🔑

git-secretsを導入してみた

2021/12/04に公開

Gitリポジトリに特定の情報を登録することを防ぐ「git-secrets」を導入した備忘録。
本内容は、既に多くの記事でまとめられていますが、偶然初めて本内容を発見したAWS初学者の方が、未然に漏洩事故を防ぐ設定を行う上での一助になれば幸いです。

背景

AWSの利用において、以下のケースをよくネット上で見て、初学者の自分もやらかしそうだと怯えていた。。。

git-secrets

https://github.com/awslabs/git-secrets

  • commit時に、事前に設定した正規表現にマッチする情報が含まれていたら、そのcommitを取り消す。
  • 任意のタイミングでファイルやディレクトリをスキャンすることも可能。

インストール

macOS・Homebrew環境、下記を実行。

$ brew install git-secrets

git secretsと実行してみて、以下のヘルプメッセージが表示されればインストール完了。

$ git secrets
usage: git secrets --scan [-r|--recursive] [--cached] [--no-index] [--untracked]
	:

使用法

各gitリポジトリに対して、git secrets --installを行うことで、git-secretsに対応させます。

$ git init
$ 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

AWSのIAMで利用されているクレデンシャルのパターンを弾く専用のオプションが用意されているので設定します。

$ git secrets --register-aws
OK

.git/configに以下が追記されていることを確認できます。

[secrets]
	providers = git secrets --aws-provider
	patterns = (A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}
	patterns = (\"|')?(AWS|aws|Aws)?_?(SECRET|secret|Secret)?_?(ACCESS|access|Access)?_?(KEY|key|Key)(\"|')?\\s*(:|=>|=)\\s*(\"|')?[A-Za-z0-9/\\+=]{40}(\"|')?
	patterns = (\"|')?(AWS|aws|Aws)?_?(ACCOUNT|account|Account)_?(ID|id|Id)?(\"|')?\\s*(:|=>|=)\\s*(\"|')?[0-9]{4}\\-?[0-9]{4}\\-?[0-9]{4}(\"|')?
	allowed = AKIAIOSFODNN7EXAMPLE
	allowed = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

テスト

上記のサンプルキーの一部を変更したキー情報を含む、クレデンシャルファイルを作成しました。

$ cat credential_test.txt

aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEa

では、作成したファイルをcommitしてみましょう。

$ git add .
$ git commit -m "First Test"

credential_test.txt:1:aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEa

[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

無事commitがリジェクトされました。

  • commitする前に任意のタイミングで検査したい場合は、git secrets --scanを実行することで確かめることができます。
$ git secrets --scan credential_test.txt
credential_test.txt:1:aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEa

[ERROR] Matched one or more prohibited patterns
	:
  • 一時的に検査を停止したい場合は、commit時に--no-verifyオプションを含めて実行することで、無効化することができます。
$ git commit -m "First Test" --no-verify
[master (root-commit) 421073b] First Test
 1 file changed, 1 insertion(+)
 create mode 100644 credential_test.txt
 
 $ git log --oneline
 421073b (HEAD -> master) First Test
  • また、既存のリポジトリにgit-secretsを後から適用させた場合、過去のcommit履歴を検査したいことがあると思います。その場合は、git secrets --scan-historyを行うことで、git historyを検査することができます。
$ git secrets --scan-history
[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

適用範囲

今までの内容は、各gitリポジトリで設定を行なっていましたが、git secrets --register-awsのように全てのリポジトリに反映させたい設定があると思います。
その場合は、 git secrets --register-aws --globalを実行することで設定を行うことができます。設定内容は、~/.gitconfigに追記されます。

$ git secrets --register-aws --global
OK

$ cat ~/.gitconfig

[secrets]
	providers = git secrets --aws-provider
	patterns = (A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}
	patterns = (\"|')?(AWS|aws|Aws)?_?(SECRET|secret|Secret)?_?(ACCESS|access|Access)?_?(KEY|key|Key)(\"|')?\\s*(:|=>|=)\\s*(\"|')?[A-Za-z0-9/\\+=]{40}(\"|')?
	patterns = (\"|')?(AWS|aws|Aws)?_?(ACCOUNT|account|Account)_?(ID|id|Id)?(\"|')?\\s*(:|=>|=)\\s*(\"|')?[0-9]{4}\\-?[0-9]{4}\\-?[0-9]{4}(\"|')?
	allowed = AKIAIOSFODNN7EXAMPLE
	allowed = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

最後に、各リポジトリごとの設定追加を行なってみます。今回は、credential_test.txtのwJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEaを許可するように設定します。

$ git secrets --add --allowed wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEa

$ git secrets --scan credential_test.txt

先ほどまでは、表示されていた[ERROR]が表示されないことが確認できました。
では、設定ファイルをみてみましょう。

$ cat .git/config
[secrets]
	allowed = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEa
	
$ cat ~/.gitconfig
[secrets]
	providers = git secrets --aws-provider
	patterns = (A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}
	patterns = (\"|')?(AWS|aws|Aws)?_?(SECRET|secret|Secret)?_?(ACCESS|access|Access)?_?(KEY|key|Key)(\"|')?\\s*(:|=>|=)\\s*(\"|')?[A-Za-z0-9/\\+=]{40}(\"|')?
	patterns = (\"|')?(AWS|aws|Aws)?_?(ACCOUNT|account|Account)_?(ID|id|Id)?(\"|')?\\s*(:|=>|=)\\s*(\"|')?[0-9]{4}\\-?[0-9]{4}\\-?[0-9]{4}(\"|')?
	allowed = AKIAIOSFODNN7EXAMPLE
	allowed = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

無事、指定したリポジトリにのみ設定が反映されていることが確認できました。

このように、全体的にgit-secretsを使えるようにしつつ、リポジトリごとでカスタマイズしていくことが可能です。

Tips

git init 実行時に git-secrets も有効にしたい場合は、事前に以下を行えばOKです。

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

まとめ

git-secretsを導入することで、ヒューマンエラーによる情報漏洩を防ぐことができるようになりました!
しかし、常日頃からセキュアな情報はGitにpushしないように意識していこうと再実感しました。
これで少し安心して、私用環境で学習を進めることができます。。。

参考

Discussion