CKS 知识清单
NOTE
- 本文内容适用于 v1.29 版本,参考时请注意文章的时效性。
- 由于 CKS 需要先考过 CKA,这里只列出不包含在 CKA 考试中的知识点。
Runtime Class
为 Pod 提供不同的 容器运行时。
参考资料
Security Context
为 Pod 或容器配置 权限 和 访问控制。
参考资料
Admission Controllers
准入控制器(Admission Controllers)是 apiserver 中的一组 请求拦截器,会拦截请求并执行 验证(Validating) 和 变更(Mutating) 操作。
参考资料
- 准入控制器:https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/
- K8s 官博文章:https://kubernetes.io/blog/2019/03/21/a-guide-to-kubernetes-admission-controllers/
- 动态准入控制:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/extensible-admission-controllers/
知识点
修改 apiserver 的配置以启用准入控制器:
# /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 准入控制器配置:
imagePolicy:
kubeConfigFile: /path/to/kubeconfig/for/backend
# 以秒计的时长,控制批准请求的缓存时间
allowTTL: 50
# 以秒计的时长,控制拒绝请求的缓存时间
denyTTL: 50
# 以毫秒计的时长,控制重试间隔
retryBackoff: 500
# 确定 Webhook 后端失效时的行为
defaultAllow: true
Auditing
记录 对 apiserver 的请求及响应,可以配置日志级别及规则(审计策略),和日志存储的方式(审计后端)。
参考资料
CSR
CertificateSigningRequest(CSR)资源用来向指定的签名者 申请证书签名。
参考资料
知识点
# 创建私钥
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 中的资源。
参考资料
- 静态加密资源:https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/
- 解密资源:https://kubernetes.io/docs/tasks/administer-cluster/decrypt-data/
- 使用 KMS 加密资源:https://kubernetes.io/docs/tasks/administer-cluster/kms-provider/
Pod Security Standards
Pod 安全性标准(Security Standards)定义了三种 内置的安全策略(Policy),以广泛覆盖安全应用场景。
参考资料
- Pod 安全性标准:https://kubernetes.io/docs/concepts/security/pod-security-standards/
- Pod 安全性准入控制器:https://kubernetes.io/zh-cn/docs/concepts/security/pod-security-admission/
知识点
为 namespace 设置安全性标准
# 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
# 解析并加载 profiles
apparmor_parser [profile]
# 查看 apparmor状态,可看到加载的 profiles
apparmor_status
在 Pod 中配置 apparmor:
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 配置是否安全。
参考资料
知识点
# 只运行特定用例
kube-bench run --targets master,node,etcd,policies --check="1.1,2.2"
Sysdig
Sisdig 是一个开源的系统分析工具,它可以 获取系统的状态和行为,并对结果进行 过滤。 Sysdig 可以看做是 strace + tcpdump + lsof + htop + iftop 以及其他系统分析工具的合集。
Sysdig 还可以对 容器 进行监控。
参考资料
知识点
# 按特定格式输出特定容器的活动
# -M 持续时间(秒) -p 输出的格式
sysdig -M 30 -p "%evt.time" container.id=f778825591e5
# 查询输出字段名
sysdig --list | grep 关键字
Falco
与 Sysdig 类似,Falco 是一款适用于 Linux 操作系统的云原生安全工具,它可以近乎实时地进行 威胁检测 和 告警。
参考资料
- Falco 官方文档:https://falco.org/docs/
知识点
Falco rules 目录:/etc/falco/falco_rules.yaml
Falco 命令:
# 查询输出字段名
falco --list | grep 关键字
# 执行检查
falco -M 持续时间
Trivy
一个开源的安全扫描器,可以扫描 漏洞、错误配置、k8s 安全风险等。
参考资料
知识点
# 检查镜像是否包含特定漏洞
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 容器沙箱,它为应用程序和操作系统提供了额外的隔离层。
参考资料
- gVisor 与 containerd 一起使用:https://gvisor.dev/docs/user_guide/containerd/quick_start/
知识点
配置 RuntimeClass:
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: gvisor
handler: runsc
配置 Pod 使用 gVisor:
apiVersion: v1
kind: Pod
metadata:
name: nginx-gvisor
spec:
runtimeClassName: gvisor
containers:
- name: nginx
image: nginx
Dockerfile 优化
优化镜像的构建。
参考资料
知识点
- 构建环境 与 运行环境 分离。
- 避免使用 Root 账户。
- 尽量 减少 镜像层数。
OPA Gatekeeper
可配置化的动态准入控制器。