1751 字
9 分钟
kubernetes-authorization

存在多个 Authorization Mode 时,顺序执行,在deny时跳到下一个mode,指导allow,赋予requester权限

Kubernetes Authorization 概述
在 Kubernetes 中,Authorization 是在用户通过 Authentication(身份认证)后,决定该用户是否有权执行某一操作的过程。Kubernetes 提供了多种 Authorization 模式,以下按由浅入深的顺序逐一介绍它们:


1. Node Authorization#

用途
专门用于管理 Kubernetes 中节点对资源的访问权限。节点需要访问某些资源(如 Pods、Secrets)以便正常运行或调度工作负载。

工作机制

  • Node Authorization 模式基于节点的身份(通常由节点的证书中 system:node:<node-name> 表示)来限制权限。
  • 节点只能访问其负责的 Pod 和与这些 Pod 相关联的资源(如 ConfigMaps 和 Secrets)。

典型场景

  • 节点尝试获取自身负责的 Pod 信息。
  • 节点只能访问其调度范围内的资源。

限制

  • 专用于节点,不适合用于常规用户或服务账户的授权。

事实检查

  • 节点身份认证:节点的身份是通过 Kubernetes 提供的客户端证书进行验证的,这些证书的 CN(Common Name) 格式为 system:node:<node-name>,并且属于 system:nodes 组。
  • 权限限制
    • 节点只能获取与自己调度的 Pod 和这些 Pod 相关资源(例如 ConfigMaps、Secrets)。
    • 节点可以通过 GETLIST 操作访问特定资源,但通常没有删除或修改权限。
  • 常用场景:确保节点只能访问与其实际职责相关的数据,避免因节点被攻击而导致数据泄露。

2. ABAC (Attribute-Based Access Control)#

用途
通过属性(Attributes)定义规则,控制谁可以执行哪些操作。

工作机制

  • ABAC 基于策略文件,文件中的每条规则描述了用户、资源及操作的匹配条件。
  • 策略文件需要管理员手动编写,且是静态的。

扩展规则文件,涵盖更丰富的使用场景

示例policy#

示例 1: 开发人员对特定命名空间的只读访问#
{
  "user": "developer",
  "namespace": "development",
  "resource": ["pods", "services", "configmaps"],
  "readonly": true
}
示例 2: 管理员对所有资源的完全访问#
{
  "user": "admin",
  "namespace": "*",
  "resource": "*",
  "readonly": false
}
示例 3: 审计用户只能查看日志#
{
  "user": "auditor",
  "namespace": "*",
  "resource": ["events", "pods/log"],
  "readonly": true
}
示例 4: 限制用户只能访问特定资源种类#
{
  "user": "tester",
  "namespace": "test",
  "resource": ["pods"],
  "readonly": false
}
示例 5: 服务账户的自定义权限#
{
  "user": "system:serviceaccount:default:my-service-account",
  "namespace": "production",
  "resource": ["secrets"],
  "readonly": true
}

注意事项

  1. ABAC 的规则匹配是线性扫描,顺序非常重要。
  2. 当规则复杂时,可能导致配置难以维护,因此 Kubernetes 推荐使用 RBAC。

优点

  • 灵活,可以为不同用户和操作设置精细规则。

缺点

  • 不易维护,尤其在大规模集群中。
  • 动态性较差,需要修改文件并重启 API Server。

3. RBAC (Role-Based Access Control)#

^42cbd7

用途
基于角色分配权限,当前 Kubernetes 的推荐授权方式。

工作机制

  • 使用 RoleClusterRole 定义权限集合。
    • Role:限定在特定 Namespace 内
    • ClusterRole:全局作用于所有 Namespaces。
  • 通过 RoleBindingClusterRoleBinding 将权限绑定到用户、组或服务账户。

权限查看 Check Access

# kubectl auth can-i <verb> <resource> 
$kubectl auth can-i delete nodes
Warning: resource 'nodes' is not namespace scoped

yes

查看其他User 权限

# kubectl auth can-i <verb> <resource> --as <role> --namespace <ns>
$kubectl auth can-i delete nodes --as dev-user

核心概念#

  1. Role 和 ClusterRole

    • Role:作用于单个 Namespace,用于定义资源的操作权限。
    • ClusterRole:作用于整个集群,既可以管理全局资源(如 Nodes),也可以绑定到特定 Namespace。
  2. RoleBinding 和 ClusterRoleBinding

    • RoleBinding:将 Role 绑定到用户、组或服务账户,限定在指定的 Namespace。
    • ClusterRoleBinding:将 ClusterRole 绑定到用户、组或服务账户,全局适用或跨 Namespace。

权限语法详解#

  1. API Groups:指定资源所属的 API 组。
  2. Resources:具体资源类型(如 Pods、Services)。
  3. Verbs:允许的操作(如 get, list, create, delete)。
  4. Resource Names:指定资源名称,进一步限制权限。

RBAC 典型场景#

示例 1: 为开发人员赋予查看 Pod 的权限#
kubectl create role pod-viewer --verbs=get --verbs=list --verbs=watch\
--resource=pods --resource-name=podName1 --resource-name=podName2\
--namespace development

kubectl create rolebinding pod-viewer-binding --role=pod-viewer --user=developer 
kubectl create role pod-viewer \
  --verb=get,list,watch \
  --resource=pods \
  --resource-name=podName1 \
  --resource-name=podName2 \
  --namespace=development
  
kubectl create rolebinding pod-viewer-binding \
  --role=pod-viewer \
  --user=developer \
  --namespace=development

Pastedimage20250109234624.png

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: development
  name: pod-viewer
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
  resourceName: ["podName1", "podName2"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: pod-viewer-binding
  namespace: development
subjects:
- kind: User
  name: developer
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-viewer
  apiGroup: rbac.authorization.k8s.io
示例 2: 为集群管理员赋予全局权限#
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-admin
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cluster-admin-binding
subjects:
- kind: User
  name: admin
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

示例 3: 为 [[ServiceAccount]] 赋予权限

apiVersion: v1
kind: ServiceAccount
metadata:
  name: service-account-name
  namespace: service-account-namespace
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: admin
  namespace: service-account-namespace
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: cluster-admin-binding
subjects:
- kind: ServiceAccount
  name: service-account-name
  namespace: service-account-namespace
roleRef:
  kind: CRole
  name: admin
  apiGroup: rbac.authorization.k8s.io
RBAC 动态性示例#
  • RBAC 配置支持动态修改,无需重启 API Server。
  • 例如,在生产环境中临时授予用户权限,可以直接创建或删除 RoleBinding。

优点

  • 动态配置,无需重启 API Server。
  • 维护性强,适合大规模集群。

4. Webhook Authorization#

用途
允许将授权逻辑委托给外部服务,以实现高度定制化的访问控制策略。

工作机制

  • 每次请求 API Server 都会调用外部的 Webhook 服务。
  • Webhook 服务根据请求的用户、资源和操作等信息,返回 allowdeny 的响应。

优点

  • 灵活,支持复杂的动态策略。
  • 可以集成企业内部的权限管理系统。

缺点

  • 性能依赖外部服务的稳定性和速度。
  • 配置较复杂,需要开发和维护外部服务。

** 使用 OPA 深入讲解 Webhook**#

^827ec6

Open Policy Agent (OPA) 简介#

OPA 是一个通用策略引擎,可用于授权决策。通过 Webhook,Kubernetes 的授权请求可以由 OPA 接管,实现高度定制化的策略管理。

基本架构#
  1. API Server:将授权请求发送到 OPA Webhook。
  2. OPA Server:根据预定义的策略决定请求是否允许。
  3. Rego 语言:用于编写 OPA 的策略。
配置 OPA Webhook#
  1. 部署 OPA:

    • 部署 OPA 容器以拦截 API Server 请求。
    • 使用 ConfigMap 存储策略。
  2. 配置 API Server:

apiVersion: apiserver.k8s.io/v1
kind: WebhookConfiguration
metadata:
  name: opa-webhook
webhooks:
  - name: opa.authorization.k8s.io
    clientConfig:
      service:
        name: opa
        namespace: opa
        path: "/v1/data/authorization/allow"
    rules:
    - apiGroups: ["*"]
      apiVersions: ["*"]
      resources: ["*"]
  1. 编写 Rego 策略:
    策略存储于 allow.rego 文件中,例如:
package authorization

default allow = false

allow {
  input.review.request.user == "admin"
  input.review.request.namespace == "development"
}
  1. 测试策略:
  • 使用 kubectl auth can-i 验证用户权限。
  • 检查 OPA 日志以调试策略行为。

对比与总结#

模式优点缺点适用场景
Node Authorization高效、节点专用功能单一,仅限节点节点访问资源
ABAC灵活,规则自定义维护复杂,需重启 API Server小规模集群或简单需求
RBAC动态、推荐标准,易维护某些场景可能不够灵活大规模生产环境
Webhook高度灵活,可集成外部系统依赖外部服务,性能可能受限企业定制化需求
kubernetes-authorization
https://fuwari.vercel.app/posts/kubernetes-authorization/kubernetes-authorization/
作者
Kevin
发布于
2025-03-09
许可协议
CC BY-NC-SA 4.0