git-secretsを導入してみた
Gitリポジトリに特定の情報を登録することを防ぐ「git-secrets」を導入した備忘録。
本内容は、既に多くの記事でまとめられていますが、偶然初めて本内容を発見したAWS初学者の方が、未然に漏洩事故を防ぐ設定を行う上での一助になれば幸いです。
背景
AWSの利用において、以下のケースをよくネット上で見て、初学者の自分もやらかしそうだと怯えていた。。。
- GitのリポジトリにAWSアクセスキーを登録して情報漏洩。仮想通貨のマイニングなどに利用されてしまい多額の請求。
- 拝見した記事
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