クラウド破産しないように git-secrets を使う

AWS のクレデンシャルを GitHub に載せてしまう事故
相変わらず続いてますが、以下秘密情報の公開を防ぐ方法。
（ AWS の [Glacier](http://blog.hde.co.jp/entry/2015/01/30/154101) とか GCP の [BigQuery](http://qiita.com/itkr/items/745d54c781badc148bb9) とか
　課金の仕組み系も気をつけないとですね・・）

## git-secrets

AWS が公開しているツール。パスワードなどの秘密情報を
`誤って git リポジトリに commit する`
ことを防いでくれます。
https://github.com/awslabs/git-secrets  

# 設定手順

## 1. インストール

ツールを置いておくためのフォルダを作り、
あとはそこにソースを落としてきて `make install` するだけ。

```Bash:install
$ cd /path/to/tools/directory
$ git clone https://github.com/awslabs/git-secrets.git
$ cd git-secrets/
$ make install
```

ちなみに Mac で brew を使っている方は

```Bash:brew-install
brew update && brew install git-secrets
```

で OKです。
教えてくださった [mmizutani](http://qiita.com/mmizutani) さん、ありがとうございました。
Homebrew に登録してくださった [id:kani_b](http://kanny.hateblo.jp/entry/2015/12/26/161510) さん神。

## 2. 既存プロジェクトにフックを設定

このツールを有効にしたいプロジェクトごとに以下のコマンド

```Bash:
$ cd /path/to/your/repository
$ git secrets --install
✓ Installed commit-msg hook to .git/hooks/commit-msg
✓ Installed pre-commit hook to .git/hooks/pre-commit
✓ Installed prepare-commit-msg hook to .git/hooks/prepare-commit-msg
```

または、パスを引数で渡して `--install` しましょう。

```Bash:
$ git secrets --install /path/to/your/repository
```

## 3. 拒否条件を設定

あとは `--add` で拒否（または false-positives を防ぐ許可）パターンを設定できます。
AWS については `--register-aws` とだけ打てば OK。

条件はプロジェクトごとにでもグローバルにでも設定できますが
せっかくなので AWS系の秘密情報 については
グローバルオプションをつけて、
プロジェクトごとの設定を不要にしましょう。

```Bash:register-aws
$ git secrets --register-aws --global
```

以下のパターンが設定されます[^1]。

```Bash:secrets-list
$ git secrets --list
secrets.providers git secrets --aws-provider
secrets.patterns [A-Z0-9]{20}
secrets.patterns ("|')?(AWS|aws|Aws)?_?(SECRET|secret|Secret)?_?(ACCESS|access|Access)?_?(KEY|key|Key)("|')?\s*(:|=>|=)\s*("|')?[A-Za-z0-9/\+=]{40}("|')?
secrets.patterns ("|')?(AWS|aws|Aws)?_?(ACCOUNT|account|Account)_?(ID|id|Id)?("|')?\s*(:|=>|=)\s*("|')?[0-9]{4}\-?[0-9]{4}\-?[0-9]{4}("|')?
secrets.allowed AKIAIOSFODNN7EXAMPLE
secrets.allowed wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
```

# 設定 Tips

## 新規プロジェクトで有効にする

git init 実行時に `git-secrets` も有効にしたい場合は
あらかじめ

```Bash:
$ git secrets --install ~/.git-templates/git-secrets
$ git config --global init.templatedir '~/.git-templates/git-secrets'
```

としておけば OK です。
すでに `init.templatedir` を設定している方はうまいこと編集してください・・


## SourceTree などを使っているなら

git をコマンドライン以外で使っている場合、
そのツールが参照している git フォルダにも
`git-secrets` 実行ファイルのコピー or シンボリックリンクが必要なことも。

例えば SourceTree
<img width="616" alt="sourcetree.png" src="https://qiita-image-store.s3.amazonaws.com/0/66457/71d0cef3-69e4-95ed-1d02-92903bf32b81.png">

ここで参照しているフォルダに `git-secret` 実行ファイルをコピー、
またはシンボリックリンクをはりましょう。

# 使ってみる

## commit

ためしにコマンドラインから git commit してみます。

```Bash:git-commit
$ git commit -m "test git-secret"
README.md:1:AWSAccessKeyId=AKIAIOSFODNN1EXAMPLE
README.md:2:AWSSecretKey=wJalrXUtnFEMI/K1MDENG/bPxRfiCYEXAMPLEKEY

[ERROR] Matched one or more prohibited patterns

Possible mitigations:
- Mark false positives as allowed using: git config --add secrets.allowed ...
- List your configured patterns: git config --get-all secrets.patterns
- List your configured allowed patterns: git config --get-all secrets.allowed
- Use --no-verify if this is a one-time false positive
```

弾かれたー

## scan

すでに commit してあるソースコードをチェックしたい時は

```Bash:secret-scan
$ git secrets --scan -r /path/to/directory
```

などで確認できます。

　  

[^1]: ハンズオンでサンプルのクレデンシャルを載せたいときなどは `AKIAIOSFODNN7EXAMPLE` を使えばいいようですね！