ArgoCD installé avec sa configuration par défaut est fonctionnel, mais pas prêt pour la production. L’administrateur par défaut a accès à tout, il n’y a pas de protection contre les déploiements dans des namespaces non autorisés, et les secrets en clair dans Git sont un risque majeur. Ce guide couvre les quatre piliers de la sécurisation d’ArgoCD : RBAC, AppProjects, SSO et gestion des secrets.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Configurer le RBAC ArgoCD avec des rôles personnalisés (syntaxe Casbin)
- Créer des comptes de service pour la CI avec des droits minimaux
- Utiliser les AppProjects pour isoler les équipes (sourceRepos, destinations, ressources autorisées)
- Intégrer un SSO avec Dex (GitHub OAuth, GitLab OIDC) pour supprimer la gestion locale des utilisateurs
- Gérer les secrets sans les stocker en clair dans Git (External Secrets, Sealed Secrets)
- Configurer les notifications ArgoCD pour alerter en cas de drift ou d’échec de déploiement
Principe du moindre privilège dans ArgoCD
Section intitulée « Principe du moindre privilège dans ArgoCD »Tout comme Kubernetes, ArgoCD applique un modèle RBAC (Role-Based Access
Control). Par défaut, seul admin a accès à l’interface. En production, vous
voulez que :
- Les développeurs voient leurs applications mais ne les modifient pas
- Les ops puissent synchroniser mais pas supprimer
- Les CI tokens n’aient accès qu’à des Applications spécifiques
- Chaque équipe ne voie que ses propres Applications
RBAC ArgoCD
Section intitulée « RBAC ArgoCD »Le RBAC ArgoCD se configure dans le ConfigMap argocd-rbac-cm. La syntaxe est
basée sur Casbin (un moteur de règles de contrôle d’accès).
Rôles prédéfinis
Section intitulée « Rôles prédéfinis »ArgoCD fournit deux rôles de base :
| Rôle | Droits |
|---|---|
role:admin | Accès complet (toutes les ressources, toutes les actions) |
role:readonly | Lecture seule sur toutes les ressources |
Configurer le RBAC
Section intitulée « Configurer le RBAC »# Patch du ConfigMap argocd-rbac-cmapiVersion: v1kind: ConfigMapmetadata: name: argocd-rbac-cm namespace: argocddata: policy.default: role:readonly # Par défaut, tout le monde ne voit que policy.csv: | # Rôle développeur : voir et sync ses apps, pas de delete p, role:developer, applications, get, */*, allow p, role:developer, applications, sync, */*, allow p, role:developer, applications, action/*, */*, allow p, role:developer, logs, get, */*, allow
# Rôle ops : tout sauf delete des projets et clusters p, role:ops, applications, *, */*, allow p, role:ops, repositories, *, *, allow p, role:ops, clusters, get, *, allow
# Rôle CI token : sync uniquement sur des Applications précises p, role:ci-bot, applications, get, myproject/*, allow p, role:ci-bot, applications, sync, myproject/*, allow
# Assignation des rôles aux utilisateurs/groupes SSO g, equipe-dev, role:developer g, equipe-ops, role:ops g, ci-service-account, role:ci-botkubectl apply -f argocd-rbac-cm.yaml -n argocdCréer un token pour la CI
Section intitulée « Créer un token pour la CI »# Créer un compte de service pour la CI (pas un compte humain)argocd account generate-token --account ci-service-account
# Ou depuis kubectl (secret Kubernetes)argocd account list# Vérifier que ci-service-account est dans la listeAjoutez ce compte dans argocd-cm :
apiVersion: v1kind: ConfigMapmetadata: name: argocd-cm namespace: argocddata: accounts.ci-service-account: apiKey # Autorise uniquement les tokens APIAppProjects : isoler les équipes
Section intitulée « AppProjects : isoler les équipes »Un AppProject définit ce qu’une Application ArgoCD est autorisée à faire :
quels dépôts Git elle peut utiliser comme source, quels clusters/namespaces
elle peut cibler, et quelles ressources Kubernetes elle peut créer.
Sans AppProject, une Application permet par défaut de déployer n’importe quoi n’importe où. En production, chaque équipe doit avoir son propre AppProject.
apiVersion: argoproj.io/v1alpha1kind: AppProjectmetadata: name: equipe-a namespace: argocdspec: description: "Projet de l'équipe A — microservices e-commerce"
# Dépôts Git autorisés comme source sourceRepos: - https://github.com/mon-org/config-repo-equipe-a
# Clusters et namespaces autorisés comme destination destinations: - namespace: equipe-a-dev server: https://kubernetes.default.svc - namespace: equipe-a-staging server: https://kubernetes.default.svc - namespace: equipe-a-prod server: https://prod-cluster.example.com
# Types de ressources cluster-wide autorisés (vide = interdits) clusterResourceWhitelist: []
# Types de ressources de namespace autorisés namespaceResourceWhitelist: - group: apps kind: Deployment - group: apps kind: StatefulSet - group: "" kind: Service - group: "" kind: ConfigMap - group: "" kind: Secret # À retirer si vous utilisez External Secrets Operator
# Politiques de sync syncWindows: - kind: allow schedule: "0 8 * * 1-5" # Sync automatique permis en semaine 8h-18h duration: 10h applications: - "*"SSO avec Dex : intégrer GitHub ou GitLab
Section intitulée « SSO avec Dex : intégrer GitHub ou GitLab »Dex est le composant intégré à ArgoCD pour la fédération d’identité. Il permet de se connecter à ArgoCD avec un compte GitHub ou GitLab (OIDC/OAuth2), au lieu de gérer des utilisateurs locaux.
1. Créer une OAuth App dans GitHub
Depuis Settings > Developer settings > OAuth Apps :
- Application name :
ArgoCD - Homepage URL :
https://argocd.example.com - Authorization callback URL :
https://argocd.example.com/api/dex/callback
Récupérez le Client ID et le Client Secret.
2. Configurer argocd-cm
apiVersion: v1kind: ConfigMapmetadata: name: argocd-cm namespace: argocddata: url: https://argocd.example.com dex.config: | connectors: - type: github id: github name: GitHub config: clientID: votre-client-id clientSecret: $github-client-secret # Référence à un Secret K8s orgs: - name: mon-organisation3. Créer le Secret Kubernetes pour le client secret
kubectl create secret generic github-client-secret \ --from-literal=github-client-secret="ghp_xxx..." \ -n argocd1. Créer une Application dans GitLab
Depuis User settings > Applications :
- Name :
ArgoCD - Redirect URI :
https://argocd.example.com/api/dex/callback - Scopes :
read_user,openid,profile,email
Récupérez le Application ID et le Secret.
2. Configurer argocd-cm
apiVersion: v1kind: ConfigMapmetadata: name: argocd-cm namespace: argocddata: url: https://argocd.example.com dex.config: | connectors: - type: gitlab id: gitlab name: GitLab config: baseURL: https://gitlab.com clientID: votre-application-id clientSecret: $gitlab-client-secret groups: - mon-groupe-gitlabAssigner les groupes SSO aux rôles RBAC :
# Dans argocd-rbac-cmdata: policy.csv: | g, mon-organisation:equipe-dev, role:developer g, mon-organisation:equipe-ops, role:opsSecrets : ne jamais mettre en clair dans Git
Section intitulée « Secrets : ne jamais mettre en clair dans Git »C’est la règle absolue du GitOps : si un secret apparaît en clair dans votre config-repo, il est compromis. Deux solutions sont largement adoptées :
External Secrets Operator (recommandé)
Section intitulée « External Secrets Operator (recommandé) »External Secrets Operator synchronise les secrets depuis un coffre-fort externe
(Vault, AWS Secrets Manager, GCP Secret Manager…) vers des Secrets Kubernetes.
Votre ExternalSecret dans Git ne contient que la référence au secret, jamais
la valeur.
# external-secret.yaml (committé dans Git — ne contient pas le secret)apiVersion: external-secrets.io/v1beta1kind: ExternalSecretmetadata: name: db-credentials namespace: demospec: refreshInterval: 1h secretStoreRef: name: vault-backend kind: ClusterSecretStore target: name: db-credentials # Nom du Secret Kubernetes créé creationPolicy: Owner data: - secretKey: password remoteRef: key: secret/demo/db property: passwordL’opérateur récupère secret/demo/db depuis Vault et crée le Secret
Kubernetes db-credentials avec la valeur réelle.
Sealed Secrets (alternative plus simple)
Section intitulée « Sealed Secrets (alternative plus simple) »Sealed Secrets chiffre les secrets avec une clé publique spécifique à votre
cluster. Le SealedSecret chiffré peut être commité dans Git en toute sécurité.
# Installer le CLI kubesealKUBESEAL_VERSION="0.27.3"curl -sSLo kubeseal \ "https://github.com/bitnami-labs/sealed-secrets/releases/download/v${KUBESEAL_VERSION}/kubeseal-linux-amd64"chmod +x kubeseal && sudo mv kubeseal /usr/local/bin/
# Chiffrer un secret existantkubectl create secret generic db-credentials \ --from-literal=password="MonMotDePasse123" \ --dry-run=client -o json | \ kubeseal --format yaml > sealed-db-credentials.yaml
# Ce fichier peut être commité dans Git en toute sécuritécat sealed-db-credentials.yamlNotifications ArgoCD
Section intitulée « Notifications ArgoCD »ArgoCD peut notifier votre équipe en cas d’événement (sync réussi, erreur de santé, drift détecté). L’outil ArgoCD Notifications est intégré depuis ArgoCD v2.3.
Configuration Slack
Section intitulée « Configuration Slack »# Créer le ConfigMap de configuration des notificationscat <<EOF | kubectl apply -f -apiVersion: v1kind: ConfigMapmetadata: name: argocd-notifications-cm namespace: argocddata: service.slack: | token: \$slack-token template.app-deployed: | message: | Application {{.app.metadata.name}} déployée avec succès. Révision : {{.app.status.sync.revision}} template.app-health-degraded: | message: | ⚠️ Application {{.app.metadata.name}} est Degraded ! trigger.on-deployed: | - when: app.status.operationState.phase in ['Succeeded'] send: [app-deployed] trigger.on-health-degraded: | - when: app.status.health.status == 'Degraded' send: [app-health-degraded]EOF# Créer le secret Slackkubectl create secret generic argocd-notifications-secret \ --from-literal=slack-token="xoxb-votre-token-slack" \ -n argocd# Activer les notifications sur une Applicationkubectl annotate application nginx-demo \ notifications.argoproj.io/subscribe.on-deployed.slack="mon-canal-deploys" \ notifications.argoproj.io/subscribe.on-health-degraded.slack="mon-canal-alertes" \ -n argocdÀ retenir
Section intitulée « À retenir »- RBAC : configurez
policy.csvdansargocd-rbac-cm. Le rôle par défaut devrait êtrerole:readonly, jamaisrole:admin. - AppProjects : créez un projet par équipe avec des restrictions sur les sources Git, les namespaces cibles et les types de ressources autorisés.
- SSO avec Dex : connectez ArgoCD à GitHub ou GitLab pour éviter la gestion de comptes locaux. Assignez les groupes SSO aux rôles RBAC.
- Ne jamais mettre un secret en clair dans Git. Utilisez External Secrets Operator (si vous avez un vault) ou Sealed Secrets (plus simple).
- Notifications : configurez des alertes Slack ou email sur les événements de déploiement et de dégradation de santé.
- Les tokens CI doivent être des comptes de service dédiés avec des droits minimaux (get + sync sur un projet seulement).