CKS必过宝典--无压力一次过
CKS必过宝典
1、kube-bench 修复不安全项
考题
解题思路
此题要求修复kubelet、apiserver以及etcd通过kube-bench所发现的问题项。
修改对应组件的配置文件即可,可以执行kube-bench master
、kube-bench node
、kube-bench etcd
查看问题项以及修复建议。
首先修复apiserver,执行kube-bench
,根据题目中的问题项编号,查看修复建议。
注意:查出来的问题项会有很多,仅修改题目所要求的即可
修改建议中提到文件/etc/kubernetes/manifests/kube-apiserver.yaml
,master的配置文件都存放在这个目录,修改即生效,无需重启,所以修改前注意备份,建议将其放到/tmp目录下。
copykube-bench cd /etc/kubernetes/manifests/ cp kube-apiserver.yaml /tmp/ vi kube-apiserver.yaml # 根据1.2.7/1.2.8/1.2.9修复建议修改authorization-mode字段为Node,RBAC authorization-mode=Node,RBAC # 根据1.2.18修复建议删除--insecure-bind-address
然后修复kubelet,执行kube-bench
,根据题目中的问题项编号,查看修复建议。
根据修复建议查看文件cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
获取到kubelet的配置文件在/var/lib/kubelet/config.yaml
修改前建议备份,和apiserver一样,将备份放在/tmp
目录下。
copykube-bench cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf cd /var/lib/kubelet cp config.yaml /tmp/ vi config.yaml # 根据4.2.1修复建议,关闭anonymous认证方式,并打开webhook # 根据2.2.2修复建议,将认证方式设置为授权模式修改为Webhook authentication: anonymous: enabled: false webhook: cacheTTL: 0s enabled: true x509: clientCAFile: /etc/kubernetes/pki/ca.crt authorization: mode: Webhook webhook: cacheAuthorizedTTL: 0s cacheUnauthorizedTTL: 0s # 修改完毕后,根据修复建议要求,重载配置文件后,重启kubelet systemctl daemon-reload systemctl restart kubelet.service
最后,修复etcd,执行kube-bench
,根据题目中的问题项编号,查看修复建议。
copykube-bench cd /etc/kubernetes/mainfests cp etcd.yaml /tmp/ vi etcd.yaml # 根据修复建议,修改client-cert-auth为true --client-cert-auth=true
结果验证
修改完毕后,等待几分钟,重新执行kube-bench
查看是否还存在前面的错误。
都修复完成后,执行kubectl get node``kubectl get po -A
等命令,检查是否修改成功。
2、Pod指定ServiceAccount
考题
解题思路
根据题目顺序进行处理。
首先,需要创建一个ServiceAccount,并且不自动挂载API凭据。
前往官网找一下所需要的yaml文件
位于Kubernetes文档 \ 任务 \ 配置Pods和容器\ 为Pod配置服务账号
注意:参考文档https://kubernetes.io/docs/home/
,如果需要使用中文文档,在kubernetes.io/后面添加zh-cn/即可跳转。
copyapiVersion: v1 kind: ServiceAccount metadata: name: backend-sa namespace: qa automountServiceAccountToken: false
创建成功后,修改/cks/sa/pod1.yaml
并创建pod
copyapiVersion: v1 kind: Pod metadata: name: backend namespace: qa spec: serviceAccountName: backend-sa containers: - image: nginx:1.9 imagePullPolicy: IfNotPresent name: backend
最后,删除未被使用的ServiceAccount
copykubectl get po -n qa -oyaml | grep -i serviceaccount kubectl get sa -n qa kubectl delete sa -n qa test01
结果验证
copykubectl get sa -n qa backend-sa kubectl get po -n qabackend kubectl get qa
3、默认网络策略
考题
解题思路
前往官网找一下所需要的yaml文件
位于Kubernetes文档 \ 概念 \ 服务、负载均衡和联网 \ 网络策略 \ 默认拒绝所有入站和所有出站流量
注意:参考文档https://kubernetes.io/docs/home/
,如果需要使用中文文档,在kubernetes.io/后面添加zh-cn/即可跳转。
copyapiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny-all spec: podSelector: {} policyTypes: - Ingress - Egress
根据题目要求修改yaml
copyapiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: denypolicy namespace: testing spec: podSelector: {} policyTypes: - Ingress - Egress
根据yaml创建网络策略
结果验证
kubectl describe networkpolicy -n testing denypolicy
4、RBAC - RoleBinding
考题
解题思路
根据题目要求,首先执行kubectl describe po -n db web-pod
,检查web-pod是否已绑定serviceaccount服务账号
copykubectl describe po -n db web-pod ... Service Account: service-account-web ...
然后执行kubectl describe robebinding -n db role-1-binding
,检查serviceaccount服务账号是否已绑定的role角色
copykubectl get rolebinding -n db NAME ROLE AGE role-1-binding Role/role-1 289d kubectl describe rolebindings.rbac.authorization.k8s.io -n db role-1-binding Name: role-1-binding Labels: <none> Annotations: <none> Role: Kind: Role Name: role-1 Subjects: Kind Name Namespace ---- ---- --------- ServiceAccount service-account-web db
前往官网找一下所需要的yaml文件
位于Kubernetes文档 \ 参考 \ API访问控制 \ 使用RBAC鉴权
注意:参考文档https://kubernetes.io/docs/home/
,如果需要使用中文文档,在kubernetes.io/后面添加zh-cn/即可跳转。
copyapiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: pod-reader rules: - apiGroups: [""] # "" 标明 core API 组 resources: ["pods"] verbs: ["get", "watch", "list"]
根据题目要求和yaml参考,执行kubectl edit role -n db role-1
修改role角色权限
copykubectl edit roles -n db role-1 # Please edit the object below. Lines beginning with a '#' will be ignored, # and an empty file will abort the edit. If an error occurs while saving this file will be # reopened with the relevant failures. # apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"rbac.authorization.k8s.io/v1","kind":"Role","metadata":{"annotations":{},"name":"role-1","namespace":"db"}} creationTimestamp: "2023-05-21T14:55:47Z" name: role-1 namespace: db resourceVersion: "16525" uid: 54f5b6aa-aab3-469d-bfbe-818ab90794d4 rules: - apiGroups: [""] resources: ["services"] verbs: ["get"]
按照要求修改yaml,创建role角色role-2
copykubectl create role role-2 -n db --resource=namespaces --verb=delete
最后创建rolebinding角色绑定,将新创建的角色role-2绑定到serviceaccount服务账号service-account-web上
copykubectl create rolebinding role-2-binding -n db --serviceaccount=db:service-account-web --role=role-2
注意:在不清楚命令行参数的时候,可以使用kubectl create role --help查看帮助文档
结果验证
copyroot@node01:/cks/net# kubectl describe rolebindings.rbac.authorization.k8s.io -n db Name: role-1-binding Labels: <none> Annotations: <none> Role: Kind: Role Name: role-1 Subjects: Kind Name Namespace ---- ---- --------- ServiceAccount service-account-web db Name: role-2-binding Labels: <none> Annotations: <none> Role: Kind: Role Name: role-2 Subjects: Kind Name Namespace ---- ---- --------- ServiceAccount service-account-web db
copyroot@node01:/cks/net# kubectl describe role -n db Name: role-1 Labels: <none> Annotations: <none> PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- services [] [] [get] Name: role-2 Labels: <none> Annotations: <none> PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- namespaces [] [] [delete]
5、日志审计 log audit
考题
解题思路
前往官网找一下所需要的yaml文件
位于Kubernetes文档 \ 任务 \ 监控、日志和调试 \ 集群故障排查 \ 审计
注意:参考文档https://kubernetes.io/docs/home/
,如果需要使用中文文档,在kubernetes.io/后面添加zh-cn/即可跳转。
copyapiVersion: audit.k8s.io/v1 # 这是必填项。 kind: Policy # 不要在 RequestReceived 阶段为任何请求生成审计事件。 omitStages: - "RequestReceived" rules: # 在日志中用 RequestResponse 级别记录 Pod 变化。 - level: RequestResponse resources: - group: "" # 资源 "pods" 不匹配对任何 Pod 子资源的请求, # 这与 RBAC 策略一致。 resources: ["pods"] # 在日志中按 Metadata 级别记录 "pods/log"、"pods/status" 请求 - level: Metadata resources: - group: "" resources: ["pods/log", "pods/status"] # 不要在日志中记录对名为 "controller-leader" 的 configmap 的请求。 - level: None resources: - group: "" resources: ["configmaps"] resourceNames: ["controller-leader"] # 不要在日志中记录由 "system:kube-proxy" 发出的对端点或服务的监测请求。 - level: None users: ["system:kube-proxy"] verbs: ["watch"] resources: - group: "" # core API 组 resources: ["endpoints", "services"] # 不要在日志中记录对某些非资源 URL 路径的已认证请求。 - level: None userGroups: ["system:authenticated"] nonResourceURLs: - "/api*" # 通配符匹配。 - "/version" # 在日志中记录 kube-system 中 configmap 变更的请求消息体。 - level: Request resources: - group: "" # core API 组 resources: ["configmaps"] # 这个规则仅适用于 "kube-system" 名字空间中的资源。 # 空字符串 "" 可用于选择非名字空间作用域的资源。 namespaces: ["kube-system"] # 在日志中用 Metadata 级别记录所有其他名字空间中的 configmap 和 secret 变更。 - level: Metadata resources: - group: "" # core API 组 resources: ["secrets", "configmaps"] # 在日志中以 Request 级别记录所有其他 core 和 extensions 组中的资源操作。 - level: Request resources: - group: "" # core API 组 - group: "extensions" # 不应包括在内的组版本。 # 一个抓取所有的规则,将在日志中以 Metadata 级别记录所有其他请求。 - level: Metadata # 符合此规则的 watch 等长时间运行的请求将不会 # 在 RequestReceived 阶段生成审计事件。 omitStages: - "RequestReceived"
根据题目要求修改位于master节点的/etc/kubernetes/logpolicy/sample-policy.yaml
,修改前建议备份配置文件到/tmp/
copy - level: RequestResponse resources: - group: "" resources: ["persistentvolumes"] - level: Request resources: - group: "" # core API 组 resources: ["configmaps"] namespaces: ["front-app"] - level: Metadata resources: - group: "" # core API 组 resources: ["secrets", "configmaps"] - level: Metadata omitStages: - "RequestReceived"
注意:仅在默认配置的后面添加即可,上面的内容不做修改
修改完配置后需要给apiserver按要求添加上日志审计功能,其配置文件在/etc/kubernetes/manifests/kube-apiserver.yaml
,修改前建议备份到/tmp/
copy - --audit-policy-file=/etc/kubernetes/logpolicy/sample-policy.yaml - --audit-log-path=/var/log/kubernetes/audit-logs.txt - --audit-log-maxage=10 - --audit-log-maxbackup=2
保存退出后等待apiserver重启,若重启失败则执行下面命令手动重启
copysystemctl daemon-relaod systemctl restart kubelet
结果验证
copytail -f /var/log/kubernetes/audit-logs.txt
6、创建 Secret
考题
解题思路
前往官网找一下相关指导
位于Kubernetes文档 \ 任务 \ 管理Secrets \ 使用kubectl管理Secret
注意:参考文档https://kubernetes.io/docs/home/
,如果需要使用中文文档,在kubernetes.io/后面添加zh-cn/即可跳转。
首先按照要求将db1-test的username、password解码后的内容写入到指定文件
copymkdir -p /cks/sec kubectl get secret -n istio-system db1-test -o jsonpath='{.data.username}' | base64 --decode > /cks/sec/user.txt kubectl get secret -n istio-system db1-test -o jsonpath='{.data.password}' | base64 --decode > /cks/sec/pass.txt
然后,创建db2-test
copykubectl create secret generic db2-test -n istio-system \ --from-literal=username=production-instance \ --from-literal=password='KvLftKgs4aVH'
最后,创建pod并挂在secret db2-test
前往官网找一下yaml
位于Kubernetes文档 \ 概念 \ 配置 \ Secret
注意:参考文档https://kubernetes.io/docs/home/
,如果需要使用中文文档,在kubernetes.io/后面添加zh-cn/即可跳转。
copyapiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod image: redis volumeMounts: - name: foo mountPath: "/etc/foo" readOnly: true volumes: - name: foo secret: secretName: mysecret optional: true
根据题目要求,修改yaml
copyapiVersion: v1 kind: Pod metadata: name: secret-pod namespace: istio-system spec: containers: - name: dev-container image: nginx volumeMounts: - name: secret-volume mountPath: "/etc/secret" volumes: - name: secret-volume secret: secretName: db2-test
结果验证
copycat /cks/sec/user.txt db1 cat /cks/sec/pass.txt hello kubectl exec -it -n istio-system secret-pod -- cat /etc/secret/username production-instance kubectl exec -it -n istio-system secret-pod -- cat /etc/secret/password KvLftKgs4aVH
7、Dockerfile 检测
考题
解题思路
修改Dockerfile
1、将CMD上面的USER root
修改为USER nobody
2、按照题目要求将基础镜像改为ubuntu:16.04
修改deployment.yaml
1、检查标签,确保文件中的标签是一致的
2、将securityContext
字段修改成{'capabilities': {'add': ['NET_BIND_SERVICE'], 'drop': ['all']}, 'privileged': False, 'readOnlyRootFilesystem': True, 'runAsUser': 65535}
结果验证
无需创建,检查文件内容是否修改成功即可
8、沙箱运行容器gvisor
考题
解题思路
前往官网找一下相关指导
位于Kubernetes文档 \ 概念 \ 容器运行时类(RuntimeClass)
注意:参考文档https://kubernetes.io/docs/home/
,如果需要使用中文文档,在kubernetes.io/后面添加zh-cn/即可跳转。
copy# RuntimeClass 定义于 node.k8s.io API 组 apiVersion: node.k8s.io/v1 kind: RuntimeClass metadata: # 用来引用 RuntimeClass 的名字 # RuntimeClass 是一个集群层面的资源 name: myclass # 对应的 CRI 配置的名称 handler: myconfiguration
根据题目要求,修改yaml后创建RuntimeClass
copy# RuntimeClass 定义于 node.k8s.io API 组 apiVersion: node.k8s.io/v1 kind: RuntimeClass metadata: # 用来引用 RuntimeClass 的名字 # RuntimeClass 是一个集群层面的资源 name: untrusted # 对应的 CRI 配置的名称 handler: runsc
创建成功后,修改namespace server下deployment以及pod的runtime类
copykubectl get deploy,pod -n server NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/busybox-run 1/1 1 1 289d deployment.apps/nginx-host 1/1 1 1 289d deployment.apps/run-test 1/1 1 1 289d NAME READY STATUS RESTARTS AGE pod/busybox-run-5fd8d6c8bf-ktm5z 1/1 Running 4 (7h42m ago) 289d pod/nginx-host-7755d5867d-wz2zn 1/1 Running 4 (7h42m ago) 289d pod/run-test-59d5845679-xmxh2 1/1 Running 4 (7h42m ago) 289d # 发现server下有3个deployment需要修改 kubectl edit deploy -n server busybox-run kubectl edit deploy -n server nginx-host kubectl edit deploy -n server run-test # 修改spec.sepc.runtimeClassRuntime参数为untrusted,和containers同级
结果验证
copykubectl get runtimeclasses.node.k8s.io NAME HANDLER AGE untrusted runsc 5m59s kubectl get deployment -n server -oyaml | grep -i runtimeclass runtimeClassName: untrusted runtimeClassName: untrusted runtimeClassName: untrusted
9、网络策略 NetworkPolicy
考题
解题思路
前往官网找一下所需要的yaml文件
位于Kubernetes文档 \ 概念 \ 服务、负载均衡和联网 \ 网络策略
注意:参考文档https://kubernetes.io/docs/home/
,如果需要使用中文文档,在kubernetes.io/后面添加zh-cn/即可跳转。
copyapiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: egress-namespaces spec: podSelector: matchLabels: app: myapp policyTypes: - Egress egress: - to: - namespaceSelector: matchExpressions: - key: namespace operator: In values: ["frontend", "backend"] ... ingress: - from: - namespaceSelector: matchLabels: user: alice podSelector: matchLabels: role: client ...
根据题目要求对yaml进行修改后创建
copyapiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: pod-restriction namespace: dev-team spec: podSelector: matchLabels: environment: testing # 上面的标签通过kubectl get po -n dev-team products-service --show-labels获取 policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: name: qaqa # 上面的标签通过kubectl get ns -n qaqa --show-labels获取 - podSelector: matchLabels: environment: testing
结果验证
copykubectl describe networkpolicy -n dev-team pod-restriction Name: pod-restriction Namespace: dev-team Created on: 2024-03-06 17:19:48 +0800 CST Labels: <none> Annotations: <none> Spec: PodSelector: environment=testing Allowing ingress traffic: To Port: <any> (traffic allowed to all ports) From: NamespaceSelector: name=qaqa From: PodSelector: environment=testing Not affecting egress traffic Policy Types: Ingress
10、Trivy 扫描镜像安全漏洞(重点记忆)
考题
解题思路
首先找到namespace kamino下的所有pod所使用的镜像
copykubectl describe po -n kamino | egrep "^Name:|Image:" Name: tri111 Image: amazonlinux:1 Name: tri222 Image: amazonlinux:2 Image: nginx:1.19 Name: tri333 Image: vicuu/nginx:host Image: amazonlinux:2 Name: tri444 Image: amazonlinux:2
使用trivy image -s HIGH,CRITICAL {image name} | grep Total
检查镜像漏洞
copytrivy image -s HIGH,CRITICAL amazonlinux:1 | grep Total trivy image -s HIGH,CRITICAL amazonlinux:2 | grep Total trivy image -s HIGH,CRITICAL nginx:1.19 | grep Total trivy image -s HIGH,CRITICAL vicuu/nginx:host | grep Total # 镜像太多也可使用for循环 for i in {amazonlinux:1,amazonlinux:2,nginx:1.19,vicuu/nginx:host}; do trivy image -s "HIGH,CRITICAL" $i >> 10-1.txt;done 或者 for i in `kubectl describe po -n kamino |grep Image:|awk '{print $2}'`;do trivy image -s HIGH,CRITICAl $i >> 10-2.txt ;done
删除漏洞pod
copykubectl delete po -n kamino {pod name} --force --grace-period=0
结果验证
此题耗时较长,可放到最后处理,不做验证。由于国内环境可能无法使用trivy,记住命令即可。
11、AppArmor(重点记忆)
考题
解题思路
前往官网找一下所需要的yaml文件
位于Kubernetes文档 \ 教程 \ 安全 \ 使用 AppArmor 限制容器对资源的访问
注意:参考文档https://kubernetes.io/docs/home/
,如果需要使用中文文档,在kubernetes.io/后面添加zh-cn/即可跳转。
首先,根据题目要求加在APPArmor配置文件
copy# 切换到指定节点 ssh node02 # 切换到配置文件目录 cd /etc/apparmor.d # 查看配置文件 cat nginx_apparmor #include <tunables/global> profile nginx-profile-3 flags=(attach_disconnected) { #include <abstractions/base> file, # Deny all file writes. deny /** w, } # 检查APPArmor是否使用nginx-profile-3 apparmor_status | grep nginx-profile-3 # grep没有查到,实施该配置 apparmor_parser nginx_apparmor # 检查是否已被实施 apparmor_status | grep nginx-profile-3 nginx-profile-3
注意:输入apparmor,使用tab会提示使用apparmor_status和apparmor_parser,记住这两个命令怎么用就行
然后,编辑yaml创建deployment
注意:deplotment配置文件不在前面的节点,而是在这个集群的初始节点,exit退回去
copy# 回到初始节点 exit # 切换到yaml目录 cd /cks/KSSH00401 # 编辑deployment配置文件,在metadata下添加`annotations`注解 # annotations: # container.apparmor.security.beta.kubernetes.io/podx: localhost/nginx-profile-3 # 其中podx为{.spec.containers.name} 的值,localhost/后面跟上前面APPArmor的执行文件名称 # 完整配置文件如下 apiVersion: v1 kind: Pod metadata: name: podx annotations: container.apparmor.security.beta.kubernetes.io/podx: localhost/nginx-profile-3 spec: containers: - image: busybox imagePullPolicy: IfNotPresent name: podx command: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 5h" ] resources: {} nodeName: node02 dnsPolicy: ClusterFirst restartPolicy: Always status: {} # 执行yaml创建deployment kubectl apply -f nginx-deploy.yaml
结果验证
copykubectl exec -it podx -- cat /proc/1/attr/current nginx-profile-3 (enforce)
12、Sysdig & falco(重点记忆)
考题
解题思路
此题使用falco和sysdig都可解决,但是falco需要修改配置文件,记忆难度大,sysdig虽然出问题,但是能解决,建议使用sysdig
copy# 切换到工具节点 ssh node02 # 查看container name crictl ps | grep redis d0758798db574 8135583d97feb 3 hours ago Running redis123 4 278335a60f333 redis123-c69bfccd9-grt94 # 查看socket路径 crictl info | grep sock "containerdEndpoint": "/run/containerd/containerd.sock", # 查看sysdig帮助 sysdig -h --cri <path> Path to CRI socket for container metadata Use the specified socket to fetch data from a CRI-compatible runtime -l, --list List the fields that can be used for filtering and output formatting. Use -lv to get additional information for each field. -M <num_seconds> Stop collecting after <num_seconds> reached. -p <output_format>, --print=<output_format> Specify the format to be used when printing the events. With -pc or -pcontainer will use a container-friendly format. With -pk or -pkubernetes will use a kubernetes-friendly format. With -pm or -pmesos will use a mesos-friendly format. See the examples section below for more info. # 查看命令格式 sysdig -l | grep time evt.time sysdig -l | grep user user.uid user.name sysdig -l | grep proc proc.name # 因为要求用户名和用户ID在一列显示,因此需要执行两遍 sysdig -M 30 -p %evt.time,%user.uid,%proc.name --cri /run/containerd/containerd.sock container.name=redis123 >> /opt/KSR00101/incidents/summary sysdig -M 30 -p %evt.time,%user.name,%proc.name --cri /run/containerd/containerd.sock container.name=redis123 >> /opt/KSR00101/incidents/summary # 如果执行失败,报错Segmentaion fault (core dumped) 重新执行命令 # 如果执行失败,报错"Unable to load the driver" sysdig-probe-loader # 如果仍报错,则重装sysdig apt install sysdig
结果验证
执行cat /opt/KSR00101/incidents/summary |head
由于此题过于费时,建议记住命令直接执行
13、Container 安全上下文
考题
解题思路
前往官网找一下所需要的yaml文件
位于Kubernetes文档 \ 任务 \ 配置Pods和容器 \ 为Pod或容器配置安全上下文
注意:参考文档https://kubernetes.io/docs/home/
,如果需要使用中文文档,在kubernetes.io/后面添加zh-cn/即可跳转。
根据要求,修改deployment配置
copykubectl edit deploy -n sec-ns secdep # 在{.spec.spec}下添加securityContext字段 securityContext: runAsUser: 30000 # 在{.spec.spec.containers}下添加,注意,containers下有两个镜像设置,都需要添加 securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true
结果验证
执行kubectl describe deploy -n sec-ns secdep
检查修改是否已生效
14、TLS 安全配置
考题
解题思路
前往官网找一下所需要的yaml文件
位于Kubernetes文档 \ 参考 \ 组件工具 \ kube-apiserver
注意:参考文档https://kubernetes.io/docs/home/
,如果需要使用中文文档,在kubernetes.io/后面添加zh-cn/即可跳转。
按照要求修改kube-apiserver的配置,位于master节点的/etc/kubernetes/manifests/kube-apiserver.yaml
copy# 切换到master节点 ssh master # 切换到配置文件目录 cd /etc/kubernetes/manifests # 备份配置文件 cp kube-apisever.yaml /tmp # 编辑kube-apiserver.yaml vi kube-apiserver.yaml #按题目要求添加 - --tls-cipher-suites=TLS_AES_128_GCM_SHA256 - --tls-min-version=VersionTLS13
然后,按照要求修改etcd配置,由于官方文档中并没有关于etcd的指导,因此需要记忆一下
copy# 备份配置文件 cp etcd.yaml /tmp # 编辑etcd.yaml vi etcd.yaml # 按题目要求添加,记忆点,相比apiserver,参数名删掉前缀tls- - --cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
结果验证
修改完配置后,apiserver以及etcd会自动重启,等待重启成功后检查集群状态
15、启用 API server 认证
考题
解题思路
前往官网找一下所需要的yaml文件
位于Kubernetes文档 \ 参考 \ 组件工具 \ kube-apiserver
注意:参考文档https://kubernetes.io/docs/home/
,如果需要使用中文文档,在kubernetes.io/后面添加zh-cn/即可跳转。
copy# 切换到master节点 ssh master # 切换到配置文件目录 cd /etc/kubernetes/manifests # 备份配置文件 cp kube-apisever.yaml /tmp # 编辑kube-apiserver.yaml vi kube-apiserver.yaml #按题目要求添加 - --authorization-mode=RBAC,Node - --enable-admission-plugins=NodeRestriction # 查看集群角色绑定关系system:anonymous kubectl get clusterrolebinding system:anonymous # 删除该集群角色绑定关系 kubectl delete clusterrolebinding system:anonymous
结果验证
执行kubectl get clusterrolebindings.rbac.authorization.k8s.io system:anonymous --kubeconfig=/etc/kubernetes/admin.conf
16、ImagePolicyWebhook 容器镜像扫描(重点记忆)
考题
解题思路
由于此题官方文档位置分散,且步骤不完全,建议重点记忆。
copy# 切换到master节点 su master # 切换用户 sudo -i # 切换到配置目录 cd /etc/kubernetes/epconfig # 编辑镜像扫描配置文件 vi admission_configuration.json # 将默认允许改成false "defaultAllow": false # 编辑kubeconfigfile vi kubeconfig.yml # 在{.clusters.cluster}下添加sever字段,与certificate-authority同级 server: https://image-bouncer-webhook.default.svc:1323/image_policy # 编辑apisever配置,添加镜像扫描策略,按照惯例先备份 cp /etc/kubernetes/manifests/kube-apiserver.yaml /tmp vi /etc/kubernetes/manifests/kube-apiserver.yaml - --enable-admission-plugins=NodeRestriction,ImagePolicyWebhook - --admission-control-config-file=/etc/kubernetes/epconfig/admission_configuration.json
结果验证
待apiserver重启完成后,执行指定yml后查看指定日志文件,检查是否有相关镜像扫描记录
copykubectl apply -f /root/KSSC00202/configuration.yml cat /var/log/imagepolicy/roadrunner.log
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构