返回顶部

CKS必过宝典--无压力一次过

CKS必过宝典

1、kube-bench 修复不安全项

考题

解题思路

此题要求修复kubelet、apiserver以及etcd通过kube-bench所发现的问题项。

修改对应组件的配置文件即可,可以执行kube-bench masterkube-bench nodekube-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
posted @ 2024-03-08 10:28  丨君丶陌  阅读(167)  评论(0编辑  收藏  举报