Рубрики
Uncategorized

Как управлять своими секретами с Git-Crypt

Многие программные проекты используют секреты — обычно клавиши к внешним API или учетные данные для доступа к экстрему … Помечено с безопасностью, WebDev, DevOps, Tutorial.

Многие программные проекты используют секреты — обычно клавиши к внешним API или учетные данные для доступа к внешнему ресурсу, таком как база данных. Ваше приложение нуждается в этих клавишах во время выполнения, поэтому вам нужно иметь возможность предоставить их при развертывании вашего приложения или в качестве шага в подготовке среды развертывания.

В этой статье я собираюсь показать вам, как использовать Git-Crypt Так что вы можете безопасно сохранить свои секреты приложений в ваших репозиториях исходного кода, даже если они публики.

Проблема с секретами приложений

Большинство проектов имеют какие-то секретные ключи или учетные данные. Например, если ваше приложение размещено на Heroku Вы можете предоставить ключ API к вашему приложению Heroku, используя команду, как это:

$ heroku config:set API_KEY=my-sooper-sekrit-api-key

Запустив эту команду перед вами (Re) развертывать ваше приложение, вы даете ему переменную среды во время выполнения называется API_KEY со значением My-Sooper-Sekrit-API-ключ Отказ Однако отслеживание этих секретных ценностей снаружи Heroku (или где бы вы ни развернули ваше приложение), по-прежнему является проблемой.

Я всегда пытаюсь настроить свои проекты, чтобы я мог запустить одну команду, чтобы развернуть их с нуля без каких-либо отдельных ручных шагов. Для нашего примера это означает, что мне нужно хранить значение My-Sooper-Sekrit-API-ключ где-то Так что мой код развертывания может использовать его (в этом случае, для запуска Heroku Config: set ... команда выше).

Мой исходный код проекта всегда хранятся в Git и обычно размещается на Github.com или BitBucket.com или в нескольких других хостингах исходного кода. Я мог бы Храните значение My API_KEY в моем репозитории исходного кода, однако, в этом есть некоторые недостатки:

  • Я не могу поделиться своим репозиторием с кем-либо еще, если мне не удобно доходить к моим секретам. Это означает, что все мои прикладные репозитории с секретами в них должны быть частными.
  • Предположительно многие сотрудники в Github/Bitbucket/где бы также имели доступ к моим секретам, которым я не могу быть в порядке (в зависимости от секрета).
  • Легко забыть о секретах в частном репозитории, если бы я позже решил сделать его общественностью. Поэтому я мог случайно раскрыть важные секреты.

Я мог хранить свои секреты где-то отдельно от моего исходного кода приложения, но это имеет свои проблемы:

  • Мне нужен способ получить свои секреты от того, где они хранятся, в или до развертывания или до развертывания, а также доступа к им коду развертывания.
  • Мои секреты могут не храниться так же надежно, как мой исходный код. Например, я мог бы сохранить секреты в .env Файл на моем ноутбуке и убедитесь, что я никогда не проверяю это в репозиторий Git. Однако, если я потеряю этот файл (например, если мой ноутбук поврежден/украден), то я также теряю этот секрет.

Гит-склеп

Git-Crypt стремится решить эту проблему, зашифруя свои секреты, когда вы нажимаете их в свой хранилище GIT и расшифровывая их всякий раз, когда вы их потяните. Это происходит прозрачно, с вашей точки зрения. Таким образом, секреты находятся в ClearText, насколько вы и ваш код развертывания обеспокоены, но никто другой не может их прочитать, даже если ваш исходный код находится в публичном репозитории GitHub.

Давайте посмотрим на пример.

1. Установите Git-Crypt.

Есть инструкции для Linux, Mac и Windows на Страница установки Git-Crypt

Если я, как я, вы используете Mac с Домашний вид Установлен, вы можете запустить:

$ brew install git-crypt

2. Создайте новый репозиторий Git.

$ mkdir myproject 
$ cd myproject 
$ git init 
$ echo "This is some text" > file.txt 
$ git add file.txt 
$ git commit -m "Initial commit"

Теперь у нас есть репозиторий Git, содержащий один текстовый файл.

3. Настройте репозиторий для использования Git-Crypt.

$ git-crypt init

Вы должны увидеть вывод:

Generating key...

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

$ git-crypt export-key ../git-crypt-key

Эта команда создает копию симметричного ключа Git-Crypt, который был создан для этого хранилища. Мы помещаем его в каталог выше этого репозитория, чтобы мы могли повторно использовать один и тот же ключ в нескольких репозиториях Git.

По умолчанию Git-Crypt хранит сгенерированный ключ в файле .git/git-crypt/keys/default Таким образом, вы можете достичь того же результата, запустив CP .git/git-crypt/keys/default ../git-crypt-ключ

Это Git-Crypt-ключ Файл важен. Это ключ, который может разблокировать все зашифрованные файлы в нашем репозитории. Посмотрим, как использовать этот ключ позже.

4. Скажите git-crypt, какие файлы шифруют.

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

До Мы добавляем этот файл в наш репозиторий, мы скажем Git-Crupt, что мы хотим API.Key файл для зашифрования всякий раз, когда мы это делаем.

Мы делаем это, используя . Гитаттрибусы файл. Это файл, который мы можем использовать для добавления дополнительных метаданных на наш хранилище GIT. Это не специфично для Git-Crypt, так что у вас уже может быть файл. Гитатрубов в вашем репозитории. Если это так, просто добавьте соответствующие строки — не замените весь файл.

В нашем случае у нас нет файла .Gitattributes, поэтому нам нужно создать один. Файл .Gitattributes содержит строки формы:

[file pattern] attr1=value1 attr2=value2

Для Git-Crypt шаблон файлов должен соответствовать всем файлам, которые мы хотим Git-Crypt для шифрования, а атрибуты всегда одинаковы: Фильтр и Различать , оба из которых мы устанавливаем на Git-Crypt.

Итак, наши файл .Gitattributes должен содержать это:

api.key filter=git-crypt diff=git-crypt

Создайте этот файл и добавьте и примите его к вашему репозитории Git:

$ echo "api.key filter=git-crypt diff=git-crypt" > .gitattributes 
$ git add .gitattributes 
$ git commit -m "Tell git-crypt to encrypt api.key"

Я использовал буквальное имя файла API.Key В файле моих .gitattributes, но это может быть любой шаблон файлов, который включает в себя файл (ы), которые вы хотите зашифровать, поэтому я мог бы использовать *.ключ , например. В качестве альтернативы вы можете просто добавить строку для каждого файла, который вы хотите зашифровать.

Может быть легко допустить ошибку в файле .gitattributes, если вы пытаетесь защитить несколько файлов с одной записью шаблона. Итак, я настоятельно рекомендую прочитать этот раздел Git-Crypt Readme , который подчеркивает некоторые общие готы.

5. Добавьте секрет.

Теперь, когда мы сказали Git-Crypt, мы хотим зашифровать API.Key Файл, давайте добавим это в наш репозиторий.

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

$ echo "dummy value" > api.key

Мы не добавили API.Key Чтобы погрузить еще, но мы можем проверить, какой git-crypt _going _to do by работает:

$ git-crypt status

Вы должны увидеть следующий вывод:

    encrypted: api.key 
not encrypted: .gitattributes 
not encrypted: file.txt

Таким образом, хотя файл API.Key еще не привержен нашему репозитории Git, это говорит вам, что Git-Crypt собирается зашифровать его для вас.

Давайте добавлю и совершим файл:

$ git add api.key 
$ git commit -m "Added the API key file"

6. Подтвердите наш секрет зашифрован.

Мы рассказали Git-Crupt, чтобы зашифровать, и мы добавили API.Key на наш репозиторий. Однако, если мы смотрим, ничто не кажется другим:

$ cat api.key 
dummy value

Причина этого является то, что Git-Crypt прозрачно шифрует и расшифрует файлы, когда вы нажимаете и потяните их в свой репозиторий. Итак, API.Key Файл выглядит как обычный файл clearText.

$ file api.key 
api.key: ASCII text

Один из способов подтвердить, что ваши файлы действительно зашифрованы, — это подтолкнуть репозиторий в GitHub. Когда вы просматриваете API.Key Файл с помощью веб-интерфейса GitHub вы увидите, что это зашифрованный двоичный файл, а не текст.

Простой способ посмотреть, как репозиторий будет смотреть на кого-то без ключа дешифрования, — это запустить:

$ git-crypt lock

Теперь, если мы посмотрим на наш API.Key Файл, вещи разные:

$ file api.key 
api.key: data 

$ cat api.key 
GITCRYPTROܮ7y\R*^

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

Вернуться к четкости API.Key Файл, запустить:

$ git-crypt unlock ../git-crypt-key

../git-crypt-key Файл тот, который мы сохранили ранее, используя Гит-склеп экспортный ключ ...

Контрольно-пропускной пункт

Давайте сделаем быстрый обзор того, где мы сейчас находимся.

  • Инициализируйте Git-Crypt на репозитории Git, используя Git-Crypt init
  • Используйте шаблоны файла в . Гитаттрибусы Чтобы сказать Git-Crupt, какие файлы для шифрования
  • Git-Crypt Lock Зашифруйте все указанные файлы в нашем репозитории
  • Git-Crypt разблокировать [Путь к Keyfile] расшифрует зашифрованные файлы

Git-Crypt-ключ Файл очень важен. Без этого вы не сможете расшифровать любой из зашифрованных файлов в вашем хранилище. Любой, у кого есть копия этого файла, имеет доступ ко всем зашифрованным секретам в вашем репозитории. Таким образом, вам нужно сохранить этот файл безопасным и безопасным.

Повторно использовать файл ключа Git-Crypt

Мы использовали Git-Crypt init и Гит-склеп экспорт-ключ создать наши Git-Crypt-ключ файл. Но, если мы должны иметь отдельную ключевой файл для каждого из наших репозиториев, то мы очень не улучшили наше секретное управление.

К счастью, очень легко использовать один и тот же файл ключа Git-Crypt для нескольких репозиториев Git.

Чтобы использовать существующий ключ файл, просто используйте Git-Crypt Unlock вместо Git-Crypt init Когда вы настроили репозиторий Git, чтобы использовать Git-Crypt, как это:

$ mkdir my-other-project   # At the same directory level as `myproject` 
$ cd my-other-project 
$ git init 
$ echo "Something" > file.txt 
$ git add file.txt 
$ git commit -m "initial commit" 
$ git-crypt unlock ../git-crypt-key

Если вы запустите Git-Crypt Unlock Команда перед добавлением любых файлов в ваш репозиторий Git, вы увидите, как это сообщение:

fatal: You are on a branch yet to be born 
Error: 'git checkout' failed 
git-crypt has been set up but existing encrypted files have not been decrypted

Это все еще работает просто отлично, но это немного запутано, поэтому я обязательно добавил и совершил хотя бы один файл перед запуском Git-Crypt Unlock ...

Повторное использование файла ключа Git-Crypt удобно, но это означает, что если кто-то еще получает копию файла ключа, все Из ваших зашифрованных секретов выставлены.

Это тот же тип компромиссов безопасности, как используя менеджер паролей, как LastPass. или 1Password Отказ Вместо того, чтобы управлять несколькими секретами (паролями), каждый с его собственным риском воздействия, вы держите их все в безопасном хранилище и используете один мастер-пароль для разблокировки что Отказ

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

Когда не использовать Git-Crypt

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

Вот некоторые вещи, которые следует учитывать, чтобы решить, является ли это правильное решение для вашего конкретного проекта:

  • Git-Crypt предназначен для ситуаций, когда большинство файлов в вашем репозитории GIT могут оставаться в ClearText, и вам просто нужно шифровать несколько файлов, которые содержат секреты. Если вам нужно шифровать большинство или все файлы в вашем репозитории, то другие решения могут быть лучше.
  • Нет простого способа отозвать доступ к секретам в репозитории после того, как у кого-то есть ключевой файл, и нет простого способа вращения (т. Е. Заменить) файл ключа (хотя изменение файла ключа Git-Crypt не помогает, если вы много Также вращайте все фактические секреты в репозитории).
  • Git-Crypt только шифрует Содержание файлов. Поэтому это не подходит, если метаданные Из вашего хранилища также чувствителен (то есть имена файлов, модификационные даты, совершают сообщения и т. Д.).
  • Некоторые приложения GIT GIT могут не работать надежно с Git-Crypt. ( Хотя конкретный случай Atlassian Sourcetree, упомянутый в Readme, был Исправлено .)

В этом разделе больше информации в этом разделе Git-Crypt Readme Отказ

Лучший способ использовать Гит-склеп

Вместо того, чтобы управлять вашим файлом ключа Git-Crypt напрямую, есть лучший способ управлять зашифрованными репозиториями путем интеграции Git-Crypt с GPG Так что вы можете использовать свой частный ключ GPG для расшифровки репозитория Git. Это также позволяет добавлять несколько сотрудников в репозиторий Git, не передавая никаких секретов между сторонами. Тем не менее, это требует более сложной установки, поэтому мы сохраним это для другой статьи.

Оригинал: «https://dev.to/heroku/how-to-manage-your-secrets-with-git-crypt-56ih»