Шифруем данные в 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.