Как управлять Credentials в Jenkins
Credentials (учетные данные) — это механизм безопасного хранения секретов в Jenkins (пароли, SSH-ключи, токены, сертификаты). Секреты хранятся в зашифрованном виде на диске master-сервера и никогда не выводятся в логах сборок (маскируются как ****).
Типы Credentials
| Тип | Описание | Пример использования |
|---|---|---|
| Username with password | Логин и пароль | Nexus, база данных, Git |
| Secret text | Одиночный секретный текст | API-токен, ключ SonarQube |
| Secret file | Секретный файл | Сертификат, settings.xml, kubeconfig |
| SSH Username with private key | SSH-ключ | Подключение к серверам, Git по SSH |
| Certificate | PKCS#12 сертификат | TLS-сертификаты |
Области видимости (Scope)
- Global — доступен во всех проектах Jenkins.
- System — доступен только на уровне системы Jenkins (для подключения агентов и т.д.), недоступен в пайплайнах.
- Folder — доступен внутри определенной папки проектов (изоляция по командам).
Использование через environment
При использовании credentials() в блоке environment Jenkins автоматически создает переменные:
Пример
pipeline {
agent any
environment {
// Username with password — создает ТРИ переменные:
// NEXUS_CREDS (в формате user:pass), NEXUS_CREDS_USR и NEXUS_CREDS_PSW
NEXUS_CREDS = credentials('nexus-credentials')
// Secret text — одна переменная
SONAR_TOKEN = credentials('sonarqube-token')
}
stages {
stage('Deploy to Nexus') {
steps {
sh """
mvn deploy \
-DaltDeploymentRepository=nexus::default::https://nexus.company.com/repository/maven-releases \
-Dusername=\${NEXUS_CREDS_USR} \
-Dpassword=\${NEXUS_CREDS_PSW}
"""
}
}
}
}
Использование через withCredentials
Блок withCredentials предоставляет секреты только внутри своей области видимости:
Пример withCredentials
stage('Deploy') {
steps {
withCredentials([
usernamePassword(credentialsId: 'nexus-credentials',
usernameVariable: 'NEXUS_USER',
passwordVariable: 'NEXUS_PASS'),
sshUserPrivateKey(credentialsId: 'deploy-ssh-key',
keyFileVariable: 'SSH_KEY')
]) {
sh 'curl -u ${NEXUS_USER}:${NEXUS_PASS} --upload-file app.jar ${NEXUS_URL}'
sh 'ssh -i ${SSH_KEY} user@server "systemctl restart app"'
}
}
}
Использование configFileProvider для settings.xml
Плагин Config File Provider хранит конфигурационные файлы (например, settings.xml с учетными данными Nexus) и предоставляет их во время сборки:
Пример
stage('Build') {
steps {
configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) {
sh 'mvn -s $MAVEN_SETTINGS clean deploy'
}
}
}
Лучшие практики работы с Credentials
- Минимальные привилегии — создавайте отдельные credentials для каждого назначения (не один суперпользователь на всё).
- Folder scope — изолируйте credentials по командам/проектам через папки Jenkins.
- Ротация — периодически меняйте пароли и токены.
- Аудит — отслеживайте, кто и когда использует credentials (Audit Trail Plugin).
- Внешние хранилища — для enterprise-среды интегрируйте Jenkins с HashiCorp Vault или CyberArk.
Вывод
Credentials — это фундамент безопасности CI/CD пайплайна. Правильное управление секретами предотвращает утечки данных и обеспечивает соответствие требованиям безопасности. Никогда не храните секреты в коде, Jenkinsfile или переменных окружения операционной системы.
На собеседовании: часто просят объяснить разницу между
credentials()в environment иwithCredentials, а также описать типы credentials. Ключевой момент — знать, что Jenkins маскирует секреты в логах, но это не абсолютная защита (например,base64секрета не будет замаскирован).