【每日一个云原生小技巧 #68】Kubernetes API 访问控制

Kubernetes API 访问控制是 Kubernetes 安全体系的核心组成部分,负责管理对 Kubernetes API 的访问权限。它确保只有经过授权的用户和进程能够执行对 Kubernetes 资源的操作。

Kubernetes API 访问控制

Kubernetes API 访问控制使用多层安全策略来保护集群:

  1. 身份验证(Authentication):确定请求者的身份。常用方法包括证书、令牌、基本身份验证等。
  2. 授权(Authorization):一旦身份确认,下一步是判断该用户是否有权限执行请求的操作。常用的授权模式包括 RBAC(基于角色的访问控制)、ABAC(基于属性的访问控制)等。
  3. 准入控制(Admission Control):在请求被允许之前,可使用准入控制器对其进行进一步的约束和修改。

使用场景

  1. 多用户环境:在有多个用户或团队共享 Kubernetes 集群的情况下,限制他们对特定资源的访问。
  2. 自动化脚本:为自动化工作流程(如 CI/CD 流程)配置适当的访问权限。
  3. 合规性和安全性:确保只有授权用户才能访问敏感数据,符合合规性和安全要求。

使用技巧

  1. 使用 RBAC:基于角色的访问控制(RBAC)是管理 Kubernetes 集群访问的推荐方式。
  2. 最小权限原则:为用户和服务账户分配最小的必要权限。
  3. 定期审计:定期审计权限设置和使用情况,确保符合安全和合规性要求。

使用案例

案例1:创建和配置 Service Account

假设您正在为 CI/CD 系统设置访问控制,您需要创建一个服务账户并授予它访问特定命名空间的权限。

创建服务账户

代码语言:javascript
复制
apiVersion: v1
kind: ServiceAccount
metadata:
  name: cicd-account
  namespace: dev

这将在 dev 命名空间中创建一个名为 cicd-account 的服务账户。

创建角色和角色绑定

代码语言:javascript
复制
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: dev
  name: dev-deployer
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["create", "get", "list", "watch", "delete"]

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: dev-deployer-binding
namespace: dev
subjects:

  • kind: ServiceAccount
    name: cicd-account
    namespace: dev
    roleRef:
    kind: Role
    name: dev-deployer
    apiGroup: rbac.authorization.k8s.io

这里我们创建了一个名为 dev-deployer 的角色,它允许对 dev 命名空间中的 Pod 执行创建、获取、列表、观察和删除操作。然后,我们通过 RoleBinding 将这个角色绑定到我们之前创建的服务账户 cicd-account

案例2:为用户分配命名空间级别的访问权限

假设您想为特定用户在特定命名空间中提供读取权限。

创建角色

代码语言:javascript
复制
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: mynamespace
name: namespace-reader
rules:
  • apiGroups: [""]
    resources: ["pods", "pods/log"]
    verbs: ["get", "list", "watch"]
  • 这个 namespace-reader 角色允许用户读取 mynamespace 命名空间中的 Pod 和 Pod 日志。

    创建角色绑定

    代码语言:javascript
    复制
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
    name: namespace-reader-binding
    namespace: mynamespace
    subjects:
  • kind: User
    name: username
    apiGroup: rbac.authorization.k8s.io
    roleRef:
    kind: Role
    name: namespace-reader
    apiGroup: rbac.authorization.k8s.io
  • 这个 RoleBindingnamespace-reader 角色绑定到用户 username,从而允许该用户访问 mynamespace 命名空间中的 Pod 和 Pod 日志。

    结论

    通过合理配置 Kubernetes API 访问控制,可以有效地保护集群资源,确保只有授权的用户和进程才能访问敏感数据和执行关键操作。这不仅有助于维护 Kubernetes 集群的安全性,还可以满足不同的业务需求和合规性要求。