赞
踩
Context
针对 kubeadm 创建的 cluster 运行 CIS 基准测试工具时,发现了多个必须立即解决的问题。
Task
通过配置修复所有问题并重新启动受影响的组件以确保新的设置生效。
修复针对 API 服务器发现的所有以下违规行为:
1.2.7 Ensure that the --authorization-mode argument is not set to AlwaysAllow FAIL
1.2.8 Ensure that the --authorization-mode argument includes Node FAIL
1.2.9 Ensure that the --authorization-mode argument includes RBAC FAIL
1.2.18 Ensure that the --insecure-bind-address argument is not set FAIL (v1.28 考题中这项没给出,但最好也检查一下,模拟环境是里需要改的)
修复针对 kubelet 发现的所有以下违规行为:
Fix all of the following violations that were found against the kubelet:
4.2.1 Ensure that the anonymous-auth argument is set to false FAIL
4.2.2 Ensure that the --authorization-mode argument is not set to AlwaysAllow FAIL
注意:尽可能使用 Webhook 身份验证/授权。
修复针对 etcd 发现的所有以下违规行为:
Fix all of the following violations that were found against etcd:
2.2 Ensure that the --client-cert-auth argument is set to true FAIL
模拟环境里,初始化这道题的脚本为 kube-bench.sh
- candidate@node01:~$ ssh master01
- candidate@master01:~$ sudo -i
- root@master01:~$ sh kube-bench.sh //模拟这道题的初始环境
- root@master01:~$ mkdir bak1
- root@master01:~$ cp /etc/kubernetes/manifests/kube-apiserver.yaml bak1/
- root@master01:~$ cp /etc/kubernetes/manifests/etcd.yaml bak1/
- root@master01:~$ cp /var/lib/kubelet/config.yaml bak1/
- root@master01:~$ vim /etc/kubernetes/manifests/kube-apiserver.yaml
- - --authorization-mode=Node,RBAC
- #删除 insecure-bind-address。实际考试中,有可能本来就没写这行。
- - --insecure-bind-address=0.0.0.0
-
- root@master01:~$ vim /var/lib/kubelet/config.yaml
- # anonymous 应该为 false,webhook 应该为 true。
- anonymous:
- enabled: false #将 true 改为 false
- webhook:
- enabled: true #修改为 true。
-
- authorization: #修改 authorization 下的
- mode: Webhook #改为 Webhook
-
- root@master01:~$ vim /etc/kubernetes/manifests/etcd.yaml
- - --client-cert-auth=true #修改为 true
-
- root@master01:~$ systemctl daemon-reload
- root@master01:~$ systemctl restart kubelet
- root@master01:~$ kubectl get pod -A # 确保所有的 pod 都是 Running
- exit,exit
Context
您组织的安全策略包括:
ServiceAccount 不得自动挂载 API 凭据
ServiceAccount 名称必须以“-sa”结尾
清单文件 /cks/sa/pod1.yaml 中指定的 Pod 由于 ServiceAccount 指定错误而无法调度。
请完成一下项目:
Task
在现有 namespace qa 中创建一个名为 backend-sa 的新 ServiceAccount,确保此 ServiceAccount 不自动挂载 API 凭据。
使用 /cks/sa/pod1.yaml 中的清单文件来创建一个 Pod。
最后,清理 namespace qa 中任何未使用的 ServiceAccount。
- ## 搜sa 全称configure-service-account
- candidate@node01:~$ vim qa-ns.yaml
- apiVersion: v1
- kind: ServiceAccount
- metadata:
- name: backend-sa #修改 name
- namespace: qa #注意添加 namespace
- automountServiceAccountToken: false #修改为 false,表示不自动挂载 secret
- candidate@node01:~$ kubectl apply -f qa-ns.yaml
- candidate@node01:~$ kubectl get sa -n qa
- NAME SECRETS AGE
- backend-sa 0 58s
- candidate@node01:~$ vi /cks/sa/pod1.yaml
- ……
- metadata:
- name: backend
- namespace: qa #注意命名空间是否对
- spec:
- serviceAccountName: backend-sa # 没有则添加一行,有则修改这一行
- containers:
- ……
- candidate@node01:~$ kubectl apply -f /cks/sa/pod1.yaml
- candidate@node01:~$ kubectl get pod -n qa
- NAME READY STATUS RESTARTS AGE
- backend 1/1 Running 0 8s
- # 查看所有 sa,下图可以看到一共有 3 个 sa。
- candidate@node01:~$ kubectl get sa -n qa
- # 查看已经在用的 sa,可以看到 default 和 backend-sa 都已经使用了。
- candidate@node01:~$ kubectl get pod -n qa -o yaml | grep -i serviceAccountName
- # 删除不用的 sa
- candidate@node01:~$ kubectl delete sa test01 -n qa
Context
一个默认拒绝(default-deny)的 NetworkPolicy 可避免在未定义任何其他 NetworkPolicy 的 namespace 中意外公开 Pod。
Task
为所有类型为 Ingress+Egress 的流量在 namespace testing 中创建一个名为 denypolicy 的新默认拒绝 NetworkPolicy。 此新的 NetworkPolicy 必须拒绝 namespace testing 中的所有的 Ingress + Egress 流量。 将新创建的默认拒绝 NetworkPolicy 应用与在 namespace testing 中运行的所有 Pod。
你可以在 /cks/net/p1.yaml 找到一个模板清单文件。
- ## 搜networkpolicy
- candidate@node01:~$ vi /cks/net/p1.yaml
- apiVersion: networking.k8s.io/v1
- kind: NetworkPolicy
- metadata:
- name: denypolicy #修改 name
- namespace: testing #注意添加 namespace
- spec:
- podSelector: {}
- policyTypes:
- - Ingress
- - Egress #根据题目要求保留
- candidate@node01:~$ kubectl apply -f /cks/net/p1.yaml
- candidate@node01:~$ kubectl describe networkpolicy denypolicy -n testing
Context
绑定到 Pod 的 ServiceAccount 的 Role 授予过度宽松的权限。完成以下项目以减少权限集。
Task
一个名为 web-pod 的现有 Pod 已在 namespace db 中运行。
编辑绑定到 Pod 的 ServiceAccount service-account-web 的现有 Role,仅允许只对 services 类型的资源执行 get 操作。 在 namespace db 中创建一个名为 role-2 ,并仅允许只对 namespaces 类型的资源执行 delete 操作的新 Role。 创建一个名为 role-2-binding 的新 RoleBinding,将新创建的 Role 绑定到 Pod 的 ServiceAccount。
注意:请勿删除现有的 RoleBinding。
- ## 搜RBAC
- candidate@node01:~$ kubectl describe rolebindings -n db
- candidate@node01:~$ kubectl edit role role-1 -n db
- ……
- rules: #模拟环境里要删除掉 null,然后添加以下内容。考试时,要根据实际情况修改。
- - apiGroups: [""]
- resources: ["services"]
- #对 services 资源 get 操作权限。还可能会考对 endpoints 资源 list 的操作权限,或对 namespace 的 update 权限。
- verbs: ["get"]
- #这里也是要根据题目实际的要求写,比如题目要求 watch 权限,则这里就将 get 改成 watch。
- candidate@node01:~$ kubectl create role -h
- candidate@node01:~$ kubectl create role role-2 --verb=delete --resource=namespaces -n db
- ## 记住 --verb 是权限,可能考 delete 或者 update 等 --resource 是对象,可能考 namespaces 或者 persistentvolumeclaims 等。
- candidate@node01:~$ kubectl create rolebinding -h
- candidate@node01:~$ kubectl create rolebinding role-2-binding --role=role-2 --serviceaccount=db:service-account-web -n db
- candidate@node01:~$ kubectl describe rolebindings -n db
- candidate@node01:~$ kubectl describe role -n db
Task
在 cluster 中启用审计日志。为此,请启用日志后端,并确保:
/etc/kubernetes/logpolicy/sample-policy.yaml 提供了基本策略。它仅指定不记录的内容。
注意:基本策略位于 cluster 的 master 节点上。
编辑和扩展基本策略以记录:
此外,添加一个全方位的规则以在 Metadata 级别记录所有其他请求。
注意:不要忘记应用修改后的策略。
模拟环境里,初始化这道题的脚本为 log-audit.sh
- candidate@node01:~$ ssh master01
- candidate@master01:~$ sudo -i
- root@master01:~$ sh log-audit.sh
- root@master01:~$ cp /etc/kubernetes/logpolicy/sample-policy.yaml bak1/
- root@master01:~$ vim /etc/kubernetes/logpolicy/sample-policy.yaml
- # 搜audit
- rules:
- # namespaces changes at RequestResponse level
- - level: RequestResponse
- resources:
- - group: ""
- resources: ["persistentvolumes"] #根据题目要求修改,比如题目要求的是 namespaces。
- #the request body of persistentvolumes/pods changes in the namespace front-apps
- - level: Request
- resources:
- - group: ""
- resources: ["configmaps"] #根据题目要求修改,比如题目要求的是 persistentvolumes 或者 pods。
- namespaces: ["front-apps"]
- - level: Metadata
- resources:
- - group: ""
- resources: ["secrets", "configmaps"]
- # Also, add a catch-all rule to log all other requests at the Metadata level.
- - level: Metadata
- omitStages:
- - "RequestReceived"
- root@master01:~$ cp /etc/kubernetes/manifests/kube-apiserver.yaml /bak1
- root@master01:~$ vi /etc/kubernetes/manifests/kube-apiserver.yaml
- #定义审计策略 yaml 文件位置,通过 hostpath 挂载
- - --audit-policy-file=/etc/kubernetes/logpolicy/sample-policy.yaml
- #定义审计日志位置,通过 hostpath 挂载
- - --audit-log-path=/var/log/kubernetes/audit-logs.txt
- #定义保留旧审计日志文件的最大天数为 10 天
- - --audit-log-maxage=10
- #定义要保留的审计日志文件的最大数量为 2 个
- - --audit-log-maxbackup=2
- root@master01:~$ systemctl daemon-reload
- root@master01:~$ systemctl restart kubelet
- root@master01:~$ kubectl get pod -A
- root@master01:~$ tail /var/log/kubernetes/audit-logs.txt
- exit,exit
Task
在 namespace istio-system 中获取名为 db1-test 的现有 secret 的内容
将 username 字段存储在名为 /cks/sec/user.txt 的文件中,并将 password 字段存储在名为 /cks/sec/pass.txt 的文件中。
注意:你必须创建以上两个文件,他们还不存在。
注意:不要在以下步骤中使用/修改先前创建的文件,如果需要,可以创建新的临时文件。
在 istio-system namespace 中创建一个名为 db2-test 的新 secret,内容如下:
username : production-instance
password : KvLftKgs4aVH
最后,创建一个新的 Pod,它可以通过卷访问 secret db2-test :
Pod 名称 secret-pod
Namespace istio-system
容器名 dev-container
镜像 nginx
卷名 secret-volume
挂载路径 /etc/secret
- candidate@node01:~$ kubectl get secrets db1-test -n istio-system -o yaml
- candidate@node01:~$ echo 'ZGIx'|base64 -d > /cks/sec/user.txt
- candidate@node01:~$ echo 'aGVsbG8='|base64 -d > /cks/sec/pass.txt
- candidate@node01:~$ cat /cks/sec/user.txt
- candidate@node01:~$ cat /cks/sec/pass.txt
- candidate@node01:~$ kubectl create secret -h
- candidate@node01:~$ kubectl create secret generic -h
- candidate@node01:~$ kubectl create secret generic db2-test -n istio-system --from-literal=username=production-instance --from-literal=password=KvLftKgs4aVH
- candidate@node01:~$ kubectl get secret -n istio-system
- # 搜secret
- candidate@node01:~$ vim k8s-secret.yaml
- apiVersion: v1
- kind: Pod
- metadata:
- name: secret-pod #pod 名字
- namespace: istio-system #命名空间
- spec:
- containers:
- - name: dev-container #容器名字
- image: nginx #镜像名字
- imagePullPolicy: IfNotPresent
- volumeMounts: #挂载路径
- - name: secret-volume #卷名
- mountPath: /etc/secret
- volumes:
- - name: secret-volume #卷名
- secret:
- secretName: db2-test #名为 db2-test 的 secret
- candidate@node01:~$ kubectl apply -f k8s-secret.yaml
- candidate@node01:~$ kubectl get pod -n istio-system
Task
分析和编辑给定的 Dockerfile /cks/docker/Dockerfile(基于 ubuntu:16.04 镜像),
并修复在文件中拥有的突出的安全/最佳实践问题的两个指令。
分析和编辑给定的清单文件 /cks/docker/deployment.yaml ,
并修复在文件中拥有突出的安全/最佳实践问题的两个字段。
注意:请勿添加或删除配置设置;只需修改现有的配置设置让以上两个配置设置都不再有安全/最佳实践问题。
注意:如果您需要非特权用户来执行任何项目,请使用用户 ID 65535 的用户 nobody 。
只修改即可,不需要创建。
- candidate@node01:~$ vi /cks/docker/Dockerfile
- 1、修改基础镜像为题目要求的 ubuntu:16.04
- FROM ubuntu:16.04
- 2、仅将 CMD 上面的 USER root 修改为 USER nobody,不需要改其他的 USER root。
- USER nobody
- candidate@node01:~$ vi /cks/docker/deployment.yaml
- 1、需要将原先的 run: couchdb 修改为 app: couchdb
- app: couchdb
- 2、确保 'privileged': 为 False ,确保'readonlyRootFilesystem': 为 True,确保'runAsUser': 为 65535
- securityContext:
- {'capabilities': {'add': ['NET_BIND_SERVICE'], 'drop': ['all']}, 'privileged': False, 'readOnlyRootFilesystem': True, 'runAsUser': 65535}
Context
该 cluster 使用 containerd 作为 CRI 运行时。containerd 的默认运行时处理程序是 runc。
containerd 已准备好支持额外的运行时处理程序 runsc (gVisor)。
Task
使用名为 runsc 的现有运行时处理程序,创建一个名为 untrusted 的 RuntimeClass。
更新 namespace server 中的所有 Pod 以在 gVisor 上运行。
您可以在 /cks/gVisor/rc.yaml 中找到一个模版清单。
- # 搜 runtimeclass
- candidate@node01:~$ vi /cks/gVisor/rc.yaml
- apiVersion: node.k8s.io/v1
- kind: RuntimeClass
- metadata:
- name: untrusted # 用来引用 RuntimeClass 的名字
- handler: runsc # 对应的 CRI 配置的名称
- candidate@node01:~$ kubectl create -f /cks/gVisor/rc.yaml
- candidate@node01:~$ kubectl get RuntimeClass
- candidate@node01:~$ kubectl -n server get deployment
- candidate@node01:~$ kubectl -n server edit deployments busybox-run
- candidate@node01:~$ kubectl -n server edit deployments nginx-host
- candidate@node01:~$ kubectl -n server edit deployments run-test
- spec: #找到这个 spec,注意在 deployment 里是有两个单独行的 spec 的,要找第二个,也就是下面有 containers 这个字段的 spec。
- runtimeClassName: untrusted #添加这一行,注意空格对齐
- containers:
- candidate@node01:~$ kubectl -n server get pod
Task
创建一个名为 pod-restriction 的 NetworkPolicy 来限制对在 namespace dev-team 中运行的 Pod products-service 的访问。
只允许以下 Pod 连接到 Pod products-service
注意:确保应用 NetworkPolicy。
你可以在/cks/net/po.yaml 找到一个模板清单文件。
- # 查看 qaqa 命名空间标签(name: qaqa)
- candidate@node01:~$ kubectl get ns --show-labels
- # 查看 pod 标签(environment: testing)
- candidate@node01:~$ kubectl get pod -n dev-team --show-labels
- # 如果 Pod 或者 Namespace 没有标签,则需要打上标签。
- candidate@node01:~$ kubectl label ns qaqa name=qaqa
- candidate@node01:~$ kubectl label pod products-service environment=testing -n dev-team
- candidate@node01:~$ vi /cks/net/po.yaml
- # 查networkpolicy,根据官网,修改为如下内容:
- ……
- metadata:
- name: pod-restriction #修改
- namespace: dev-team #修改
- spec:
- podSelector:
- matchLabels:
- environment: testing
- policyTypes:
- - Ingress #注意,这里只写 - Ingress,不要将 - Egress 也复制进来!
- ingress:
- - from: #第一个 from
- - namespaceSelector:
- matchLabels:
- name: qaqa #命名空间有 name: qaqa 标签的
- - from: #第二个 from
- - namespaceSelector: {} #修改为这样,所有命名空间
- podSelector: #注意,这个 podSelector 前面的“-” 要删除。
- matchLabels:
- environment: testing #有 environment: testing 标签的 Pod,这个地方是根据题目要求“Pods with label environment: testing , in any namespace”,这句话里的 pod 标签写的。不要和上面 spec 里的混淆。
- #创建
- candidate@node01:~$ kubectl apply -f /cks/net/po.yaml
- #检查
- candidate@node01:~$ kubectl describe networkpolicy -n dev-team
Task
使用 Trivy 开源容器扫描器检测 namespace kamino 中 Pod 使用的具有严重漏洞的镜像。
查找具有 High 或 Critical 严重性漏洞的镜像,并删除使用这些镜像的 Pod。
注意:Trivy 仅安装在 cluster 的 master 节点上,
在工作节点上不可使用。
你必须切换到 cluster 的 master 节点才能使用 Trivy。
candidate@node01:~$ ssh master01
kubectl get pods --namespace kamino --output=custom-columns="NAME:.metadata.name,IMAGE:.spec.containers[*].image"
- candidate@master01:~$ trivy image -h
- for i in {amazonlinux:1,amazonlinux:2,nginx:1.19,vicuu/nginx:host}; do trivy image -s "HIGH,CRITICAL" $i >> 10.txt;done
candidate@master01:~$ kubectl -n kamino delete pod XXXX --force
exit
Context
APPArmor 已在 cluster 的工作节点 node02 上被启用。一个 APPArmor 配置文件已存在,但尚未被实施。
Task
在 cluster 的工作节点 node02 上,实施位于 /etc/apparmor.d/nginx_apparmor 的现有 APPArmor 配置文件。 编辑位于 /cks/KSSH00401/nginx-deploy.yaml 的现有清单文件以应用 AppArmor 配置文件。
最后,应用清单文件并创建其中指定的 Pod 。
请注意,考试时,考题里已表明 APPArmor 在工作节点上,所以你需要 ssh 到开头写的工作节点上。
在模拟环境,你需要 ssh 到 node02 这个工作节点。
- candidate@node01:~$ ssh node02
- candidate@node02:~$ sudo -i
- root@node02:~$ cd /etc/apparmor.d/
- root@node02:~$ cat nginx_apparmor
- root@node02:~$ apparmor_status #查不到,没启动
- root@node02:~$ apparmor_parser /etc/apparmor.d/nginx_apparmor #启用
- root@node02:~$ apparmor_status# 再次检查有结果了
注意!注意!考试时,这个文件是在默认登录的终端那个初始节点上的,而不是在这个 work 节点的。
exit exit
- 搜apparmor
- candidate@node01:~$ vi /cks/KSSH00401/nginx-deploy.yaml
- name: podx
- annotations:
- container.apparmor.security.beta.kubernetes.io/podx: localhost/nginx-profile-3
- candidate@node01:~$ kubectl apply -f /cks/KSSH00401/nginx-deploy.yaml
- candidate@node01:~$ kubectl get pod
Task:
使用运行时检测工具来检测 Pod redis123 单个容器中频发生成和执行的异常进程。
有两种工具可供使用:
注: 这些工具只预装在 cluster 的工作节点 node02 上,不在 master 节点。
使用工具至少分析 30 秒 ,使用过滤器检查生成和执行的进程,将事件写到 /opt/KSR00101/incidents/summary 文件中,
其中包含检测的事件, 格式如下: timestamp,uid/username,processName
保持工具的原始时间戳格式不变。
注: 确保事件文件存储在集群的工作节点上。
请注意,考试时,考题里已表明 sysdig 和 falco 在工作节点上,所以你需要 ssh 到开头写的工作节点上。但在模拟环境,你需要 ssh 到 node02 这个工作节点。
- candidate@node01:~$ ssh node02
- candidate@node02:~$ sudo -i
root@node02:~$ crictl ps | grep redis123
- root@node02:~$ vim /etc/falco/falco_rules.local.yaml
- - rule: rule1
- desc: rule1
- condition: container.name = "redis123"
- output: "%evt.time,%user.uid,%proc.name"
- priority: WARNING
- root@node02:~$ sudo falco -M 30 -r /etc/falco/falco_rules.local.yaml >> /opt/KSR00101/incidents/summary
- root@node02:~$ vim /etc/falco/falco_rules.local.yaml
- output: "%evt.time,%user.name,%proc.name"
- root@node02:~$ sudo falco -M 30 -r /etc/falco/falco_rules.local.yaml >> /opt/KSR00101/incidents/summary
root@node02:~$ cat /opt/KSR00101/incidents/summary
exit exit
Context
Container Security Context 应在特定 namespace 中修改 Deployment。
Task
按照如下要求修改 sec-ns 命名空间里的 Deployment secdep
一、用 ID 为 30000 的用户启动容器(设置用户 ID 为: 30000)
二、不允许进程获得超出其父进程的特权(禁止 allowPrivilegeEscalation)
三、以只读方式加载容器的根文件系统(对根文件的只读权限)
- 搜context 安全上下文
- candidate@node01:~$ kubectl -n sec-ns edit deployment secdep
- name: sec-ctx-demo-1 / 2
- securityContext: #新增或修改 containers 里面第一个 image 的此字段。
- allowPrivilegeEscalation: false
- readOnlyRootFilesystem: true
-
- securityContext: #修改模拟环境里的这一行,注意要删除{}。如果考试时没有搜到,则新增这一行。
- runAsUser: 30000
- candidate@node01:~$ kubectl -n sec-ns get all
Task
通过 TLS 加强 kube-apiserver 安全配置,要求
1、kube-apiserver 除了 TLS 1.3 及以上的版本可以使用,其他版本都不允许使用。
2、密码套件(Cipher suite)为 TLS_AES_128_GCM_SHA256
通过 TLS 加强 ETCD 安全配置,要求 1、密码套件(Cipher suite)为 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- candidate@node01:~$ ssh master01
- candidate@master01:~$ sudo -i
- candidate@master01:~$ cp /etc/kubernetes/manifests/kube-apiserver.yaml /tmp
- #搜kube-api server
- candidate@master01:~$ vim /etc/kubernetes/manifests/kube-apiserver.yaml
- - --tls-cipher-suites=TLS_AES_128_GCM_SHA256
- - --tls-min-version=VersionTLS13 #如果题目要求 TLS 1.2,则就写 VersionTLS12
candidate@master01:~$ kubectl -n kube-system get pod
- candidate@master01:~$ cp /etc/kubernetes/manifests/etcd.yaml /tmp
- candidate@master01:~$ vim /etc/kubernetes/manifests/etcd.yaml
- - --cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- root@master01:~$ systemctl daemon-reload
- root@master01:~$ systemctl restart kubelet.service
- root@master01:~$ kubectl -n kube-system get pod
exit exit
Context
由 kubeadm 创建的 cluster 的 Kubernetes API 服务器,出于测试目的,
临时配置允许未经身份验证和未经授权的访问,授予匿名用户 cluster-admin 的访问权限.
Task
重新配置 cluster 的 Kubernetes APl 服务器,以确保只允许经过身份验证和授权的 REST 请求。
使用授权模式 Node,RBAC 和准入控制器 NodeRestriction。
删除用户 system:anonymous 的 ClusterRoleBinding 来进行清理。
注意:所有 kubectl 配置环境/文件也被配置使用未经身份验证和未经授权的访问。
你不必更改它,但请注意,一旦完成 cluster 的安全加固, kubectl 的配置将无法工作。
您可以使用位于 cluster 的 master 节点上,cluster 原本的 kubectl 配置文件
/etc/kubernetes/admin.conf ,以确保经过身份验证的授权的请求仍然被允许。
模拟环境里,初始化这道题的脚本为 api.sh
- candidate@node01:~$ ssh master01
- candidate@master01:~$ sudo -i
- root@master01:~$ sh api.sh
- root@master01:~$ mkdir bak15
- root@master01:~$ cd bak15
- root@master01:~$ cp /etc/kubernetes/manifests/kube-apiserver.yaml .
- root@master01:~$ vi /etc/kubernetes/manifests/kube-apiserver.yaml
- 修改为
- - --authorization-mode=Node,RBAC
- - --enable-admission-plugins=NodeRestriction
- - --anonymous-auth=false
- root@master01:~$ systemctl daemon-reload
- root@master01:~$ systemctl restart kubelet.service
- root@master01:~$ kubectl get pod -A
- # 查
- root@master01:~$ kubectl get clusterrolebinding system:anonymous
- # 删
- root@master01:~$ kubectl delete clusterrolebinding system:anonymous
- # 再检查
- root@master01:~$ kubectl get clusterrolebinding system:anonymous
exit exit
Context
cluster 上设置了容器镜像扫描器,但尚未完全集成到 cluster 的配置中。
完成后,容器镜像扫描器应扫描并拒绝易受攻击的镜像的使用。
Task
注意:你必须在 cluster 的 master 节点上完成整个考题,所有服务和文件都已被准备好并放置在该节点上。
给定一个目录 /etc/kubernetes/epconfig 中不完整的配置,
以及具有 HTTPS 端点 https://image-bouncer-webhook.default.svc:1323/image_policy 的功能性容器镜像扫描器:
最后,通过尝试部署易受攻击的资源 /cks/img/web1.yaml 来测试配置是否有效。
模拟环境里,初始化这道题的脚本为 imagePolicy.sh
- candidate@node01:~$ ssh master01
- candidate@master01:~$ sudo -i
- root@master01:~$ sh imagePolicy.sh
- root@master01:~$ vim /etc/kubernetes/epconfig/admission_configuration.json
- "defaultAllow": false #将 true 改为 false
- root@master01:~$ vi /etc/kubernetes/epconfig/kubeconfig.yml
- - cluster: #下面添加
- server: https://image-bouncer-webhook.default.svc:1323/image_policy #添加 webhook server 地址
- root@master01:~$ cp /etc/kubernetes/manifests/kube-apiserver.yaml /tmp
- root@master01:~$ vi /etc/kubernetes/manifests/kube-apiserver.yaml
- #搜imagepolicywebhook
- - --enable-admission-plugins=NodeRestriction,ImagePolicyWebhook
- - --admission-control-config-file=/etc/kubernetes/epconfig/admission_configuration.json
- root@master01:~$ systemctl daemon-reload
- root@master01:~$ systemctl restart kubelet.service
- root@master01:~$ kubectl -n kube-system get pod
- root@master01:~$ kubectl apply -f /cks/img/web1.yaml
- 不允许创建
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。