3. Argo CD RBAC 基础:RBAC 角色、策略(Policy)与权限模型,内置角色(admin、readonly)解析
Argo CD 的权限控制体系基于 RBAC(Role-Based Access Control,基于角色的访问控制) 模型构建。理解 RBAC 是设计项目级准入策略和精细化权限分配的前提。本章将深入解析 Argo CD RBAC 的核心概念、策略语法、权限模型以及内置角色的具体能力边界。
3.1 RBAC 核心概念与权限模型
Argo CD RBAC 模型遵循经典的“主体-角色-资源-动作”四元组关系。其核心思想是:谁(主体) 对 什么(资源) 可以执行 哪些操作(动作)。
| 术语 | 说明 | Argo CD 中的对应 |
|---|---|---|
| Subject(主体) | 发起请求的实体 | 用户、服务账户、SSO 组、LDAP 组 |
| Role(角色) | 一组权限的集合 | 内置角色(admin, readonly)或自定义角色 |
| Resource(资源) | 被访问的对象 | applications, clusters, projects, repositories, logs, exec |
| Action(动作) | 允许执行的操作 | get, create, update, delete, sync, override, action/* |
| Policy(策略) | 将主体与角色绑定的规则 | argocd-rbac-cm ConfigMap 中的 policy.csv 字段 |
Argo CD 的权限判定流程遵循 默认拒绝 原则:任何未显式允许的操作都将被拒绝。策略评估时,系统会检查所有匹配的策略规则,只要有一条规则允许,则操作被放行;如果没有任何规则允许,则操作被拒绝。
3.2 策略(Policy)语法详解
Argo CD 的策略定义遵循 Casbin 模型,配置文件位于 argocd-rbac-cm ConfigMap 的 policy.csv 字段中。策略分为两种类型:角色定义策略(p) 和 角色绑定策略(g)。
3.2.1 角色定义策略(p)
格式:p, 角色名, 资源, 动作, 资源范围(可选)
# 语法模板
p, <role>, <resource>, <action>, <object>
# 示例:允许 admin 角色对所有 application 执行所有操作
p, admin, applications, *, */*
# 示例:允许 readonly 角色对所有 application 执行 get 操作
p, readonly, applications, get, */*
# 示例:允许自定义角色对指定项目下的 application 执行 sync 操作
p, project-deployer, applications, sync, my-project/*
| 字段 | 说明 | 常见取值 |
|---|---|---|
| role | 角色名称 | admin, readonly, 自定义名称 |
| resource | 受控资源类型 | applications, clusters, projects, repositories, logs, exec, accounts |
| action | 允许的操作 | get, create, update, delete, sync, override, action/*, * |
| object | 资源范围限定 | */*(全部), <project>/*(指定项目下全部), <project>/<app>(指定应用) |
3.2.2 角色绑定策略(g)
格式:g, 主体, 角色
# 语法模板
g, <subject>, <role>
# 示例:将 admin 角色绑定给本地 admin 用户
g, admin, role:admin
# 示例:将 readonly 角色绑定给 SSO 组
g, my-oidc-group, role:readonly
# 示例:将自定义角色绑定给 LDAP 用户
g, cn=dev-team,ou=groups,dc=example,dc=com, role:project-deployer
sub 声明或邮箱;对于 LDAP 用户,主体名是完整的 DN。务必确认认证源返回的主体标识,否则策略将无法正确匹配。
3.3 内置角色深度解析
Argo CD 默认提供两个内置角色:admin 和 readonly。理解这两个角色的权限边界,是进行自定义角色设计的基础。
3.3.1 admin 角色
admin 是 Argo CD 的超级管理员角色,拥有对所有资源的完全控制权。其默认策略定义如下:
# admin 角色的默认策略(argocd-rbac-cm 中定义)
p, role:admin, *, *, */*
该策略的含义是:admin 角色对所有资源(*)的所有动作(*)在所有范围(*/*)内均被允许。这包括但不限于:
- 创建、删除、修改任意 Application
- 添加、删除、修改任意 Cluster 和 Repository
- 创建、删除、修改任意 Project
- 执行 Application 的 Sync、Rollback、Override 操作
- 查看和导出日志(logs)
- 在 Pod 中执行命令(exec)
- 管理用户账户(accounts)
3.3.2 readonly 角色
readonly 角色仅允许对资源执行 get 操作,禁止任何修改性操作。其默认策略定义如下:
# readonly 角色的默认策略(argocd-rbac-cm 中定义)
p, role:readonly, *, get, */*
readonly 角色的能力边界:
- 允许: 查看 Application 清单、同步状态、健康状态;查看 Cluster 和 Repository 列表;查看 Project 配置;查看日志。
- 禁止: 创建、更新、删除任何资源;执行 Sync、Rollback、Override 操作;执行 exec 命令;管理用户账户。
3.4 自定义角色设计示例
以下是一个自定义角色的设计示例,展示如何基于内置角色进行权限裁剪:
# 1. 定义自定义角色:project-admin(项目管理员)
# 允许对 my-project 下的所有 application 执行所有操作
p, role:project-admin, applications, *, my-project/*
# 允许查看 my-project 的配置
p, role:project-admin, projects, get, my-project
# 允许查看集群信息(只读)
p, role:project-admin, clusters, get, *
# 2. 定义自定义角色:project-viewer(项目查看者)
# 仅允许查看 my-project 下的 application
p, role:project-viewer, applications, get, my-project/*
# 允许查看 my-project 的配置
p, role:project-viewer, projects, get, my-project
# 3. 定义自定义角色:deployer(部署者)
# 允许对 my-project 下的 application 执行 get 和 sync 操作
p, role:deployer, applications, get, my-project/*
p, role:deployer, applications, sync, my-project/*
# 禁止 delete 和 override 操作
# 4. 绑定主体到自定义角色
g, alice, role:project-admin
g, bob, role:project-viewer
g, ci-service-account, role:deployer
3.5 RBAC 配置生效与验证
修改 argocd-rbac-cm ConfigMap 后,Argo CD 会自动检测并重新加载策略,无需重启服务。验证 RBAC 配置是否生效的推荐方法:
- 使用 argocd CLI 测试:
# 以指定用户身份测试权限 argocd account can-i get applications --project my-project argocd account can-i sync applications my-project/guestbook argocd account can-i create clusters - 查看 RBAC 配置状态:
# 查看当前 RBAC 配置 kubectl get configmap argocd-rbac-cm -n argocd -o yaml # 查看 RBAC 调试日志 argocd account get-user-info - 通过 UI 验证: 使用对应角色的用户登录 Argo CD UI,检查可操作的菜单项和按钮是否与预期一致。