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)。
- 节点可以通过
GET和LIST操作访问特定资源,但通常没有删除或修改权限。
- 常用场景:确保节点只能访问与其实际职责相关的数据,避免因节点被攻击而导致数据泄露。
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
}注意事项:
- ABAC 的规则匹配是线性扫描,顺序非常重要。
- 当规则复杂时,可能导致配置难以维护,因此 Kubernetes 推荐使用 RBAC。
优点:
- 灵活,可以为不同用户和操作设置精细规则。
缺点:
- 不易维护,尤其在大规模集群中。
- 动态性较差,需要修改文件并重启 API Server。
3. RBAC (Role-Based Access Control)
^42cbd7
用途:
基于角色分配权限,当前 Kubernetes 的推荐授权方式。
工作机制:
- 使用 Role 和 ClusterRole 定义权限集合。
- Role:限定在特定 Namespace 内。
- ClusterRole:全局作用于所有 Namespaces。
- 通过 RoleBinding 或 ClusterRoleBinding 将权限绑定到用户、组或服务账户。
权限查看 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核心概念
-
Role 和 ClusterRole:
- Role:作用于单个 Namespace,用于定义资源的操作权限。
- ClusterRole:作用于整个集群,既可以管理全局资源(如 Nodes),也可以绑定到特定 Namespace。
-
RoleBinding 和 ClusterRoleBinding:
- RoleBinding:将 Role 绑定到用户、组或服务账户,限定在指定的 Namespace。
- ClusterRoleBinding:将 ClusterRole 绑定到用户、组或服务账户,全局适用或跨 Namespace。
权限语法详解
- API Groups:指定资源所属的 API 组。
- Resources:具体资源类型(如 Pods、Services)。
- Verbs:允许的操作(如
get,list,create,delete)。 - 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
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.ioRBAC 动态性示例
- RBAC 配置支持动态修改,无需重启 API Server。
- 例如,在生产环境中临时授予用户权限,可以直接创建或删除 RoleBinding。
优点:
- 动态配置,无需重启 API Server。
- 维护性强,适合大规模集群。
4. Webhook Authorization
用途:
允许将授权逻辑委托给外部服务,以实现高度定制化的访问控制策略。
工作机制:
- 每次请求 API Server 都会调用外部的 Webhook 服务。
- Webhook 服务根据请求的用户、资源和操作等信息,返回
allow或deny的响应。
优点:
- 灵活,支持复杂的动态策略。
- 可以集成企业内部的权限管理系统。
缺点:
- 性能依赖外部服务的稳定性和速度。
- 配置较复杂,需要开发和维护外部服务。
** 使用 OPA 深入讲解 Webhook**
^827ec6
Open Policy Agent (OPA) 简介
OPA 是一个通用策略引擎,可用于授权决策。通过 Webhook,Kubernetes 的授权请求可以由 OPA 接管,实现高度定制化的策略管理。
基本架构
- API Server:将授权请求发送到 OPA Webhook。
- OPA Server:根据预定义的策略决定请求是否允许。
- Rego 语言:用于编写 OPA 的策略。
配置 OPA Webhook
-
部署 OPA:
- 部署 OPA 容器以拦截 API Server 请求。
- 使用 ConfigMap 存储策略。
-
配置 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: ["*"]- 编写 Rego 策略:
策略存储于allow.rego文件中,例如:
package authorization
default allow = false
allow {
input.review.request.user == "admin"
input.review.request.namespace == "development"
}- 测试策略:
- 使用
kubectl auth can-i验证用户权限。 - 检查 OPA 日志以调试策略行为。
对比与总结
| 模式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Node Authorization | 高效、节点专用 | 功能单一,仅限节点 | 节点访问资源 |
| ABAC | 灵活,规则自定义 | 维护复杂,需重启 API Server | 小规模集群或简单需求 |
| RBAC | 动态、推荐标准,易维护 | 某些场景可能不够灵活 | 大规模生产环境 |
| Webhook | 高度灵活,可集成外部系统 | 依赖外部服务,性能可能受限 | 企业定制化需求 |
kubernetes-authorization
https://fuwari.vercel.app/posts/kubernetes-authorization/kubernetes-authorization/