ArgoCD LDAP RBAC策略失效:为何使用sub而非用户名/邮箱?
问题场景
我在k3s集群中安装了版本为v2.14.2+ad27246的ArgoCD,配置了如下RBAC策略(argocd-rbac-cm):
data: policy.csv: |+ p, viktor.eriksson@ext.xxx.com, applications, *, my-project/*, allow p, viktor.eriksson@ext.xxx.com, projects, get, *, allow p, viktor.eriksson@ext.xxx.com, repositories, get, *, allow p, viktor.eriksson@ext.xxx.com, clusters, get, *, allow p, viktor.eriksson@ext.xxx.com, logs, get, my-project/*, allow p, viktor.eriksson@ext.xxx.com, exec, create, my-project/*, allow
同时配置了LDAP认证(argocd-cm):
data: dex.config: | connectors: - type: ldap id: ldap name: LDAP config: host: ldap.xxx.internal:389 insecureNoSSL: true # Set to false if using TLS startTLS: false # Set to true if using StartTLS bindDN: "" # Empty for direct user authentication usernamePrompt: "LDAP Username" userSearch: baseDN: dc=xxx,dc=internal filter: "" username: userPrincipalName idAttr: userPrincipalName emailAttr: userPrincipalName nameAttr: displayName preferredUsernameAttr: userPrincipalName groupSearch: baseDN: dc=xxx,dc=internal filter: "" userAttr: dn groupAttr: member nameAttr: cn server.rbac.log.enforce.enable: 'true' url: https://localhost:8585
登录后Dex日志显示认证成功:
level=INFO msg="login successful" connector_id=ldap username="Viktor Eriksson /EXT /xxx" preferred_username=Viktor.Eriksson@ext.xxx.com email=Viktor.Eriksson@ext.xxx.com groups="[<the groups i'm part of>]" request_id=21397de2-fb0a-48d8-a486-cb6c854e7eec
ArgoCD Server日志中的claims包含邮箱、preferred_username等字段:
/project.ProjectService/List" grpc.method=List grpc.request.claims="{"at_hash":"iW6mbRByVYqVf-LF3Yxf5g","aud":"argo-cd","c_hash":"YL0tjnX3RdXhPlj4lagcSQ","email":"Viktor.Eriksson@ext.xxx.com","email_verified":true,"exp":1741173322,"iat":1741086922,"iss":"https://localhost:8585/api/dex","name":"Viktor Eriksson /EXT /xxx","preferred_username":"Viktor.Eriksson@ext.xxx.com","sub":"Ch9WaWt0b3IuRXJpa3Nzb25AZXh0LmJvbGlkZW4uY29tEgRsZGFw"}" grpc.request.content= grpc.service=project.ProjectService grpc.start_time="2025-03-04T11:17:08Z" span.kind=server system=grpc
但上述RBAC策略不生效,无法查看my-project项目;而将策略主体换成claims中的sub字段后,权限正常生效:
data: policy.csv: |+ p, Ch9WaWt0b3IuRXJpa3Nzb25AZXh0LmJvbGlkZW4uY29tEgRsZGFw, applications, *, my-project/*, allow p, Ch9WaWt0b3IuRXJpa3Nzb25AZXh0LmJvbGlkZW4uY29tEgRsZGFw, projects, get, *, allow p, Ch9WaWt0b3IuRXJpa3Nzb25AZXh0LmJvbGlkZW4uY29tEgRsZGFw, repositories, get, *, allow p, Ch9WaWt0b3IuRXJpa3Nzb25AZXh0LmJvbGlkZW4uY29tEgRsZGFw, clusters, get, *, allow p, Ch9WaWt0b3IuRXJpa3Nzb25AZXh0LmJvbGlkZW4uY29tEgRsZGFw, logs, get, my-project/*, allow p, Ch9WaWt0b3IuRXJpa3Nzb25AZXh0LmJvbGlkZW4uY29tEgRsZGFw, exec, create, my-project/*, allow
问题解答
1. 为什么RBAC默认使用sub字段?
ArgoCD默认采用JWT中的sub(Subject)字段作为RBAC的身份标识,原因在于:
sub是OAuth2/OIDC规范定义的标准字段,用于唯一标识用户,具备全局唯一性和稳定性;- 相比邮箱、用户名这类可能随用户信息变更的字段,
sub不会因用户修改邮箱、更换用户名而改变,能避免权限配置失效的问题。
2. 如何配置RBAC使用用户名、邮箱或自定义字段作为策略主体?
在argocd-cm配置中添加server.rbac.userNameKey参数,指定要用作RBAC身份标识的JWT claim字段即可:
配置示例(以邮箱为例)
修改argocd-cm,添加如下配置项:
data: # 原有dex.config等配置... server.rbac.userNameKey: "email" server.rbac.log.enforce.enable: 'true' url: https://localhost:8585
可选的字段值
- 若要使用
preferred_username(对应你配置的LDAP userPrincipalName),设置为server.rbac.userNameKey: "preferred_username"; - 若要使用邮箱,设置为
server.rbac.userNameKey: "email"; - 只要是JWT claims中存在的字段,都可以作为该参数的值。
生效步骤
- 保存修改后的
argocd-cm配置; - 重启ArgoCD Server Pod,让配置生效:
kubectl rollout restart deployment argocd-server -n argocd - 此时RBAC策略中的主体即可使用指定的字段(如邮箱
viktor.eriksson@ext.xxx.com),无需再依赖sub字段。
内容的提问来源于stack exchange,提问作者Viktor Eriksson

