【K8s】Kubernetes 安全机制之 RBAC

文摘   科技   2024-10-08 07:00   北京  

下内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发!如果您有其他想要了解的,欢迎私信联系我~





基本介绍

在 Kubernetes 中,RBAC(Role-Based Access Control,基于角色的访问控制)是一种权限管理机制,用于控制用户、系统进程或系统组件对 Kubernetes 资源的访问权限。
RBAC 的主要作用如下:
  • 权限细分:RBAC 允许创建不同的角色,每个角色可以定义一组特定的权限。这些角色可以授予用户对资源的不同级别的访问权限,如读取、写入、删除等
  • 角色分配:通过角色绑定(RoleBinding 或 ClusterRoleBinding),可以将一个或多个角色分配给用户、组或服务账户。这使得权限管理更加灵活和可扩展
  • 最小权限原则:RBAC 支持最小权限原则,即用户只能获得完成其工作所必需的权限。这有助于减少安全风险
  • namespace 级别的权限:RBAC 允许在特定的 namespace 内定义角色和角色绑定,从而限制用户只能在特定的 namespace 内操作
  • 集群级别的权限:RBAC 还支持在集群级别定义角色和角色绑定,这样用户就可以在整个集群范围内进行操作
  • 动态策略管理:RBAC 允许通过 Kubernetes API 动态地创建、更新和删除角色和角色绑定,使得权限管理更加灵活
  • 审计和合规:RBAC 可以与 Kubernetes 的审计日志结合使用,帮助跟踪和记录用户的活动,以便于审计和合规性检查
  • 集成身份提供者:RBAC 可以与外部身份提供者(如 LDAP、SAML 或 OIDC)集成,允许使用集中式身份验证和授权
  • 减少硬编码权限:RBAC 减少了硬编码权限的需求,使得权限管理更加集中和一致
  • 提高安全性:通过精细的权限控制,RBAC 有助于提高集群的安全性,防止未授权访问和潜在的安全威胁
RBAC 的核心思想是通过「角色」控制资源的操作权限,应用场景如下:
  • 权限最小化
  • 细粒度权限控制
  • 集群安全合规
使用 kubeadm 安装的集群默认开启了 RBAC,对应配置位于 Master 节点上静态 Pod 的资源清单中:/etc/kubernetes/manifests/kube-apiserver.yaml:- --authorization-mode=Node,RBAC




RBAC 对象类型

1、Role 与 ClusterRole
  • Role(角色)通过 Rule 定义 Subject 在指定命名空间下的权限,仅作用于集群内单个指定的命名空间

    • Role 需要指定命名空间

  • ClusterRole(集群角色)通过 Rule 定义 Subject 在集群下的权限,可以作用于集群内所有的命名空间

    • ClusterRole 不需要指定命名空间

    • 集群初始化默认的 ClusterRole 对象为 cluster-admin


2、RoleBinding 与 ClusterRoleBinding
  • RoleBinding(角色绑定) 将 Subject 与 Role 进行绑定
    • RoleBinding 需要指定命名空间
  • ClusterRoleBinding(集群角色绑定)将 Subject 与 ClusterRole 进行绑定
    • ClusterRoleBinding 不需要指定命名空间




RBAC 对象属性

1、Rule
  • 规则,用于定义 Role / ClusterRole 可以对「资源类型集合」执行的「操作类型集合」
    • apiGroups:规则适用的 API 组,[""] 表示核心 API 组
    • resources:允许操作的「资源类型集合」,如 nodes、deployments、pods 等(注意:末尾加上 s)
    • verbs:允许执行的「操作类型集合」,如 watch、list、get、create、update、delete 等

2、RoleRef
  • 角色引用,用于在 RoleBinding / ClusterRoleBinding 引用要绑定的 Role / ClusterRole
  • 示例如下:
roleRef:  apiGroup: rbac.authorization.k8s.io   # 默认,且不是 rbac.authorization.k8s.io/v1  kind: Role / ClusterRole  name: xxx

3、Subject
  • 主体,用于在 RoleBinding / ClusterRoleBinding 定义绑定的主体,支持以下类型:
    • User:用户
    • Group:用户组
    • ServiceAccount:服务账号
  • 示例如下:
subjects:- kind: ServiceAccount  name: xxx  namespace: xxx




RBAC 常用命令

# 创建 Role / ClusterRole* kubectl create role demo --resource=nodes,pods --verb=get,list -n <namespace>* kubectl create clusterrole demo --resource=nodes,pods --verb=get,list,create,delete # 创建 RoleBinding / ClusterRoleBinding* kubectl create rolebinding demo --role=demo --serviceaccount=xxx -n <namespace>* kubectl create clusterrolebinding demo --clusterrole=demo --serviceaccount=xxx 🔔 --serviceaccount=xxx,--user=xxx,--group=xxx # 查看 RBAC 对象* kubectl get role / rolebinding -n <namespace>* kubectl get clusterrole / clusterrolebinding # 删除 RBAC 对象* kubectl delete role / rolebinding  demo -n <namespace>* kubectl get clusterrole / clusterrolebinding demo




RBAC 资源清单(示例)

apiVersion: v1kind: ServiceAccountmetadata:  name: demo-admin  namespace: kube-system ---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:  name: demo-clusterrolerules:- apiGroups:  - ""  resources:  - nodes  - services  - endpoints  - pods  - nodes/proxy  verbs:  - get  - list  - watch- apiGroups:  - ""  resources:  - configmap  - nodes/proxy  verbs:  - get ---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:  name: demoroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: demo-clusterrolesubjects:- kind: ServiceAccount  name: demo-admin  namespace: kube-system




书籍推荐

最后推荐一本笔者从 Docker 进阶到 Kubernetes 自学过程中,受益较深的书籍。笔者经常复读,并结合工作实践不断加深理解和体会,可谓常读常新。希望这本书可以帮助到更多对 Kubernetes 感兴趣或刚开始学习的读者。

实施运维知识交流
专注于运维、实施交付领域,持续分享个人笔记、学习心得,欢迎关注,共同交流、成长!
 最新文章