当前位置: 首页 > news >正文

CKS认证 | Day1 K8s集群部署与安全配置

一、K8s安全运维概述

Kubernetes(K8s) 是一个广泛使用的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。随着 K8s 在生产环境中的普及,安全运维成为确保系统稳定性和数据安全的关键。

 

1.1 安全运维的重要性

  • 万物互联,安全为基,企业的网络安全不可小视;
  • 服务器被黑事件频发;
  • 公司重要数据资产在运维手中;

— SecDevOps

SecDevOps 与 DevOps相似,是一种哲学,鼓励运维人员、开发 人员、测试人员和安全人员进行更高水水平协作,将信息安全被放 在事前考虑,将安全性注入自动化流程中,以确保整个产品周期内 的信息安全。

1.2 K8s提供的安全机制

为保证集群以及容器应用的安全,Kubernetes 提供了多 种安全机制,限制容器的行为,减少容器和集群的攻击面, 保证整个系统的安全性。

  • 集群安全:TLS证书认证、RBAC;

  • Security Context:限制容器的行为,例如只读文 件系统、特权、运行用户等;

  • Pod Security Policy:集群级的 Pod 安全策略, 自动为集群内的 Pod 配置安全策略;

  • Sysctls:允许容器设置内核参数;

  • AppArmor:限制容器中应用对资源的访问权限;

  • Network Policies:控制集群中网络通信;

  • Seccomp:限制容器内进程的系统调用;

1.3 K8s安全运维实践思路

二、部署一套完整的K8s高可用集群

请移步:CKS认证 | 使用kubeadm部署K8s高可用集群(v1.26)-CSDN博客

 

三、CIS 安全基准介绍

3.1 CIS 介绍

CIS(Center for Internet Security)安全基准 是由 CIS 组织制定的一套安全标准,旨在帮助组织评估和改进其系统和应用程序的安全性。CIS 基准提供了一套详细的配置指南和最佳实践,通过遵循 CIS 基准,组织可以显著提高系统和应用程序的安全性,降低潜在的安全风险。使用 CIS-CAT 等自动化工具,可以简化评估和修复过程,确保系统和应用程序符合 CIS 基准的要求。主要用于保护常见的操作系统和软件平台免受已知的安全威胁。

互联网安全中心(CIS,Center for Internet Security),是一个非盈利组织,致力为互联网提供 免费的安全防御解决方案。

  • CIS官网:https://www.cisecurity.org/
  • Kubernetes CIS基准方案:https://www.cisecurity.org/benchmark/kubernetes/

CIS 安全基准的核心概念:

1)目标

  • 提高安全性:通过标准化配置和最佳实践,减少系统和应用程序的漏洞
  • 降低风险:帮助组织识别和修复潜在的安全问题
  • 合规性:满足行业标准和法规要求(如 PCI-DSS、HIPAA)

2)适用范围

  • 操作系统:如 Windows、Linux(如 Ubuntu、Red Hat)、macOS
  • 网络设备:如防火墙、路由器、交换机
  • 云平台:如 AWS、Azure、GCP
  • 容器编排平台:如 Kubernetes(K8s)

CIS 安全基准的主要组成部分:

(1) 控制项(CIS Controls)

  • 定义:一系列高优先级的安全实践,用于保护组织的核心资产

  • 特点:分为多个级别(Level 1、Level 2、Level 3),每个级别对应不同的安全需求

    1. Level 1:基本的安全实践,适用于所有组织

    2. Level 2:适用于中型和大型组织,提供更严格的安全控制

    3. Level 3:适用于高安全需求的场景,如政府和金融机构

(2) 配置基准(CIS Benchmarks)

  • 定义:针对特定操作系统、应用程序或平台的详细配置指南

  • 内容:包括安全配置的最佳实践、建议和检查项

  • 示例

    1. Linux 系统:禁用不必要的服务、配置防火墙规则

    2. Kubernetes:启用 RBAC、配置网络策略

    3. AWS:启用多因素认证(MFA)、配置 IAM 策略

(3) 自动化工具(CIS-CAT)

  • 定义:CIS 提供的自动化工具,用于评估系统和应用程序是否符合 CIS 基准

  • 功能

    1. 扫描系统和应用程序,检查是否符合 CIS 基准

    2. 生成详细的报告,列出不符合的配置项

    3. 提供修复建议

3.2 K8s基准测试工具kube-bench

kube-bench 是由 Aqua Security 开发的一款开源工具,专门用于评估 Kubernetes 集群是否符合 CIS(Center for Internet Security)Kubernetes 基准。CIS 基准提供了一套针对 Kubernetes 的安全配置最佳实践,而 kube-bench 通过自动化扫描集群,帮助用户发现并修复不符合 CIS 基准的配置问题。以CIS K8s基准作为基础,用该工具来检查K8s是否安全部署。 主要查找不安全的配置参数、敏感的文件权限、不安全的帐户或公开端口等等

Github项目地址:https://github.com/aquasecurity/kube-bench

3.2.1 kube-beach部署

1)下载二进制包

  • https://github.com/aquasecurity/kube-bench/releases

2)解压tar包即可使用

tar zxvf kube-bench_0.6.14_linux_amd64.tar.gz
# 创建默认配置文件路径
mkdir /etc/kube-bench
mv cfg/ /etc/kube-bench/[root@k8s-master-1-71 ~]# ls /etc/kube-bench/cfg/
ack-1.0   cis-1.23  cis-1.6      eks-1.0.1                 gke-1.0    rh-1.0
aks-1.0   cis-1.24  cis-1.6-k3s  eks-1.1.0                 gke-1.2.0
cis-1.20  cis-1.5   config.yaml  eks-stig-kubernetes-v1r6  rh-0.7
[root@k8s-master-1-71 ~]# ls /etc/kube-bench/cfg/cis-1.24/
config.yaml        etcd.yaml    node.yaml
controlplane.yaml  master.yaml  policies.yaml# 将解压的kube-bench执行程序,移动到二进制目录下
mv kube-bench /usr/bin/

 

3.2.2 kube-beach使用

Kube-bench 与 k8s 版本支持参考:https://github.com/aquasecurity/kube-bench/blob/main/docs/platforms.md#cis-kubernetes-benchmark-support

Source

Kubernetes Benchmark

kube-bench config

Kubernetes versions

CIS

1.5.1

cis-1.5

1.15

CIS

1.6.0

cis-1.6

1.16-1.18

CIS

1.20

cis-1.20

1.19-1.21

CIS

1.23

cis-1.23

1.22-1.23

CIS

1.24

cis-1.24

1.24

CIS

GKE 1.0.0

gke-1.0

GKE

CIS

GKE 1.2.0

gke-1.2.0

GKE

CIS

EKS 1.0.1

eks-1.0.1

EKS

CIS

EKS 1.1.0

eks-1.1.0

EKS

CIS

ACK 1.0.0

ack-1.0

ACK

CIS

AKS 1.0.0

aks-1.0

AKS

RHEL

RedHat OpenShift hardening guide

rh-0.7

OCP 3.10-3.11

CIS

OCP4 1.1.0

rh-1.0

OCP 4.1-

CIS

1.6.0-k3s

cis-1.6-k3s

k3s v1.16-v1.24

DISA

Kubernetes Ver 1, Rel 6

eks-stig-kubernetes-v1r6

EKS

  • 使用 kube-bench --help 查看帮助
  • 使用 kube-bench run 进行测试,该指令有以下常用参数:

常用参数:

  • -s, --targets 指定要基础测试的目标,这个目标需要匹配 cfg/ 中的 YAML文件名称,例如:

ls /etc/kube-bench/cfg/cis-1.24/

config.yaml etcd.yaml node.yaml

controlplane.yaml master.yaml policies.yaml

  • --version:指定k8s版本,如果未指定会自动检测;(目前支持k8s最高为1.24版本)

  • --benchmark:手动指定CIS基准版本,不能与--version一起使用;


示例1:检查master组件安全配置(通过修复方案建议进行配置修改)

  • 命令:kube-bench run --targets=master

执行后会逐个检查安全配置并输出修复方案及汇总信息输出:

[PASS]:测试通过

[FAIL]:测试未通过,重点关注,在测试结果会给出修复建议

[WARN]:警告,可做了解

[INFO]:信息


示例2:测试项目配置文件:vi /etc/kube-bench/cfg/cis-1.24/目标文件.yaml(直接修改配置文件)

  • id:编号(与CIS安全基准PDF的ID对应

  • text:提示的文本

  • audit:

  • tests:测试项目

  • remediation:修复方案

  • scored:如果为true,kube-bench无法正常测试, 则会生成FAIL,如果为false,无法正常测试,则会 生成WARN

  • type:如果为manual则会生成WARN,如果为skip, 则会生成INFO


[root@k8s-master-1-71 ~]# kube-bench run --targets=master
## FAIL 审计问题
[FAIL] 1.1.12 Ensure that the etcd data directory ownership is set to etcd:etcd (Automated)
[FAIL] 1.2.5 Ensure that the --kubelet-certificate-authority argument is set as appropriate (Automated)
[FAIL] 1.2.17 Ensure that the --profiling argument is set to false (Automated)
[FAIL] 1.2.18 Ensure that the --audit-log-path argument is set (Automated)
[FAIL] 1.2.19 Ensure that the --audit-log-maxage argument is set to 30 or as appropriate (Automated)
[FAIL] 1.2.20 Ensure that the --audit-log-maxbackup argument is set to 10 or as appropriate (Automated                   )
[FAIL] 1.2.21 Ensure that the --audit-log-maxsize argument is set to 100 or as appropriate (Automated)
[FAIL] 1.3.2 Ensure that the --profiling argument is set to false (Automated)
[FAIL] 1.4.1 Ensure that the --profiling argument is set to false (Automated)
... 
--------------------------------------------------------------------------------
## 修复建议(注意:在不确定参数的情况下不建议修改)
== Remediations master ==1.1.12 On the etcd server node, get the etcd data directory, passed as an argum
from the command 'ps -ef | grep etcd'.
Run the below command (based on the etcd data directory found above).
For example, chown etcd:etcd /var/lib/etcd      //etcd数据目录设置属组1.2.5 Follow the Kubernetes documentation and setup the TLS connection between
the apiserver and kubelets. Then, edit the API server pod specification file
/etc/kubernetes/manifests/kube-apiserver.yaml on the control plane node and set
--kubelet-certificate-authority parameter to the path to the cert file for the
--kubelet-certificate-authority=<ca-string>1.2.9 Follow the Kubernetes documentation and set the desired limits in a confi
Then, edit the API server pod specification file /etc/kubernetes/manifests/kube
and set the below parameters.
--enable-admission-plugins=...,EventRateLimit,...
--admission-control-config-file=<path/to/configuration/file>1.2.17 Edit the API server pod specification file /etc/kubernetes/manifests/kub
on the control plane node and set the below parameter.
--profiling=false1.2.18 Edit the API server pod specification file /etc/kubernetes/manifests/kub
on the control plane node and set the --audit-log-path parameter to a suitable
file where you would like audit logs to be written, for example,
--audit-log-path=/var/log/apiserver/audit.log1.2.19 Edit the API server pod specification file /etc/kubernetes/manifests/kub
on the control plane node and set the --audit-log-maxage parameter to 30
or as an appropriate number of days, for example,
--audit-log-maxage=301.2.20 Edit the API server pod specification file /etc/kubernetes/manifests/kub
on the control plane node and set the --audit-log-maxbackup parameter to 10 or
value. For example,
--audit-log-maxbackup=101.2.21 Edit the API server pod specification file /etc/kubernetes/manifests/kub
on the control plane node and set the --audit-log-maxsize parameter to an appro
For example, to set it as 100 MB, --audit-log-maxsize=1001.3.2 Edit the Controller Manager pod specification file /etc/kubernetes/manifeager.yaml
on the control plane node and set the below parameter.
--profiling=false1.4.1 Edit the Scheduler pod specification file /etc/kubernetes/manifests/kube-
on the control plane node and set the below parameter.
--profiling=false== Summary master ==
40 checks PASS
9 checks FAIL
12 checks WARN
0 checks INFO== Summary total ==
40 checks PASS
9 checks FAIL
12 checks WARN
0 checks INFO

根据示例1,以 ID为 1.2.17 为例,建议将DEBUG参数功能设置为false:

1.2.17 Edit the API server pod specification file /etc/kubernetes/manifests/kub

on the control plane node and set the below parameter.

--profiling=false

未知参数,可以通过CIS PDF查找到相应位置,并通过官网的官方文档-【参考-组件工具】进行Ctrl -F 搜索

文档:kube-apiserver | Kubernetes

解释:该参数是通过 Web 接口 host:port/debug/pprof/ 默认启用的性能分析服务,用来进行DEBUG作用

  • curl -k https://192.168.1.71:6443/debug/pprof 或者kubectl get --raw=/debug/pprof
[root@k8s-master-1-71 ~]# vi /etc/kubernetes/manifests/kube-apiserver.yaml
spec:containers:- command:
...- --profiling=false    //末尾增加该参数# 修改后保存,kube-apiserver自动重启
[root@k8s-master-1-71 ~]# kubectl get pods -n kube-system
...
kube-apiserver-k8s-master-1-71             1/1     Running   0             38s# 重新执行
[root@k8s-master-1-71 ~]# kube-bench run --targets=master
[PASS] 1.2.17 Ensure that the --profiling argument is set to false (Automated)

根据示例2,以 ID为 1.2.5 为例,通过更改配置文件,将告警等级进行降级:

[root@k8s-master-1-71 ~]# vi /etc/kube-bench/cfg/cis-1.24/master.yaml
...- id: 1.2.5text: "Ensure that the --kubelet-certificate-authority argument is set as appropriate (Automated)"audit: "/bin/ps -ef | grep $apiserverbin | grep -v grep"tests:test_items:- flag: "--kubelet-certificate-authority"remediation: |Follow the Kubernetes documentation and setup the TLS connection betweenthe apiserver and kubelets. Then, edit the API server pod specification file$apiserverconf on the control plane node and set the--kubelet-certificate-authority parameter to the path to the cert file for the certificate authority.--kubelet-certificate-authority=<ca-string>scored: false    //将true设置为false。测试ID 1.2.5 从[FAIL] 变为 [WARN]
[root@k8s-master-1-71 ~]# kube-bench run --targets=master | grep 1.2.5
[WARN] 1.2.5 Ensure that the --kubelet-certificate-authority argument is set as appropriate (Automated)[root@k8s-master-1-71 ~]# vi /etc/kube-bench/cfg/cis-1.24/master.yamlscored: falsetype: skip    //增加type,值为skip。测试ID 1.2.5 从[WARN] 变为 [INFO]
[root@k8s-master-1-71 ~]# kube-bench run --targets=master | grep 1.2.5
[INFO] 1.2.5 Ensure that the --kubelet-certificate-authority argument is set as appropriate (Automated)

四、Ingress 配置证书

4.1 Ingress介绍

  • Ingress:K8s中的一个抽象资源,给管理员 提供一个暴露应用的入口定义方法;

  • Ingress Controller:根据Ingress生成具体 的路由规则,并对Pod负载均衡器;

4.2 HTTPS重要性

HTTPS是安全的HTTP,HTTP 协议中的内容都是明文传输,HTTPS 的目的是将这 些内容加密,确保信息传输安全。最后一个字母 S 指的是SSL/TLS 协议,它位于 HTTP 协议与 TCP/IP 协议中间。

HTTPS优势:

  • 加密隐私数据:防止您访客的隐私信息(账号、地址、手机号等)被劫持或窃取;

  • 安全身份认证:验证网站的真实性,防止钓鱼网站;

  • 防止网页篡改:防止数据在传输过程中被篡改,保护用户体验;

  • 地址栏安全锁:地址栏头部的“锁”型图标,提高用户信任度;

  • 提高SEO排名:提高搜索排名顺序,为企业带来更多访问量;

4.3 将一个项目对外暴露HTTPS访问

配置ingress服务

kubectl apply -f ingress-controller-1.1.yaml[root@k8s-master-1-71 ~]# kubectl get pods -n ingress-nginx
NAME                                      READY   STATUS    RESTARTS   AGE
ingress-nginx-controller-85cdb79d-srkrq   1/1     Running   0          52s
[root@k8s-master-1-71 ~]# kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.108.162.206   <none>        80:30513/TCP,443:32099/TCP   79d
ingress-nginx-controller-admission   ClusterIP   10.103.217.175   <none>        443/TCP                      79d

配置HTTPS步骤:

  1. 准备域名证书文件(来自:openssl / cfssl工具自签或者权威机构颁发)

  2. 将证书文件保存到Secret

  3. Ingress规则配置tls

  4. kubectl get ingress

  5. 测试,本地电脑绑定hosts记录对应ingress里面配置的域名,IP是 Ingress Concontroller Pod节点IP

先前准备:

kubectl create deployment httpd-web --image=nginx --replicas=3
kubectl expose deployment httpd-web --port=80 --target-port=80

步骤1:准备域名证书文件

vi certs.sh
cat > ca-config.json <<EOF   # 根证书的配置文件
{"signing": {"default": {"expiry": "87600h"},"profiles": {"kubernetes": {"expiry": "87600h","usages": ["signing","key encipherment","server auth","client auth"]}}}
}
EOFcat > ca-csr.json <<EOF    # 根证书的请求颁发文件
{"CN": "kubernetes","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","L": "Beijing","ST": "Beijing"}]
}
EOF# 通过以上相关根证书信息,为指定域名颁发客户端证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -cat > web.hostname.cn-csr.json <<EOF
{"CN": "web.hostname.cn",     # 一定要与访问的实际域名保持一致"hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","L": "BeiJing","ST": "BeiJing"}]
}
EOFcfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes web.hostname.cn-csr.json | cfssljson -bare web.hostname.cn[root@k8s-master-1-71 ~]# mkdir ssl ; mv certs.sh ssl/ ; cd ssl/[root@k8s-master-1-71 ssl]# bash certs.sh

步骤2:将证书文件保存到Secret

kubectl create secret tls web-aliangedu-cn --
cert=web.aliangedu.cn.pem --key=web.aliangedu.cn-key.pem

步骤3:Ingress规则配置tls

[root@k8s-master-1-71 ~]# kubectl apply -f ingress-https.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-https
spec:ingressClassName: nginxtls:    # 添加tls- hosts:- httpd.hostname.cn secretName: web-hostname-cnrules:- host: httpd.hostname.cnhttp:paths:- path: /pathType: Prefixbackend:service:name: httpd-webport:number: 80

查看 kubectl get ingress

[root@k8s-master-1-71 ~]# kubectl get ingress
NAME            CLASS   HOSTS               ADDRESS        PORTS     AGE
ingress-https   nginx   httpd.hostname.cn   192.168.1.73   80, 443   65s[root@k8s-master-1-71 ~]# kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.108.162.206   <none>        80:30513/TCP,443:32099/TCP   79d
ingress-nginx-controller-admission   ClusterIP   10.103.217.175   <none>        443/TCP                      79d

访问测试:https://httpd.hostname.cn

五、网络策略控制集群内部网络通信

5.1 网络策略应用场景

默认情况下,Kubernetes 集群网络没任何网络限制,Pod 可以与任何其他 Pod 通信,在某些场景下就需要进行网络控制, 减少网络攻击面,提高安全性,这就会用到网络策略。

网络策略(Network Policy):是一个K8s资源,用于限制Pod出入流量,提供Pod级别和Namespace级别网络访问控制。

网络策略的应用场景:

  • 应用程序间的访问控制,例如项目A不能访问项目B的Pod;

  • 开发环境命名空间不能访问测试环境命名空间Pod;

  • 当Pod暴露到外部时,需要做Pod白名单;

  • 多租户网络环境隔离;

5.2 网络策略概述

网络策略工作流程:

  1. 创建Network Policy资源

  2. Policy Controller监控网络策略,同步并通知节点上程序

  3. 节点上DaemonSet运行的程序从etcd中获取Policy,调用本 地Iptables创建防火墙规则

相关YAML文件:网络策略 | Kubernetes

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: test-network-policynamespace: default
spec:podSelector:matchLabels:role: dbpolicyTypes:- Ingress- Egressingress:- from:- ipBlock:cidr: 172.17.0.0/16except:- 172.17.1.0/24- namespaceSelector:matchLabels:project: myproject- podSelector:matchLabels:role: frontendports:- protocol: TCPport: 6379egress:- to:- ipBlock:cidr: 10.0.0.0/24ports:- protocol: TCPport: 5978
  • podSelector:目标Pod,根据标签选择。

  • policyTypes:策略类型,指定策略用于入站、出站流量。

  • Ingress:from是可以访问的白名单,可以来自于IP段、命名空间、

  • Pod标签等,ports是可以访问的端口。

  • Egress:这个Pod组可以访问外部的IP段和端口。

5.3 网络访问控制5个案例

案例1:拒绝命名空间下所有Pod入、出站流量

需求:拒绝test命名空间下所有Pod入、出站流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: deny-allnamespace: test
spec:podSelector: {}   # 匹配本命名空间所有PodpolicyTypes:- Ingress- Egress
# ingress 和 egress 没有指定规则,则不允许任何流量进出Pod

案例2:拒绝其他命名空间Pod访问

需求:test命名空间下所有pod可以互相访问,也可以访问其他 命名空间Pod,但其他命名空间不能访问test命名空间Pod。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: deny-all-namespacenamespace: test
spec:podSelector: {}policyTypes:- Ingressingress:- from:- podSelector: {}    # 匹配本命名空间所有Pod

或者

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: deny-all-namespacenamespace: test
spec:podSelector: {}policyTypes:- Ingressingress:- from:- namespaceSelector:matchLabels:name: test       # 指定本命名空间

案例3:允许其他命名空间Pod访问指定应用

需求:允许其他命名空间访问test命名空间指定Pod

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-all-namespacesnamespace: test
spec:podSelector:matchLabels:eun: webpolicyTypes:- Ingressingress:- from:- namespaceSelector: {}    # 匹配所有命名空间的Pod

案例4:同一个命名空间下应用之间限制访问

需求:将test命名空间中标签为run=web的pod隔离, 只允许标签为 run=client1 的pod访问80端口

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: app-to-appnamespace: test
spec:podSelector:matchLabels:run: webpolicyTypes:- Ingressingress:- from:- podSelector:matchLabels:run: client1ports:- protocol: TCPport: 80

案例5:只允许指定命名空间中的应用访问

需求:限制dev命名空间标签为 env=dev 的pod,

  • 只允许 prod命名空间中的pod 访问

  • 允许其他所有命名空间 app=client1标签pod访问

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: dev-webnamespace: dev
spec:podSelector:matchLabels:env: devpolicyTypes:- Ingressingress:  
# 满足允许prod命名空间中的pod访问- from:- namespaceSelector:matchLabels:name: prod   
# 允许pod标签为app=client1的pod访问,所有命名空间  - from: - namespaceSelector: {}podSelector:matchLabels:app: client1

六、k8s证书续签

K8s证书一般分为两套:K8s组件(apiserver)Etcd

假如按角色来分,证书分为管理节点和工作节点。

  • 管理节点:如果是kubeadm部署则自动生成,如果是二进制部署一般由cfssl或者openssl生成

  • 工作节点:工作节点主要是指kubelet和kube-proxy连接apiserver所需的客户端证书,kubelet证书由controller-manager组 件自动颁发

注意:使用kubeadm方式部署,证书有效期为1年,证书过期会导致集群无法正常工作,日志会给出证书过期错误(x509: certificate has expired or is not yet valid

证书使用在组件之间的通信

红线:K8s自建证书颁发机构(CA), 需携带由它生成的客户端证书访问 apiserver

蓝色:Etcd自建证书颁发机构(CA), 需携带由它生成的客户端证书访问etcd

命令:查看证书有效期

  1. kubeadm certs check-expiration

  2. openssl x509 -in -noout -dates

  3. echo | openssl s_client -showcerts -connect 127.0.0.1:6443 -servername api 2>/dev/null | openssl x509 -noout -enddate

例如:

[root@k8s-master-1-71 pki]# kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
# 根证书颁发的客户端证书(毕业证)
CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Mar 24, 2024 04:08 UTC   303d            ca                      no
apiserver                  Mar 24, 2024 04:06 UTC   303d            ca                      no
apiserver-etcd-client      Mar 24, 2024 04:06 UTC   303d            etcd-ca                 no
apiserver-kubelet-client   Mar 24, 2024 04:06 UTC   303d            ca                      no
controller-manager.conf    Mar 24, 2024 04:07 UTC   303d            ca                      no
etcd-healthcheck-client    Feb 16, 2024 14:22 UTC   266d            etcd-ca                 no
etcd-peer                  Feb 16, 2024 14:22 UTC   266d            etcd-ca                 no
etcd-server                Feb 16, 2024 14:22 UTC   266d            etcd-ca                 no
front-proxy-client         Mar 24, 2024 04:06 UTC   303d            front-proxy-ca          no
scheduler.conf             Mar 24, 2024 04:07 UTC   303d            ca                      no# 根证书(大学、证书颁发机构)(根证书的有效期默认kubeadm设置为10年,一般情况下也不会变化)
CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Feb 13, 2033 14:22 UTC   9y              no
etcd-ca                 Feb 13, 2033 14:22 UTC   9y              no
front-proxy-ca          Feb 13, 2033 14:22 UTC   9y              no[root@k8s-master-1-71 ~]# cd /etc/kubernetes/pki/[root@k8s-master-1-71 pki]# openssl x509 -in apiserver.crt -noout -dates
notBefore=Feb 16 14:22:31 2023 GMT
notAfter=Mar 24 04:06:51 2024 GMT# 或者 请求HTTPS查看服务续签变化
echo | openssl s_client -showcerts -connect 127.0.0.1:6443 -servername api 2>/dev/null | openssl x509 -noout -enddate
notAfter=Mar 24 04:06:51 2024 GMT

补充:

在kubeadm部署集群之前,需进行续签的方法:修改kubeadm源码中证书的默认有效期;

在kubeadm部署集群之后,需进行续签的方法:

  1. kubeadm certs 工具续签证书;

  2. 升级k8s集群版本,默认会再续签1年有效期

命令:续签所有证书

  • kubeadm certs renew all <--config=kubeadm.yaml>     //可指定其它组件yaml文件

示例:kubeadm部署方式续签

# 查看证书有效期
[root@k8s-master-1-71 pki]# kubeadm certs check-expiration# 备份
[root@k8s-master-1-71 ~]# cp -r /etc/kubernetes/ /etc/kubernetes.bak
[root@k8s-master-1-71 ~]# cp -r /var/lib/etcd/ /var/lib/etcd.bak# 续签所有证书
[root@k8s-master-1-71 ~]# kubeadm certs renew all# 重启生效证书
[root@k8s-master-1-71 ~]# kubectl delete pod kube-apiserver-k8s-master-1-71 kube-controller-manager-k8s-master-1-71 kube-scheduler-k8s-master-1-71 etcd-k8s-master-1-71 -n kube-system
pod "kube-apiserver-k8s-master-1-71" deleted
pod "kube-controller-manager-k8s-master-1-71" deleted
pod "kube-scheduler-k8s-master-1-71" deleted
pod "etcd-k8s-master-1-71" deleted# kubectl使用新配置文件
cp -f /etc/kubernetes/admin.conf $HOME/.kube/config

注:如果多master,其他证书和配置文件拷贝过去覆盖或者做上述同样操作

课后作业:

1、网络策略

需求1:在test命名空间创建一个名为deny-all的网络策略,拒绝本命名空间所有Pod的 Ingress和Egress流量

需求2:限制dev命名空间标签为env=dev的pod,只允许prod命名空间中的pod访问和 其他所有命名空间app=client1标签pod访问

2、使用kube-bench工具检查集群组件配置文件存在的问题与修复,并重启对应组件确保 新配置生效。

小结

本篇为 【Kubernetes CKS认证 Day1】的学习笔记,希望这篇笔记可以让您初步了解到 CIS及Kube-beach的使用、了解Ingress配置证书、网络策略等;课后还有扩展实践,不妨跟着我的笔记步伐亲自实践一下吧!


Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解。

相关文章:

CKS认证 | Day1 K8s集群部署与安全配置

一、K8s安全运维概述 Kubernetes&#xff08;K8s&#xff09; 是一个广泛使用的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。随着 K8s 在生产环境中的普及&#xff0c;安全运维成为确保系统稳定性和数据安全的关键。 1.1 安全运维的重要性 万物互联&…...

新手上路:Anaconda虚拟环境创建和配置以使用PyTorch和DGL

文章目录 前言步骤 1: 安装 Anaconda步骤 2: 创建新的 Anaconda 环境步骤 3: 安装最新版本的 PyTorch步骤 4: 安装特定版本的 PyTorch步骤 5: 安装最新版本的 DGL步骤 6: 安装特定版本的 DGL步骤 7: Pycharm中使用虚拟环境解释器第一种情况&#xff1a;创建新项目第二种情况&am…...

什么是PCB的Mark点?如何进行设计Mark点?

一、什么是Mark点&#xff1f; PCB的Mark点&#xff0c;也被称为基准点或光学定位点&#xff0c;是在印刷电路板&#xff08;Printed Circuit Board, PCB&#xff09;上设置的一种特殊标记。 ​ 图1.1 PCB的Mark点 Mark点的主要作用是为表面贴装技术&#xff08;Surface Mount…...

Spark SQL中的from_json函数详解

Spark SQL中的from_json函数详解 在Spark SQL中&#xff0c;from_json是一个用于解析JSON数据的函数&#xff0c;主要用于将JSON格式的字符串解析为结构化的数据&#xff08;即StructType或其他Spark SQL数据类型&#xff09;。这个函数在处理半结构化数据&#xff08;如JSON日…...

Vue 引入及简单示例

Vue 渐进式JavaScript 框架 学习笔记 - Vue 引入及简单示例 目录 与jquery区别 Vue引入 两种方式引入 下载到本地 代码结构 简单示例 Style中引入vue.js 对vue语法进行解析 对三目运算符支持 设置变量&#xff08;状态&#xff09; 总结 与jquery区别 不需要手动操…...

JDK长期支持版本(LTS)

https://blogs.oracle.com/java/post/the-arrival-of-java-23 jdk长期支持版本&#xff08;LTS&#xff09;&#xff1a;JDK 8、11、17、21&#xff1a;...

审计文件标识作为水印打印在pdf页面边角

目录 说明 说明 将审计文件的所需要贴的编码直接作为水印贴在页面四个角落&#xff0c;节省辨别时间 我曾经写过一个给pdf页面四个角落加上文件名水印的python脚本&#xff0c;现在需要加一个图形界面进一步加强其实用性。首先通过路径浏览指定文件路径&#xff0c;先检测该路…...

图片专栏——概念

欢迎来到图片世界&#xff0c;大家一起学习交流! 1. 像素&#xff08;Pixel&#xff09; 定义&#xff1a;像素是图像的最小单位&#xff0c;是“图像元素”的缩写。你可以把像素想象成拼图中的一个最小块&#xff0c;无数个像素组合在一起就形成了完整的图像。作用&#xff…...

江天科技主要产品销售单价下滑,应收账款、存货周转率大幅下降

《港湾商业观察》廖紫雯 日前&#xff0c;苏州江天包装科技股份有限公司&#xff08;以下简称&#xff1a;江天科技&#xff09;冲击北交所&#xff0c;保荐机构为国投证券。 江天科技主要从事标签印刷产品的研发、生产与销售&#xff0c;公司主要产品包括薄膜类和纸张类的不…...

HTB:Remote[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用ftp尝试匿名…...

【开源免费】基于SpringBoot+Vue.JS密接者跟踪系统(JAVA毕业设计)

本文项目编号 T 145 &#xff0c;文末自助获取源码 \color{red}{T145&#xff0c;文末自助获取源码} T145&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

机器学习10-解读CNN代码Pytorch版

机器学习10-解读CNN代码Pytorch版 我个人是Java程序员&#xff0c;关于Python代码的使用过程中的相关代码事项&#xff0c;在此进行记录 文章目录 机器学习10-解读CNN代码Pytorch版1-核心逻辑脉络2-参考网址3-解读CNN代码Pytorch版本1-MNIST数据集读取2-CNN网络的定义1-无注释版…...

Python 电脑定时关机工具

Python 电脑定时关机工具 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着开源精神的想法&#xff0c;望大家喜欢&#xff0c…...

机器学习09-Pytorch功能拆解

机器学习09-Pytorch功能拆解 我个人是Java程序员&#xff0c;关于Python代码的使用过程中的相关代码事项&#xff0c;在此进行记录 文章目录 机器学习09-Pytorch功能拆解1-核心逻辑脉络2-个人备注3-Pytorch软件包拆解1-Python有参和无参构造构造方法的基本语法示例解释注意事项…...

Qt之QDjango-db的简单使用

QDjango是一款由C编写、依托于Qt库的Web开发框架&#xff0c;其设计理念受到了广受欢迎的Python框架Django的影响。这个项目旨在提供一个高效、灵活且易于使用的工具集&#xff0c;帮助开发者构建高质量的Web应用。其项目地址: https://gitcode.com/gh_mirrors/qd/qdjango&…...

滑动窗口最大值(力扣239)

刚拿到这道题&#xff0c;我们第一反应就是遍历每一个滑动窗口&#xff0c;然后在滑动窗口中遍历找到该窗口的最大值,但是这样的时间复杂度为O(k*n).有没有更简单的方法呢&#xff1f;答案是使用队列。更准确的说是双向队列。下面我将详细讲解一下如何使用双向队列解决这道问题…...

HTTP / 2

序言 在之前的文章中我们介绍过了 HTTP/1.1 协议&#xff0c;现在再来认识一下迭代版本 2。了解比起 1.1 版本&#xff0c;后面的版本改进在哪里&#xff0c;特点在哪里&#xff1f;话不多说&#xff0c;开始吧⭐️&#xff01; 一、 HTTP / 1.1 存在的问题 很多时候新的版本的…...

Python 脚本-显示给定文件的文件信息

目录 Python 代码实现 Python 代码解释 1.导入必要的模块&#xff1a; 2.函数 get_file_info&#xff1a; 3.函数 print_file_info&#xff1a; 4.主函数 main&#xff1a; 5.程序入口&#xff1a; 使用方法 Python 代码实现 import os import stat import sys import…...

C# 通用缓存类开发:开启高效编程之门

引言 嘿&#xff0c;各位 C# 开发者们&#xff01;在当今快节奏的软件开发领域&#xff0c;提升应用程序的性能就如同给跑车装上涡轮增压&#xff0c;能让你的项目在激烈的竞争中脱颖而出。而构建一个高效的 C# 通用缓存类&#xff0c;无疑是实现这一目标的强大武器。 想象一…...

Mac安装Homebrew

目录 安装修改homeBrew源常用命令安装卸载软件升级软件相关清理相关 安装 官网 https://brew.sh/不推荐官网安装方式&#xff08;很慢很慢或者安装失败联网失败&#xff09; 检测是否安装homebrewbrew -v执行安装命令 苹果电脑 常规安装脚本 &#xff08;推荐 完全体 几分钟就…...

MySQL面试题2025 每日20道【其四】

1、你们生产环境的 MySQL 中使用了什么事务隔离级别&#xff1f;为什么&#xff1f; 中等 在生产环境中&#xff0c;MySQL数据库的事务隔离级别通常由开发团队或数据库管理员根据应用的需求来设定。MySQL支持四种标准的事务隔离级别&#xff1a; 读未提交&#xff08;Read Unc…...

maven 微服务项目多 包版本问题

mvn dependency:tree查看jar包直接的关系 找到重复的包!!!! 可以查看包版本问题 [INFO] | - org.jpedal:OpenViewerFX:jar:6.6.14:compile [INFO] | | - org.eclipse.birt.runtime.3_7_1:org.mozilla.javascript:jar:1.7.2:compile [INFO] | | - bouncycastle:bcprov-j…...

skipcrossnets模型详解及代码复现

模型背景 在SkipcrossNets模型提出之前,多模态融合在自动驾驶领域已取得显著进展。然而,传统的两流网络仅在特定层进行融合,需要大量人工尝试来设置,并且随着网络深度增加,模态特征差异增大,容易影响性能。 为解决这些问题,研究人员开发了SkipcrossNets模型,旨在提供…...

【0397】Postgres内核 checkpoint process ⑦ 获取 delaying checkpoint VXIDs(delayChkpt)

1. Top-level transactions 顶级事务(Top-level transactions)通过由 PGPROC 字段 backendId 和 lxid 组成的 VirtualTransactionIDs 来标识。对于已准备的事务,LocalTransactionId 是一个普通的 XID。这些在短期内保证唯一,但在数据库重启或 XID 滚转后会被重新使用;因此…...

Go语言-学习一

简介&#xff1a;Go语言经过多年的快速发展&#xff0c;已经被光广泛应用到各个领域&#xff0c;成为当前最热的计算机语言之一。Go自带许多高级特性及常用工具&#xff0c;使Go一出世就以高并发和高性能为程序员所追捧。 go语言特点 1、静态类型、编译型、开源 2、脚本化&…...

学习记录-统计记录场景下的Redis写请求合并优化实践

学习记录-使用Redis合并写请求来优化性能 1.业务背景 学习进度的统计功能:为了更精确的记录用户上一次播放的进度&#xff0c;采用的方案是&#xff1a;前端每隔15秒就发起一次请求&#xff0c;将播放记录写入数据库。但问题是&#xff0c;提交播放记录的业务太复杂了&#x…...

Java中json的一点理解

一、Java中json字符串与json对象 1、json本质 json是一种数据交换格式。 常说的json格式的字符串 > 发送和接收时都只是一个字符串&#xff0c;它遵循json这种格式。 2、前后端交互传输的json是什么&#xff1f; 前后端交互传输的json都是json字符串 比如&#xff1a;…...

用于牙科的多任务视频增强

Multi-task Video Enhancement for Dental Interventions 2022 miccai Abstract 微型照相机牢牢地固定在牙科手机上&#xff0c;这样牙医就可以持续地监测保守牙科手术的进展情况。但视频辅助牙科干预中的视频增强减轻了低光、噪音、模糊和相机握手等降低视觉舒适度的问题。…...

二、vue智能Ai对话(高仿通义千问)流式进阶版

1、安装依赖、启动 // 安装依赖 npm install // 启动服务 node server.js 2、浏览器运行html 3、流式进阶版视频地址&#xff1a;流式进阶版视频 4、各位如有需要&#xff0c;请下载源码包。...

Python新春烟花

目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…...

《自动驾驶与机器人中的SLAM技术》ch4:基于预积分和图优化的 GINS

前言&#xff1a;预积分图优化的结构 1 预积分的图优化顶点 这里使用 《自动驾驶与机器人中的SLAM技术》ch4&#xff1a;预积分学 中提到的散装的形式来实现预积分的顶点部分&#xff0c;所以每个状态被分为位姿&#xff08;&#xff09;、速度、陀螺零偏、加计零偏四种顶点&am…...

「2024·我的成长之路」:年终反思与展望

文章目录 1. 前言2.创作历程2.1 摆烂期2.2 转变期3. 上升期 2. 个人收获3.经验分享4. 展望未来 1. 前言 2025年1月16日&#xff0c;2024年博客之星入围公布&#xff0c;很荣幸获得了这次入围的机会。2024年对我个人是里程碑的一年&#xff0c;是意义非凡的一年&#xff0c;是充…...

P8738 [蓝桥杯 2020 国 C] 天干地支

两种方法 #include<bits/stdc.h> using namespace std;int main(){int year;cin>>year;string tg[10] {"geng", "xin", "ren", "gui","jia", "yi", "bing", "ding", "wu&…...

Linux网络 TCP socket

TCP简介 TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。它位于OSI模型的第四层&#xff0c;主要为应用层提供数据传输服务。TCP通过三次握手建立连接&#xff0c;确保数据在发送和接收过程中的准确性和顺序…...

IntelliJ IDEA 2023.3 中配置 Spring Boot 项目的热加载

IntelliJ IDEA 2023.3 中配置 Spring Boot 项目的热加载 在 IntelliJ IDEA 2023.3 中配置 Spring Boot 项目的热加载&#xff0c;可以让你在不重启应用的情况下看到代码修改的效果。以下是详细的配置步骤&#xff1a; 添加 spring-boot-devtools 依赖 在 pom.xml 文件中添加 …...

【网络协议】【http】【https】RSA+AES-TLS1.2

【网络协议】【http】【https】RSAAES-TLS1.2 https并不是一个协议 而是在传输层之间添加了SSL/TLS协议 TLS 协议用于应用层协议&#xff08;如 HTTP&#xff09;和传输层&#xff08;如 TCP&#xff09;之间&#xff0c;增加了一层安全性来解决 HTTP 存在的问题&#xff0c;H…...

Java中如何安全地停止线程?

大家好&#xff0c;我是锋哥。今天分享关于【Java中如何安全地停止线程?】面试题。希望对大家有帮助&#xff1b; Java中如何安全地停止线程? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Java中&#xff0c;安全地停止线程是一项重要的任务&#xff0c;尤其…...

01.04、回文排序

01.04、[简单] 回文排序 1、题目描述 给定一个字符串&#xff0c;编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词。 2、解题思路 回文串的特点&#xff1a; 一个回文串在…...

[深度学习]多层神经网络

多层神经网络 文章目录 多层神经网络单个神经元人类大脑神经与神经元神经元与矩阵神经元的串联激活函数激活函数位置神经网络的三种表现形式神经网络的参数&#xff08;可训练的&#xff09; 深度学习的训练过程全连接网络过拟合和欠拟合 单个神经元 一个神经元实际表示的数据公…...

JavaScript语言的正则表达式

JavaScript语言的正则表达式详解 正则表达式&#xff08;Regular Expression&#xff0c;简称Regex或RegExp&#xff09;是一种强大的文本处理工具&#xff0c;可以在字符串中执行模式匹配和替换操作。在JavaScript中&#xff0c;正则表达式是处理字符串时不可或缺的部分&…...

yolo系列模型为什么坚持使用CNN网络?

在深度学习领域&#xff0c;目标检测是一项至关重要的任务&#xff0c;而YOLO&#xff08;You Only Look Once&#xff09;系列模型无疑是这一领域的佼佼者。YOLO以其高效、准确的特点&#xff0c;在实时目标检测任务中占据了重要地位。然而&#xff0c;随着Transformer模型在自…...

Kotlin语言的数据结构

Kotlin语言的数据结构导论 Kotlin是一种现代化的编程语言&#xff0c;具有简洁、安全和高效的特点。Kotlin不仅支持面向对象编程&#xff0c;还融入了函数式编程的概念&#xff0c;使得开发者能够以更优雅的方式处理数据。在构建复杂应用时&#xff0c;数据结构的选择及其实现…...

光纤接口、GTX高速收发器基础知识学习、光口眼图测试--FPGA学习笔记28

----素材来源原子哥 一、光纤接口简介 光纤接口是用来连接光纤线缆的物理接口&#xff0c;简称为光口。其原理是利用了光从光密介质进入光疏介质从而发生了全反射。通常有 FC、 SC、 ST、 LC、 D4、 DIN、 MU、 MT 等等各种形式接口。 &#xff08;1&#xff09; SC 型光纤接…...

【k8s】k8s部署Argo CD

1、创建 Argo CD 命名空间&#xff1a; 先创建一个专用的命名空间 argocd 用于部署 Argo CD。 kubectl create namespace argocd 2、安装 Argo CD&#xff1a; 使用 kubectl 从 Argo CD 官方 GitHub 仓库安装它。运行以下命令来安装所有的 Argo CD 组件&#xff1a; kubectl a…...

PHP礼品兑换系统小程序

&#x1f381; 礼品兑换系统&#xff1a;革新企业礼品管理&#xff0c;专属神器来袭&#xff01; &#x1f4bb; 一款专为追求高效与个性化的现代企业量身打造的礼品兑换系统&#xff0c;它基于强大的ThinkPHP框架与前沿的Uniapp技术栈深度融合&#xff0c;不仅完美适配礼品卡…...

【SSH端口转发:实现安全的远程端口映射】

SSH端口转发&#xff1a;实现安全的远程端口映射 在网络应用开发和运维过程中&#xff0c;我们经常需要进行端口转发来实现各种网络访问需求。今天我要分享一个使用SSH进行端口转发的实用脚本&#xff0c;并详细讲解其工作原理。 脚本内容 免密 ssh-copy-id -p 20080 rootxx…...

2024年第十五届蓝桥杯青少组国赛(c++)真题—快速分解质因数

快速分解质因数 完整题目和在线测评可点击下方链接前往&#xff1a; 快速分解质因数_C_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/cpp/show-3781.htmlhttps://www.hixinao.com/tiku/cpp/show-3781.html 若如其他赛事真题可自行前往题库中心查找&#xff0c;题…...

为什么你的 Qt 应用程序会出现 xcb 插件错误

有朋友咨询为什么他们的 Qt 应用程序在统信 UOS ARM 版本下运行&#xff0c;提示如下错误&#xff1a; qt.qpa.plugin: Could not find the Qt platform plugin "xcb" in "" This application failed to start because no Qt platform plugin could be i…...

ANSYS HFSS 中的相控天线阵列仿真方法

概述 相控天线阵列系统广泛使用&#xff0c;从国防雷达应用到商业 5G 应用。设计这些天线阵列涉及复杂的数学运算&#xff0c;需要全波仿真。Ansys HFSS 全场 3D 电磁仿真软件可以在合理的时间内以较低的计算成本仿真复杂的相控阵天线系统&#xff0c;同时考虑复杂激励、环境&…...

【记录】Jenkins版本及JDK关系介绍的官网地址

Redhat Jenkins Packages...