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目录下。
kube-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
目录下。
kube-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
,根据题目中的问题项编号,查看修复建议。
kube-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/即可跳转。
apiVersion: v1
kind: ServiceAccount
metadata:
name: backend-sa
namespace: qa
automountServiceAccountToken: false
创建成功后,修改/cks/sa/pod1.yaml
并创建pod
apiVersion: v1
kind: Pod
metadata:
name: backend
namespace: qa
spec:
serviceAccountName: backend-sa
containers:
- image: nginx:1.9
imagePullPolicy: IfNotPresent
name: backend
最后,删除未被使用的ServiceAccount
kubectl get po -n qa -oyaml | grep -i serviceaccount
kubectl get sa -n qa
kubectl delete sa -n qa test01
结果验证
kubectl 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/即可跳转。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
根据题目要求修改yaml
apiVersion: 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服务账号
kubectl describe po -n db web-pod
...
Service Account: service-account-web
...
然后执行kubectl describe robebinding -n db role-1-binding
,检查serviceaccount服务账号是否已绑定的role角色
kubectl 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/即可跳转。
apiVersion: 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角色权限
kubectl 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
kubectl create role role-2 -n db --resource=namespaces --verb=delete
最后创建rolebinding角色绑定,将新创建的角色role-2绑定到serviceaccount服务账号service-account-web上
kubectl create rolebinding role-2-binding -n db --serviceaccount=db:service-account-web --role=role-2
注意:在不清楚命令行参数的时候,可以使用kubectl create role --help查看帮助文档
结果验证
root@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
root@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/即可跳转。
apiVersion: 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/
- 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/
- --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重启,若重启失败则执行下面命令手动重启
systemctl daemon-relaod
systemctl restart kubelet
结果验证
tail -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解码后的内容写入到指定文件
mkdir -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
kubectl 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/即可跳转。
apiVersion: 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
apiVersion: 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
结果验证
cat /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/即可跳转。
# RuntimeClass 定义于 node.k8s.io API 组
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
# 用来引用 RuntimeClass 的名字
# RuntimeClass 是一个集群层面的资源
name: myclass
# 对应的 CRI 配置的名称
handler: myconfiguration
根据题目要求,修改yaml后创建RuntimeClass
# 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类
kubectl 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同级
结果验证
kubectl 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/即可跳转。
apiVersion: 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进行修改后创建
apiVersion: 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
结果验证
kubectl 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所使用的镜像
kubectl 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
检查镜像漏洞
trivy 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
kubectl 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配置文件
# 切换到指定节点
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退回去
# 回到初始节点
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
结果验证
kubectl exec -it podx -- cat /proc/1/attr/current
nginx-profile-3 (enforce)
12、Sysdig & falco(重点记忆)
考题
解题思路
此题使用falco和sysdig都可解决,但是falco需要修改配置文件,记忆难度大,sysdig虽然出问题,但是能解决,建议使用sysdig
# 切换到工具节点
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配置
kubectl 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
# 切换到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的指导,因此需要记忆一下
# 备份配置文件
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/即可跳转。
# 切换到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 容器镜像扫描(重点记忆)
考题
解题思路
由于此题官方文档位置分散,且步骤不完全,建议重点记忆。
# 切换到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后查看指定日志文件,检查是否有相关镜像扫描记录
kubectl apply -f /root/KSSC00202/configuration.yml
cat /var/log/imagepolicy/roadrunner.log
标签:kubectl,io,kubernetes,--,必过,yaml,CKS,name
From: https://www.cnblogs.com/dingcong1201/p/18060444