文章目录
- 安全认证
- 1. **身份认证(Authentication)**
- 2. **授权(Authorization)**
- 3. **准入控制(Admission Control)**
- 4. **机密信息管理**
- 5. **其他安全实践**
安全认证
Kubernetes 的安全机制覆盖了从身份验证到资源操作的完整链条:
- 认证 → 2. 授权 → 3. 准入控制 → 4. 资源管理
生产环境中建议:
- 使用 RBAC + ServiceAccount 进行最小权限分配。
- 启用 Pod 安全准入 和 网络策略。
- 定期轮换证书和令牌。
通过组合这些机制,可以构建一个符合零信任原则的 Kubernetes 集群安全体系。
1. 身份认证(Authentication)
http token和账户密码等
https ca证书
-
X.509 客户端证书
- 通过 TLS 双向认证,客户端使用证书(如
kubectl
的--client-certificate
和--client-key
参数)向 API Server 证明身份。 - 证书由集群 CA 签发,需在 API Server 启动时配置
--client-ca-file
。
- 通过 TLS 双向认证,客户端使用证书(如
-
Bearer Token(静态令牌)
- 静态令牌文件通过
--token-auth-file
指定,令牌以明文形式存储在文件中(不推荐生产环境使用)。 - 通常用于服务账户(ServiceAccount)的自动生成令牌(JWT格式)。
- 静态令牌文件通过
-
ServiceAccount(服务账户)
- 每个 Pod 默认挂载一个 ServiceAccount 的令牌(位于
/var/run/secrets/kubernetes.io/serviceaccount/token
)。 - API Server 通过
--service-account-key-file
验证令牌签名。
- 每个 Pod 默认挂载一个 ServiceAccount 的令牌(位于
-
OpenID Connect (OIDC)
- 集成第三方身份提供商(如 Google、Azure AD),用户通过 OAuth 2.0 流程获取 ID Token 后访问集群。
-
Webhook 令牌认证
- 将令牌验证委托给外部服务(如自定义认证服务),通过
--authentication-token-webhook-config-file
配置。
- 将令牌验证委托给外部服务(如自定义认证服务),通过
-
匿名请求
- 默认允许匿名请求(身份为
system:anonymous
),可通过--anonymous-auth=false
禁用。
- 默认允许匿名请求(身份为
2. 授权(Authorization)
通过 RBAC(主流)、ABAC、Node Authorization 等机制控制已认证用户的权限:
-
RBAC(基于角色的访问控制)
- 定义 Role(命名空间内权限)和 ClusterRole(集群范围权限),再通过 RoleBinding/ClusterRoleBinding 绑定到用户、组或 ServiceAccount。
- 示例:允许某用户读取 Pod 信息:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata:namespace: defaultname: pod-reader rules: - apiGroups: [""]resources: ["pods"]verbs: ["get", "list", "watch"]
-
ABAC(基于属性的访问控制)
- 通过策略文件(
--authorization-policy-file
)定义规则,灵活性差,已逐渐被 RBAC 取代。
- 通过策略文件(
-
Node Authorization
- 专门授权 kubelet 访问节点相关资源(如 Pod、Secret)。
-
Webhook 授权
- 将授权决策委托给外部 HTTP 服务。
3. 准入控制(Admission Control)
在请求通过认证和授权后,API Server 会调用准入控制器(Admission Controllers)进行更精细的资源校验或修改:
-
内置控制器
NamespaceLifecycle
:防止在终止的命名空间中创建资源。ResourceQuota
:限制命名空间的资源使用量。PodSecurity
(替代 PSP):强制执行 Pod 安全标准(如禁止特权容器)。MutatingAdmissionWebhook
/ValidatingAdmissionWebhook
:通过 Webhook 动态修改或验证资源。
-
示例:使用
ValidatingAdmissionWebhook
拦截不符合标签要求的 Deployment。
4. 机密信息管理
- Secrets
- 存储敏感数据(如密码、令牌),以 Base64 编码形式存在 Etcd 中,建议启用加密(
--encryption-provider-config
)。
- 存储敏感数据(如密码、令牌),以 Base64 编码形式存在 Etcd 中,建议启用加密(
- ConfigMap
- 存储非敏感配置,与 Secrets 分离以降低风险。
5. 其他安全实践
- API Server 安全配置
- 启用 HTTPS(
--tls-cert-file
,--tls-private-key-file
)。 - 限制匿名访问和废弃 API 版本。
- 启用 HTTPS(
- Etcd 加密
- 静态数据加密(
--encryption-provider-config
)。
- 静态数据加密(
- 网络策略(NetworkPolicy)
- 控制 Pod 间网络流量(需 CNI 插件支持,如 Calico)。
- Pod 安全上下文(SecurityContext)
- 限制容器权限(如
runAsNonRoot: true
、readOnlyRootFilesystem: true
)。
- 限制容器权限(如