В этой серии мы увидели, как создавать и управлять нашими секретами в Git и ограничить их доступ к членам команды.
Что если я хочу, используйте свой секрет от моего CI для непрерывного развертывания? Это именно то, что мы увидим в этой статье, основанной на Gitlab ci 🦊. .
Отказ от ответственности : Каждая система CI должна быть совместима, вам просто нужно иметь доступ к секретам CI и иметь возможность получать их во время выполнения.
🤖 Создание идентичности CI
Чтобы быть в состоянии расшифровать секреты в рамках непрерывной интеграции, мы должны создать идентичность для нашего CI. Алиса
, Бобби
и Девон
будет иметь новый друг по имени Кабинета
🤖!
Девон
Отвечает за CI, создаст новую ключевую пару для этого нового специального пользователя. Он будет использовать GPG - Полученный ключ
Команда и ответьте на вопросы, как если бы это было для настоящего человека.
Затем он извлечет резервную копию частный/открытый ключ с помощью команды GPG -O. ci.key. прерску --Экспорт-секрет-ключей ci@domain.fr
. Этот ключ находится в текстовом формате, который прост в использовании в качестве переменной среды.
Примечание : Этот ключ и пароль следует хранить надежно, в клавиатуре, хранилище или что-то еще, потому что они представляют собой идентичность вашей CI. По дизайну он сможет расшифровать все секреты из репозитория.
Нам также необходимо извлечь открытый ключ отдельно, чтобы распределить его каждому членам команды. Без этого они не смогут зашифровать секрет и включать CI
ключ в процессе.
Сделать это, Девон
будет использовать команду GPG -O Ci.public.key. --Armor - export
Отказ
🔑 Импортировать открытый ключ CI
Каждый член команды должен импортировать открытый ключ, извлеченный Девон
на предыдущем шаге. Здесь Booby
будет использовать GPG --import ci.public.key
Команда для выполнения этого.
В конце, он, и все другие члены команды должны иметь в своем ключевом списке ( GPG --list-Keys
) Открытый ключ CI
Отказ
🔏 Обновлять ключи каждого секрета
CI
является новым членом команды, как и любой другой человек. Команда должна позволить этому новым «человеком» доступе и расшифровать каждый секрет. Итак, мы будем использовать SOP Coots updateys
на любой секрет.
Это требует правильно настроенного .sops.yaml
файл. Для получения дополнительной информации об этом вы можете прочитать вторая часть этой серии.
🦊 Конфигурация GitLab CI
Теперь CI готов к настройке. Девон
Отвечает за это, импортирую в секретную панель GitLab (в Настройки > CI/CD > Переменные ) содержание Ci.key
создан ранее, и пароль определена для нее.
Примечание : Переменная Тип
определяется на Файл
для Ключ
Отказ Для получения дополнительной информации об этом посмотрите на Официальная документация GitLab о переменной файла
Тогда, Девон
Определите работу GitLab CI, способную прочитать значение из зашифрованного секрета. Для нашего примера это просто сделает кот
на стандартном выходе. Конечно, вы можете сделать то, что вы хотите с этими ценностями в вашем трубопроводе CI.
Нам нужно позаботиться о изображение
используется в нашей непрерывной интеграции. Мы должны иметь возможность получить доступ к GPG
команда. В этом примере мы установим его.
deploy int: image: google/cloud-sdk # <1> before_script: - apt-get update && apt-get install -y curl gnupg # <2> - curl -qsL https://github.com/mozilla/sops/releases/download/v3.5.0/sops-v3.5.0.linux -o /usr/local/bin/sops # <3> - chmod +x /usr/local/bin/sops - cat $KEY | gpg --batch --import # <4> - echo $PASSPHRASE | gpg --batch --always-trust --yes --passphrase-fd 0 --pinentry-mode=loopback -s $(mktemp) # <5> script: - sops -d int.encrypted.env > int.env # <6> - cat int.env
- Определите изображение задания, основанное на нашей развертывающей фазе … Он должен соответствовать командным потребностям, это просто например здесь.
- Мы устанавливаем
GPG
искручивание
БлагодаряAPT
на распределении Debian. Следует адаптировать, если вы используете другое распространение. - Мы используем
Curl
Для скачивания. SOP
двоичный от github. Берегите себя, чтобы получить последнюю версию 😉. - Импортировать
Ci.key
в нашуGPG
Набор инструментов. - Предоставить
Фраза переноса
кGPG
Насущная инструментарий быть полностью «не интерактивным». - Затем CI может расшифровать
Int.encrypted.env
Файл и используйте его, где мы хотим в нашей развертывающей фазе.
Running with gitlab-runner 13.0.0 (c127439c) on docker-auto-scale 0277ea0f Preparing the "docker+machine" executor Using Docker executor with image google/cloud-sdk ... Pulling docker image google/cloud-sdk ... Using docker image sha256:5d096c48b3b4bab72df240dcf94940be3e0397606bb4cc94143f2a12189dba1f for google/cloud-sdk ... Preparing environment Running on runner-0277ea0f-project-19225532-concurrent-0 via runner-0277ea0f-srm-1591443365-4e9ad7c3... Getting source from Git repository $ eval "$CI_PRE_CLONE_SCRIPT" Fetching changes with git depth set to 50... Initialized empty Git repository in /builds/davinkevin/sops-blog-post-repository/.git/ Created fresh repository. From https://gitlab.com/davinkevin/sops-blog-post-repository * [new ref] refs/pipelines/153546622 -> refs/pipelines/153546622 * [new branch] master -> origin/master Checking out 84edc518 as master... Skipping Git submodules setup Restoring cache 00:02 Downloading artifacts 00:01 Running before_script and script $ apt-get update && apt-get install -y curl gnupg Hit:1 http://deb.debian.org/debian buster InRelease Get:2 http://deb.debian.org/debian buster-updates InRelease [49.3 kB] Get:3 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB] Hit:4 https://packages.cloud.google.com/apt cloud-sdk-buster InRelease Get:5 http://deb.debian.org/debian sid InRelease [146 kB] Get:6 http://security.debian.org/debian-security buster/updates/main amd64 Packages [201 kB] Get:7 http://deb.debian.org/debian sid/main amd64 Packages.diff/Index [27.9 kB] Get:8 http://deb.debian.org/debian sid/main amd64 Packages 2020-06-05-2003.49.pdiff [23.8 kB] Get:9 http://deb.debian.org/debian sid/main amd64 Packages 2020-06-06-0208.52.pdiff [16.2 kB] Get:10 http://deb.debian.org/debian sid/main amd64 Packages 2020-06-06-0803.34.pdiff [12.5 kB] Get:10 http://deb.debian.org/debian sid/main amd64 Packages 2020-06-06-0803.34.pdiff [12.5 kB] Fetched 543 kB in 2s (243 kB/s) Reading package lists... Reading package lists... Building dependency tree... Reading state information... The following packages were automatically installed and are no longer required: dh-python libperl5.28 libpython3.7 libpython3.7-minimal libpython3.7-stdlib perl-modules-5.28 python3.7-minimal Use 'apt autoremove' to remove them. The following additional packages will be installed: dirmngr gnupg-l10n gnupg-utils gpg gpg-agent gpg-wks-client gpg-wks-server gpgconf gpgsm gpgv libbrotli1 libcurl4 Suggested packages: dbus-user-session libpam-systemd pinentry-gnome3 tor parcimonie xloadimage scdaemon The following NEW packages will be installed: libbrotli1 The following packages will be upgraded: curl dirmngr gnupg gnupg-l10n gnupg-utils gpg gpg-agent gpg-wks-client gpg-wks-server gpgconf gpgsm gpgv libcurl4 13 upgraded, 1 newly installed, 0 to remove and 132 not upgraded. Need to get 8559 kB of archives. After this operation, 1241 kB of additional disk space will be used. Get:1 http://deb.debian.org/debian sid/main amd64 gpg-wks-client amd64 2.2.20-1 [507 kB] Get:2 http://deb.debian.org/debian sid/main amd64 dirmngr amd64 2.2.20-1 [740 kB] Get:3 http://deb.debian.org/debian sid/main amd64 gnupg-utils amd64 2.2.20-1 [889 kB] Get:4 http://deb.debian.org/debian sid/main amd64 gpg-wks-server amd64 2.2.20-1 [500 kB] Get:5 http://deb.debian.org/debian sid/main amd64 gpg-agent amd64 2.2.20-1 [641 kB] Get:6 http://deb.debian.org/debian sid/main amd64 gpg amd64 2.2.20-1 [894 kB] Get:7 http://deb.debian.org/debian sid/main amd64 gpgconf amd64 2.2.20-1 [532 kB] Get:8 http://deb.debian.org/debian sid/main amd64 gnupg-l10n all 2.2.20-1 [1035 kB] Get:9 http://deb.debian.org/debian sid/main amd64 gnupg all 2.2.20-1 [749 kB] Get:10 http://deb.debian.org/debian sid/main amd64 gpgsm amd64 2.2.20-1 [627 kB] Get:11 http://deb.debian.org/debian sid/main amd64 gpgv amd64 2.2.20-1 [608 kB] Get:12 http://deb.debian.org/debian sid/main amd64 libbrotli1 amd64 1.0.7-6.1 [267 kB] Get:13 http://deb.debian.org/debian sid/main amd64 curl amd64 7.68.0-1 [249 kB] Get:14 http://deb.debian.org/debian sid/main amd64 libcurl4 amd64 7.68.0-1 [321 kB] debconf: delaying package configuration, since apt-utils is not installed Fetched 8559 kB in 0s (22.3 MB/s) (Reading database ... 85863 files and directories currently installed.) Preparing to unpack .../00-gpg-wks-client_2.2.20-1_amd64.deb ... Unpacking gpg-wks-client (2.2.20-1) over (2.2.12-1+deb10u1) ... Preparing to unpack .../01-dirmngr_2.2.20-1_amd64.deb ... Unpacking dirmngr (2.2.20-1) over (2.2.12-1+deb10u1) ... Preparing to unpack .../02-gnupg-utils_2.2.20-1_amd64.deb ... Unpacking gnupg-utils (2.2.20-1) over (2.2.12-1+deb10u1) ... Preparing to unpack .../03-gpg-wks-server_2.2.20-1_amd64.deb ... Unpacking gpg-wks-server (2.2.20-1) over (2.2.12-1+deb10u1) ... Preparing to unpack .../04-gpg-agent_2.2.20-1_amd64.deb ... Unpacking gpg-agent (2.2.20-1) over (2.2.12-1+deb10u1) ... Preparing to unpack .../05-gpg_2.2.20-1_amd64.deb ... Unpacking gpg (2.2.20-1) over (2.2.12-1+deb10u1) ... Preparing to unpack .../06-gpgconf_2.2.20-1_amd64.deb ... Unpacking gpgconf (2.2.20-1) over (2.2.12-1+deb10u1) ... Preparing to unpack .../07-gnupg-l10n_2.2.20-1_all.deb ... Unpacking gnupg-l10n (2.2.20-1) over (2.2.12-1+deb10u1) ... Preparing to unpack .../08-gnupg_2.2.20-1_all.deb ... Unpacking gnupg (2.2.20-1) over (2.2.12-1+deb10u1) ... Preparing to unpack .../09-gpgsm_2.2.20-1_amd64.deb ... Unpacking gpgsm (2.2.20-1) over (2.2.12-1+deb10u1) ... Preparing to unpack .../10-gpgv_2.2.20-1_amd64.deb ... Unpacking gpgv (2.2.20-1) over (2.2.12-1+deb10u1) ... Setting up gpgv (2.2.20-1) ... Selecting previously unselected package libbrotli1:amd64. (Reading database ... 85881 files and directories currently installed.) Preparing to unpack .../libbrotli1_1.0.7-6.1_amd64.deb ... Unpacking libbrotli1:amd64 (1.0.7-6.1) ... Preparing to unpack .../curl_7.68.0-1_amd64.deb ... Unpacking curl (7.68.0-1) over (7.64.0-4+deb10u1) ... Preparing to unpack .../libcurl4_7.68.0-1_amd64.deb ... Unpacking libcurl4:amd64 (7.68.0-1) over (7.64.0-4+deb10u1) ... Setting up libbrotli1:amd64 (1.0.7-6.1) ... Setting up gnupg-l10n (2.2.20-1) ... Setting up gpgconf (2.2.20-1) ... Setting up libcurl4:amd64 (7.68.0-1) ... Setting up curl (7.68.0-1) ... Setting up gpg (2.2.20-1) ... Setting up gnupg-utils (2.2.20-1) ... Setting up gpg-agent (2.2.20-1) ... Installing new version of config file /etc/logcheck/ignore.d.server/gpg-agent ... Setting up gpgsm (2.2.20-1) ... Setting up dirmngr (2.2.20-1) ... Setting up gpg-wks-server (2.2.20-1) ... Setting up gpg-wks-client (2.2.20-1) ... Setting up gnupg (2.2.20-1) ... Processing triggers for libc-bin (2.30-8) ... $ curl -qsL https://github.com/mozilla/sops/releases/download/v3.5.0/sops-v3.5.0.linux -o /usr/local/bin/sops $ chmod +x /usr/local/bin/sops $ cat $KEY | gpg --batch --import gpg: directory '/root/.gnupg' created gpg: keybox '/root/.gnupg/pubring.kbx' created gpg: /root/.gnupg/trustdb.gpg: trustdb created gpg: key FFEFFE9451381735: public key "continuous-integration" imported gpg: key FFEFFE9451381735: secret key imported gpg: Total number processed: 1 gpg: imported: 1 gpg: secret keys read: 1 gpg: secret keys imported: 1 $ echo $PASSPHRASE | gpg --batch --always-trust --yes --passphrase-fd 0 --pinentry-mode=loopback -s $(mktemp) $ sops -d int.encrypted.env > int.env $ cat int.env secret=5Tz2QNxki789YFDa Running after_script 00:01 Saving cache 00:02 Uploading artifacts for successful job 00:01 Job succeeded
Как мы видим здесь (а в Gitlab Reblab View ), каждый раз, когда трубопровод срабатывает, он повторно установит каждое программное обеспечение, из GPG к
SOP , который может быть трудоемким и источником ошибки.
🦊 Оптимизация Gitlab CI
Девон
создаст другой проект только для CI
Изображение для инструмента, и он подготовит изображение CI, чтобы иметь возможность иметь GPG
и SOP
установлены. Вот например, Dockerfile
:
FROM tutum/curl AS downloader RUN curl -qsL https://github.com/mozilla/sops/releases/download/v3.5.0/sops-v3.5.0.linux -o /opt/sops && \ chmod +x /opt/sops FROM google/cloud-sdk as final COPY --from=downloader /opt/sops /usr/local/bin/sops RUN apt-get update && apt-get install -y gnupg --no-install-recommends
Затем он активирует график, чтобы построить это изображение каждый день и публиковать его в своем собственном реестре Docker. Благодаря этому, он может улучшить предыдущее .gitlab-ci.yml
:
deploy int: image: registry.gitlab.com/davinkevin/sops-blog-post-repository/gcloud-sops # Image created by the previous Dockerfile 🐳 before_script: - cat $KEY | gpg --batch --import - echo $PASSPHRASE | gpg --batch --always-trust --yes --passphrase-fd 0 --pinentry-mode=loopback -s $(mktemp) script: - sops -d int.encrypted.env > int.env - cat int.env
Вы можете видеть, выполнение рабочих мест намного прост сейчас:
Running with gitlab-runner 13.0.0 (c127439c) on docker-auto-scale ed2dce3a Preparing the "docker+machine" executor Using Docker executor with image registry.gitlab.com/davinkevin/sops-blog-post-repository/gcloud-sops ... Authenticating with credentials from job payload (GitLab Registry) Pulling docker image registry.gitlab.com/davinkevin/sops-blog-post-repository/gcloud-sops ... Using docker image sha256:ec7e941ae9f66656c9c0b7b4ce61b229eeb215492c65ebfe21c69026aa166013 for registry.gitlab.com/davinkevin/sops-blog-post-repository/gcloud-sops ... Preparing environment 00:05 Running on runner-ed2dce3a-project-19225532-concurrent-0 via runner-ed2dce3a-srm-1591446538-6f33846d... Getting source from Git repository 00:03 $ eval "$CI_PRE_CLONE_SCRIPT" Fetching changes with git depth set to 50... Initialized empty Git repository in /builds/davinkevin/sops-blog-post-repository/.git/ Created fresh repository. From https://gitlab.com/davinkevin/sops-blog-post-repository * [new ref] refs/pipelines/153552640 -> refs/pipelines/153552640 * [new branch] master -> origin/master Checking out 625b7479 as master... Skipping Git submodules setup Restoring cache 00:01 Downloading artifacts 00:02 Running before_script and script 00:04 Authenticating with credentials from job payload (GitLab Registry) $ cat $KEY | gpg --batch --import gpg: directory '/root/.gnupg' created gpg: keybox '/root/.gnupg/pubring.kbx' created gpg: /root/.gnupg/trustdb.gpg: trustdb created gpg: key FFEFFE9451381735: public key "continuous-integration" imported gpg: key FFEFFE9451381735: secret key imported gpg: Total number processed: 1 gpg: imported: 1 gpg: secret keys read: 1 gpg: secret keys imported: 1 $ echo $PASSPHRASE | gpg --batch --always-trust --yes --passphrase-fd 0 --pinentry-mode=loopback -s $(mktemp) $ sops -d int.encrypted.env > int.env $ cat int.env secret=5Tz2QNxki789YFDa Running after_script 00:02 Saving cache 00:01 Uploading artifacts for successful job 00:02 Job succeeded
Примечание : Вы можете использовать этот метод с любым реестром Docker, не только один из GitLab 🦊.
Конечно, до_script
Должен быть копирование/вставить для каждой работы, требующей доступа к секретам. Девон
Refactor это будет оптимизировать Не повторяйте себя
Аспект:
.auth: &auth | # <1> function gpg_auth() { cat $KEY | gpg --batch --import > /dev/null echo $PASSPHRASE | gpg --batch --always-trust --yes --passphrase-fd 0 --pinentry-mode=loopback -s $(mktemp) > /dev/null } gpg_auth deploy alice: image: registry.gitlab.com/davinkevin/sops-blog-post-repository/gcloud-sops before_script: - *auth # <2> script: - sops -d dev_a.encrypted.env > dev_a.env - cat dev_a.env deploy int: image: registry.gitlab.com/davinkevin/sops-blog-post-repository/gcloud-sops before_script: - *auth # <3> script: - sops -d int.encrypted.env > int.env - cat int.env
- А
Ямл
Якорь используется для установки функции пользовательской оболочки и вызов ее сразу. - Использование якоря как
до_script
шаг на работе. - Повторное использование
auth
якорь на другой работе.
Вы можете увидеть Развернуть Алиса
и Развертывать int
Журналы в Gitlab UI.
Конечно, это просто экстракт реального .gitlab-ci.yaml
, который включает в себя свидание, тест, сборки и CIE 👍.
Вывод
Здесь мы узнаем, как настроить нашу идентичность Ci и настроить GitLab Ci 🦊, чтобы быть в состоянии расшифровать секреты. Мы также видим, как оптимизировать его в привязке, используя использование среды GitLab для дома докера.
Вы можете найти исходный код этой статьи, файлов и сценариев в этом Gitlab Repository . CI срабатывает в Этот репозиторий Gitlab
Оригинал: «https://dev.to/stack-labs/manage-your-secrets-in-git-with-sops-gitlab-ci-2jnd»