简介
Kubernetes安全始于控制谁能做什么以及Pod可以运行什么。在本教程中,我们将实现RBAC(基于角色的访问控制)和Pod安全标准来保护Kubernetes集群。
前提条件
- 运行中的Kubernetes集群(minikube、kind或托管集群)
- 已安装并配置
kubectl - Kubernetes基础知识(Pod、Namespace、Deployment)
1. 理解RBAC组件
Kubernetes RBAC有四个关键对象:
| 对象 | 作用域 | 用途 |
|------|--------|------|
| Role | Namespace | 定义命名空间内的权限 |
| ClusterRole | 集群 | 定义集群范围的权限 |
| RoleBinding | Namespace | 将Role授予用户/组 |
| ClusterRoleBinding | 集群 | 在集群范围授予ClusterRole |
2. 创建实验用Namespace
# 创建专用命名空间
kubectl create namespace security-lab
# 验证
kubectl get namespaces | grep security-lab
3. 创建RBAC角色
只读角色
创建仅允许查看资源的角色:
# read-only-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: security-lab
name: pod-reader
rules:
apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch"]
apiGroups: [""]
resources: ["services", "configmaps"]
verbs: ["get", "list"]
具有有限写权限的开发者角色
# developer-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: security-lab
name: developer
rules:
apiGroups: [""]
resources: ["pods", "services", "configmaps", "secrets"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
apiGroups: ["apps"]
resources: ["deployments", "replicasets"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
apiGroups: [""]
resources: ["pods/exec", "pods/portforward"]
verbs: ["create"]
apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list"]
# 应用两个角色
kubectl apply -f read-only-role.yaml
kubectl apply -f developer-role.yaml
4. 创建ServiceAccount和绑定
# service-accounts.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: viewer-sa
namespace: security-lab
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: developer-sa
namespace: security-lab
# role-bindings.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: viewer-binding
namespace: security-lab
subjects:
kind: ServiceAccount
name: viewer-sa
namespace: security-lab
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: developer-binding
namespace: security-lab
subjects:
kind: ServiceAccount
name: developer-sa
namespace: security-lab
roleRef:
kind: Role
name: developer
apiGroup: rbac.authorization.k8s.io
5. 测试RBAC权限
使用kubectl auth can-i验证权限:
# 测试viewer权限
kubectl auth can-i get pods \
--namespace security-lab \
--as system:serviceaccount:security-lab:viewer-sa
# 输出: yes
kubectl auth can-i create pods \
--namespace security-lab \
--as system:serviceaccount:security-lab:viewer-sa
# 输出: no
6. Pod安全标准(PSS)
Kubernetes 1.25+用Pod安全标准替代了PodSecurityPolicy。
三个安全级别
| 级别 | 描述 |
|------|------|
| Privileged | 无限制(默认) |
| Baseline | 防止已知的权限提升 |
| Restricted | 严格限制,安全最佳实践 |
7. 应用Pod安全标准
# 对命名空间应用受限安全标准
kubectl label namespace security-lab \
pod-security.kubernetes.io/enforce=restricted \
pod-security.kubernetes.io/audit=restricted \
pod-security.kubernetes.io/warn=restricted
8. 测试安全执行
特权Pod会被拒绝,符合restricted标准的Pod才能运行。关键配置包括:runAsNonRoot: true、allowPrivilegeEscalation: false、readOnlyRootFilesystem: true、capabilities.drop: ["ALL"]。
9. 生产级安全Deployment
完整的安全Deployment模板包含:ServiceAccount配置、安全上下文、资源限制和NetworkPolicy。实现RBAC(API层面)、Pod安全(运行时层面)和NetworkPolicy(网络层面)的纵深防御。
总结
本教程涵盖了:
1. 创建最小权限的RBAC角色
2. 将角色绑定到ServiceAccount
3. 使用脚本和can-i进行权限审计
4. 在Namespace级别实施Pod安全标准
5. 编写符合restricted策略的安全Pod规范
6. 添加NetworkPolicy控制流量
7. 使用审计脚本自动化安全检查