# Git Crypt

![git-crypt](https://static.juev.org/2021/07/git-crypt.png)

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

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

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

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

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

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

Рассмотрев несколько вариантов, обратил внимание на
[git-crypt](https://github.com/AGWA/git-crypt).

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

```bash
brew install git-crypt
```

или nix:

```bash
nix-env -i git-crypt
```

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

```bash
git-crypt init
```

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

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

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

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

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

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

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

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

```bash
$ 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%
```

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

```bash
git-crypt unlock ../key-file
```

Проверим:

```bash
$ cat home/files/ssh/config
Host *
```

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

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

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

```bash
git-crypt add-gpg-user gpg-ID
```

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

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

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

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

