Skip to content

CKS 知识清单

NOTE

  • 本文内容适用于 v1.29 版本,参考时请注意文章的时效性。
  • 由于 CKS 需要先考过 CKA,这里只列出不包含在 CKA 考试中的知识点。

Runtime Class

为 Pod 提供不同的 容器运行时

参考资料

Security Context

为 Pod 或容器配置 权限访问控制

参考资料

Admission Controllers

准入控制器(Admission Controllers)是 apiserver 中的一组 请求拦截器,会拦截请求并执行 验证(Validating)变更(Mutating) 操作。 admission-controller-phases.png

参考资料

知识点

修改 apiserver 的配置以启用准入控制器:

yaml
# /etc/kubernetes/manifests/kube-apiserver.yaml

apiVersion: v1
kind: Pod
metadata:
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-apiserver
    # 配置要启用的准入控制插件列表
    - --enable-admission-plugins=NodeRestriction,ImagePolicyWebhook
    # 指定准入控制插件的配置
    - --admission-control-config-file=/etc/kubernetes/policywebhook/admission_config.json

ImagePolicyWebhook 准入控制器配置:

yaml
imagePolicy:
  kubeConfigFile: /path/to/kubeconfig/for/backend
  # 以秒计的时长,控制批准请求的缓存时间
  allowTTL: 50
  # 以秒计的时长,控制拒绝请求的缓存时间
  denyTTL: 50
  # 以毫秒计的时长,控制重试间隔
  retryBackoff: 500
  # 确定 Webhook 后端失效时的行为
  defaultAllow: true

Auditing

记录 对 apiserver 的请求及响应,可以配置日志级别及规则(审计策略),和日志存储的方式(审计后端)。

参考资料

CSR

CertificateSigningRequest(CSR)资源用来向指定的签名者 申请证书签名

参考资料

知识点

bash
# 创建私钥
openssl genrsa -out myuser.key 2048

# 创建 csr
openssl req -new -key myuser.key -out myuser.csr

# 签名
## 手动签名

### 找到 k8s CA 证书路径
find /etc/kubernetes/pki | grep ca

### 手动签名
openssl x509 -req -in myuser.csr  \
  -CA /etc/kubernetes/pki/ca.crt \
  -CAkey /etc/kubernetes/pki/ca.key \
  -CAcreateserial
  -days 500 \
  -out myuser.crt
  
## 使用 k8s API 签名

### base64 编码 csr
cat myuser.crt | base64 -w 0 

### 在 k8s 中 创建 csr 资源
### 注意:需要将 spec.request 中的值替换成上一步 base64 编码后的 csr
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: myuser
spec:
  request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1ZqQ0NBVDRDQVFBd0VURVBNQTBHQTFVRUF3d0dZVzVuWld4aE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTByczhJTHRHdTYxakx2dHhWTTJSVlRWMDNHWlJTWWw0dWluVWo4RElaWjBOCnR2MUZtRVFSd3VoaUZsOFEzcWl0Qm0wMUFSMkNJVXBGd2ZzSjZ4MXF3ckJzVkhZbGlBNVhwRVpZM3ExcGswSDQKM3Z3aGJlK1o2MVNrVHF5SVBYUUwrTWM5T1Nsbm0xb0R2N0NtSkZNMUlMRVI3QTVGZnZKOEdFRjJ6dHBoaUlFMwpub1dtdHNZb3JuT2wzc2lHQ2ZGZzR4Zmd4eW8ybmlneFNVekl1bXNnVm9PM2ttT0x1RVF6cXpkakJ3TFJXbWlECklmMXBMWnoyalVnald4UkhCM1gyWnVVV1d1T09PZnpXM01LaE8ybHEvZi9DdS8wYk83c0x0MCt3U2ZMSU91TFcKcW90blZtRmxMMytqTy82WDNDKzBERHk5aUtwbXJjVDBnWGZLemE1dHJRSURBUUFCb0FBd0RRWUpLb1pJaHZjTgpBUUVMQlFBRGdnRUJBR05WdmVIOGR4ZzNvK21VeVRkbmFjVmQ1N24zSkExdnZEU1JWREkyQTZ1eXN3ZFp1L1BVCkkwZXpZWFV0RVNnSk1IRmQycVVNMjNuNVJsSXJ3R0xuUXFISUh5VStWWHhsdnZsRnpNOVpEWllSTmU3QlJvYXgKQVlEdUI5STZXT3FYbkFvczFqRmxNUG5NbFpqdU5kSGxpT1BjTU1oNndLaTZzZFhpVStHYTJ2RUVLY01jSVUyRgpvU2djUWdMYTk0aEpacGk3ZnNMdm1OQUxoT045UHdNMGM1dVJVejV4T0dGMUtCbWRSeEgvbUNOS2JKYjFRQm1HCkkwYitEUEdaTktXTU0xMzhIQXdoV0tkNjVoVHdYOWl4V3ZHMkh4TG1WQzg0L1BHT0tWQW9FNkpsYWFHdTlQVmkKdjlOSjVaZlZrcXdCd0hKbzZXdk9xVlA3SVFjZmg3d0drWm89Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=
  signerName: kubernetes.io/kube-apiserver-client
  expirationSeconds: 86400  # one day
  usages:
  - client auth
EOF

### 批准 csr
kubectl get csr
kubectl certificate approve myuser

### 获取证书
kubectl get csr myuser -o jsonpath='{.status.certificate}'| base64 -d > myuser.crt


# 设置 kubectl context
kubectl config set-credentials myuser --client-key=myuser.key --client-certificate=myuser.crt 
kubectl config set-context myuser --cluster=kubernetes --user=myuser
kubectl config use-context myuser
kubectl config get-context

加密 K8S 中的资源

可以修改 apiserver 的配置 以加密 K8S 中的资源。

参考资料

Pod Security Standards

Pod 安全性标准(Security Standards)定义了三种 内置的安全策略(Policy),以广泛覆盖安全应用场景。

参考资料

知识点

为 namespace 设置安全性标准

yaml
# kubectl edit namespace team-red
apiVersion: v1
kind: Namespace
metadata:
  labels:
    kubernetes.io/metadata.name: team-red
    pod-security.kubernetes.io/enforce: baseline # add
  name: team-red
...

AppArmor

AppArmor 是一个 Linux 内核安全模块,它可以限制应用可以访问的资源。

参考资料

知识点

加载 profiles

shell
# 解析并加载 profiles
apparmor_parser [profile]

# 查看 apparmor状态,可看到加载的 profiles
apparmor_status

在 Pod 中配置 apparmor:

yaml
apiVersion: v1
kind: Pod
metadata:
  name: hello-apparmor
  annotations:
    # Tell Kubernetes to apply the AppArmor profile "k8s-apparmor-example-deny-write".
    container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-apparmor-example-deny-write
spec:
  containers:
  - name: hello
    image: busybox:1.28
    command: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]

NOTE

v1.30 版本已经改为在 securityContext 中配置。

kube-bench

kube-bench 是一个 Go 应用程序,它通过运行 CIS Kubernetes Benchmark (基准测试)来检查 Kubernetes 配置是否安全

参考资料

知识点

bash
# 只运行特定用例
kube-bench run --targets master,node,etcd,policies --check="1.1,2.2"

Sysdig

Sisdig 是一个开源的系统分析工具,它可以 获取系统的状态和行为,并对结果进行 过滤。 Sysdig 可以看做是 strace + tcpdump + lsof + htop + iftop 以及其他系统分析工具的合集。

Sysdig 还可以对 容器 进行监控。

参考资料

知识点

bash
# 按特定格式输出特定容器的活动
# -M 持续时间(秒) -p 输出的格式 
sysdig -M 30 -p "%evt.time" container.id=f778825591e5

# 查询输出字段名
sysdig --list | grep 关键字

Falco

与 Sysdig 类似,Falco 是一款适用于 Linux 操作系统的云原生安全工具,它可以近乎实时地进行 威胁检测告警

参考资料

知识点

Falco rules 目录:/etc/falco/falco_rules.yaml

Falco 命令:

bash
# 查询输出字段名
falco --list | grep 关键字

# 执行检查
falco -M 持续时间

Trivy

一个开源的安全扫描器,可以扫描 漏洞、错误配置、k8s 安全风险等。

参考资料

知识点

bash
# 检查镜像是否包含特定漏洞
trivy image httpd:2.4.39-alpine | egrep "CVE-2021-28831|CVE-2016-9841"

# 检查镜像是否包含特定级别的漏洞
trivy image -s HIGH,CRITICAL httpd:2.4.39-alpine

gVisor

gVisor 是 Google 开发的开源 Linux 容器沙箱,它为应用程序和操作系统提供了额外的隔离层。

参考资料

知识点

配置 RuntimeClass:

yaml
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: gvisor
handler: runsc

配置 Pod 使用 gVisor:

yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-gvisor
spec:
  runtimeClassName: gvisor
  containers:
  - name: nginx
    image: nginx

Dockerfile 优化

优化镜像的构建。

参考资料

知识点

  1. 构建环境运行环境 分离。
  2. 避免使用 Root 账户。
  3. 尽量 减少 镜像层数。

OPA Gatekeeper

可配置化的动态准入控制器。

参考资料