Перейти к основному содержимому

Как внедрить секреты Git в Jenkins

· 6 мин. чтения

1. Введение

Jenkins — отличный инструмент для автоматизации сборки и доставки программного обеспечения, особенно при использовании git для управления конфигурацией программного обеспечения. Однако распространенная проблема при использовании Jenkins заключается в том, как обрабатывать конфиденциальные данные, такие как пароли или токены .

В этом руководстве мы рассмотрим, как безопасно внедрять секреты git в конвейеры и задания Jenkins.

2. Секреты Git

Для начала мы сначала рассмотрим создание секретов git.

2.1. Создать ключи GPG

Поскольку секреты git используют ключи GPG, мы должны сначала убедиться, что у нас есть действительный ключ для использования:

$ gpg --gen-key

Это запросит у нас полное имя и адрес электронной почты, а также секретную фразу-пароль. Запомните эту парольную фразу, так как она понадобится нам позже при настройке Jenkins.

Это создаст пару открытого и закрытого ключей в нашем домашнем каталоге, чего достаточно, чтобы начать создавать секреты. Позже мы увидим, как экспортировать ключ для использования с Jenkins.

2.2. Инициализировать секреты

Утилита git-secret — это дополнение к git, которое может хранить конфиденциальные данные внутри репозитория git . Это не только безопасный способ хранения учетных данных, но и преимущества управления версиями и контроля доступа, встроенные в git.

Для начала мы должны сначала установить утилиту git-secret . Обратите внимание, что он не является частью большинства дистрибутивов git и должен устанавливаться отдельно.

После установки мы можем инициализировать секреты внутри любого репозитория git:

$ git secret init

Это похоже на команду git init . Он создает новый каталог .gitsecret внутри репозитория.

В качестве наилучшей практики мы должны добавить все файлы в каталоге .gitignore в систему управления версиями, кроме файла random_seed . Приведенная выше команда инициализации должна гарантировать, что наш .gitignore сделает это за нас , но ее стоит перепроверить.

Далее нам нужно добавить пользователя в связку ключей git secret repo:

$ git secret tell mike@aol.com

Теперь мы готовы хранить секреты в нашем репо.

2.3. Хранение и извлечение секретов

Команда git secret работает, шифруя определенные файлы в репо. Файлам присваивается расширение .secret , а исходное имя файла добавляется к .gitignore , чтобы предотвратить его фиксацию в репозитории.

В качестве примера предположим, что мы хотим сохранить пароль для нашей базы данных в файле с именем dbpassword.txt . Сначала мы создаем файл:

$ echo "Password123" > dbpassword.txt

Теперь шифруем файл:

$ git secret add dbpassword.txt

Наконец, мы должны зафиксировать секрет с помощью команды hide :

$ git secret hide

На этом этапе мы должны зафиксировать наши изменения, чтобы убедиться, что файл надежно хранится в нашем репозитории. Это делается с помощью стандартных команд git:

$ git add .
$ git commit -m "Add encrypted DB password"
$ git push

Обратите внимание, что незашифрованный файл по-прежнему доступен локально. Однако git автоматически проигнорировал его, поэтому мы не можем случайно зарегистрировать его.

Чтобы подтвердить это, если бы мы сделали еще одну проверку репозитория, это то, что мы увидели бы:

$ ls
dbpassword.txt.secret

Обратите внимание, что содержимое файла .secret зашифровано и недоступно для чтения . Прежде чем мы сможем их прочитать, мы должны расшифровать файл:

$ git secret reveal -p <PASSPHRASE>
$ git secret cat dbpassword.txt

PASSPHRASE — это парольная фраза GPG, которую мы использовали при создании нашего ключа GPG.

3. Использование секретов Git с Дженкинсом

Теперь мы рассмотрели шаги, необходимые для хранения и получения учетных данных с помощью git secret . Далее мы увидим, как использовать зашифрованные секреты с Jenkins.

3.1. Создать учетные данные

Для начала мы должны сначала экспортировать закрытый ключ GPG, который мы создали ранее:

$ gpg -a --export-secret-keys mike@aol.com > gpg-secret.key
$ gpg --export-ownertrust > gpg-ownertrust.txt

Важно сохранить этот закрытый ключ в безопасности . Никогда не делитесь им и не сохраняйте его в общедоступном месте.

Далее нам нужно сохранить этот закрытый ключ внутри Jenkins. Мы сделаем это, создав несколько учетных данных Jenkins для хранения секретного ключа GPG и хранилища доверия, которые мы только что экспортировали.

Сначала перейдите в «Учетные данные » > « Система» > «Глобальные учетные данные » и нажмите «Добавить учетные данные » . Нам нужно настроить следующие поля:

  • Тип : Секретный файл
  • Файл : загрузите gpg-secret.key , который мы экспортировали выше .
  • ID : gpg-секрет
  • Описание : Секретный ключ GPG

./e4eaced5964321ce95b1487bc56d895d.jpg

Сохраните учетные данные и создайте еще один для файла хранилища доверенных сертификатов:

  • Тип : Секретный файл
  • Файл : загрузите файл gpg-ownertrust.txt , который мы экспортировали выше .
  • ID : gpg-ownertrust
  • Описание : Доверие владельца GPG

./2a617b3a240bc68f7bbd1aa342f5347b.jpg

Сохраните учетные данные и создайте окончательные учетные данные для парольной фразы GPG:

  • Тип : секретный текст
  • Текст : <Парольная фраза, используемая для создания ключа GPG>
  • ID : gpg-кодовая фраза
  • Описание : Парольная фраза GPG

./ef9a757469ff8fb03cec8c20315614d6.jpg

3.2. Использовать учетные данные в конвейере

Теперь, когда у нас есть ключ GPG, доступный в качестве учетных данных, мы можем создать или изменить конвейер Jenkins для использования ключа. Имейте в виду, что у нас должен быть установлен инструмент git-secret на агенте Jenkins, прежде чем это сработает.

Чтобы получить доступ к зашифрованным данным внутри нашего пайплайна, мы должны добавить несколько частей в скрипт пайплайна.

Во-первых, мы добавляем объявление среды :

environment {
gpg_secret = credentials("gpg-secret")
gpg_trust = credentials("gpg-ownertrust")
gpg_passphrase = credentials("gpg-passphrase")
}

Это делает три учетных данных, которые мы создали ранее, доступными для последующих этапов конвейера.

Затем мы импортируем ключ GPG и доверяем локальной среде агента:

steps {
sh """
gpg --batch --import $gpg_secret
gpg --import-ownertrust $gpg_trust
"""
}

Наконец, мы можем выполнять секретные команды git внутри репо:

steps {
sh """
cd $WORKSPACE
git secret reveal -p '$gpg_passphrase'
git secret cat dbpassword.txt
"""
}

Когда мы запустим конвейер, мы должны увидеть вывод пароля базы данных в конце:

+ git secret cat dbpassword.txt
Password123

3.3. Дженкинс Джобс

Мы также можем использовать секреты git, используя традиционные задания Jenkins.

Как и в случае с конвейерами, мы должны настроить 3 учетных данных Jenkins для нашего ключа GPG, доверия и парольной фразы.

Основное отличие от конвейеров заключается в том, что мы внедряем учетные данные GPG с помощью панели конфигурации среды Jenkins:

./fadf02831f8fc02ccd34f66541111dc4.jpg

Затем мы можем добавить команды GPG import и git secret в команды оболочки:

./a8cc318fbb380a5a48944dc236f46229.jpg

Как и в случае с конвейером, мы должны увидеть пароль базы данных, напечатанный в конце выполнения задания:

+ git secret cat dbpassword.txt
Password123
Finished: SUCCESS

4. Вывод

В этом руководстве мы увидели, как использовать секреты git как с конвейерами Jenkins, так и с традиционными заданиями. Это простой способ предоставить доступ к конфиденциальным данным для ваших конвейеров CI/CD.

Однако обратите внимание, что, хотя секреты Git являются одним из вариантов хранения ключей, другие специализированные решения для обеспечения безопасности, такие как Hashicorp Vault, предлагают более надежные альтернативы.