git-secretsで.env.sampleが叱られる場合の対処

# はじめに
Node.jsでAWS S3にファイルアップロードするプログラムを作ってるんですが、`AWS_SECRET_ACCESS_KEY`のようなGitコミットしちゃいけないファイルは[dotenv](https://github.com/motdotla/dotenv)を使って書いているわけですよ。

`.env`のサンプルを`.env.sample`みたいなファイル名でコミットしておいて、各々の環境で`.env`に変名して使うが常套手段なわけですが、そのプロジェクトに[git-secrets](https://github.com/awslabs/git-secrets)を入れてみたところ、`.env.sample`にAWSのキーが書いてあるよ！と叱られるようになっちゃったので、対応したメモです。

# .env.sampleの内容とエラー

こうしてたら

```shell:.env.sample
AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxxxxxxxx"
AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
```

こんなん出ましたー。

```shell-session
$ git add .env.sample
$ git commit -m 'Add .env.sample'
.env.sample:2:AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

[ERROR] Matched one or more prohibited patterns

Possible mitigations:
- Mark false positives as allowed using: git config --add secrets.allowed ...
- Mark false positives as allowed by adding regular expressions to .gitallowed at repository's root directory
- List your configured patterns: git config --get-all secrets.patterns
- List your configured allowed patterns: git config --get-all secrets.allowed
- List your configured allowed patterns in .gitallowed at repository's root directory
- Use --no-verify if this is a one-time false positive
```

ちなみにコメントアウトしてもダメ。

```shell:.env.sample
# AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxxxxxxxx"
# AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
```

# 右辺に何も書かないのが正解

これで解決しました。

```shell:.env.sample
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
```
```shell-session
$ git add .env.sample
$ git commit -m 'Add .env.sample'
```

右辺に何も書かなければ、キーがブランクだとちゃんと判定されてコミットできます。「各キーの桁数もわかった方が良いだろうなー」とかお節介をやいてたのがダメだったのね。。良かれと思って要らんことやってしまうワタクシ。。

# 右辺の桁数が40桁じゃなければコミット可能

もうちょっと色々試してみたんですが、実はgit-secret、ちゃんと右辺の桁数をチェックしてくれています。
AWS_SECRET_ACCESS_KEYは40桁なので40桁だとコミット失敗しますが、それより長くても短くてもコミットは成功しました。なるほどねー。

シングルクォート、ダブルクォートは有っても無くても結果同じ。

## NGパターン

```shell:.env.sample
AWS_SECRET_ACCESS_KEY="1234567890123456789012345678901234567890"
AWS_SECRET_ACCESS_KEY='1234567890123456789012345678901234567890'
AWS_SECRET_ACCESS_KEY=1234567890123456789012345678901234567890
```

## OKパターン

```shell:.env.sample
AWS_SECRET_ACCESS_KEY=""
AWS_SECRET_ACCESS_KEY=''
AWS_SECRET_ACCESS_KEY=
AWS_SECRET_ACCESS_KEY="12345"
AWS_SECRET_ACCESS_KEY='12345'
AWS_SECRET_ACCESS_KEY=12345
AWS_SECRET_ACCESS_KEY="1234567890123456789012345678901234567890ABC"
AWS_SECRET_ACCESS_KEY='1234567890123456789012345678901234567890ABC'
AWS_SECRET_ACCESS_KEY=1234567890123456789012345678901234567890ABC
```

# チェック用の正規表現

`git config`コマンドで確認できます。
**`secrets.patterns`にマッチ && `secrets.allowed`にマッチしない**
場合に、コミット失敗するわけですね。

今回の対象は`secrets.patterns`の真ん中、`{40}("|')?`で終わるやつです。


```shell-session
$ git config -l |grep secrets                                          月 10/29 00:13:53 2018
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
```

ソースだとこの辺か。
https://github.com/awslabs/git-secrets/blob/1.2.1/git-secrets#L223-L233

# 最後にちょっとした疑問
`.env.sample` って、ファイル名 `sample.env` と書くのはいけないんだろうか？
こうしておくとエディタが「拡張子は.env」と認識してくれて、全体的に`.env`と同じように編集できるから都合良いのよねー。

ネット上で探したら`.env.sample`もしくは`.env.example`にしてる例ばっかだったんですが、もしかして「拡張子をあえて合わせない理由」があるのかな？
理由は思いつかないのだけど、誰か知ってたら教えてください。

では本日はこの辺で〜 :wave: