Pull to refresh

Шифрование важных файлов в Git

Reading time2 min
Views3.9K
Допустим мы храним данные на некотором удалённом сервере в Bare-репозитории.
Если есть сомнения в честности обслуживающего сервер персонала, или мы опасаемся, что кто-то сопрёт наш проект, можно зашифровать избранные секретные файлы, представляющие особо секретные технологии фирмы и тем самым затруднить клонирование проекта.

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

В реализации мы всопользуемся .gitattributes, staging, filters (фильтрами) и главой 7.2 Pro Git Book.


Вот как мы это будем делать.
Существуют два важных нам состояния:

image
State A.

image
State B.

State A — когда вы сделали выборку (git checkout) и работаете с вашей рабочей копией — в этот момент файлы должны расшифровываться и находиться в читаемом состоянии. Эта фаза контролируется фильтром stage.

State B — когда изменения ваше рабочей копии готовятся к отправке в репозиторий (git add) — в этот момент файлы должны быть зашифрованы до передачи в хранилище. Эта фаза контролируется фильтром clean.

Обычно фазы stage & clean используются для чего-то более мирного, например форматирование (indent) исходников по вашим вкусам и причёсывание их под принятые в организации стандарты при обратной отправке.

Перед отправкой в хранилище (локальное или удалённое) и для получения читаемых секретных файлов проекта необходимо произвести подготовку на машине разработчика.

Добавляем описание фильтров в ~/.gitconfig:

[filter "private"]
clean = ~/git_encode.pl
smudge = ~/git_decode.pl


В домашней директории у нас располагаются два скрипта.
Замените SecurePassword на свой пароль. Выберите на свой вкус метод шифрования из имеющихся в вашей сборке библиотеки OpenSSL. Мы использовали rc5.

~/git_encode.pl:

#!/usr/bin/env perl
use strict;
undef $/;
my $data = <STDIN>;
my $tmp = "/tmp/git.encode.$$." . rand() . ".tmp";
local * O;
open(O,">$tmp");
print O $data;
close(O);
print `openssl enc -rc5 -k SecurePassword -nosalt < $tmp`;
unlink($tmp);


~/git_decode.pl:

#!/usr/bin/env perl
use strict;
undef $/;
my $data = <STDIN>;
my $tmp = "/tmp/git.decode.$$." . rand() . ".tmp";
local * O;
open(O,">$tmp");
print O $data;
close(O);
print `openssl enc -d -rc5 -k SecurePassword -nosalt < $tmp`;
unlink($tmp);


Установите на эти скрипты право исполнения (в командной строке):

chmod +x ~/git_encode.pl ~/git_decode.pl

В рабочем каталоге подключаем защиту к необходимым файлам.
.gitattributes:

*.m filter=private
*.h filter=private
*.c filter=private
*.cpp filter=private


Теперь при отправке в хранилище выбранные файлы будут проходить через шифровщик, а при выборке через расшифровщик.
Чтобы Git не думал каждый раз, что файлы изменились, убедитесь, что шифровщик не «солит» (salted) файлы (используйте опцию -nosalt).
Tags:
Hubs:
+26
Comments26

Articles