Gymterview
middle

Как управлять 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

  1. Минимальные привилегии — создавайте отдельные credentials для каждого назначения (не один суперпользователь на всё).
  2. Folder scope — изолируйте credentials по командам/проектам через папки Jenkins.
  3. Ротация — периодически меняйте пароли и токены.
  4. Аудит — отслеживайте, кто и когда использует credentials (Audit Trail Plugin).
  5. Внешние хранилища — для enterprise-среды интегрируйте Jenkins с HashiCorp Vault или CyberArk.

Вывод

Credentials — это фундамент безопасности CI/CD пайплайна. Правильное управление секретами предотвращает утечки данных и обеспечивает соответствие требованиям безопасности. Никогда не храните секреты в коде, Jenkinsfile или переменных окружения операционной системы.

На собеседовании: часто просят объяснить разницу между credentials() в environment и withCredentials, а также описать типы credentials. Ключевой момент — знать, что Jenkins маскирует секреты в логах, но это не абсолютная защита (например, base64 секрета не будет замаскирован).