如何配置 Kubernetes RBAC 权限

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本教程将指导你了解 Kubernetes RBAC(基于角色的访问控制)的基础知识,这是一种用于管理和控制对 Kubernetes 资源的访问的强大机制。你将学习如何配置 RBAC 策略,理解关键概念,并应用最佳实践来保护你的 Kubernetes 集群。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/delete("Delete") kubernetes/BasicCommandsGroup -.-> kubernetes/edit("Edit") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/config("Config") subgraph Lab Skills kubernetes/create -.-> lab-415231{{"如何配置 Kubernetes RBAC 权限"}} kubernetes/delete -.-> lab-415231{{"如何配置 Kubernetes RBAC 权限"}} kubernetes/edit -.-> lab-415231{{"如何配置 Kubernetes RBAC 权限"}} kubernetes/apply -.-> lab-415231{{"如何配置 Kubernetes RBAC 权限"}} kubernetes/config -.-> lab-415231{{"如何配置 Kubernetes RBAC 权限"}} end

理解 Kubernetes RBAC

Kubernetes RBAC(基于角色的访问控制)是一种强大的机制,它允许你管理和控制对 Kubernetes 资源的访问。它提供了一种灵活且细粒度的方式,用于在你的 Kubernetes 集群中定义和实施授权策略。

Kubernetes RBAC 的核心包含以下关键概念:

角色(Role)和集群角色(ClusterRole)

角色(Role)和集群角色(ClusterRole)定义了一组可以授予用户、组或服务账户的权限。角色(Role)作用于特定的命名空间,而集群角色(ClusterRole)则是集群范围的。

角色绑定(RoleBinding)和集群角色绑定(ClusterRoleBinding)

角色绑定(RoleBinding)和集群角色绑定(ClusterRoleBinding)用于将角色(Role)或集群角色(ClusterRole)与用户、组或服务账户相关联。它们决定了谁有权访问哪些资源。

主体(Subject)

主体(Subject)是你想要授予权限的实体(用户、组或服务账户)。可以通过它们的名称或 Kubernetes 标识来指定。

为了理解 Kubernetes RBAC 的工作原理,让我们看一个简单的例子。假设你有一个名为 “app-namespace” 的 Kubernetes 命名空间,并且你想授予名为 “alice” 的用户在该命名空间中查看和创建 Pod 的能力。

graph LR A[用户:alice] --> B[角色绑定(RoleBinding)] B --> C[角色(Role)] C --> D[权限:查看、创建 Pod] C --> E[命名空间:app-namespace]

在这个例子中,你将创建一个具有必要权限(查看和创建 Pod)的角色(Role),以及一个将该角色(Role)与 “app-namespace” 命名空间中的用户 “alice” 相关联的角色绑定(RoleBinding)。

## 角色(Role)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: app-namespace
  name: pod-viewer
rules:
- apiGroups: [""] ## "" 表示核心 API 组
  resources: ["pods"]
  verbs: ["get", "list", "watch", "create"]

## 角色绑定(RoleBinding)
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: pod-viewer
  namespace: app-namespace
subjects:
- kind: User
  name: alice
roleRef:
  kind: Role
  name: pod-viewer
  apiGroup: rbac.authorization.k8s.io

此配置授予 “alice” 用户在 “app-namespace” 命名空间中查看和创建 Pod 的能力。

Kubernetes RBAC 提供了一种灵活且可扩展的方式来管理 Kubernetes 集群中的访问控制。通过理解基本概念并应用最佳实践,你可以确保集群资源安全,并可供正确的用户和应用程序访问。

配置 Kubernetes RBAC

配置 Kubernetes RBAC 涉及创建角色(Role)、集群角色(ClusterRole)、角色绑定(RoleBinding)和集群角色绑定(ClusterRoleBinding),以便向 Kubernetes 集群中的用户、组和服务账户授予适当的权限。

创建角色(Role)和集群角色(ClusterRole)

角色(Role)和集群角色(ClusterRole)定义了可以授予主体的权限集。你可以使用 Kubernetes API 或通过在 YAML 文件中定义来创建它们。

## 角色(Role)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: app-namespace
  name: pod-viewer
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]

## 集群角色(ClusterRole)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-admin
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]

绑定角色(Role)和集群角色(ClusterRole)

角色绑定(RoleBinding)和集群角色绑定(ClusterRoleBinding)用于将角色(Role)或集群角色(ClusterRole)与主体(用户、组或服务账户)相关联。

## 角色绑定(RoleBinding)
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: pod-viewer
  namespace: app-namespace
subjects:
- kind: User
  name: alice
roleRef:
  kind: Role
  name: pod-viewer
  apiGroup: rbac.authorization.k8s.io

## 集群角色绑定(ClusterRoleBinding)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cluster-admin-binding
subjects:
- kind: User
  name: admin
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

管理服务账户

服务账户是 Kubernetes RBAC 中的一种特殊类型的主体。它们用于为在集群中运行的应用程序和进程提供标识。

## 服务账户
apiVersion: v1
kind: ServiceAccount
metadata:
  name: app-service-account
  namespace: app-namespace

## 服务账户的角色绑定(RoleBinding)
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: app-service-account-viewer
  namespace: app-namespace
subjects:
- kind: ServiceAccount
  name: app-service-account
  namespace: app-namespace
roleRef:
  kind: Role
  name: pod-viewer
  apiGroup: rbac.authorization.k8s.io

通过了解如何配置角色(Role)、集群角色(ClusterRole)、角色绑定(RoleBinding)和集群角色绑定(ClusterRoleBinding),以及如何管理服务账户,你可以有效地控制和管理对 Kubernetes 资源的访问。

应用 Kubernetes RBAC 最佳实践

在实施 Kubernetes RBAC 时,遵循最佳实践对于确保集群的安全性和可维护性非常重要。以下是一些关键建议:

最小权限原则

遵循最小权限原则,为每个主体授予执行其任务所需的最低权限。除非绝对必要,否则避免授予过于宽泛的权限,例如集群管理员访问权限。

关注点分离

通过为不同的功能领域或团队创建不同的角色(Role)和角色绑定(RoleBinding)来分离关注点。这有助于维护清晰且有条理的访问控制结构。

## 为不同团队设置单独的角色(Role)
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: app-namespace
  name: developer-role
rules:
  - apiGroups: [""]
    resources: ["pods", "services"]
    verbs: ["get", "list", "watch", "create", "update", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: app-namespace
  name: ops-role
rules:
  - apiGroups: [""]
    resources: ["nodes", "configmaps"]
    verbs: ["get", "list", "watch"]

自动化与版本控制

使用版本控制系统(如 Git)来管理你的 RBAC 配置,以确保一致性、可追溯性,并便于回滚更改。

定期审查与审计

定期审查你的 RBAC 配置,以确保它们是最新的,并与你组织的安全策略保持一致。删除任何不必要或过时的权限。

利用默认角色

Kubernetes 提供了几个默认的集群角色(ClusterRole),例如 vieweditadmin,可以将它们用作 RBAC 配置的起点。根据需要自定义这些角色以满足你的特定要求。

通过遵循这些最佳实践,你可以创建一个强大且安全的 Kubernetes RBAC 实现,有效地管理对集群资源的访问。

总结

Kubernetes RBAC 提供了一种灵活且细粒度的方式,用于在你的 Kubernetes 集群中定义和实施授权策略。通过理解角色(Role)、集群角色(ClusterRole)、角色绑定(RoleBinding)和集群角色绑定(ClusterRoleBinding)的核心概念,你可以有效地向用户、组和服务账户授予权限。本教程涵盖了 Kubernetes RBAC 的基础知识以及如何将其应用于你的 Kubernetes 环境。通过遵循所概述的最佳实践,你可以确保你的 Kubernetes 集群安全且访问得到妥善控制。