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 的权限判定流程遵循 默认拒绝 原则:任何未显式允许的操作都将被拒绝。策略评估时,系统会检查所有匹配的策略规则,只要有一条规则允许,则操作被放行;如果没有任何规则允许,则操作被拒绝。

设计要点: RBAC 策略是累加且非互斥的。一个用户可能同时匹配多个角色(例如通过 SSO 组和本地用户映射),此时该用户将拥有这些角色权限的 并集。因此,在设计角色时需注意权限的叠加效应,避免意外提权。
Argo CD RBAC 权限模型架构 主体 (Subject) 本地用户 (admin) SSO / OIDC 用户 LDAP 组 / 服务账户 策略 (Policy) p, sub, role, obj, act g, user, role argocd-rbac-cm 角色 (Role) admin (内置) readonly (内置) 自定义角色 权限判定 (Permission Decision) 资源: applications / clusters / projects / logs 动作: get / create / update / delete / sync / override 受控资源 (Resource) Application / Cluster / Project / Repository / Log / Exec 默认拒绝原则 未显式允许的操作 → 拒绝;多条策略取并集

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
常见陷阱: 主体名称的匹配规则取决于认证方式。对于本地用户,主体名直接使用用户名;对于 SSO/OIDC 用户,主体名通常是 sub 声明或邮箱;对于 LDAP 用户,主体名是完整的 DN。务必确认认证源返回的主体标识,否则策略将无法正确匹配。

3.3 内置角色深度解析

Argo CD 默认提供两个内置角色:admin 和 readonly。理解这两个角色的权限边界,是进行自定义角色设计的基础。

内置角色权限对比 admin 角色 资源访问权限 • applications: 全部操作 (get/create/update/delete/sync/override) • clusters: 全部操作 (get/create/update/delete) • projects: 全部操作 (get/create/update/delete) • repositories: 全部操作 (get/create/update/delete) • logs: 全部操作 (get) • exec: 全部操作 (create) • accounts: 全部操作 (get/create/update/delete) 资源范围 • 所有项目 (*/*) • 所有集群和仓库 readonly 角色 资源访问权限 • applications: 仅 get • clusters: 仅 get • projects: 仅 get • repositories: 仅 get • logs: 仅 get • exec: 无权限 • accounts: 无权限 资源范围 • 所有项目 (*/*) • 所有集群和仓库 注意: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 命令;管理用户账户。
最佳实践: 在生产环境中,不应直接将 admin 角色授予普通用户。建议基于内置角色进行裁剪,创建符合最小权限原则的自定义角色。例如,为 CI/CD 流水线创建一个只能对特定项目执行 sync 操作的角色,为审计人员创建一个只能查看特定项目日志的角色。

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 配置是否生效的推荐方法:

  1. 使用 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
  2. 查看 RBAC 配置状态:
    # 查看当前 RBAC 配置
    kubectl get configmap argocd-rbac-cm -n argocd -o yaml
    
    # 查看 RBAC 调试日志
    argocd account get-user-info
  3. 通过 UI 验证: 使用对应角色的用户登录 Argo CD UI,检查可操作的菜单项和按钮是否与预期一致。
安全提醒: 在修改 RBAC 策略前,建议先在测试环境验证。错误的策略配置可能导致管理员被锁定。始终保留一个具有 admin 权限的备用账户或确保可以通过 kubectl 直接修改 ConfigMap 以恢复访问。