This directory contains Keycloak realm and client configurations for the HelpDev platform.
These configurations implement patterns defined in:
- PRD Section 9: Identity and Access Management (Keycloak)
- PRD Section 5.2:
platform-keycloakrepository structure
keycloak/
├── realms/
│ ├── helpdev-platform/ # Realm for platform tools (Argo CD, Grafana, Backstage)
│ │ └── realm.json
│ └── helpdev-services/ # Realm for service-to-service authentication
│ └── realm.json
├── clients/
│ ├── argocd.json # Argo CD OIDC client
│ ├── grafana.json # Grafana OIDC client
│ └── backstage.json # Backstage OIDC client
└── README.md
Realm for platform collaborators and tools:
- Purpose: SSO for platform tools (Argo CD, Grafana, Backstage)
- Identity Provider: GitHub (organization-based access)
- Roles:
platform-admin: Full access to all platform toolsplatform-viewer: Read-only access to platform toolsdeveloper: Standard developer accesssecrets-admin: Full access to secrets managementsecrets-manager: Domain-scoped secrets management
Realm for service-to-service authentication:
- Purpose: Client credentials flow for microservices
- Client Scopes:
api-read: Read access to APIsapi-write: Write access to APIsservice-roles: Service-specific roles
OIDC client for Argo CD:
- Flow: Authorization Code with PKCE
- Groups Claim: Enabled for RBAC
- Redirect URIs: Production and HML environments
OIDC client for Grafana:
- Flow: Authorization Code with PKCE
- Role Mapping: Realm roles mapped to Grafana roles
- Groups Claim: Enabled for team-based dashboards
OIDC client for Backstage:
- Flow: Authorization Code with PKCE
- Service Account: Enabled for backend operations
- Authorization Services: Enabled for fine-grained permissions
The configurations use environment variables for sensitive values:
| Variable | Description |
|---|---|
${DOMAIN} |
Base domain (e.g., helpdev.io) |
${GITHUB_CLIENT_ID} |
GitHub OAuth App Client ID |
${GITHUB_CLIENT_SECRET} |
GitHub OAuth App Client Secret |
${ARGOCD_CLIENT_SECRET} |
Argo CD OIDC client secret |
${GRAFANA_CLIENT_SECRET} |
Grafana OIDC client secret |
${BACKSTAGE_CLIENT_SECRET} |
Backstage OIDC client secret |
${SMTP_HOST} |
SMTP server host |
${SMTP_PORT} |
SMTP server port |
${SMTP_USER} |
SMTP username |
${SMTP_PASSWORD} |
SMTP password |
# Import realm
docker run --rm \
-e KEYCLOAK_URL=https://auth.helpdev.io \
-e KEYCLOAK_USER=admin \
-e KEYCLOAK_PASSWORD=$KEYCLOAK_ADMIN_PASSWORD \
-e IMPORT_PATH=/config \
-v $(pwd)/realms:/config \
adorsys/keycloak-config-cli:latestClients should be imported after the realm is created:
# Using kcadm.sh
kcadm.sh config credentials --server https://auth.helpdev.io --realm master --user admin
kcadm.sh create clients -r helpdev-platform -f clients/argocd.json
kcadm.sh create clients -r helpdev-platform -f clients/grafana.json
kcadm.sh create clients -r helpdev-platform -f clients/backstage.jsonThese configurations are synchronized to Keycloak via GitOps:
- Argo CD watches the
platform-keycloakrepository - keycloak-config-cli runs as a Kubernetes Job after Keycloak deployment
- Configuration changes are applied automatically on sync
Git Commit → Argo CD Sync → keycloak-config-cli Job → Keycloak Updated
Per PRD Section 9.2:
- Each region has its own Keycloak instance
- Configuration (realms, clients) is synchronized via Git
- Runtime data (sessions, tokens) is isolated per region
| Synced via Git | Isolated per Region |
|---|---|
| Realm definitions | User sessions |
| Client configurations | Refresh tokens |
| Roles and permissions | Audit logs |
| Identity providers | RDS database |
- PKCE: All clients use PKCE for enhanced security
- Client Secrets: Stored in AWS Secrets Manager, injected at runtime
- SSL: Required for all external connections
- Brute Force Protection: Enabled on all realms
- Audit Logging: Enabled for all authentication events
# Generate new secret
NEW_SECRET=$(openssl rand -base64 32)
# Update in AWS Secrets Manager
aws secretsmanager update-secret \
--secret-id helpdev/prod/us-east-1/platform/keycloak/argocd-client-secret \
--secret-string "$NEW_SECRET"
# Update in Keycloak
kcadm.sh update clients/<client-uuid> -r helpdev-platform -s secret="$NEW_SECRET"- Create JSON file in
clients/directory - Commit and push to Git
- Argo CD syncs the change
- keycloak-config-cli imports the new client
- Keycloak Documentation
- keycloak-config-cli
- PRD Section 9: Identity and Access Management