new file: apps/argocd-config/OIDC_SECRET_SETUP.md
modified: apps/argocd-config/argocd-cm.yaml modified: apps/argocd-config/external-secret.yaml
This commit is contained in:
208
apps/argocd-config/OIDC_SECRET_SETUP.md
Normal file
208
apps/argocd-config/OIDC_SECRET_SETUP.md
Normal file
@@ -0,0 +1,208 @@
|
|||||||
|
# ArgoCD OIDC Secret Setup - Best Practices & Troubleshooting
|
||||||
|
|
||||||
|
## Problem
|
||||||
|
|
||||||
|
ArgoCD Secret-Referenzen in `oidc.config` funktionieren nicht zuverlässig. Dies ist ein bekanntes Problem (siehe GitHub Issue #18576).
|
||||||
|
|
||||||
|
## Warum funktionieren Secret-Referenzen nicht?
|
||||||
|
|
||||||
|
1. **Timing-Problem**: ArgoCD liest die ConfigMap beim Start. Wenn das Secret noch nicht existiert oder noch nicht bereit ist, cached ArgoCD die "Key does not exist" Warnung.
|
||||||
|
|
||||||
|
2. **Secret-Name-Konvention**: ArgoCD erwartet standardmäßig Keys im Secret `argocd-secret` (nicht `argocd-oidc-secret`).
|
||||||
|
|
||||||
|
3. **Key-Namen-Format**: Keys sollten mit Punkten formatiert sein (z.B. `oidc.authentik.clientID`), nicht mit Unterstrichen oder Bindestrichen.
|
||||||
|
|
||||||
|
4. **Label-Requirement**: Das Secret benötigt das Label `app.kubernetes.io/part-of: argocd`, damit ArgoCD es findet.
|
||||||
|
|
||||||
|
## Lösungsoptionen
|
||||||
|
|
||||||
|
### Option 1: Nutzung des Haupt-Secrets `argocd-secret` (Empfohlen)
|
||||||
|
|
||||||
|
**Vorteile:**
|
||||||
|
- ArgoCD erwartet dies standardmäßig
|
||||||
|
- Keine Probleme mit Secret-Namen
|
||||||
|
- Bewährte Praxis
|
||||||
|
|
||||||
|
**Nachteile:**
|
||||||
|
- Erfordert Zugriff auf das bestehende `argocd-secret`
|
||||||
|
- Könnte Konflikte mit bestehenden Keys geben
|
||||||
|
|
||||||
|
**Implementierung:**
|
||||||
|
```yaml
|
||||||
|
# ExternalSecret: Keys ins argocd-secret schreiben
|
||||||
|
apiVersion: external-secrets.io/v1beta1
|
||||||
|
kind: ExternalSecret
|
||||||
|
metadata:
|
||||||
|
name: argocd-oidc-secret-source
|
||||||
|
namespace: argocd
|
||||||
|
spec:
|
||||||
|
refreshInterval: 1m
|
||||||
|
secretStoreRef:
|
||||||
|
name: vault-backend
|
||||||
|
kind: ClusterSecretStore
|
||||||
|
target:
|
||||||
|
name: argocd-secret # <-- Haupt-Secret verwenden
|
||||||
|
creationPolicy: Merge # <-- Merge, nicht Owner!
|
||||||
|
data:
|
||||||
|
- secretKey: oidc.authentik.clientID
|
||||||
|
remoteRef:
|
||||||
|
key: secret/apps/argocd
|
||||||
|
property: oidc_client_id
|
||||||
|
- secretKey: oidc.authentik.clientSecret
|
||||||
|
remoteRef:
|
||||||
|
key: secret/apps/argocd
|
||||||
|
property: oidc_client_secret
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ConfigMap: Referenz ohne Secret-Name
|
||||||
|
oidc.config: |
|
||||||
|
name: Authentik
|
||||||
|
issuer: https://auth.apps.k3s.stabify.de/application/o/argo-cd/
|
||||||
|
clientID: $oidc.authentik.clientID
|
||||||
|
clientSecret: $oidc.authentik.clientSecret
|
||||||
|
requestedScopes: ["openid", "profile", "email", "groups"]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Option 2: Separates Secret mit korrekten Labels
|
||||||
|
|
||||||
|
**Vorteile:**
|
||||||
|
- Saubere Trennung
|
||||||
|
- Keine Konflikte mit Haupt-Secret
|
||||||
|
|
||||||
|
**Nachteile:**
|
||||||
|
- Erfordert korrekte Labelung
|
||||||
|
- Timing-Probleme können weiterhin auftreten
|
||||||
|
|
||||||
|
**Implementierung:**
|
||||||
|
```yaml
|
||||||
|
# ExternalSecret: Labels setzen
|
||||||
|
apiVersion: external-secrets.io/v1beta1
|
||||||
|
kind: ExternalSecret
|
||||||
|
metadata:
|
||||||
|
name: argocd-oidc-secret-source
|
||||||
|
namespace: argocd
|
||||||
|
spec:
|
||||||
|
refreshInterval: 1m
|
||||||
|
secretStoreRef:
|
||||||
|
name: vault-backend
|
||||||
|
kind: ClusterSecretStore
|
||||||
|
target:
|
||||||
|
name: argocd-oidc-secret
|
||||||
|
creationPolicy: Owner
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/part-of: argocd # <-- Wichtig!
|
||||||
|
type: Opaque
|
||||||
|
data:
|
||||||
|
- secretKey: clientID
|
||||||
|
remoteRef:
|
||||||
|
key: secret/apps/argocd
|
||||||
|
property: oidc_client_id
|
||||||
|
- secretKey: clientSecret
|
||||||
|
remoteRef:
|
||||||
|
key: secret/apps/argocd
|
||||||
|
property: oidc_client_secret
|
||||||
|
```
|
||||||
|
|
||||||
|
### Option 3: Init-Container oder Helm Pre-Hook (Erweitert)
|
||||||
|
|
||||||
|
**Vorteile:**
|
||||||
|
- Garantiert, dass Secret vor ArgoCD Start existiert
|
||||||
|
- Volle Kontrolle
|
||||||
|
|
||||||
|
**Nachteile:**
|
||||||
|
- Komplexer
|
||||||
|
- Erfordert zusätzliche Ressourcen
|
||||||
|
|
||||||
|
## Aktuelle Lösung (Temporary)
|
||||||
|
|
||||||
|
Bis das Secret-Referenz-Problem gelöst ist, nutzen wir hardcoded Credentials:
|
||||||
|
|
||||||
|
**⚠️ WICHTIG:** Dies ist **NICHT sicher** für Production! Nur als Workaround!
|
||||||
|
|
||||||
|
Die hardcodierten Werte sollten:
|
||||||
|
1. Nur in Git Commits mit verschlüsselten Secrets gespeichert werden
|
||||||
|
2. Oder via Sealed Secrets / SOPS verschlüsselt werden
|
||||||
|
3. Oder komplett aus Git entfernt werden (nur via CI/CD gesetzt)
|
||||||
|
|
||||||
|
### Option 4: Dex verwenden (Empfohlen für ArgoCD!)
|
||||||
|
|
||||||
|
**Vorteile:**
|
||||||
|
- Dex ist der "native" Weg für ArgoCD
|
||||||
|
- Secret-Referenzen funktionieren zuverlässiger
|
||||||
|
- Dex nutzt standardmäßig `argocd-secret` mit Keys wie `dex.authentik.clientID`
|
||||||
|
- Authentik empfiehlt Dex für ArgoCD-Integration
|
||||||
|
- Mehr Flexibilität (mehrere Connectors möglich)
|
||||||
|
|
||||||
|
**Nachteile:**
|
||||||
|
- Zusätzliche Layer (Dex als Middleware)
|
||||||
|
- Etwas komplexere Konfiguration
|
||||||
|
|
||||||
|
**Implementierung:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ExternalSecret: Keys ins argocd-secret schreiben (Dex-Format)
|
||||||
|
apiVersion: external-secrets.io/v1beta1
|
||||||
|
kind: ExternalSecret
|
||||||
|
metadata:
|
||||||
|
name: argocd-dex-secret-source
|
||||||
|
namespace: argocd
|
||||||
|
spec:
|
||||||
|
refreshInterval: 1m
|
||||||
|
secretStoreRef:
|
||||||
|
name: vault-backend
|
||||||
|
kind: ClusterSecretStore
|
||||||
|
target:
|
||||||
|
name: argocd-secret # <-- Haupt-Secret
|
||||||
|
creationPolicy: Merge # <-- Merge, nicht Owner!
|
||||||
|
data:
|
||||||
|
- secretKey: dex.authentik.clientID
|
||||||
|
remoteRef:
|
||||||
|
key: secret/apps/argocd
|
||||||
|
property: oidc_client_id
|
||||||
|
- secretKey: dex.authentik.clientSecret
|
||||||
|
remoteRef:
|
||||||
|
key: secret/apps/argocd
|
||||||
|
property: oidc_client_secret
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ConfigMap: Dex-Config statt oidc.config
|
||||||
|
dex.config: |
|
||||||
|
connectors:
|
||||||
|
- type: oidc
|
||||||
|
id: authentik
|
||||||
|
name: Authentik
|
||||||
|
config:
|
||||||
|
issuer: https://auth.apps.k3s.stabify.de/application/o/argo-cd/
|
||||||
|
clientID: $dex.authentik.clientID
|
||||||
|
clientSecret: $dex.authentik.clientSecret
|
||||||
|
scopes:
|
||||||
|
- openid
|
||||||
|
- profile
|
||||||
|
- email
|
||||||
|
- groups
|
||||||
|
# Optional: Claim-Mapping
|
||||||
|
claimMapping:
|
||||||
|
groups: groups
|
||||||
|
email: email
|
||||||
|
name: name
|
||||||
|
```
|
||||||
|
|
||||||
|
**Wichtig:** Bei Dex wird der `clientID` im Secret **auch** referenziert (nicht hardcoded), da Dex Secret-Referenzen besser unterstützt!
|
||||||
|
|
||||||
|
## Nächste Schritte
|
||||||
|
|
||||||
|
1. ⭐ **Option 4 testen**: Dex-Konfiguration (empfohlen!)
|
||||||
|
2. Falls Option 4 nicht funktioniert: Option 1 (Nutze `argocd-secret` mit Merge Policy für `oidc.config`)
|
||||||
|
3. Falls Option 1 nicht funktioniert: Option 2 mit korrekten Labels
|
||||||
|
4. Falls beides nicht funktioniert: Option 3 (Init-Container)
|
||||||
|
5. Langfristig: Warte auf Fix in ArgoCD oder verwende Sealed Secrets
|
||||||
|
|
||||||
|
## Referenzen
|
||||||
|
|
||||||
|
- [GitHub Issue #18576](https://github.com/argoproj/argo-cd/issues/18576)
|
||||||
|
- [ArgoCD User Management Docs](https://argo-cd.readthedocs.io/en/stable/operator-manual/user-management/)
|
||||||
|
- [External Secrets Operator Docs](https://external-secrets.io/)
|
||||||
@@ -9,13 +9,22 @@ metadata:
|
|||||||
data:
|
data:
|
||||||
url: "https://argocd.k3s.stabify.de"
|
url: "https://argocd.k3s.stabify.de"
|
||||||
|
|
||||||
# OIDC Direct Config (Dex Bypass)
|
# Dex Config (Native ArgoCD SSO)
|
||||||
oidc.config: |
|
dex.config: |
|
||||||
|
connectors:
|
||||||
|
- type: oidc
|
||||||
|
id: authentik
|
||||||
name: Authentik
|
name: Authentik
|
||||||
|
config:
|
||||||
issuer: https://auth.apps.k3s.stabify.de/application/o/argo-cd/
|
issuer: https://auth.apps.k3s.stabify.de/application/o/argo-cd/
|
||||||
clientID: kfQ0L0Z4JSjlgFkciBisEtOMxDMc4ECA729nFujN
|
clientID: kfQ0L0Z4JSjlgFkciBisEtOMxDMc4ECA729nFujN
|
||||||
clientSecret: dRMFCvAVp8MaTIMjmg9ICYpL84nzpR6FPtvqMvULXyOq4nv4XO7CljScm8satk8kpUSAYxLB1taFuQxY0m0y7qfpxjZZcsbJGxgoCsLMqEEEJQTI6kgsaMsjD8Ak677q
|
clientSecret: $dex.authentik.clientSecret
|
||||||
requestedScopes: ["openid", "profile", "email", "groups"]
|
insecureEnableGroups: true
|
||||||
|
scopes:
|
||||||
|
- openid
|
||||||
|
- profile
|
||||||
|
- email
|
||||||
|
- groups
|
||||||
|
|
||||||
# Resource Customizations (unverändert)
|
# Resource Customizations (unverändert)
|
||||||
resource.customizations.ignoreResourceUpdates.ConfigMap: |
|
resource.customizations.ignoreResourceUpdates.ConfigMap: |
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
apiVersion: external-secrets.io/v1beta1
|
apiVersion: external-secrets.io/v1beta1
|
||||||
kind: ExternalSecret
|
kind: ExternalSecret
|
||||||
metadata:
|
metadata:
|
||||||
name: argocd-oidc-secret-source
|
name: argocd-dex-secret-source
|
||||||
namespace: argocd
|
namespace: argocd
|
||||||
spec:
|
spec:
|
||||||
refreshInterval: 1m
|
refreshInterval: 1m
|
||||||
@@ -9,14 +9,10 @@ spec:
|
|||||||
name: vault-backend
|
name: vault-backend
|
||||||
kind: ClusterSecretStore
|
kind: ClusterSecretStore
|
||||||
target:
|
target:
|
||||||
name: argocd-oidc-secret
|
name: argocd-secret
|
||||||
creationPolicy: Owner
|
creationPolicy: Merge
|
||||||
data:
|
data:
|
||||||
- secretKey: oidc-client-id
|
- secretKey: dex.authentik.clientSecret
|
||||||
remoteRef:
|
|
||||||
key: secret/apps/argocd
|
|
||||||
property: oidc_client_id
|
|
||||||
- secretKey: oidc-client-secret
|
|
||||||
remoteRef:
|
remoteRef:
|
||||||
key: secret/apps/argocd
|
key: secret/apps/argocd
|
||||||
property: oidc_client_secret
|
property: oidc_client_secret
|
||||||
|
|||||||
Reference in New Issue
Block a user