Шифруем данные в git-репозитории

Где хранить важную текстовую информацию, которая постоянно изменяется, чтобы была возможность откатиться назад в случае ошибки или просмотреть историю всех изменений? Ответ очевиден — в Git!

Но что делать, если обычного приватного репозитория на чужом сервере тебе недостаточно для хранения критической информации? Тут на подмогу приходит инструмент git-crypt.

git-crypt — это расширение для Git, позволяющее прозрачно шифровать файлы в репозитории с помощью GPG. С его помощью ты можешь хранить секретные данные в открытых репозиториях: на сервер файлы улетают в зашифрованном виде, в то время как локальная работа с ними остается привычной и бесшовной.

Шифровать можно как определенные файлы (например, конфиги с чувствительными данными), так и типы файлов по маске или весь репозиторий целиком.

Первичная подготовка системы

Естественно, сначала необходимо установить git-crypt на локальной машине. Инструкцию для разных систем можно найти вот тут.

В Linux установка обычно производится командами apt install git-crypt или dnf install git-crypt. В macOS инструмент ставится через Homebrew: brew install git-crypt. Также можно собрать его из исходников непосредственно из Git-репозитория проекта.


Подготовка репозитория

Сначала создаем обычный Git-репозиторий:

$ mkdir repo && cd repo
$ git init

Теперь нужно выбрать стратегию управления доступом. У git-crypt есть два основных пути: использование симметричного ключа (один файл на всех) или GPG-ключей (асимметричное шифрование). Рассмотрим оба варианта.

Вариант 1: Симметричный ключ (простой метод)

Создается единый файл-ключ (без парольной фразы), который шифрует данные.

Плюсы:

  • Максимально быстрая настройка.
  • Не нужно разбираться в инфраструктуре GPG.

Минусы:

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

Создание и экспорт ключа

$ git-crypt init
$ git-crypt export-key secret_key 

Сохрани secret_key в надежном месте!

Вариант 2: Использование GPG (более гибкий метод)

Более безопасный подход, особенно для командной разработки. Здесь ты используешь существующие или новые GPG-пары (публичный/приватный ключ).

Плюсы:

  • Безопасность: твои ключи могут быть защищены парольной фразой (passphrase), также ты сам выбираешь размер и тип ключа при генерации.
  • Удобство: легко добавлять новых участников, просто импортируя их публичные ключи. Точно так же происходит отзыв неактуальных доступов.

Минусы:

  • Требует базового понимания работы GPG.

Добавление пользователя

Узнай свой USER_ID (Email или отпечаток) через gpg --list-keys и выполни:

$ git-crypt init 
$ git-crypt add-gpg-user USER_ID

После этого в репозиторий добавится твой публичный ключ, которым будут шифроваться данные. Путь будет выглядеть примерно так: .git-crypt/keys/default/0/ID_КЛЮЧА.gpg.


Настройка объектов шифрования

Теперь определимся с тем, что именно мы будем шифровать. Для этого используется файл .gitattributes.

Шифруем выборочные файлы

Создаем файл .gitattributes в корне проекта:

wp-config.php filter=git-crypt diff=git-crypt
*.env filter=git-crypt diff=git-crypt
/certs/* filter=git-crypt diff=git-crypt

После коммита будет зашифрован файл wp-config.php, все файлы с расширением .env и все файлы в директории /certs/

Шифруем все файлы в репозитории

Содержимое .gitattributes:

** filter=git-crypt diff=git-crypt
.gitattributes !filter !diff
.gitignore !filter !diff

При такой настройке абсолютно все файлы в репозитории (кроме .gitattributes и .gitignore) будут зашифрованы.

Завершение настройки

Добавляем правила в индекс и фиксируем изменения:

$ git add .gitattributes
$ git commit -m "Add git-crypt attributes"
$ git push 

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


Клонирование зашифрованного репозитория

Если понадобится развернуть окружение на новой машине, выполни следующие шаги:

$ git clone <URL> repo
$ cd repo

Файлы после клонирования будут выглядеть как бинарный мусор. Чтобы их «проявить», нужно разблокировать репозиторий.

Если использовался симметричный ключ

Скопируй ключ во временное хранилище (например, /tmp/secret_key) и выполни:

$ git-crypt unlock /tmp/secret_key

После этого не забудь уничтожить временный файл:

$ shred -u /tmp/secret_key

Если использовался GPG-ключ

Просто введи команду:

$ git-crypt unlock

Программа попросит ввести пароль (passphrase) от твоего секретного GPG-ключа.


О чем еще стоит помнить

  • Критический риск: Если файл симметричного ключа попадет в чужие руки, злоумышленник получит мгновенный доступ ко всем секретам, так как этот ключ не защищен паролем. В случае с GPG риск ниже: даже при краже приватного ключа взломщику все равно придется подбирать парольную фразу (passphrase).
  • Анонимность: GPG-ключи оставляют отпечатки, по которым можно идентифицировать владельца. Если нужна максимальная приватность, генерируй новую пару ключей специально для каждого отдельного репозитория.
  • Проверка: Перед тем как пушить важные данные, добавь тестовый файл и убедись, что он зашифрован. Проверь это через веб-интерфейс (GitHub/GitLab) или склонируй репозиторий в другую директорию без выполнения unlock — файлы должны читаться как бинарные.
  • Производительность: Если устройство слабое, а файлов очень много, процесс шифрования/расшифровки может занять время. Не торопись прерывать операции.
  • Бэкапы ключей: Это критично. Если ты потеряешь GPG-ключ или симметричный файл secret_key, данные в репозитории восстановить будет невозможно. Храни их в надежных менеджерах паролей, например, в KeePassXC.