[git-crypt] リモートリポジトリ内の特定ファイルの暗号化

# はじめに
私用でAPI-KEYを使うことになり, 暗号化する手段を探していたところ, 以下で紹介するgit-cryptがあったので導入することにした. しかし, その途中で少し詰まったため, 自分用の備忘録として記事にすることにした.

[git-crypt](https://github.com/AGWA/git-crypt)

## 環境
```bash:terminal
$ cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
$ git --version
git version 1.8.3.1
$ make --version
GNU Make 3.82
Built for x86_64-redhat-linux-gnu
Copyright (C) 2010  Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```

## この記事で紹介しないこと
 - gitのインストール方法
 - gpg(gnupg)のインストール方法
 - OSごとのツールのインストール方法

#  Installation
公式の[Install.md](https://github.com/AGWA/git-crypt/blob/master/INSTALL.md)  
要件等がこちらに書いてあるので, <b>必ず一度目を通すことを強く推奨する</b>.

## 1. clone
リポジトリをクローン.

```bash:terminal
$ git clone https://github.com/AGWA/git-crypt.git
``` 

## 2. `make`して`make install`
特に説明は必要ないかと.

```bash:terminal
$ cd git-crypt
$ make
$ make install
```
## 3. `gpg`で作るための`*.conf`ファイルを作成
いちいち入力してるとミスがあったときに困るため, `.conf`ファイルで設定.  
(今回はkey-gen.confとします).  
ファイルの内容は以下の通り.  

```conf:key-gen.conf
Key-Type: RSA
Key-Length: 4096

SubKey-Type: RSA
SubKey-Length: 4096

Expire-Date: 2y           // 期間(お好みでok)

Name-Real: {real-name}    // 名前をここに入力
Name-Email: {email}       // emailアドレスをここに入力

passphrase: {pass-phrase} // pass-phraseをここに入力

%commit                   
%echo Successfully done
```
## 4. rng-toolsのインストール
```bash:terminal
$ gpg --gen-key --batch key-gen.conf
```
をしても良いが, 時間がかかるので`rng-tools`パッケージを使う。  

> rngd は /dev/hwrng から乱数を得て, カーネルのエントロピープールに乱数を提供します. rngd はあくまでカーネルのエントロピープールに乱数を提供するのみで, ハードウェア乱数生成器のデータを直接 /dev/random 等から出力するのでありません. また rngd は入力されたデータが本当にランダムかどうか, FIPS 140-2 (2002-10-10) テストを行ってくれます.

> ハードウェア乱数生成器を利用することで /dev/random からより高速に乱数を生成することができます. ハードウェア乱数生成器を利用しない場合と利用する場合の生成速度の違いは以下のようになります.
(引用:[Raspberry Pi のハードウェア乱数生成器を利用する](https://blog.ymyzk.com/2015/05/raspberry-pi-hardware-random-number-generator/))

私はCentOS7を利用しているので, 以下のコマンドを叩いた.  
(環境に応じてコマンドを要変更のこと)  

```bash:terminal
$ sudo yum install rng-tools
```

## 5. gpgによる鍵の生成
以下のコマンドを実行して鍵を生成.  

```bash:1st_terminal
$ gpg --gen-key --batch ./key-gen.conf
```

その後, 別のterminalを開き, 以下のコマンドを実行.

```bash:2nd_terminal
$ sudo rngd -r /dev/urandom
```

すると, 最初のterminalで以下のように出力されるはず.

```bash:1st_terminal
~~
gpg --gen-key --batch ./key-gen.conf
gpg: 鍵*を絶対的に信用するよう記録しました
gpg: Successfully done
```

## 6. git-cryptの設定
設定は`.gitattributes`に以下のように書き込む.  
ここで, {file-name}の部分には暗号化したいファイル名を入れる. 
<b>e.g.)は入力例なので, 記入しないように.</b>

```txt:.gitattributes
{file-name} filter=git-crypt diff=git-crypt

// e.g.)  
// API-KEY.xml filter=git-crypt diff=git-crypt
```

その後, 以下のコマンドでGPGで生成した鍵を特定できる文字列を入れる.  
私はgpgで鍵を生成したときの`email`を入れた.  

```bash:terminal
$ git-crypt add-gpg-user {email}

// e.g.) 
// $ git-crypt add-gpg-user hoge@fuga.com
```

## 7. git add
最後に, `.gitattributes`で設定したファイルをステージング(`$ git add`)する.  
暗号化対象にされているファイルは 以下のコマンドで確認可能.
 
```bash:terminal
$ git-crypt status -e
```  
  
もし, 暗号化されていないのにステージングされている場合は, 以下のコマンドで暗号化対象に更新可能.

```bash:terminal
$ git-crypt status -f
```  

# おわりに
今回は, API-KEYの暗号化のためにgit-cryptを使用したが, 他のAPI-KEYの安全な管理方法があればお教えいただきたい。
お疲れ様でした.

# 参考資料
 - [git-crypt](https://github.com/AGWA/git-crypt)
   - [git-crypt による git 管理下ファイルの暗号化](http://gouf.hatenablog.com/entry/2017/12/07/205655)
   - [リモートリポジトリの特定のファイルを暗号化しておく](https://qiita.com/yuhr/items/52cb02d46aa19b1b9e87)
 - [gnupg](https://github.com/gpg/gnupg)
   - [Raspberry Pi のハードウェア乱数生成器を利用する](https://blog.ymyzk.com/2015/05/raspberry-pi-hardware-random-number-generator/)
   - [gpg --gen-key 乱数生成をもっと効率的にする　リモートでログインしている場合。](http://toriniku.hatenablog.com/entry/20120726/1343289102)