Git Crypt

#git #security #nix

git-crypt

Конфигурация в Nix

17 января 2021 года впервые попробовал перенести конфигурацию своей системы в Nix. Перепробовав несколько вариантов, на тот момент времени остановился на home-manager в виду его простоты и удобности. Текущую конфигурацию (уже не используемую) можно найти в репозитории juev/nix-home .

25 апреля перешел на использование LnL7/nix-darwin , и конфигурацию разместил в приватном репозитории, чтобы не раскрывать личную информацию. Nix-darwin в отличие от home-manager имеет массу дополнительных возможностей, позволяющих более тонко описывать конфигурацию системы. За дополнительной информацией отсылаю к официальному источнику.

В репозитории размещается список программного обеспечения из различных источников, что будет установлена, конфигурация этих программ и конфигурация самой системы. Для подготовки рабочего окружения на новом компьютере достаточно склонировать репозиторий и запустить один sh-файл, который устанавливает Nix, nix-darwin и затем разворачивает все необходимые программы и их конфигурацию.

Шифрование файлов

Сейчас хотел бы рассказать про размещение приватной информации в репозитории. Так как помимо установки ПО и его конфигурации, хотелось бы, чтобы после запуска на компьютере появлялись и ssh-ключи, необходимые для работы. Размещать их в открытом виде, пусть и в приватном репозитории, небезопасно.

Рассмотрев несколько вариантов, обратил внимание на git-crypt .

На macOS можно установить с помощью homebrew:

brew install git-crypt

или nix:

nix-env -i git-crypt

В рабочей директории репозитория инициализируем git-crypt командой:

git-crypt init

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

echo "home/files/ssh/** filter=git-crypt diff=git-crypt" > .gitattributes

Для данного случая все файлы, размещаемые в директории home/files/ssh/ будут зашифрованы перед фиксацией.

Симметричное шифрование

Для использования симметричного шифрования в git-crypt достаточно экспортировать созданные ключи в отдельную директорию и использовать их при кодировании:

git-crypt export-key ../key-file

Созданный файл key-file это симметричный ключ, необходимый для шифрования. Не храните его в этом же репозитории!

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

$ git add .
$ git commit -am "[+] added files"
$ git push
$ cd ..
$ git clone git@github.com:remote/repository.git test2
$ cd test2
$ cat home/files/ssh/config
GITCRYPT"e      I|BK1oL4iu`-բu8!DêQmP0y8"{|B}ra$p*Hl|   z-*Fs>{3%

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

git-crypt unlock ../key-file

Проверим:

$ cat home/files/ssh/config
Host *

При использовании симметричного ключа в репозиторий НЕ добавляется новых файлов, помимо .gitattibutes.

Асимметричное шифрование

Для ассиметричного шифрования используется gnupg. Создаем новый ключ, если его еще нет и затем указываем его в нашем репозитории:

git-crypt add-gpg-user gpg-ID

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

При использовании ассиметричного шифрования в командной строке НЕ передается имя ключа.

Для просмотра статуса файлов можно использовать команду git-crypt status. Если необходимо зашифровать файлы в локальном репозитории, достаточно дать команду git-crypt lock. Для расшифровки соответственно git-crypt unlock.

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