Table of Contents
git-secretsとは
git-secretsに登録したパターンに合致するシークレット情報が、コードに含まれていないかをチェックする仕組みです。
gitのコミットメッセージ、マージをスキャンしgitリポジトリにシークレットが追加されるのを防ぎます。
前提
インストールするにあたりGit Bashを使用します。
あらかじめGit Bashを使用できるようにしておいてください。
流れは以下です。
git-secretsのインストール (Windows)
Git Bashを起動し、以下コマンドを実行します。
$ git clone https://github.com/awslabs/git-secrets
これでリポジトリをクローンできます。
PowerShellを管理者権限で起動し、先ほど作成したリポジトリへ移動します。
cd .\git-secrets\
install.ps1ファイルを実行します。
PS C:\Users\ユーザー\git-secrets> powershell -ExecutionPolicy Bypass .\install.ps1
Checking to see if installation directory already exists...
Creating installation directory.
Copying files.
Checking if directory already exists in Path...
Adding to path.
Adding to user session.
Done.
環境変数パスに.git-secrets
が追加されたことが確認できます。
git hookを設定
git-secrets
をインストールしただけではコミット時に認証情報が入っているかのスキャンが実行されないため、git hook
の機能を使用してスキャンするように設定をします。
git hookの機能を確認するため、C:\Users\ユーザー\
配下に適当にフォルダを作成します。
Git Bashで作成
$ mkdir check-hook-repo
$ cd check-hook-repo
$ git init
git hookをインストールします。
$ 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認証情報用のパターンをgitconfigに書き込みます
コミットする度にcheck-hook-repoをスキャンするように設定をするコマンドです。
$ git secrets --register-aws
OK
aws認証情報用の登録されたパターンを確認します。
リポジトリにAWSアクセスキーのパターンが出力されます。
$ git secrets --list
secrets.providers git secrets --aws-provider
secrets.patterns (A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}
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
git hookの動作確認
git -secrets --register-aws
でAWSアクセスキーを判断するパターンを登録しましたので、実際にパターンに合致する文字列でコミットを実行し、スキャンされるかを確認します。
以下コマンドを実行し、パターンに一致するtest.txtを作成します。
$ cat <<'EOL' >> test.txt
> AKIAIOSFODNN7EXAMPLD
> EOL
# test.txtが作成されたことを確認
$ cat test.txt
AKIAIOSFODNN7EXAMPLD
これでコミットを実行してみます。
$ git add .
$ git commit -m 'test-commit'
test.txt:1:AKIAIOSFODNN7EXAMPLD
[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アクセスキーのパターン一致をglobalに登録
いままでの手順だと、作成したリポジトリ単位でしかgit hook
が動作しないため、すべてのリポジトリに対してgit hook
が動作するように設定します。
init.templateDir
にテンプレートを登録し、git init
, git clone
時に動的にgit hook
をインストールする設定を行います。
aws認証情報用のパターンをgit config
に書き込む設定をglobalで設定します。
これですべてのリポジトリでコミットする度にスキャンするように設定をします。
# ユーザー配下に移動します。
$ cd
$ git secrets --register-aws --global
init.templateDir
を生成します。
$ git secrets --install ~/.git-templates/git-secrets
✓ Installed commit-msg hook to C:/Users/ユーザー/.git-templates/git-secrets/hooks/commit-msg
✓ Installed pre-commit hook to C:/Users/ユーザー/.git-templates/git-secrets/hooks/pre-commit
✓ Installed prepare-commit-msg hook to C:/Users/ユーザー/.git-templates/git-secrets/hooks/prepare-commit-msg
$ git config --global init.templateDir ~/.git-templates/git-secrets/
実際にgit init
時にgit hook
がインストールされるかどうか確認し、commit
でエラーが出るかを確認します。
# リポジトリを作成
$ git init check-global-repo
上記のようにhookが作成されることを確認できました。
これでcommitまで実施してみます。
$ cd ~/check-global-repo/
$ cat <<'EOL' >> test.txt
> AKIAIOSFODNN7EXAMPLD
> EOL
# test.txtが作成されたことを確認
$ cat test.txt
AKIAIOSFODNN7EXAMPLD
$ git add .
$ git commit -m 'test-global'
test.txt:1:AKIAIOSFODNN7EXAMPLD
[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
というコマンドを実行することで、事前に脆弱性診断することも可能です。
実際に問題のあるtxt
を置いた状態でスキャンをかけてみます。
$ git secrets --scan
test.txt:1:AKIAIOSFODNN7EXAMPLD
[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-secretsの設定は終わりです。
まとめ
本記事はクラスメソッドさんのdevelopers IO 2023のイベントに参加した際に、AWSのセキュリティ設定はちゃんとできていますか?といったセッションの中であった発表を聞き、早速実行しようと思い実践してみました。
AWSアクセスキーの流出をすると、悪意のあるユーザーがEC2インスタンスを無数に起動させ、高額請求されてしまう、といった取返しのつかない状況になってしまいます。
個人だけならまだしも、企業のAWSを管理している、となると賠償責任を負うことにもなります。
アクセスキーの流出を防ぐ大変重要な設定かと思いますので、ぜひこちらを記事を参考に設定をしてみてください。
参考