====== 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."