git-secretsを設定してAWSアクセスキーのコミットを防止する仕組み

git-secrets

git-secretsとは

git-secretsに登録したパターンに合致するシークレット情報が、コードに含まれていないかをチェックする仕組みです。

gitのコミットメッセージ、マージをスキャンしgitリポジトリにシークレットが追加されるのを防ぎます。

前提

インストールするにあたりGit Bashを使用します。

あらかじめGit Bashを使用できるようにしておいてください。

流れは以下です。

AWS公式から引用 https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/scan-git-repositories-for-sensitive-information-and-security-issues-by-using-git-secrets.html

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
ポイント
上記コマンドがうまく認識しない場合は一度Git Bashの再起動を行い、再度コマンドを実行してみてください。

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を管理している、となると賠償責任を負うことにもなります。

アクセスキーの流出を防ぐ大変重要な設定かと思いますので、ぜひこちらを記事を参考に設定をしてみてください。

参考

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です