Git
shell
openssl

git管理対象のファイルを暗号化して利用する

More than 3 years have passed since last update.

一部のファイルのみ暗号化した状態でgit管理したい要件があったのでメモ

ほとんどこちらを参考にしています。

https://gist.github.com/shadowhand/873637


フィルタ処理用のファイルを作成する。

$ mkdir ~/.gitencrypt  

$ cd !$
$ touch clean_filter_openssl smudge_filter_openssl diff_filter_openssl
$ chmod 755 *


各ファイルの中身

<your-passphrase>は適宜書き換えること

※確認でアップロードしたリポジトリはpass:<your-passphrase>のままで実行しています。


clean_filter_openssl

#!/bin/bash

PASS_FIXED='pass:<your-passphrase>'
SALT_FIXED='XXXXX'
openssl enc -base64 -aes-256-cbc -pass $PASS_FIXED -S $SALT_FIXED

※2016/01/14 -saltを追加

単なる暗号化だけであれば自動でランダムなsaltにしてくれるので-S指定は不要だけど、-Sがないと新規にcheckoutした場合やindexを作り直した際にdiffはないのにmodifiedな状態になってしまうので、saltを固定しておいたほうがよさそう。


smudge_filter_openssl

#!/bin/bash

PASS_FIXED='pass:<your-passphrase>'
openssl enc -d -base64 -aes-256-cbc -pass $PASS_FIXED 2> /dev/null || cat


diff_filter_openssl

#!/bin/bash

PASS_FIXED='pass:<your-passphrase>'
openssl enc -d -base64 -aes-256-cbc -pass $PASS_FIXED -in "$1" 2> /dev/null || cat "$1"


フィルタ適用対象の設定を行う

今回は encrypy/*.yml というパターンにマッチするファイルに対して、checkin/checkout時とdiff時に

opensslフィルタを利用する設定をします。

cd \<repository\>  

touch .gitattributes
echo 'encrypt/*.yml filter=openssl diff=openssl' >> .gitattributes


gitconfigにフィルタの設定をする

cd \<repository\>  

git config --add merge.renormalize true
git config --add filter.openssl.smudge ~/.gitencrypt/smudge_filter_openssl
git config --add filter.openssl.clean ~/.gitencrypt/clean_filter_openssl
git config --add diff.openssl.textconv ~/.gitencrypt/diff_filter_openssl


確認する

上記をて起用してpushしたリポジトリを作成してpushしておく。

cloneすると暗号化されたままの状態でワーキングツリーにチェックアウトされる。

$ git clone https://github.com/ikeisuke/encrypted-sample  

$ cd encrypted-sample
$ cat encrypt/encrypt.yml
U2FsdGVkX1/Sw8ihiaafq7xpSrWqAWMSBXLexo8gw7Ciho2GRvcaF0f9uV12SwhE

フィルタ設定はリポジトリローカルの設定だったので、フィルタが適用されていない。

再度git configコマンドを利用してフィルタを追加する。

$ git config --add merge.renormalize true

$ git config --add filter.openssl.smudge ~/.gitencrypt/smudge_filter_openssl
$ git config --add filter.openssl.clean ~/.gitencrypt/clean_filter_openssl
$ git config --add diff.openssl.textconv ~/.gitencrypt/diff_filter_openssl

git reset --hardでワーキングツリーをリセットすると暗号化解除されたファイルに書きかわる。

$ git reset --hard  

$ cat encrypt/encrypt.yml
encrypted:
- yml
- encrypt