CKS考试真题

1、kube-bench 修复不安全项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
linux@node1:~$ kubectl config use-context k8s
# 第⼀题四个步骤,修改kube-apiserver.yaml,修改etcd.yaml,修改kubeconfig.yaml,
重启⼀下服务
# 切换到master的root下
linux@node1:~$ ssh master
linux@master:~$ sudo -i
# 初始化脚本sh /root/init/bench.sh

root@master01:~$ cp /etc/kubernetes/manifests/kube-apiserver.yaml /tmp
root@master01:~$ cp /etc/kubernetes/manifests/etcd.yaml /tmp
root@master01:~$ cp /var/lib/kubelet/config.yaml /tmp

#1、 修改api-server中的 - --authorization-mode=
root@master:~$ vim /etc/kubernetes/manifests/kube-apiserver.yaml
- --authorization-mode=Node,RBAC
- --insecure-bind-address=0.0.0.0 #删除 insecure-bind-address。实际考试中,有可能本来就没写这行。

#2、修改kubelet
root@master:~$ vim /var/lib/kubelet/config.yaml
# anonymous 应该为 false,webhook 应该为 true。
anonymous:
enabled: false #将 true 改为 false
webhook:
enabled: true #修改为 true。
authorization:
mode: Webhook #修改 authorization 下的mode改为 Webhook

# 3、修改etcd
root@master:~$ vim /etc/kubernetes/manifests/etcd.yaml
- --client-cert-auth=true #修改为 true

# 4、重启
root@master:~$ systemctl daemon-reload
root@master:~$ systemctl restart kubelet
root@master01:~$ kubectl get pod -A # 确保所有的 pod 都是 Running, ⼀般 来说需要等3-5分钟恢复正常
exit,exit

参考链接:https://kubernetes.io/zh-cn/docs/reference/config-api/kubelet-config.v1beta1/

2、Pod 指定ServiceAccount

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
linux@node1:~$ kubectl config use-context KSCH00301
# 本题⼀共三个步骤, 创建sa、创建Pod、删除Pod
# 1、创建SA
linux@node1:~$ vim qa-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: backend-sa
namespace: qa
automountServiceAccountToken: false
linux@node1:~$ kubectl apply -f qa-sa.yaml
serviceaccount/abckend-sa created
linux@node1:~$ kubectl get sa -n qa
NAME SECRETS AGE
abckend-sa 0 10s
default 0 24d
test01 0 24d

# 2、创建Pod使⽤该sa
linux@node1:~$ vim /cks/sa/pod1.yaml
apiVersion: v1
kind: Pod
metadata:
name: backend
namespace: qa #注意命名空间是否正确
spec:
serviceAccountName: backend-sa # 修改使⽤刚刚创建的sa backend-sa(考试时,默
认已有这⼀⾏,需要修改。)
containers:
- image: nginx:1.9
imagePullPolicy: IfNotPresent
name: backend
linux@node1:~$ kubectl apply -f /cks/sa/pod1.yaml
linux@node1:~$ kubectl get pods -n qa
NAME READY STATUS RESTARTS AGE
backend 1/1 Running 0 117s
qatt 1/1 Running 3 (46m ago) 24d

# 3、删除qa中没有使⽤的SA
# 查看所有 sa,下图可以看到⼀共有 3 个 sa。
linux@node1:~$ kubectl get sa -n qa
# 查看已经在⽤的 sa,下图可以看到 default 和 backend-sa 都已经使⽤了。
linux@node1:~$ kubectl get pods -n qa -o yaml | grep -i ServiceAccountName
# 删除不⽤的SA
linux@node1:~$ kubectl delete sa test01 -n qa

参考链接:https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/

3、默认网络策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
linux@node1:~$ kubectl config use-context KSCS00101
linux@node1:~$ vim /cks/net/p1.yaml # 修改yaml⽂件
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: denypolicy # 修改name
namespace: testing # 添加namespace
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress #根据题目要求保留
linux@node1:~$ kubectl apply -f /cks/net/p1.yaml
linux@node1:~$ kubectl describe networkpolicy denypolicy -n testing

参考链接:https://kubernetes.io/docs/concepts/services-networking/network-policies/

4、RBAC - RoleBinding

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
linux@node1:~$ kubectl config use-context KSCH00201
# 此题四个步骤 编辑role-1、创建role-2 、创建role-2-binding 、检查
# 1、 编辑 role-1 权限:
linux@node1:~$ kubectl describe rolebinding -n db
linux@node1:~$ kubectl edit role role-1 -n db
……
rules: #模拟环境里要删除掉 null,然后添加以下内容。考试时,要根据实际情况修改。
- apiGroups: [""]
resources: ["services"]
#对 services 资源 get 操作权限。还可能会考对 endpoints 资源 list 的操作权限,或对 namespace 的 update 权限。
verbs: ["get"]
#这里也是要根据题目实际的要求写,比如题目要求 watch 权限,则这里就将 get 改成 watch。

#2、 在 db 命名空间,创建名为 role-2 的 role,只允许对 namespaces 做 delete 操作。
# 记住 --verb 是权限,可能考 delete 或者 update 等 --resource 是对象,可能考 namespaces 或者 persistentvolumeclaims 等。
linux@node1:~$ kubectl create role role-2 --verb=delete --resource=namesp
aces -n db

# 3、 通过 rolebinding 绑定 service-account-web
linux@node1:~$ kubectl create rolebinding role-2-binding --role=role-2 --
serviceaccount=db:service-account-web -n db
# 4、检查
linux@node1:~$ kubectl describe rolebinding -n db

参考链接:https://kubernetes.io/docs/reference/access-authn-authz/rbac/#role-and-clusterrole

5、⽇志审计 log audit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
linux@node1:~$ kubectl config use-context KSH
# 此题分为三个步骤、修改sample-policy.yaml 修改kube-apiserver.yaml 、检查
1、切换环境
linux@node1:~$ ssh master
linux@master:~$ sudo -i
root@master:~$ cp /etc/kubernetes/logpolicy/sample-policy.yaml /tmp
root@master:~$ cp /etc/kubernetes/manifests/kube-apiserver.yaml /tmp

# 2、配置审计策略
root@master:~$ vim /etc/kubernetes/logpolicy/sample-policy.yaml
# Please do not delete the above rule content, you can continue to add it below.
# 考试的时候上⾯这⼀⾏不要动,从下⾯开始写新的规则
# 这四个level参考上⾯图⽚⾥⾯的内容
- level: RequestResponse
resources:
- group: ""
resources: ["persistentvolumes"]

- level: Request
resources:
- group: ""
resources: ["configmaps"]
namespaces: ["front-apps"]

- level: Metadata
resources:
- group: ""
resources: ["secrets", "configmaps"]

- level: Metadata
omitStages:
- "RequestReceived"

# 3、配置master节点的kube-apiserver.yaml
root@master:~$ vim /etc/kubernetes/manifests/kube-apiserver.yaml
- --audit-policy-file=/etc/kubernetes/logpolicy/sample-policy.yaml # 定义审计策略 yaml ⽂件位置,通过 hostpath 挂载
- --audit-log-path=/var/log/kubernetes/audit-logs.txt #定义审计⽇志位置,通过 hostpath 挂载
- --audit-log-maxage=10 # 定义保留旧审计⽇志⽂件的最⼤天数为 10 天
- --audit-log-maxbackup=2 #定义要保留的审计日志文件的最大数量为2个

# 4、等待api-server⾃动重启,且恢复正常
root@master:~$ systemctl daemon-reload
root@master:~$ systemctl restart kubelet # 等待两分钟
root@master:~$ kubectl get pods -A
root@master:~$ tail /var/log/kubernetes/audit-logs.txt # 看到有内容输出就说明做对了
exit
exit

参考链接:https://kubernetes.io/docs/tasks/debug/debug-cluster/audit/#audit-policy

6、创建Secret

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 此题⼀共四个步骤、将信息写⼊user.txt和pass.txt、创建secret、创建pod使⽤sercret
#1、将db1-test 的username和password,通过base64解码保存到题⽬指定⽂件中
linux@node1:~$ kubectl get secrets db1-test -n istio-system -o yaml
linux@node1:~$ echo 'ZGIx' | base64 -d > /cks/sec/user.txt
linux@node1:~$ echo 'aGVsbG8=' | base64 -d > /cks/sec/pass.txt
linux@node1:~$ cat /cks/sec/user.txt
db1linux@node1:~$ cat /cks/sec/pass.txt
hellolinux@node1:~$

# 2、创建名为 db2-test的secret使⽤题⽬要求的⽤户名和密码作为键值(注意要加命名空间.注意,如果密码中有特殊字符(例如:$,\,*,= 和 !),需要加单引号来转义--from-literal=password='G!Y\*d$zDsb'这样。)
linux@node1:~$ kubectl create secret generic db2-test -n istio-system
--from-literal=username=production-instance --from-literal=password=KvLftKgs4aVH
linux@node1:~$ kubectl get secret -n istio-system
NAME TYPE DATA AGE
db1-test Opaque 2 24d
db2-test Opaque 2 42s

# 3、根据题⽬要求,参考官⽹,创建pod使⽤该sercret
linux@node1:~$ vim k8s-secret.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

linux@node1:~$ kubectl apply -f k8s-secret.yaml
pod/secret-pod created

# 4、检查
linux@node1:~$ kubectl get pod -n istio-system
NAME READY STATUS RESTARTS AGE
secret-pod 1/1 Running 0 21s

参考链接:https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/

7、Dockerfile检测

1
2
3
4
5
6
7
8
9
10
11
12
13
linux@node1:~$ kubectl config use-context KSSC
# 1、修改dockerfile⽂件
linux@node1:~$ vim /cks/docker/Dockerfile
FROM ubuntu:22.04 #修改基础镜像为题目要求的 ubuntu:22.04
USER nobody #18⾏的root改为nobody

# 2、修改deployment.yaml⽂件
linux@node1:~$ vim /cks/docker/deployment.yaml
# 需要将不同于另外两个的 run: couchdb 修改为 app: couchdb
app: couchdb
# 确保 'privileged': 为 False ,确保'readonlyRootFilesystem': 为 True,确保'runAsUser': 为 65535
securityContext:
{'capabilities': {'add': ['NET_BIND_SERVICE'], 'drop': ['all']}, 'privileged': False, 'readOnlyRootFilesystem': True, 'runAsUser': 65535}

参考链接:https://kubernetes.io/docs/concepts/security/pod-security-standards/

8、沙箱运⾏容器gVisor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
linux@node1:~$ kubectl config use-context KSMV
# 此题分为三步,创建runtimeclass,引⽤runtimeclass、检查
1 、创建RuntimeClass
linux@node1:~$ vim /cks/gVisor/rc.yaml
apiVersion: node1.k8s.io/v1
kind: RuntimeClass
metadata:
name: untrusted # ⽤来引⽤RuntimeClass的名字,RuntimeClass 是⼀个集群层⾯的资源
handler: runsc # 添加对应的CRI配置名称
linux@node1:~$ kubectl apply -f /cks/gVisor/rc.yaml
linux@node1:~$ kubectl get RuntimeClass
NAME HANDLER AGE
untrusted runsc 4m32s

# 2、将命名空间为 server 下的 Pod 引⽤ RuntimeClass
# 考试时,3 个 Deployment 下有 3 个 Pod,修改 3 个 deployment 即可。
linux@node1:~$ kubectl get deploy -n server
NAME READY UP-TO-DATE AVAILABLE AGE
busybox-run 1/1 1 1 26d
nginx-host 1/1 1 1 26d
run-test 1/1 1 1 26d
# 以下3个deployment都要修改
linux@node1:~$ kubectl edit deploy busybox-run -n server
linux@node1:~$ kubectl edit deploy nginx-host -n server
linux@node1:~$ kubectl edit deploy run-test -n server
spec:
runtimeClassName: untrusted # 在第⼆个spec下⾯增加这⼀⾏,增加完会跑到下⾯去
containers:
# 3、检查
linux@node1:~$ kubectl get deploy -n server -o yaml | grep runtime

参考链接:https://kubernetes.io/docs/concepts/containers/runtime-class/

9、⽹络策略NetworkPolicy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
linux@node1:~$ kubectl config use-context KSS
# 此题分为两个步骤,查信息,创建networkpolicy
# 1、检查namespace标签
linux@node1:~$ kubectl get ns --show-labels # 查看名称空间的标签
linux@node1:~$ kubectl get pods -n dev-team --show-labels # 查看pod标签
NAME READY STATUS RESTARTS AGE LABELS
products-service 1/1 Running 3 (17h ago) 26d environment=testing
#没有打标签的话可以参考下⾯命令
# kubectl label ns qaqa name=qaqa
# kubectl label pod products-service environment=testing -n dev-team

# 2、创建networkpolicy
linux@node1:~$ vim /cks/net/po.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: pod-restriction # 修改名字
namespace: dev-team # 修改名称空间
spec:
podSelector:
matchLabels:
environment: testing # ⽬标pod kubectl get pods -n dev-team --showlabels 查出来的标签
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: qaqa # 匹配带qaqa的名称空间
- from: # 新加⼀个from
- namespaceSelector: {}
podSelector:
matchLabels:
environment: testing # 匹配所有带testing标签的pod
linux@node1:~$ kubectl apply -f /cks/net/po.yaml
linux@node1:~$ kubectl get networkpolicy -n dev-team
NAME POD-SELECTOR AGE
pod-restriction environment=testing 2m42s

参考链接:https://kubernetes.io/docs/concepts/services-networking/network-policies/

10、Trivy 扫描镜像安全漏洞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 考试时按照这个来: 模拟环境很慢,因为需要连接国外的服务器,考试的时候没有这个慢
# 此题为三。 查镜像,扫镜像,删pod
linux@node1:~$ kubectl config use-context KK
linux@node1:~$ ssh master
# 在下⾯四个pod中使⽤了四个镜像amazonlinux:1 amazonlinux:2
# nginx:1.19 vicuu/nginx:host 如果扫描出来的镜像有问题的就删除对应的pod ⽐如amazonlinux:2有问题 那234都需要删除
#1、查镜像
linux@master:~$ kubectl get pod -n kamino --output=custom-column
s="NAME:.metadata.name,IMAGE:.spec.containers[*].image"
NAME IMAGE
tri111 amazonlinux:1
tri222 amazonlinux:2,nginx:1.19
tri333 vicuu/nginx:host,amazonlinux:2
tri444 amazonlinux:2

#2、检查镜像是否有高危和严重的漏洞
linux@master:~$ for i in {amazonlinux:1,amazonlinux:2,nginx:1.19,vicuu/nginx:host}; do trivy image -s "HIGH,CRITICAL" $i >> 10.txt;done

#3、删除有问题的 pod
linux@master:~$ cat 10.txt |grep -iB3 total # 看HIGH和CRITICAL 是不是0 是就代表没有,不是就代表有需要删除
linux@master:~$ kubectl delete pod -n kamino tri222

参考链接:https://kubernetes.io/docs/reference/kubectl/quick-reference/

11、AppArmor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 此题为三步,到node2上去启⽤apparmor 退到node1上修改并应⽤ 检查
linux@node1:~$ kubectl config use-context KSSH
linux@node1:~$ ssh node2
linux@node2:~$ sudo -i

1、切换到/etc/apparmor.d/下启⽤apparmor
root@node2:~$ cd /etc/apparmor.d/
root@node2:/etc/apparmor.d$ cat nginx_apparmor
#include <tunables/global>
profile nginx-profile-3 flags=(attach_disconnected) {#nginx-profile-3就是这
个配置⽂件的名字
#include <abstractions/base>
file,
# Deny all file writes.
deny /** w,
}
#执⾏ apparmor 策略模块
root@node2:/etc/apparmor.d$ apparmor_parser /etc/apparmor.d/nginx_apparmor
root@node2:/etc/apparmor.d$ apparmor_status | grep nginx-profile-3

#2、修改pod⽂件
#注意!注意!考试时,这个文件是在默认登录的终端那个初始节点上的,而不是在这个 work 节点的。
root@node2:/etc/apparmor.d$ exit
linux@node2:~$ exit
linux@node1:~$ vim /cks/KSSH00401/nginx-deploy.yaml

annotations:
container.apparmor.security.beta.kubernetes.io/podx: localhost/nginx-profile-3

linux@node1:~$ kubectl apply -f /cks/KSSH00401/nginx-deploy.yaml
pod/podx created
# 可以验证⼀下
linux@node1:~$ kubectl get pod
NAME READY STATUS RESTARTS AGE
podx 1/1 Running 0 99s
redis123-56c7cd579-wzk9f 1/1 Running 3 (38m ago) 26d

3、检查
# 可以通过检查该配置⽂件的 proc attr 来验证容器是否实际使⽤该配置⽂件运⾏:
linux@node1:~$ kubectl exec podx -- cat /proc/1/attr/current
nginx-profile-3 (enforce) # 看到这个表示作对了

参考链接:https://kubernetes.io/zh-cn/docs/tutorials/security/apparmor/

1 2 、 S y s d i g & f alc o

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 推荐使⽤sysdig falco使⽤起来更加麻烦,就两个步骤,扫描和查看⽂件
linux@node1:~$ kubectl config use-context KSSC00401
linux@node1:~$ ssh node2
linux@node2:~$ sudo -i
root@node2:~$ crictl ps | grep redis123
root@node2:~$ crictl info | grep sock # 找到 containerd 的 socke
"containerdEndpoint": "/run/containerd/containerd.sock",

root@node2:~$ sysdig -M 30 -p "%evt.time,%user.name,%proc.name" --cri /ru
n/containerd/containerd.sock container.name=redis123 >> /opt/KSR00101/inci
dents/summary

root@node2:~$ sysdig -M 30 -p "%evt.time,%user.uid,%proc.name" --cri /run/
containerd/containerd.sock container.name=redis123 >> /opt/KSR00101/incidents/summary

root@node2:~$ cat /opt/KSR00101/incidents/summary
exit
exit

# 注意:如果考试时执⾏ sysdig 报错“Unable to load the driver”,则执⾏下⾯⼀条命令:(模拟环境⾥不需要执⾏)
#启⽤模块
# sysdig-probe-loader
# 然后再次执⾏ sysdig -M 30 ……
# 如果还是报错,就重装⼀下 sysdig,命令为 apt install sysdig

13、Container安全上下文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 此题分为两步,编辑deploy和检查
linux@node1:~$ kubectl config use-context KSMV
#1、编辑deploy
linux@node1:~$ kubectl edit deploy secdep -n sec-ns
# 请注意,考试和模拟环境中,先检查 spec 下⾯(与 containers:同级别字段)是否有 securityContext: {},如果有则可以直接修改即可。否则重复添加是不⽣效的。
template:
metadata:
creationTimestamp: null
labels:
app: secdep
spec:
containers:
- command:
- sh
- -c
- sleep 12h
image: busybox:1.28
imagePullPolicy: IfNotPresent
name: sec-ctx-demo-1 # 在name下增加以下三⾏
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
- command:
- sh
- -c
- sleep 12h
image: busybox
imagePullPolicy: IfNotPresent
name: sec-ctx-demo-2 # 在name下增加以下三⾏
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: #修改这一行,注意要删除{}。如果考试时没有搜到,则新增这一行。
runAsUser: 30000
terminationGracePeriodSeconds: 30

#2、检查
linux@node1:~$ kubectl get deploy secdep -n sec-ns -o yaml | grep -i2 securityContext

参考链接:https://kubernetes.io/docs/tasks/configure-pod-container/security-context/

14、TLS安全配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 两个步骤 修改kube-apiserver.yaml 修改etcd.yaml
linux@node1:~$ kubectl config use-context KSRS
# 切换到master的root下
linux@node1:~$ ssh master
linux@master:~$ sudo -i
#1、修改kube-apiserver
# 修改之前先备份,不要备份到/etc/kubernetes/下,会导致异常
root@master:~$ cp /etc/kubernetes/manifests/kube-apiserver.yaml /tmp
root@master:~$ vim /etc/kubernetes/manifests/kube-apiserver.yaml
# 在RBAC⾏下加⼊以下两⾏ 建议⽤paste粘贴模式
# 如果题⽬要求 TLS 1.2,则就写 VersionTLS12
- --tls-cipher-suites=TLS_AES_128_GCM_SHA256
- --tls-min-version=VersionTLS13

# 2、修改etcd
# 修改之前先备份⽂件
root@master:~$ cp /etc/kubernetes/manifests/etcd.yaml /tmp
root@master:~$ vim /etc/kubernetes/manifests/etcd.yaml
- --cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 # 在crt下⾯的⼀⾏添加或修改这⼀⾏

# 3、等待 etcd ⾃动重启,且恢复正常。
root@master:~$ systemctl daemon-reload
root@master:~$ systemctl restart kubelet
# 修改完成后,需要等待 5 分钟,等集群应⽤策略后,再检查⼀下所有 pod,特别是 etcd 和 kube-apiserver 两个 pod,确保模拟环境是正常的。
root@master:~$ kubectl get pod -n kube-system
root@master:~$ exit
linux@master:~$ exit

参考链接:https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/kube-apiserver/

15、启⽤API server认证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
root@master:~# kubectl config use-context KSCF
# 此题两个步骤, 修改kube-apiserver.yaml 删除clusterrolebinding
linux@node1:~$ ssh master
linux@master:~$ sudo -i
# 请先执⾏如下命令,模拟这道题的初始环境。实际考试时,不需要执⾏的。
# 脚本在 master 的/root ⽬录下。
# root@master:~# sh init/api.sh
#1、确保只有认证并且授权过的 REST 请求才被允许 修改kube-apiserver.yaml
root@master:~$ cp /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/
root@master:~$ vim /etc/kubernetes/manifests/kube-apiserver.yaml
修改为
- --authorization-mode=Node,RBAC
- --enable-admission-plugins=NodeRestriction
- --anonymous-auth=false

# 2、等待 apiserver ⾃动重启,且恢复正常。
root@master:~$ systemctl daemon-reload
root@master:~$ systemctl restart kubelet
root@master:~$ kubectl get pods -A --kubeconfig=/etc/kubernetes/admin.conf

#4、删除题⽬要求的⻆⾊绑定
root@master:~$ kubectl get clusterrolebinding system:anonymous --kubeconfig=/etc/kubernetes/admin.conf
root@master:~$ kubectl delete clusterrolebinding system:anonymous --kubeconfig=/etc/kubernetes/admin.conf
clusterrolebinding.rbac.authorization.k8s.io "system:anonymous" deleted

root@master:~$ kubectl get clusterrolebinding system:anonymous --kubeconfig=/etc/kubernetes/admin.conf
Error from server (NotFound): clusterrolebindings.rbac.authorization.k8s.i
o "system:anonymous" not found
root@master:~$ exit
linux@master:~$ exit
linux@node1:~$

参考链接:https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/kube-apiserver/

16、ImagePolicyWebhook容器镜像扫描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 此题 四个步骤, 改json、改kubeconfig.yaml,添加server、改kube-apiserver.yaml、部署
linux@node1:~$ kubectl config use-context KSSH
#切换到master的root下
linux@node1:~$ ssh master
linux@master:~$ sudo -i
# 请先执⾏如下命令,模拟这道题的初始环境。实际考试时,不需要执⾏的。
# root@master:~# sh /root/init/image.sh
# 1、编辑 admission_configuration.json(题⽬会给这个⽬录),修改 defaultAllow 为false
root@master:~$ vim /etc/kubernetes/epconfig/admission_configuration.json
"denyTTL": 50,
"retryBackoff": 500,
"defaultAllow": false #将true改为false

#2、编辑kubeconfig.yml,添加 webhook server 地址:
root@master:~$ vim /etc/kubernetes/epconfig/kubeconfig.yml
certificate-authority: /etc/kubernetes/epconfig/server.crt
server: https://image-bouncer-webhook.default.svc:1323/image_policy #在name前面添加webhook server地址
name: bouncer_webhook

# 3、编辑 kube-apiserver.yaml,从官⽹中引⽤ ImagePolicyWebhook 的配置信息:
root@master01:~$ cp /etc/kubernetes/manifests/kube-apiserver.yaml /tmp
root@master01:~$ vim /etc/kubernetes/manifests/kube-apiserver.yaml
# ImagePolicyWebhook 在⾏尾添加
- --enable-admission-plugins=NodeRestriction,ImagePolicyWebhook
# 添加⼀⾏
- --admission-control-config-file=/etc/kubernetes/epconfig/admission_configuration.json

# 4、等待 apiserver 自动重启,且恢复正常
root@master:~$ systemctl daemon-reload
root@master:~$ systemctl restart kubelet
root@master:~$ kubectl get pod -n kube-system
root@master:~$ kubectl apply -f /cks/img/web1.yaml
不允许创建

参考链接:https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/