CKS考试通关后,我整理了这16个K8S安全配置的实战避坑点(含kube-bench、Trivy、AppArmor)
CKS认证工程师的16个Kubernetes安全加固实战技巧
1. 从CKS考试到生产环境的实战跨越
通过CKS认证只是Kubernetes安全之旅的起点。在实际生产环境中,安全配置远比考试场景复杂多变。许多工程师在通过考试后,面对真实集群的安全加固需求时仍会感到无从下手。本文将分享16个经过实战验证的安全配置技巧,帮助你将考试知识转化为生产力。
为什么这些经验值得关注?
- 基于最新Kubernetes 1.28版本的安全实践
- 每个技巧都经过生产环境验证
- 不仅告诉你"怎么做",更解释"为什么这么做"
- 覆盖从基础配置到高级防御的完整链条
2. 基础安全配置:构建第一道防线
2.1 API Server安全加固
API Server是Kubernetes集群的"大脑",也是攻击者的首要目标。以下是必须实施的加固措施:
# /etc/kubernetes/manifests/kube-apiserver.yaml关键配置
spec:
containers:
- command:
- kube-apiserver
- --authorization-mode=Node,RBAC
- --anonymous-auth=false
- --enable-admission-plugins=NodeRestriction
- --tls-min-version=VersionTLS13
- --tls-cipher-suites=TLS_AES_128_GCM_SHA256
关键参数解析:
| 参数 | 安全意义 | 推荐值 |
|---|---|---|
| anonymous-auth | 禁止匿名访问 | false |
| authorization-mode | 授权模式 | Node,RBAC |
| admission-plugins | 准入控制 | NodeRestriction |
| tls-min-version | 最低TLS版本 | VersionTLS13 |
提示:修改API Server配置后,需要执行
systemctl daemon-reload && systemctl restart kubelet使变更生效
2.2 kubelet安全配置
kubelet是工作节点上的关键组件,不当配置可能导致容器逃逸:
# 检查当前kubelet配置
cat /var/lib/kubelet/config.yaml | grep -E 'anonymous|authorization'
应确保以下配置:
authentication:
anonymous:
enabled: false
authorization:
mode: Webhook
2.3 etcd加密配置
etcd存储着集群的所有敏感数据,必须启用加密:
# /etc/kubernetes/manifests/etcd.yaml关键配置
- --client-cert-auth=true
- --cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
3. 身份认证与访问控制
3.1 ServiceAccount安全实践
ServiceAccount是Pod访问API Server的凭证,需要严格管理:
# 安全ServiceAccount示例
apiVersion: v1
kind: ServiceAccount
metadata:
name: backend-sa
namespace: qa
automountServiceAccountToken: false # 禁止自动挂载token
最佳实践:
- 命名以"-sa"结尾便于识别
- 按最小权限原则分配角色
- 定期清理未使用的ServiceAccount
3.2 RBAC精细化控制
避免使用过于宽松的ClusterRole,按需创建定制化角色:
# 创建仅能get services的Role
kubectl create role service-reader --verb=get --resource=services -n db
# 创建仅能delete namespaces的Role
kubectl create role namespace-deleter --verb=delete --resource=namespaces -n db
3.3 清理高风险绑定
定期检查并清理不必要的ClusterRoleBinding:
# 查找并删除匿名用户的cluster-admin绑定
kubectl get clusterrolebinding system:anonymous
kubectl delete clusterrolebinding system:anonymous
4. 网络隔离策略
4.1 默认拒绝策略
在关键namespace实施默认拒绝策略:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: testing
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
4.2 精细化网络控制
按需开放特定Pod间的通信:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: pod-restriction
namespace: dev-team
spec:
podSelector:
matchLabels:
app: products-service
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: qaqa
- podSelector:
matchLabels:
environment: testing
5. 运行时安全
5.1 容器安全上下文
通过securityContext限制容器权限:
securityContext:
runAsUser: 30000 # 非root用户
allowPrivilegeEscalation: false # 禁止提权
readOnlyRootFilesystem: true # 只读根文件系统
5.2 沙箱运行时gVisor
对不可信工作负载使用gVisor隔离:
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: untrusted
handler: runsc # gVisor运行时
在Deployment中引用:
spec:
runtimeClassName: untrusted
5.3 AppArmor配置
启用AppArmor配置文件增强容器安全:
# 加载AppArmor配置
apparmor_parser /etc/apparmor.d/nginx_apparmor
在Pod中应用:
metadata:
annotations:
container.apparmor.security.beta.kubernetes.io/<container-name>: localhost/nginx-profile-3
6. 镜像安全
6.1 漏洞扫描与Trivy实践
使用Trivy扫描镜像漏洞:
# 扫描指定namespace所有镜像
kubectl get pods -n kamino -o jsonpath='{range .items[*]}{.spec.containers[*].image}{"\n"}{end}' | sort -u | xargs -I{} trivy image --severity HIGH,CRITICAL {}
高危镜像处理流程:
- 识别使用高危镜像的Pod
- 通知相关团队更新镜像
- 强制删除仍在使用高危镜像的Pod
6.2 ImagePolicyWebhook配置
通过准入控制阻止高危镜像部署:
// /etc/kubernetes/epconfig/admission_configuration.json
{
"imagePolicy": {
"kubeConfigFile": "/etc/kubernetes/epconfig/kubeconfig.yml",
"allowTTL": 50,
"denyTTL": 50,
"retryBackoff": 500,
"defaultAllow": false # 隐式拒绝
}
}
API Server启用插件:
- --enable-admission-plugins=NodeRestriction,ImagePolicyWebhook
- --admission-control-config-file=/etc/kubernetes/epconfig/admission_configuration.json
7. 安全监控与审计
7.1 日志审计配置
启用API Server审计日志:
# /etc/kubernetes/manifests/kube-apiserver.yaml
- --audit-policy-file=/etc/kubernetes/logpolicy/sample-policy.yaml
- --audit-log-path=/var/log/kubernetes/audit-logs.txt
- --audit-log-maxage=10 # 保留10天
- --audit-log-maxbackup=2 # 保留2个备份
审计策略示例:
rules:
- level: RequestResponse
resources:
- group: ""
resources: ["persistentvolumes"]
- level: Request
resources:
- group: ""
resources: ["configmaps"]
namespaces: ["front-apps"]
- level: Metadata
resources:
- group: ""
resources: ["secrets", "configmaps"]
7.2 运行时监控与Falco
使用Falco检测异常活动:
# 自定义规则监控特定容器
cat > /etc/falco/falco_rules.local.yaml <<EOF
- rule: Redis异常进程
desc: 检测Redis容器中的异常进程
condition: container.name = "redis123" and proc.name != "redis-server"
output: "%evt.time,%user.uid,%proc.name"
priority: WARNING
EOF
# 运行监控
falco -M 30 -r /etc/falco/falco_rules.local.yaml > /opt/KSR00101/incidents/summary
8. 敏感数据保护
8.1 Secret管理实践
安全创建和使用Secret:
# 从文件创建Secret
kubectl create secret generic db2-test \
--from-literal=username=production-instance \
--from-literal=password=KvLftKgs4aVH \
-n istio-system
在Pod中安全使用:
volumes:
- name: secret-volume
secret:
secretName: db2-test
containers:
- volumeMounts:
- name: secret-volume
mountPath: /etc/secret
readOnly: true
8.2 Dockerfile安全
安全Dockerfile编写要点:
FROM ubuntu:16.04
USER nobody # 非root用户
# 不要使用ADD,优先使用COPY
COPY --chown=nobody:nobody app /app
# 明确声明暴露端口
EXPOSE 8080
# 使用数组格式的CMD
CMD ["nginx", "-g", "daemon off;"]
9. 持续安全实践
安全配置不是一次性的工作,而需要持续维护:
- 定期扫描:每周运行kube-bench和Trivy扫描
- 配置检查:使用kubectl和audit2rbac检查RBAC配置
- 版本更新:及时升级Kubernetes和容器运行时
- 备份验证:定期备份etcd并验证恢复流程
- 人员培训:定期进行安全意识和技能培训
生产环境检查清单:
- [ ] 所有节点已安装最新安全补丁
- [ ] API Server认证和授权配置正确
- [ ] 网络策略覆盖所有关键namespace
- [ ] 容器运行时使用适当隔离技术
- [ ] 敏感数据全部通过Secret管理
- [ ] 审计日志已启用并定期分析
- [ ] 存在应急响应和恢复计划
更多推荐
所有评论(0)