LU12a - Jenkins Secrets
Lokal werden Secrets oft in privaten .env-Dateien gespeichert. Bei Build-Pipelines müssen die Secrets auf dem Build-Server (oder einem 3rd-Party-Service) hinterlegt werden. Secrets direkt in die Jenkinsfile-Datei zu schreiben ist keine gute Idee, da sie für alle mit Lesezugriff auf das Code-Repository lesbar wären.
Die verschiedenen Typen von „secrets“, die JEnkins unterstützt, sind in folgender Tabelle aufgelistet.
| Typ | Zweck | Beispiele | Verwendung in Pipeline |
|---|---|---|---|
| Secret text | Einzelner String-Wert | API Keys, Tokens | withCredentials([string(...)]) |
| Username/Password | Login-Paare | DB, Docker Registry | withCredentials([usernamePassword(...)]) |
| SSH Key | SSH Zugriff | Server Deploy, Git SSH | sshUserPrivateKey |
| Secret file | Datei als Secret | kubeconfig, JSON Keys, Zertifikate | file(credentialsId, ...) |
| Certificate | X.509 Zertifikate | mTLS, interne APIs | Zertifikatsbasierte Auth (zum Beispiel für Webhooks) |
Nachfolgend ist die Verwendung in einem Jenkinsfile zu sehen. Die separate Helper-Function sorgt dafür, dass bei mehreren Stages nicht die Secret-ID mehrfach angegeben werden muss.
| Jenkinsfile mit Passwort-Leak ❌ | Jenkinsfile mit Secret-Helper-Function ✔️ |
|---|---|
environment { DB_USER = "appuser" DB_PASSWORD = "apppassword" } ... steps { sh """ docker run -d \ --name $DB_CONTAINER \ --restart unless-stopped \ --network infra-net \ -e POSTGRES_USER=$DB_USER \ -e POSTGRES_PASSWORD=$DB_PASSWORD \ -e POSTGRES_DB=$DB_NAME \ -v $DB_VOLUME:/var/lib/postgresql/data \ -v $WORKSPACE/database:/docker-entrypoint-initdb.d \ postgres:17 """ } | def withDbCredentials(body) { withCredentials([ usernamePassword( credentialsId: 'postgres-creds', usernameVariable: 'DB_USER', passwordVariable: 'DB_PASSWORD' ) ]) { body() } } ... steps { withDbCredentials { sh """ docker run -d \ --name $DB_CONTAINER \ --restart unless-stopped \ --network infra-net \ -e POSTGRES_USER=$DB_USER \ -e POSTGRES_PASSWORD=$DB_PASSWORD \ -e POSTGRES_DB=$DB_NAME \ -v $DB_VOLUME:/var/lib/postgresql/data \ -v $WORKSPACE/database:/docker-entrypoint-initdb.d \ postgres:17 """ } } |
Ein wichtiger Grundsatz bezüglich der Sicherheit von Jenkins-Secrets lautet: „Wenn ein Benutzer eine Pipeline editieren kann, kann er in der Regel auch Secrets exfiltrieren.“