Skip to content

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 Email 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

argocd account list --insecure

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:

argocd account list --insecure

Expected:

NAME      ENABLED  CAPABILITIES
admin     true     login
adrianna  true     login
rodolf    true     login
tarun     true     login


How to change a user's group

Edit policy.csv in the values file — change the g, binding line:

# Move tarun from admins to readonly
g, tarun, argocd-readonly   # was: g, tarun, argocd-admins

Commit + push → ArgoCD syncs → permission takes effect immediately (no pod restart needed).


How to disable a user

Set enabled: "false" in the values file:

configs:
  cm:
    accounts.tarun.enabled: "false"

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