ArgoCD User Management¶
ArgoCD uses local accounts in this air-gap env (no SSO/OIDC). Users are declared in the Helm values file; passwords are set via CLI after deploy — never stored in Git.
Architecture¶
configs.cm → declares accounts (argocd-cm ConfigMap)
configs.rbac → assigns groups + permissions (argocd-rbac-cm ConfigMap)
argocd-secret → stores bcrypt-hashed passwords (set via CLI, never in Git)
Groups are defined in policy.csv. Users are assigned to groups with g, lines.
Current users and groups¶
| Username | Group | Role | |
|---|---|---|---|
rodolf |
[email protected] | argocd-admins |
Full admin |
tarun |
[email protected] | argocd-admins |
Full admin |
adrianna |
[email protected] | argocd-admins |
Full admin |
| Group | Permissions |
|---|---|
argocd-admins |
role:admin — full access to all apps, repos, clusters |
argocd-readonly |
role:readonly — view only |
How to add a new user¶
Step 1 — Declare the account in Git¶
Edit mod-ask-devops/applications/cluster-addons/argocd/values-mod-auh1-dev-ask.yaml:
configs:
cm:
accounts.<username>: login
accounts.<username>.enabled: "true"
rbac:
policy.csv: |
# add a group binding for the new user
g, <username>, argocd-admins # or argocd-readonly
Commit and push → ArgoCD syncs the argocd app → account is created.
Step 2 — Set the password via CLI¶
Passwords are never in Git
Passwords are stored as bcrypt hashes in argocd-secret (a Kubernetes Secret).
They are set via the ArgoCD CLI and survive Helm upgrades.
# Port-forward if not on the cluster network
# kubectl port-forward svc/argocd-server -n argocd 8080:443
# Login as admin first
argocd login argocd.cl1.sq4.aegis.internal \
--username admin \
--password <admin-password> \
--insecure
# Set the new user's password
argocd account update-password \
--account <username> \
--new-password '<password>' \
--current-password <admin-password> \
--insecure
Step 3 — Verify¶
Expected output includes the new user with Enabled: true.
Initial password setup (first time — all 3 admin users)¶
Run from bastion after ArgoCD syncs the new values:
ARGOCD_SERVER=argocd.cl1.sq4.aegis.internal
ADMIN_PASS=<current-admin-password>
argocd login $ARGOCD_SERVER --username admin --password $ADMIN_PASS --insecure
for user in rodolf tarun adrianna; do
argocd account update-password \
--account $user \
--new-password 'ModGPT@2026!' \
--current-password $ADMIN_PASS \
--insecure
echo "✓ $user password set"
done
Verify all accounts are active:
Expected:
How to change a user's group¶
Edit policy.csv in the values file — change the g, binding line:
Commit + push → ArgoCD syncs → permission takes effect immediately (no pod restart needed).
How to disable a user¶
Set enabled: "false" in the values file:
This blocks login immediately after sync without deleting the account.
Troubleshooting¶
| Symptom | Cause | Fix |
|---|---|---|
Invalid username or password after password set |
Wrong admin password used in --current-password |
Use kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath='{.data.password}' \| base64 -d |
Account not in argocd account list |
Values not synced yet | argocd app sync argocd --grpc-web |
| Permission denied after login | User not assigned to a group | Check policy.csv for g, <username>, <group> line |
Password change fails: account not found |
Account not declared in configs.cm |
Add accounts.<username>: login to values + sync |