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
Сохраните учетные данные и создайте еще один для файла хранилища доверенных сертификатов:
Тип
: Секретный файлФайл
: загрузите файлgpg-ownertrust.txt
, который мы экспортировали выше .ID
: gpg-ownertrustОписание
: Доверие владельца GPG
Сохраните учетные данные и создайте окончательные учетные данные для парольной фразы GPG:
Тип
: секретный текстТекст
: <Парольная фраза, используемая для создания ключа GPG>ID
: gpg-кодовая фразаОписание
: Парольная фраза GPG
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:
Затем мы можем добавить команды GPG import и git secret в команды оболочки:
Как и в случае с конвейером, мы должны увидеть пароль базы данных, напечатанный в конце выполнения задания:
+ git secret cat dbpassword.txt
Password123
Finished: SUCCESS
4. Вывод
В этом руководстве мы увидели, как использовать секреты git как с конвейерами Jenkins, так и с традиционными заданиями. Это простой способ предоставить доступ к конфиденциальным данным для ваших конвейеров CI/CD.
Однако обратите внимание, что, хотя секреты Git являются одним из вариантов хранения ключей, другие специализированные решения для обеспечения безопасности, такие как Hashicorp Vault, предлагают более надежные альтернативы.