Как использовать имя пользователя и пароль, хранящиеся в AWS Secrets Manager, в моей работе Jenkins?

У меня есть конвейер Jenkins, который запускает тесты Cypress в контейнере Docker. Тестам необходимы имя пользователя и пароль для входа в веб-приложение. Я сохранил имя пользователя и пароль в AWS Secrets Manager. Я могу это сделать, когда выполняю команду оболочки на этапе сборки.

USERNAME=$(aws secretsmanager get-secret-value --region us-east-2 --secret-id myID | jq -r .SecretString | jq -r .username)
PASSWORD=$(aws secretsmanager get-secret-value --region us-east-2 --secret-id myID | jq -r .SecretString | jq -r .password)

docker run -e NO_COLOR=1 -v "$PWD":/workdir -w /workdir --entrypoint=cypress 1.dkr.ecr.us-east-2.amazonaws.com/cypress/included:3.8.3 run  --env username="$USERNAME",password="$PASSWORD" 

Однако я хочу создать задание Jenkins Pipeline и сделать это из JenkinsFile. Как я могу прочитать имя пользователя и пароль из AWS Secrets Manager в файле Jenkins?


person Ankit Madaan    schedule 12.06.2020    source источник


Ответы (2)


У вас есть sh шаг.

steps {
  script {
    username = sh (script: "aws secretsmanager get-secret-value --region us-east-2 --secret-id myID | jq -r .SecretString | jq -r .username", returnStdout: true)
    password = sh (script: "aws secretsmanager get-secret-value --region us-east-2 --secret-id myID | jq -r .SecretString | jq -r .password", returnStdout: true)
  }
}
person Ay0    schedule 12.06.2020
comment
Ваш комментарий мне помог, но в то же время я потратил 4 часа, чтобы выяснить, почему это не работает ... У вас есть опечатка в ключевом слове returnStdOut. Это должно быть returnStdout. - person ybonda; 07.02.2021
comment
@ybonda исправлено :) - person Ay0; 08.02.2021

Вы также можете использовать API поставщика учетных данных Jenkins для достижения этой цели.

Использование API поставщика учетных данных вместо шага сценария дает несколько преимуществ:

  • Учетные данные в вашем скрипте конвейера Jenkins («что») отделены от логики, которая их ищет («как»), что делает ваши скрипты более чистыми и переносимыми.
  • Вы можете загрузить несколько поставщиков учетных данных, если вам нужно прочитать учетные данные из нескольких мест.
  • Поставщики учетных данных эффективно кэшируют секретные метаданные, гарантируя, что секретные значения остаются вне памяти до момента, когда они понадобятся.
  • Jenkins автоматически маскирует значения учетных данных, которые печатаются в журнале сборки, поэтому случайная утечка значений сложнее.
  • Пользовательский интерфейс учетных данных Jenkins и пользовательский интерфейс конструктора вакансий показывают, какие учетные данные доступны, что упрощает создание сценариев заданий.

Это правда, что есть некоторая сложность предварительной настройки поставщика учетных данных по сравнению с шагом сценария. Однако, если вы используете учетные данные более чем в 1 или 2 сценариях, или любые из ваших учетных данных будут иметь нетривиальные последствия, если они будут неправильно управляться или просочиться (например, ключи загрузки Artifactory), я определенно думаю, что стоит взять эту стоимость сейчас взамен для более простого управления учетными данными и последующего обслуживания.

Дополнительную информацию см. В документации Jenkins.

Пример

Если вы хотите использовать API поставщика учетных данных с секретами, которые вы сохранили в диспетчере секретов, вы должны использовать плагин AWS Secrets Manager Credentials Provider. (Отказ от ответственности: я поддерживаю этот плагин.)

Сначала мы устанавливаем плагин AWS Secrets Manager Credentials Provider на Jenkins и предоставляем Jenkins IAM доступ к Secrets Manager.

Затем мы загружаем имя пользователя Jenkins с паролем «artifactory» в диспетчер секретов, которое содержит имя пользователя «joe» (неконфиденциальная информация) и пароль «supersecret» (конфиденциальная информация).

aws secretsmanager create-secret \
  --name 'artifactory' \
  --secret-string 'supersecret' \
  --description 'Acme Corp Artifactory user' \
  --tags 'Key=jenkins:credentials:username,Value=joe' 'Key=jenkins:credentials:type,Value=usernamePassword'

Затем мы привязываем «искусственные» учетные данные к нашему файлу Jenkins.

pipeline {
    agent any
    environment {
        ARTIFACTORY = credentials('artifactory')
    }
    stages {
        stage('Foo') {
            steps {
                // Three environment variables are now available to use however you want:
                //
                // ARTIFACTORY=joe:supersecret
                // ARTIFACTORY_USR=joe
                // ARTIFACTORY_PSW=supersecret
                
                sh './deploy'
            }
        }
    }
}
person chriskilding    schedule 09.10.2020
comment
echo 'Hello $ ARTIFACTORY_USR' не выводит фактическое значение, как мне вывести фактическое значение в консоль для целей отладки? - person shan; 30.11.2020
comment
Я полагаю, вы видите, как маскировка учетных данных вступает в силу, отмечая значение в журнале сборки. (По общему признанию, это не лучший пример, поэтому я обновлю его.) В верхней части моей головы Дженкинс не позволит вам отключить маскировку по уважительной причине (если такой опции нет, злоумышленники не могут отключить маскировку. либо), но если вам действительно нужен доступ к значению в исключительных случаях отладки, вы можете использовать обходной путь: записать переменную в файл в рабочей области, а затем прочитать файл. Я бы, конечно, предостерегал от того, чтобы делать это в производственной среде или с настоящими учетными данными. - person chriskilding; 10.12.2020