git-secretsを利用したAWSキーの漏洩対策

git-secretsを利用して、AWSのアクセス/シークレットキーを、意図せずGitリポジトリに公開しないよう対策する。既に多くの利用例が紹介されているが、備忘録としてインストールと利用方法をメモしておく。

git-secretsのインストール

macOS

Homebrewを利用してインストール:

$ brew install git-secrets
$ which git-secrets
/opt/homebrew/bin/git-secrets

Linux

公式リポジトリgit cloneしてインストール:

$ git clone https://github.com/awslabs/git-secrets
$ cd git-secrets
$ sudo make install
$ which git-secrets
/usr/local/bin/git-secrets

git-secretsを適用する

デモ用のプロジェクトにgit-secretsを適用する:

$ git clone git@github.com:saito-hideki/demo-ansible-project.git
$ cd demo-ansible-project
$ 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

gitプロジェクトレベルでAWSのアクセスキーとシークレットキーの漏洩対策の設定:

$ git secrets --register-aws
OK

globalレベルでのSAWSのアクセスキーとシークレットキーの漏洩対策の設定:

$ git secrets --register-aws --global

設定を実施すると、そ以下のパスにある設定ファイルの[secrets]セクションが追加され、git secrets scanや、git commit時にスキャンするパターン(patterns)が`[secrets]セクションに設定される。

  • プロジェクトレベルで設定した場合は、gitのプロジェクトディレクトリの.git/config
  • globalレベルで設定した場合は`$HOME/.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 = <サンプルアクセスキー>
        allowed = <サンプルシークレットキー>

git-secretsの効果を確認する

AWSのアクセスキーは、AKIAから始まり16文字の[A-Z0-9]で構成されているので、サンプルデータを作成して効果を確認する。

[secrets]に定義されたpatternsにしたがってgit commit時にスキャンされる:

allowedに記載された文字列については除外される:

$ echo "AWS_ACCESS_KEY = AKIA`openssl rand -hex 128 | cut -c 1-16 | tr \[:lower:\] \[:upper:\]`" > hello.txt
$ git commit -a
hello.txt:1:AWS_ACCESS_KEY = <アクセスキー>

[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

既存のコンテンツに含まれているかどうかは、--scan-historyで確認できる:

$ git secrets --scan-history
<コミットID>:hello.txt:1:AWS_ACCESS_KEY = <アクセスキー>

[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

[secrets]セクションでのチェックを無視してcommitする場合は、--no-verifyオプションを付与する:

$ git commit --no-verify