k8s的全部考试答案,亲测可靠,博主CKA,CKS已过,欢迎交流。(求个关注吧)
1、kube-bench 修复不安全项
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
2、Pod 指定 ServiceAccount
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。
1 创建 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
2 创建 Pod 使用该 ServiceAccount
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
3 删除没有使用的 ServiceAccount
# 查看所有 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
3、默认网络策略
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
4、RBAC - RoleBinding
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
5、日志审计 log audit
Task
在 cluster 中启用审计日志。为此,请启用日志后端,并确保:
- 日志存储在 /var/log/kubernetes/audit-logs.txt
- 日志文件能保留 10 天
- 最多保留 2 个旧审计日志文件
/etc/kubernetes/logpolicy/sample-policy.yaml 提供了基本策略。它仅指定不记录的内容。
注意:基本策略位于 cluster 的 master 节点上。
编辑和扩展基本策略以记录:
- RequestResponse 级别的 persistentvolumes 更改
- namespace front-apps 中 configmaps 更改的请求体
- Metadata 级别的所有 namespace 中的 ConfigMap 和 Secret 的更改
此外,添加一个全方位的规则以在 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"
配置 master 节点的 kube-apiserver.yaml
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
6、创建 Secret
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
1 将 db1-test 的 username 和 password,通过 base64 解码保存到题目指定文件:
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
2 创建名为 db2-test 的 secret 使用题目要求的用户名和密码作为键值。注意要加命名空间。
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
3 创建 Pod 使用该 secret
# 搜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
7、Dockerfile 检测
Task
分析和编辑给定的 Dockerfile /cks/docker/Dockerfile(基于 ubuntu:16.04 镜像),
并修复在文件中拥有的突出的安全/最佳实践问题的两个指令。
分析和编辑给定的清单文件 /cks/docker/deployment.yaml ,
并修复在文件中拥有突出的安全/最佳实践问题的两个字段。
注意:请勿添加或删除配置设置;只需修改现有的配置设置让以上两个配置设置都不再有安全/最佳实践问题。
注意:如果您需要非特权用户来执行任何项目,请使用用户 ID 65535 的用户 nobody 。
只修改即可,不需要创建。
1 修改 Dockerfile
candidate@node01:~$ vi /cks/docker/Dockerfile
1、修改基础镜像为题目要求的 ubuntu:16.04
FROM ubuntu:16.04
2、仅将 CMD 上面的 USER root 修改为 USER nobody,不需要改其他的 USER root。
USER nobody
2 修改 deployment.yaml
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}
8、沙箱运行容器 gVisor
Context
该 cluster 使用 containerd 作为 CRI 运行时。containerd 的默认运行时处理程序是 runc。
containerd 已准备好支持额外的运行时处理程序 runsc (gVisor)。
Task
使用名为 runsc 的现有运行时处理程序,创建一个名为 untrusted 的 RuntimeClass。
更新 namespace server 中的所有 Pod 以在 gVisor 上运行。
您可以在 /cks/gVisor/rc.yaml 中找到一个模版清单。
1 创建 RuntimeClass
# 搜 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
2 将命名空间为 server 下的 Pod 引用 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
9、网络策略 NetworkPolicy
Task
创建一个名为 pod-restriction 的 NetworkPolicy 来限制对在 namespace dev-team 中运行的 Pod products-service 的访问。
只允许以下 Pod 连接到 Pod products-service
- namespace qaqa 中的 Pod
- 位于任何 namespace,带有标签 environment: testing 的 Pod
注意:确保应用 NetworkPolicy。
你可以在**/cks/net/po.yaml** 找到一个模板清单文件。
1 检查 namespace 标签
# 查看 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
2 创建 NetworkPolicy
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
10、Trivy 扫描镜像安全漏洞
Task
使用 Trivy 开源容器扫描器检测 namespace kamino 中 Pod 使用的具有严重漏洞的镜像。
查找具有 High 或 Critical 严重性漏洞的镜像,并删除使用这些镜像的 Pod。
注意:Trivy 仅安装在 cluster 的 master 节点上,
在工作节点上不可使用。
你必须切换到 cluster 的 master 节点才能使用 Trivy。
1 切换到 Master 的 candidate 下
candidate@node01:~$ ssh master01
2 获取命名空间 kamino 下的所有 pod 和其 image 的对应关系
kubectl get pods --namespace kamino --output=custom-columns="NAME:.metadata.name,IMAGE:.spec.containers[*].image"
3 检查镜像是否有高危和严重的漏洞
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
4 删除有问题的 pod
candidate@master01:~$ kubectl -n kamino delete pod XXXX --force
exit
11、AppArmor
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 这个工作节点。
1 切换到 node02 的 root 下
candidate@node01:~$ ssh node02
candidate@node02:~$ sudo -i
2 切换到 apparmor 的目录
root@node02:~$ cd /etc/apparmor.d/
root@node02:~$ cat nginx_apparmor
3 执行 apparmor 策略模块
root@node02:~$ apparmor_status #查不到,没启动
root@node02:~$ apparmor_parser /etc/apparmor.d/nginx_apparmor #启用
root@node02:~$ apparmor_status# 再次检查有结果了
4 修改 pod 文件
注意!注意!考试时,这个文件是在默认登录的终端那个初始节点上的,而不是在这个 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
12、Sysdig & falco
Task:
使用运行时检测工具来检测 Pod redis123 单个容器中频发生成和执行的异常进程。
有两种工具可供使用:
- sysdig
- falco
注: 这些工具只预装在 cluster 的工作节点 node02 上,不在 master 节点。
使用工具至少分析 30 秒 ,使用过滤器检查生成和执行的进程,将事件写到 /opt/KSR00101/incidents/summary 文件中,
其中包含检测的事件, 格式如下: timestamp,uid/username,processName
保持工具的原始时间戳格式不变。
注: 确保事件文件存储在集群的工作节点上。
请注意,考试时,考题里已表明 sysdig 和 falco 在工作节点上,所以你需要 ssh 到开头写的工作节点上。但在模拟环境,你需要 ssh 到 node02 这个工作节点。
1、切换到 node02 的 root 下
candidate@node01:~$ ssh node02
candidate@node02:~$ sudo -i
2、确认题目里所要求 Pod 的唯一标识,比如 ContainerID。
root@node02:~$ crictl ps | grep redis123
3、编辑 falco 规则 手动输入以下内容,强行背过
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
4、查看保存的文件
root@node02:~$ cat /opt/KSR00101/incidents/summary
exit exit
13、Container 安全上下文
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
14、TLS 安全配置
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
1 切换到 Master 的 root 下
candidate@node01:~$ ssh master01
candidate@master01:~$ sudo -i
candidate@master01:~$ cp /etc/kubernetes/manifests/kube-apiserver.yaml /tmp
2 修改 kube-apiserver
#搜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
3 等待 apiserver 自动重启,且恢复正常。
candidate@master01:~$ kubectl -n kube-system get pod
4 修改 etcd
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
5 等待 etcd 自动重启,且恢复正常。
root@master01:~$ systemctl daemon-reload
root@master01:~$ systemctl restart kubelet.service
root@master01:~$ kubectl -n kube-system get pod
exit exit
15、启用 API server 认证
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
1、切换集群
candidate@node01:~$ ssh master01
candidate@master01:~$ sudo -i
root@master01:~$ sh api.sh
2 确保只有认证并且授权过的 REST 请求才被允许
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
3 等待 apiserver 自动重启,且恢复正常。
root@master01:~$ systemctl daemon-reload
root@master01:~$ systemctl restart kubelet.service
root@master01:~$ kubectl get pod -A
4 删除题目要求的角色绑定
# 查
root@master01:~$ kubectl get clusterrolebinding system:anonymous
# 删
root@master01:~$ kubectl delete clusterrolebinding system:anonymous
# 再检查
root@master01:~$ kubectl get clusterrolebinding system:anonymous
exit exit
16、ImagePolicyWebhook 容器镜像扫描
Context
cluster 上设置了容器镜像扫描器,但尚未完全集成到 cluster 的配置中。
完成后,容器镜像扫描器应扫描并拒绝易受攻击的镜像的使用。
Task
注意:你必须在 cluster 的 master 节点上完成整个考题,所有服务和文件都已被准备好并放置在该节点上。
给定一个目录 /etc/kubernetes/epconfig 中不完整的配置,
以及具有 HTTPS 端点 https://image-bouncer-webhook.default.svc:1323/image_policy 的功能性容器镜像扫描器:
- 启用必要的插件来创建镜像策略
- 校验控制配置并将其更改为隐式拒绝(implicit deny)
- 编辑配置以正确指向提供的 HTTPS 端点
最后,通过尝试部署易受攻击的资源 /cks/img/web1.yaml 来测试配置是否有效。
模拟环境里,初始化这道题的脚本为 imagePolicy.sh
1、切换到 Master 的 root 下
candidate@node01:~$ ssh master01
candidate@master01:~$ sudo -i
root@master01:~$ sh imagePolicy.sh
2、编辑 admission_configuration.json 修改 defaultAllow 为 false
root@master01:~$ vim /etc/kubernetes/epconfig/admission_configuration.json
"defaultAllow": false #将 true 改为 false
3、编辑kubeconfig.yml,添加 webhook server 地址:
root@master01:~$ vi /etc/kubernetes/epconfig/kubeconfig.yml
- cluster: #下面添加
server: https://image-bouncer-webhook.default.svc:1323/image_policy #添加 webhook server 地址
4、编辑 kube-apiserver.yaml,从官网中引用 ImagePolicyWebhook 的配置信息
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
5、等待 apiserver 自动重启,且恢复正常。
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
不允许创建
版权归原作者 颗粒CloudCoder 所有, 如有侵权,请联系我们删除。