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).
| Type | Usage | ID de type |
|---|---|---|
| Username + Password | Registry Docker, Nexus, LDAP | usernamePassword |
| Secret Text | Tokens API (Sonar, Slack, GitHub…) | string |
| SSH Private Key | Clé SSH pour agents, Git, déploiement | sshUserPrivateKey |
| Certificate | Keystores Java (.jks, .p12) | certificate |
| Secret File | Kubeconfig, 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ètre | Recommandation |
|---|---|
| CSRF Protection | Activée par défaut depuis 2.x — ne pas désactiver |
| Disable CLI over Remoting | Activer dans Configure Global Security |
| Agent → Controller Security | Restreindre les commandes autorisées depuis les agents |
| Markup Formatter | Plugin OWASP — évite les XSS dans les descriptions |
| Reverse Proxy | Toujours mettre Jenkins derrière Nginx/Traefik avec TLS |
| Port JNLP | Fixer 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_dataTerraform - 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
- Administration — Vue d’ensemble — hub administration
- Jenkinsfile déclaratif — utilisation de
credentials()etwithCredentials - Installation et configuration — JCasC et secrets au démarrage
- Plugins essentiels — Credentials Binding, Role Strategy, Vault