# 云原生 K8s 安全专家 CKS 认证考题详解# 1、K8s 集群安全加固:禁止匿名访问
root@master01:~ .. . - --enable-admission-plugins= NodeRestriction - --authorization-mode= Node,RBAC .. .root@master01:~ root@master01:~
# 2、K8s 基准测试考题分析
root@master01:~ .. . - --authorization-mode= Node,RBAC .. .root@master01:~ .. . - --client-cert-auth= true .. .root@master01:~ .. .authentication: anonymous: enabled: false .. .authorization: mode: Webhook .. .root@master01:~ root@master01:~ root@node01:~ apiVersion: kubelet.config.k8s.io/v1beta1 authentication: anonymous: enabled: false .. .authorization: mode: Webhook .. . root@node01:~ root@node01:~
# 3、K8s 密文管理考题分析
root@master01:~ NAME READY UP-TO-DATE AVAILABLE AGE clever 0 /1 1 0 86d root@master01:~ NAME READY STATUS RESTARTS AGE clever-6766f68d99-75xt8 0 /1 ContainerCreating 0 86d root@master01:~ secret/clever created root@master01:~ NAME TYPE DATA AGE clever kubernetes.io/tls 2 2m31s root@master01:~ NAME READY STATUS RESTARTS AGE clever-6766f68d99-75xt8 0 /1 ContainerCreating 0 86d
# 4、K8s 资源优化:提升容器安全性
root@master01:~ FROM ubuntu:16.04 USER rootRUN apt get install -y nginx = 4.2 ENV ENV = testing USER 65535 CMD [ "nginx -d" ] root@master01:~ .. . securityContext: { 'capabilities' :{ 'add' :[ 'NET_ADMIN' ] ,'drop' :[ 'all' ] } ,'privileged' : False,'readOnlyRootFilesystem' : True, 'runAsUser' : 65535 }
# 5、Docker 安全问题考题分析
root@master01:~ root@node01:~ uid = 1001 ( develop) gid = 1001 ( develop) groups = 1001 ( develop) ,999( docker) root@node01:~ root@node01:~ uid = 1001 ( develop) gid = 1001 ( develop) groups = 1001 ( develop) root@node01:~ .. . Loaded: loaded ( /lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active ( running) since Sat 2025 -02-22 06:04:52 UTC; 57min ago .. .root@node01:~ LISTEN 0 4096 *:2375 *:* users:(( "dockerd", pid= 1336 , fd= 3 )) .. .root@node01:~ LISTEN 0 4096 *:2375 *:* users:(( "dockerd", pid= 1325 , fd= 3 )) root@node01:~ .. .[ Socket] SocketUser = rootSocketGroup = rootListenStream = /var/run/docker.sock.. .ExecStart = /usr/bin/dockerd -H fd:// --containerd = /run/containerd/containerd.sock.. .root@node01:~ root@node01:~ root@node01:~
# 6、K8s Ingress SSL 考题分析
Concepts->Services, Load Balancing, and Networking->Ingress->tls
root@master01:~ NAME TYPE CLUSTER-IP EXTERNAL-IP PORT( S) AGE web ClusterIP 10.96 .212.149 < none> 80 /TCP 86d root@master01:~ NAME CONTROLLER PARAMETERS AGE nginx k8s.io/ingress-nginx < none> 86d root@master01:~ apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web namespace: prod annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: ingressClassName: nginx tls: - hosts: - web.k8s.local secretName: web-cert rules: - host: web.k8s.local http: paths: - path: / pathType: Prefix backend: service: name: web port: number: 80 root@master01:~ ingress.networking.k8s.io/web created root@master01:~ NAME CLASS HOSTS ADDRESS PORTS AGE web nginx web.k8s.local 80 , 443 7s root@master01:~ root@master01:~
# 7、K8s ServiceAccount 考题解析
Tasks->Configure Pods and Containers->Configure Service Accounts for Pods->Launch a Pod using service account token projection
root@master01:~ apiVersion: v1 automountServiceAccountToken: false kind: ServiceAccount metadata: creationTimestamp: "2024-11-20T14:44:16Z" name: statsmonitor-sa namespace: monitoring resourceVersion: "104395" uid: 13ed4adf-cadf-49a1-a7f1-31a424f433a5 root@master01:~ apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: statsmonitor name: statsmonitor namespace: monitoring spec: replicas: 1 selector: matchLabels: app: statsmonitor template: metadata: creationTimestamp: null labels: app: statsmonitor spec: volumes: - name: token projected: sources: - serviceAccountToken: path: token serviceAccountName: statsmonitor-sa containers: - image: m.daocloud.io/docker.io/library/nginx:latest name: nginx volumeMounts: - mountPath: /var/run/secrets/kubernetes.io/serviceaccount/token name: token readOnly: true root@master01:~
# 8、K8s NetworkPolicy 考题解析
Concepts->Services, Load Balancing, and Networking->Network Policies
root@master01:~ apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: defaultdeny namespace: production spec: podSelector: { } policyTypes: - Ingress root@master01:~
# 9、K8s Cilium 考题解析
security->Overview of Network Policy->Layer 4 Examples
root@master01:~ NAME READY STATUS RESTARTS AGE LABELS policy-858469dc69-rrhbz 1 /1 Running 4 ( 8d ago) 92d app = policy,pod-template-hash= 858469dc69 root@master01:~ apiVersion: "cilium.io/v2" kind: CiliumNetworkPolicy metadata: name: allow-ingress-host namespace: cilium-policy spec: endpointSelector: matchLabels: app: policy ingress: - fromEndpoints: - matchLabels: k8s:io.kubernetes.pod.namespace: ingress-nginx authentication: mode: "required" - fromEntities: - "host" root@master01:~
# 10、K8s SecurityContext 考题解析
root@master01:~ .. . securityContext: allowPrivilegeEscalation: false runAsNonRoot: true capabilities: drop: [ "ALL" ] seccompProfile: type: RuntimeDefault root@master01:~
# 11、K8s SecurityContext 配置变更考题
root@master01:~ .. . spec: containers: - image: m.daocloud.io/docker.io/library/nginx:latest imagePullPolicy: Always name: nginx resources: { } securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true runAsUser: 30000 .. .
# 12、K8s 行为检测:Falco
Concepts->rules->Basic of Falco Rules
root@master01:~ - rule: "monitor devmem" desc: "monitor devmem" condition: fd.name == '/dev/mem' output: "Container: container_id=%container.id reading /dev/mem" priority: NOTICE root@node01:~ .. .21 :44:14.368662183: Notice Container: container_id = f459ad4e0661 reading /dev/mem.. .root@node01:~ WARN[ 0000] runtime connect using default endpoints: [ unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock] . As the default settings are now deprecated, you should set the endpoint instead. WARN[ 0000] image connect using default endpoints: [ unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock] . As the default settings are now deprecated, you should set the endpoint instead. f459ad4e06615 05455a08881ea 10 minutes ago Running alpine 0 7ff2ea1a19ab9 cpu-677fcb7db7-nj6ll root@master01:~ default cpu-677fcb7db7-nj6ll 1 /1 Running 0 48m root@master01:~
# 13、K8s 合规性扫描 Bom
root@master01:~ NAME READY STATUS RESTARTS AGE bom-6d7c56bd86-m4jmn 3 /3 Running 3 ( 11m ago) 23h root@master01:~ Defaulted container "alpine1" out of: alpine1, alpine2, alpine3 / WARNING: opening from cache https://dl-cdn.alpinelinux.org/alpine/v3.20/main: No such file or directory WARNING: opening from cache https://dl-cdn.alpinelinux.org/alpine/v3.20/community: No such file or directory libcrypto3-3.3.2-r0 x86_64 { openssl} ( Apache-2.0) [ installed] root@master01:~ / WARNING: opening from cache https://dl-cdn.alpinelinux.org/alpine/v3.19/main: No such file or directory WARNING: opening from cache https://dl-cdn.alpinelinux.org/alpine/v3.19/community: No such file or directory libcrypto3-3.1.7-r0 x86_64 { openssl} ( Apache-2.0) [ installed] root@master01:~ / WARNING: opening from cache https://dl-cdn.alpinelinux.org/alpine/v3.17/main: No such file or directory WARNING: opening from cache https://dl-cdn.alpinelinux.org/alpine/v3.17/community: No such file or directory libcrypto3-3.0.15-r0 x86_64 { openssl} ( Apache-2.0) [ installed] root@master01:~ .. . - command: - sleep - "360000" image: registry.cn-beijing.aliyuncs.com/dotbalo/alpine:3.17.10 imagePullPolicy: IfNotPresent .. .root@master01:~ root@master01:~ root@master01:~ .. .name: alpine3 .. .root@master01:~
# 14、K8s 审计日志概念理解
Tasks->Monitoring, Logging, and Debugging->Troubleshooting Clusters->Auditing
root@master01:~ root@master01:~ root@master01:~ apiVersion: audit.k8s.io/v1 kind: Policy omitStages: - "RequestReceived" rules: - level: RequestResponse resources: - group: "batch" resources: [ "cronjobs" ] - level: Request resources: - group: "" resources: [ "persistentvolumes" ] namespaces: [ "front-apps" ] - level: Metadata resources: - group: "" resources: [ "secrets" , "configmaps" ] - level: Metadata root@master01:~ .. . - --audit-policy-file= /etc/kubernetes/logpolicy/sample-policy.yaml - --audit-log-path= /var/log/kubernetes/kubernetes-logs.txt - --audit-log-maxage= 30 - --audit-log-maxbackup= 10 .. . volumeMounts: - mountPath: /etc/kubernetes/logpolicy/sample-policy.yaml name: audit readOnly: true - mountPath: /var/log/kubernetes/ name: audit-log readOnly: false .. . volumes: .. . - name: audit hostPath: path: /etc/kubernetes/logpolicy/sample-policy.yaml type: File - name: audit-log hostPath: path: /var/log/kubernetes/ type: DirectoryOrCreate .. .root@master01:~ root@master01:~ root@master01:~
# 15、K8s ImagePolicyWebhook
root@master01:~ root@master01:~ { "imagePolicy" : { "kubeConfigFile" : "/etc/kubernetes/epconfig/kubeconfig.yaml" , "allowTTL" : 50 , "denyTTL" : 50 , "retryBackoff" : 500 , "defaultAllow" : false } } root@master01:~ .. .- cluster: certificate-authority: /etc/kubernetes/pki/server.crt server: https://wakanda.local:8082/image_policy .. .root@master01:~ .. . - --enable-admission-plugins= NodeRestriction,ImagePolicyWebhook - --admission-control-config-file= /etc/kubernetes/epconfig/admission_configuration.json .. . volumeMounts: - mountPath: /etc/kubernetes/epconfig name: epconfig readOnly: true .. . volumes: - hostPath: path: /etc/kubernetes/epconfig name: epconfig .. .root@master01:~ root@master01:~ root@master01:~ root@master01:~ .. . Warning FailedCreate 19s ( x4 over 37s) replication-controller ( combined from similar events) : Error creating: pods "nginx-latest-k69tx" is forbidden: image policy webhook backend denied one or more images: Images using latest tag are not allowed
# 16、K8s 集群升级考题
Tasks->Administer a Cluster->Administer with kubeadm->Upgrade kubeadm Cluster->Upgrading Linux nodes
root@master01:~ root@master01:~ NAME STATUS ROLES AGE VERSION master01 Ready control-plane 89d v1.31.2 node01 Ready < none> 89d v1.31.1 root@master01:~ sudo apt-mark unhold kubeadm && \ sudo apt-get update && sudo apt-get install -y kubeadm = '1.31.2-*' && \ sudo apt-mark hold kubeadmroot@node01:~ root@master01:~ root@master01:~ NAME STATUS ROLES AGE VERSION master01 Ready control-plane 90d v1.31.2 node01 Ready,SchedulingDisabled < none> 90d v1.31.1 root@node01:~ root@node01:~ sudo apt-mark hold kubelet kubectlroot@node01:~ root@node01:~ root@master01:~ root@master01:~ NAME STATUS ROLES AGE VERSION master01 Ready control-plane 90d v1.31.2 node01 Ready < none> 90d v1.31.2