La sécurité Jenkins repose sur trois piliers : la gestion des identités (qui peut se connecter), le contrôle d’accès (ce que chacun peut faire), et la gestion des secrets (comment les credentials sont stockés et injectés).


Types de Credentials

Jenkins stocke les secrets dans un coffre-fort chiffré (credentials.xml).

TypeUsageID de type
Username + PasswordRegistry Docker, Nexus, LDAPusernamePassword
Secret TextTokens API (Sonar, Slack, GitHub…)string
SSH Private KeyClé SSH pour agents, Git, déploiementsshUserPrivateKey
CertificateKeystores Java (.jks, .p12)certificate
Secret FileKubeconfig, fichier de config chiffréfile

Ajouter un credential

Manage Jenkins → Credentials → System → Global credentials → Add Credentials
  ├── Kind     : Secret text
  ├── ID       : sonar-token          ← référencé dans le Jenkinsfile
  ├── Secret   : sqa_xxxxxxxxxxxx
  └── Description : Token SonarQube

Injecter des credentials dans un pipeline

// String secret → variable d'environnement
withCredentials([string(credentialsId: 'sonar-token', variable: 'SONAR_TOKEN')]) {
    sh 'mvn sonar:sonar -Dsonar.login=$SONAR_TOKEN'
}
 
// Username + Password → deux variables
withCredentials([usernamePassword(
    credentialsId: 'docker-registry',
    usernameVariable: 'DOCKER_USER',
    passwordVariable: 'DOCKER_PASS'
)]) {
    sh 'echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin registry.example.com'
}
 
// Clé SSH → fichier temporaire
withCredentials([sshUserPrivateKey(
    credentialsId: 'deploy-key',
    keyFileVariable: 'SSH_KEY',
    usernameVariable: 'SSH_USER'
)]) {
    sh 'ssh -i $SSH_KEY $SSH_USER@server "deploy.sh"'
}
 
// Fichier (kubeconfig)
withCredentials([file(credentialsId: 'kubeconfig-prod', variable: 'KUBECONFIG')]) {
    sh 'kubectl --kubeconfig=$KUBECONFIG get pods'
}
 
// Dans environment{} — injecté globalement dans tous les stages
environment {
    DOCKER_CREDS = credentials('docker-registry')
    // → DOCKER_CREDS_USR et DOCKER_CREDS_PSW disponibles
}

Contrôle d’accès — Role Strategy Plugin

Le plugin Role-Based Authorization Strategy permet de définir des rôles avec des permissions précises.

Manage Jenkins → Security → Authorization → Role-Based Strategy

Rôles globaux :
  admin       → Overall/Administer
  developer   → Job/Build, Job/Read, Job/Workspace
  viewer      → Overall/Read, Job/Read

Rôles par projet (pattern regex) :
  team-a-.*   → Job/Build, Job/Configure     ← équipe A gère ses propres jobs
  team-b-.*   → Job/Build, Job/Configure

Sécurisation du Controller

ParamètreRecommandation
CSRF ProtectionActivée par défaut depuis 2.x — ne pas désactiver
Disable CLI over RemotingActiver dans Configure Global Security
Agent → Controller SecurityRestreindre les commandes autorisées depuis les agents
Markup FormatterPlugin OWASP — évite les XSS dans les descriptions
Reverse ProxyToujours mettre Jenkins derrière Nginx/Traefik avec TLS
Port JNLPFixer le port TCP agent (50000) et le filtrer par firewall

Secrets dans JCasC

Avec Jenkins Configuration as Code, injecter les secrets via des variables d’environnement (jamais en clair dans le YAML) :

# jenkins-casc.yaml
credentials:
  system:
    domainCredentials:
      - credentials:
          - usernamePassword:
              id: docker-registry
              username: "${DOCKER_USER}"        # var d'env sur le Controller
              password: "${DOCKER_PASSWORD}"
          - string:
              id: sonar-token
              secret: "${SONAR_TOKEN}"
          - string:
              id: slack-token
              secret: "${SLACK_TOKEN}"

Fournir les variables via :

  • Variables d’environnement du container/service
  • AWS SSM Parameter Store → user_data Terraform
  • HashiCorp Vault avec le plugin Vault Plugin

Intégration HashiCorp Vault

// Plugin: hashicorp-vault-pipeline
withVault(
    configuration: [vaultUrl: 'https://vault.example.com', vaultCredentialId: 'vault-token'],
    vaultSecrets: [[path: 'secret/ci/docker', engineVersion: 2, secretValues: [
        [envVar: 'DOCKER_USER', vaultKey: 'username'],
        [envVar: 'DOCKER_PASS', vaultKey: 'password']
    ]]]
) {
    sh 'docker login -u $DOCKER_USER -p $DOCKER_PASS registry.example.com'
}

En relation avec