LoginSignup
4
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-10-28

はじめに

Node.jsでAWS S3にファイルアップロードするプログラムを作ってるんですが、AWS_SECRET_ACCESS_KEYのようなGitコミットしちゃいけないファイルはdotenvを使って書いているわけですよ。

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

.env.sampleの内容とエラー

こうしてたら

.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

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

.env.sample
# AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxxxxxxxx"
# AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

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

これで解決しました。

.env.sample
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パターン

.env.sample
AWS_SECRET_ACCESS_KEY="1234567890123456789012345678901234567890"
AWS_SECRET_ACCESS_KEY='1234567890123456789012345678901234567890'
AWS_SECRET_ACCESS_KEY=1234567890123456789012345678901234567890

OKパターン

.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}("|')?で終わるやつです。

$ 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:

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3