拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Argo CD 全局 RBAC 配置完全指南:argocd-rbac-cm.yaml 实战详解

Argo CD 全局 RBAC 配置完全指南argocd-rbac-cm.yaml 实战详解【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd在 Argo CD 中基于角色的访问控制RBAC决定了谁能在你的集群与应用上执行何种操作。argocd-rbac-cm是承载全局 RBAC 策略的核心 ConfigMap本文以 docs/operator-manual/argocd-rbac-cm.yaml 官方示例为主线逐字段讲解policy.csv、policy.default、scopes、policy.matchMode以及多策略拼接policy.*.csv的完整用法并结合util/rbac/rbac.go源码与内置策略 assets/builtin-policy.csv 揭示其底层实现原理。读完本文你将能够编写、组合、校验并排查一套生产可用的 Argo CD RBAC 策略。一、认识 argocd-rbac-cmArgo CD 本身不维护用户体系仅内置一个admin超级用户。要细分权限需要先配置 SSO 或本地用户随后通过 RBAC 把 SSO 用户组或本地用户映射到不同角色。RBAC 策略可以在两个层面定义全局 RBAC ConfigMapargocd-rbac-cm本文主题单个 AppProject 的角色项目级策略与全局策略叠加生效。argocd-rbac-cm是一个普通的 Kubernetes ConfigMap通常部署在argocd命名空间参见 manifests/base/config/argocd-rbac-cm.yaml 中的最小化定义。策略内容全部存放在data字段中Argo CD 各组件通过 informer 监听该 ConfigMap 的变化无需重启即可热加载新策略。二、官方示例配置全貌以下是 docs/operator-manual/argocd-rbac-cm.yaml 提供的完整示例它涵盖了本文将要讲解的全部配置项apiVersion: v1 kind: ConfigMap metadata: name: argocd-rbac-cm namespace: argocd labels: app.kubernetes.io/name: argocd-rbac-cm app.kubernetes.io/part-of: argocd data: # policy.csv 是用户自定义 RBAC 策略和角色定义的载体可选。 # 策略规则形式 # p, subject, resource, action, object, effect # 角色定义与绑定形式 # g, subject, inherited-subject policy.csv: | # 授权 my-org:team-alpha 组所有成员同步 my-project 中的应用 p, my-org:team-alpha, applications, sync, my-project/*, allow # 将 my-org:team-beta 组所有成员提升为管理员 g, my-org:team-beta, role:admin # 可通过向该 ConfigMap 添加额外条目来拼接最终的策略 csv。 # 此时 key 必须遵循 policy.任意字符串.csv 模式。Argo CD 会将所有 # 符合该模式的附加策略拼接在主策略policy.csv之后。这对于在 # Kustomize、Helm 等配置管理工具中组合策略非常有用。 policy.overlay.csv: | p, role:tester, applications, *, */*, allow p, role:tester, projects, *, *, allow g, my-org:team-qa, role:tester # policy.default 是默认角色的名称。当授权 API 请求时Argo CD 会回退到 # 该角色可选。如果省略或为空用户仍可登录但看不到任何应用、 # 项目等资源。 policy.default: role:readonly # scopes 控制 RBAC 执行时除 sub scope 之外需要检查的 OIDC scopes。 # 如果省略默认为 [groups]。scope 的值可以是字符串或字符串列表。 scopes: [cognito:groups, email] # matchMode 配置 casbin 的匹配函数。 # 有两个选项globglob 匹配器或 regex正则匹配器。 # 如果省略或配置错误将默认设置为 glob。 policy.matchMode: glob注意虽然策略文件是 CSV 格式但 Argo CD 解析时会忽略以#开头的行因此可以使用#写行注释如上例所示。三、policy.csv策略与角色定义policy.csv是全局 RBAC 配置的核心字段采用基于 Casbin 的语法包含两种语句类型。3.1 策略语句p格式为p, role/user/group, resource, action, object, effectrole/user/group被授权的主体可以是本地用户、SSO 用户或组、内部角色resource被操作的资源类型applications、clusters、projects、repositories等action对资源执行的操作get、create、update、delete、sync等object目标对象的标识符随资源类型而变如项目限定格式app-project/app-nameeffectallow或deny决定授权还是拒绝。例如示例中的策略p, my-org:team-alpha, applications, sync, my-project/*, allow表示my-org:team-alpha组可以同步my-project项目下的所有应用*是通配符。3.2 角色绑定语句g格式为g, user/group, role将用户或组绑定到内部角色。例如g, my-org:team-beta, role:admin把my-org:team-beta组绑定到内置的role:admin从而获得管理员权限。重要如果要对组直接编写p策略必须先通过g, group, role为组绑定角色否则针对组的p策略不会被考虑。3.3 内置角色与内置策略Argo CD 预置了两个角色定义见 assets/builtin-policy.csvrole:readonly对所有资源的只读访问getrole:admin对所有资源的无限制访问。内置策略还包含两条角色继承规则g, role:admin, role:readonly g, admin, role:admin即role:admin自动继承role:readonly的全部权限且内置admin用户被绑定到role:admin。这些内置策略会与用户自定义的policy.csv合并加载见 util/rbac/rbac.go 中argocdAdapter.LoadPolicy依次加载builtinPolicy、userDefinedPolicy与运行时策略的逻辑。3.4 资源与动作矩阵在 util/rbac/rbac.go 中Resources与Actions常量定义了全部合法取值以下矩阵汇总了各资源支持的动作资源\动作getcreateupdatedeletesyncrollbackactionoverrideinvokeapplications✅✅✅✅✅✅✅✅❌applicationsets✅✅✅✅❌❌❌❌❌clusters✅✅✅✅❌❌❌❌❌projects✅✅✅✅❌❌❌❌❌repositories✅✅✅✅❌❌❌❌❌accounts✅❌✅❌❌❌❌❌❌certificates✅✅❌✅❌❌❌❌❌gpgkeys✅✅❌✅❌❌❌❌❌logs✅❌❌❌❌❌❌❌❌exec❌✅❌❌❌❌❌❌❌extensions❌❌❌❌❌❌❌❌✅其中applications、applicationsets、logs、exec属于“应用特定”资源其object使用app-project/app-name格式若启用了任意命名空间中的应用则格式扩展为app-project/app-ns/app-name。四、policy.overlay.csv策略拼接机制在配置管理工具Kustomize、Helm 等中直接修改主policy.csv往往不便。Argo CD 支持以policy.任意字符串.csv为 key 提供额外策略条目所有匹配该模式的条目会被拼接在policy.csv之后最终组合成完整的策略文件。示例中的policy.overlay.csvpolicy.overlay.csv: | p, role:tester, applications, *, */*, allow p, role:tester, projects, *, *, allow g, my-org:team-qa, role:tester它定义了一个role:tester角色对应用和项目拥有全部权限并把my-org:team-qa组绑定到该角色。从源码看拼接逻辑位于 util/rbac/rbac.go 的PolicyCSV函数它先把主policy.csv写入然后对所有 data key 排序sort.Strings依次追加符合policy.前缀与.csv后缀、且不等于policy.csv本身的条目。因此拼接顺序由 key 的字典序决定例如policy.A.csv会先于policy.B.csv被拼接。这种机制非常适合用 Kustomize overlay 增量叠加权限参考 docs/operator-manual/rbac.md 中的完整 Kustomize 示例。五、policy.default默认角色policy.default指定所有已认证用户默认获得的角色。如果省略或为空用户仍然可以登录但看不到任何应用、项目等资源。示例中的配置policy.default: role:readonly这意味着所有通过认证的用户至少拥有只读权限。⚠️ 安全警告所有认证用户都会获得默认策略授予的至少这些权限且该访问权无法通过deny规则阻断。官方建议创建一个权限最小的role:authenticated或类似角色作为默认角色再按需为具体角色授权。同理启用匿名访问argocd-cm中的users.anonymous.enabled时未认证用户也会获得默认角色权限建议为此场景单独设置policy.default: role:unauthenticated。从源码看默认角色在 util/rbac/rbac.go 的enforce函数中实现SetDefaultRole设置默认角色后每次执行授权检查时会先用默认角色作为主体进行一次Enforce若命中allow则直接放行——这正是默认角色权限无法被 deny 阻断的原因。六、scopesOIDC Scope 控制scopes字段控制 RBAC 执行时除subscope 之外需要检查哪些 OIDC scopes。省略时默认为[groups]即从 OIDC 令牌的groups声明中提取用户所属组。取值可以是字符串或字符串列表。示例scopes: [cognito:groups, email]指定同时读取cognito:groupsAWS Cognito 的自定义组声明和email两个 scope。当 SSO 用户通过认证后其组信息来源于这些 scope 返回的值并用于匹配g语句中的组名。一个典型的结合用法data: policy.csv: | p, my-org:team-alpha, applications, sync, my-project/*, allow g, my-org:team-beta, role:admin g, userexample.org, role:admin g, admin, role:admin g, role:admin, role:readonly policy.default: role:readonly scopes: [groups, email]这里同时展示了角色继承g, role:admin, role:readonly授予role:admin的实体自动获得role:readonly全部权限和基于 email 的显式绑定。更多细节参见 用户管理文档。七、policy.matchMode匹配模式policy.matchMode配置 Casbin 使用的匹配函数可选值为glob基于 glob 通配符匹配默认值缺失或配置错误时自动回退到 globregex基于正则表达式匹配。示例policy.matchMode: glob两种模式的底层实现见 util/rbac/rbac.goglob模式使用globMatchFunc基于gobwas/glob包regex模式使用 Casbin 的util.RegexMatchFunc。ConfigMap 中该字段通过SetMatchMode动态切换。glob 模式的关键行为是策略 token 被当作单一术语/不作为分隔符。例如策略p, example-user, applications, action/extensions/*, default/*, allow中主体example-user匹配 tokenexample-user资源applications匹配applications动作action/extensions/DaemonSet/test匹配action/extensions/*无需**对象default/my-app匹配default/*。同理模式delete/*/kind/*既会匹配delete/group/kind/namespace/name也会匹配delete/group/kind/kind/name。虽然因资源 kind 通常含大写字母而问题不大但官方建议始终在模式中写全资源路径的四个部分四个/以避免歧义。八、策略求值规则与 deny 优先级访问检查分两个阶段先按默认策略policy.default校验再按当前用户的策略校验。若默认策略已返回allow或deny则直接生效不再继续求值只有当效果未定时才继续按用户、再到其所属各组依次求值。当多个策略同时命中时deny效果优先于allow即使存在更具体的allow策略只要命中了deny策略即拒绝策略在文件中的先后顺序不影响结果求值结果是确定性的全部策略求值完毕后若至少有一个allow且没有deny访问被授予。这套语义正是 Casbin 模型配置的体现见 assets/model.conf[policy_effect] e some(where (p.eft allow)) !some(where (p.eft deny)) [matchers] m g(r.sub, p.sub) globOrRegexMatch(r.res, p.res) globOrRegexMatch(r.act, p.act) globOrRegexMatch(r.obj, p.obj)其中globOrRegexMatch即由policy.matchMode决定实现的匹配函数在 util/rbac/rbac.go 中注册到 Casbin enforcer。九、重要资源的行为要点9.1 applications 的细粒度 update/delete 权限授予应用本身update/delete权限时不自动授予对应用子资源的操作权。若需操作子资源动作需写作action/group/kind/ns/name# 只允许 example-user 删除 default 项目中 prod-app 应用里的 Pod p, example-user, applications, delete/*/Pod/*/*, default/prod-app, allow # 允许更新应用所有资源但不更新应用本身 p, example-user, applications, update/*, default/prod-app, allow # 拒绝删除应用但允许删除其 Pod p, example-user, applications, delete, default/prod-app, deny p, example-user, applications, delete/*/Pod/*/*, default/prod-app, allow # 允许更新应用但拒绝更新其任何子资源 p, example-user, applications, update, default/prod-app, allow p, example-user, applications, update/*, default/prod-app, deny自 v3.0.0 起不带/*的update/delete不再作用于子资源。如需保留旧行为可在argocd-cm中设置server.rbac.disableApplicationFineGrainedRBACInheritance: false但关闭后无法在显式允许应用本身动作的情况下再对子资源 deny。9.2 action 动作与自定义资源操作action动作对应资源自定义操作内置或自定义的 resource actions格式为action/group/kind/action-name无 group 的资源如 Pod、ConfigMap写作action//Pod/action-name# 允许对 DaemonSet 执行任意操作以及对 Pod 执行 maintenance-off 操作 p, example-user, applications, action//Pod/maintenance-off, default/*, allow p, example-user, applications, action/extensions/DaemonSet/*, default/*, allow9.3 rollback、override 与 execrollback回滚到历史修订版本默认关闭兼容旧行为需在argocd-cm中设置server.rbac.rollback.enforce.enable: true后单独授权override允许在同步时传入任意 manifest 或不同修订版本v3.2 起可通过application.sync.requireOverridePrivilegeForRevisionSync: true将指定修订版本同步也视为 override授权时务必谨慎因为用户可借此彻底改变或删除应用已部署资源exec授予create动作后用户可在 UI 中进入应用 Pod 执行命令类似kubectl exec详见 Web 终端文档。9.4 clusters 资源对象格式clusters策略的object取自集群 Secret 的server字段API URL可选前缀项目名# 授予默认角色查看集群内建集群条目的权限 p, role:defaultrole, clusters, get, https://kubernetes.default.svc, allow # 授予角色对项目级外部集群的全部权限 p, role:my-role, clusters, *, my-project/https://api.example.com:6443, allow注意集群的逻辑名称name不能作为 RBAC objectobject 必须是集群 server URL可带项目前缀。十、本地用户与 SSO 共存的歧义风险g语句同样适用于本地用户。但如果同时启用了 SSO任何 SSO 用户只要其 scope 值与某个本地用户名相同就会被加入该本地用户所在的所有角色。例如本地用户sally被绑定到role:admin那么任何 scope 名为sally的 SSO 用户也会成为管理员。当 SSO 提供商是 SCM 时用户可能通过创建/加入同名组织来获得他人权限。因此同时使用本地用户与 SSO 时官方建议直接为本地用户编写p策略而非使用g绑定角色例如p, my-local-user, *, *, *, allow十一、策略热加载与运行时校验11.1 无需重启的热加载从源码看util/rbac/rbac.go 通过newInformer创建针对argocd-rbac-cm的SharedIndexInformer默认同步周期 10 分钟并注册 Add/Update 事件处理器每当 ConfigMap 发生变化syncUpdate会依次设置默认角色、匹配模式重新拼接策略 CSV 并调用SetUserPolicy重建 Casbin enforcer同时清空 enforcer 缓存。这意味着修改 RBAC ConfigMap 后策略会较快生效无需重启任何组件。11.2 用 CLI 校验与测试策略在把策略应用到线上环境之前可以使用argocd admin settings rbac命令族实现见 cmd/argocd/commands/admin/settings_rbac.go命令参考见 argocd_admin_settings_rbac进行离线验证校验策略语法是否合法# 校验本地 policy.csv argocd admin settings rbac validate --policy-file policy.csv # 也可以直接校验 argocd-rbac-cm 形式的 ConfigMap 文件 argocd admin settings rbac validate --policy-file argocd-rbac-cm.yaml # 或者校验集群中已存在的 argocd-rbac-cm argocd admin settings rbac validate --namespace argocd测试某个角色/主体能否执行指定操作# 使用本地策略文件检查 some:role 是否能在 default 项目创建应用 argocd admin settings rbac can some:role create application default/app --policy-file policy.csv # 使用集群中的 argocd-rbac-cm argocd admin settings rbac can some:role create application default/app --namespace argocdcan命令还支持--default-role覆盖默认角色、--strict严格校验资源/动作名默认开启与--quiet等参数资源名支持简写如app、proj、repo。该命令会提示组直接拥有p策略但缺少g绑定的告警——这类授权在运行时会被 API 服务器忽略。十二、最佳实践小结默认角色最小化将policy.default设为最小权限角色避免所有认证用户获得额外能力启用匿名访问时单独设置role:unauthenticated优先使用角色中间层通过g把用户/组绑定到角色通过p为角色授权利用角色继承如g, role:admin, role:readonly降低重复善用策略拼接用policy.name.csv在 Kustomize/Helm 中增量叠加权限保持基线与 overlay 清晰分离上线前离线验证使用argocd admin settings rbac validate/can对本地文件或线上 ConfigMap 进行语法与权限预检注意 glob 的/语义应用细粒度资源策略时始终写全四段路径必要时改用regex匹配模式。通过以上配置项的组合使用与源码级理解你就能把 Argo CD 的全局访问控制打磨到既灵活又安全的状态。更多细节可进一步阅读 RBAC 配置官方文档 与 AppProject 项目角色。【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门