はじめに
Node.jsでAWS S3にファイルアップロードするプログラムを作ってるんですが、AWS_SECRET_ACCESS_KEY
のようなGitコミットしちゃいけないファイルはdotenvを使って書いているわけですよ。
.env
のサンプルを.env.sample
みたいなファイル名でコミットしておいて、各々の環境で.env
に変名して使うが常套手段なわけですが、そのプロジェクトにgit-secretsを入れてみたところ、.env.sample
にAWSのキーが書いてあるよ!と叱られるようになっちゃったので、対応したメモです。
.env.sampleの内容とエラー
こうしてたら
AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxxxxxxxx"
AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
こんなん出ましたー。
$ 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
ちなみにコメントアウトしてもダメ。
# AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxxxxxxxx"
# AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
右辺に何も書かないのが正解
これで解決しました。
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
$ git add .env.sample
$ git commit -m 'Add .env.sample'
右辺に何も書かなければ、キーがブランクだとちゃんと判定されてコミットできます。「各キーの桁数もわかった方が良いだろうなー」とかお節介をやいてたのがダメだったのね。。良かれと思って要らんことやってしまうワタクシ。。
右辺の桁数が40桁じゃなければコミット可能
もうちょっと色々試してみたんですが、実はgit-secret、ちゃんと右辺の桁数をチェックしてくれています。
AWS_SECRET_ACCESS_KEYは40桁なので40桁だとコミット失敗しますが、それより長くても短くてもコミットは成功しました。なるほどねー。
シングルクォート、ダブルクォートは有っても無くても結果同じ。
NGパターン
AWS_SECRET_ACCESS_KEY="1234567890123456789012345678901234567890"
AWS_SECRET_ACCESS_KEY='1234567890123456789012345678901234567890'
AWS_SECRET_ACCESS_KEY=1234567890123456789012345678901234567890
OKパターン
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}("|')?
で終わるやつです。
$ 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
にしてる例ばっかだったんですが、もしかして「拡張子をあえて合わせない理由」があるのかな?
理由は思いつかないのだけど、誰か知ってたら教えてください。
では本日はこの辺で〜