安全与权限 RBAC
理解 RBAC 权限体系
掌握 Role、ClusterRole、ServiceAccount 的使用
能根据业务配置最小权限
核心讲解
K8s 权限体系是 RBAC(基于角色的访问控制),角色定义权限,绑定到用户 / 服务账号。
(1)核心概念
Role:角色,定义权限,命名空间级
ClusterRole:集群级角色,全局资源
RoleBinding:把角色绑定到用户 / 服务账号,命名空间级
ClusterRoleBinding:集群级绑定
ServiceAccount:服务账号,Pod 用的身份
(2)权限规则
apiGroups:API 组,比如 apps、batch
resources:资源,比如 pods、deployments
verbs:动作,get、list、create、delete
(3)最佳实践
最小权限原则,只给需要的权限
服务账号按业务分,不要用 default
生产环境禁止匿名访问
禁用默认服务账号的权限
操作示例
# 角色
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
# 绑定
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: ServiceAccount
name: app-sa
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io常见误区
权限默认是开放的:默认匿名用户有基础访问权限,生产环境必须禁用匿名访问,收紧权限边界
权限给得越全越好:严格遵循最小权限原则,只授予业务必须的权限,禁止直接给集群管理员权限
ServiceAccount 可有可无:Pod 访问集群 API 必须用服务账号,生产环境每个业务单独创建 SA,禁止使用默认 default 账号
Role 可以跨命名空间:Role 是命名空间级资源,只能作用于当前命名空间;跨命名空间授权必须用 ClusterRole
课后练习
创建一个 Pod 只读角色,绑定到指定服务账号
在 Pod 中使用该服务账号,验证只能查看 Pod 不能创建
创建一个集群级角色,可查看所有命名空间的节点信息
思考:为什么生产环境必须遵循最小权限原则?
