git-secrets は AWS Labsで提供されているツールの一つです。
※AWS Labsはawsが提供しているツールなりスクリプトなりが置いてある場所
git-secretsを利用する事により、AWSアクセスキー、AWSシークレットキーをgitリポジトリにコミットできないようにコミット直前にチェックできるようになります。
他にもファイルを検索したり、独自のルールを設定したい色々と機能があります。
今回はそんなgit-secretsをWindows環境にインストールして利用してみます。
余談
git-secretsって昔はREADMEにWindows環境へのインストール方法が書いてなくてWindowsで使えないのかと思ってましたが。
Writing instructions for how to get git-secrets to work for Windows #87
上記でWindows環境への導入方法が追加されてから、今現在はインストール用のPowerShellスクリプトも用意されています。
Windows環境にgit-secretsをインストールしてみる
Installing git-secrets - Windows
インストール用のPowerShellスクリプト(install.ps1)が用意されているのでコチラを実行します。
前提条件としてgitがインストールされていて、PowerShellスクリプトが実行できるようになっている必要があります。
下記のコマンドをPowerShellで実行して下さい。
git clone https://github.com/awslabs/git-secrets
# このスクリプト。install.ps1があるディレクトリをカレントディレクトリにして実行しないと動かないのでcdする。
cd git-secrets
./install.ps1
スクリプトが正常終了すればインストールは完了です。
ちなみにスクリプトが何をやっているかといえば、
%USERPROFILE%/.git-secretsにgit-secretsとgit-secrets.1をコピーして、%USERPROFILE%/.git-secretsを環境変数PATHに追加しています。
git-secretsを利用できるようにリポジトリにgit hookを設定する
git-secretsをインストールしただけではコミット時に認証情報が含まれているかチェックしてくれない状態です。
これはgit-secretsがgit hookの機能を利用してチェックをおこなっているためです。
チェックするためには、対象となるリポジトリにgit hookをインストールする必要があります。
ここではcheck-repというリポジトリを作成して、このリポジトリに対してgit hookをインストールしてAWSシークレットキーがコミットされたかチェックしてみます。
まずはリポジトリにgit hookをインストールして、git secrets --listでgit secretsの設定を確認してみます。
# gitリポジトリの初期化
git init check-rep
cd ./check-rep
# git hookのインストール
git secrets --install
# aws認証情報用のパターンをgitconfig(ローカル)に書き込み)
git secrets --register-aws
# リポジトリに設定されているsecretsのconfigを表示
git secrets --list
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 config --local --listを見ればみつかります。
眺めているとなんとなく想像はつきますが、アクセスキー、シークレットキーと判断するためのパターンが設定されています。
一点注意なのは、よくドキュメントでサンプルとして利用されている
- アクセスキー
AKIAIOSFODNN7EXAMPLE - シークレットキー
wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
はsecrets.allowedとして許可設定に含まれているため。
git secretsの動作を確認する用途として、このサンプルアクセスキーを利用してしまうと。
許可設定されているので普通にコミットできてしまう点は認識しておく必要があります。
git hookを設定したリポジトリにシークレットキー(サンプル)をコミットしてみる
先程、AWSアクセスキーシークレットキーを判断するパターンを確認しました。
この条件に引っかかるようなシークレットキーをファイルに書き出してコミットしてみます。
※今回は"aws_secret_access_key = GitSecretsCommitTestCaseSampleKeysSample"
# さきほど設定したリポジトリにサンプルファイルを作成
New-Item -Name ./secret -Value "aws_secret_access_key = GitSecretsCommitTestCaseSampleKeysSample"
git add ./secret
git commit -m test
git commit を実行した段階で下記のエラーが表示されてgit commit が阻害されている事がわかります。
[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のAWSアクセスキーとシークレットキーのチェック機能が追加された事が確認できました。
テンプレートに登録してリポジトリの初期化時にgit hookのインストールを自動で実行するようにする
リポジトリごとに毎回git hookをインストールしてもよいのですが、git cofingで用意されているinit.templateDirにテンプレート登録することで、git init、git clone時に自動的にgit-secrets用のgit hookをインストールする事ができます。
※2021年10月現在の注意点
この手順で利用するコマンドについて。
コマンドプロンプト と Windows PowerShell で git secrets --install ~/.git-templates/git-secretsがうまく動かない事を確認しています。
ですのでここでのコマンドGit for WindowsをインストールしたときについてくるGit Bashを利用して実施して下さい。
# 下記はGitBashで実行して下さい
# 前回はリポジトリごとにgit config(ローカル)を設定していましたが globalをつけて git config(グローバル)に設定を書き込み
git secrets --register-aws --global
# テンプレートファイルを生成
git secrets --install ~/.git-templates/git-secrets
# git configのinit.templateDirに生成したテンプレート使うように設定
git config --global init.templateDir ~/.git-templates/git-secrets
上記のコマンドを実行することで、シークレットチェック用のパターンをgit config(グローバル)に設定し、どのリポジトリでも同様の設定を利用するようにしています。
またgit config(グローバル)のinit.templateDirにテンプレートを設定することによりリポジトリ初期化時に~/.git-templates/git-secretsをテンプレートとして利用するように登録しています。
ここまでの設定したあとにリポジトリ初期化を実行すると、自動でgit hookがインストールされている事を確認できます。
git init check-rep
cd ./check-rep
New-Item -Name ./secret -Value "aws_secret_access_key = GitSecretsCommitTestCaseSampleKeysSample"
git add ./secret
git commit -m test
コミット時にチェックエラーが表示される事を確認できるかと思います。
git secrets --install ~/.git-templates/git-secretsがWindows環境ではバグってる
2021年10月現在。
git secrets --install ~/.git-templates/git-secretsコマンドを実行してgit-secrets用のテンプレートを生成しますが。
コマンドプロンプトとWindows PowerShellで実施すると期待を裏切り。
カレントディレクトリに ~/.git-templates/git-secrets というテンプレートを作成します。
ホームディレクトリにテンプレートを作成しないで~(チルダ)というフォルダの下にテンプレートファイルを作成してしまう……
これはなかなかに残念な感じ。
試した所、Git Bashだと問題なくホームディレクトリにテンプレートを作成してくれますが。
コマンドプロンプト、Windows PowerShell、Git CMDだとうまく動かないようです。
template install fails on Windows #123
PowerShell 7の場合は、試験的な機能PSNativePSPathResolutionを利用すれば問題なさそうですが、PowerShell 7.3からは試験的な機能PSNativePSPathResolutionは削除されました。
git hookの設定を解除する
一度git-secretsで管理するように設定したリポジトリをgit-secretsの管理から外したい場合はgit hookの設定を削除する必要があります。
git secretsのコマンドからアンインストールできれば便利そうですが、現状ではマニュアルでファイルを削除して対応する方法しかないようです。
対象リポジトリからgit hookを削除する場合
対象リポジトリの下記3ファイルを削除すれば問題ないようです。
- .git/hooks/commit-msg
- .git/hooks/pre-commit
- .git/hooks/prepare-commit-msg
気になるようだったらgit config(ローカル)に追加したsecrets.*な設定も削除して下さい。
テンプレート登録を解除する場合
git secrets --register-aws --globalでグローバルに設定して、init.templateDirにテンプレート登録を実施し、自動でgit hookをインストールしている場合は下記方法で解除できます。
-
git config(グローバル)に書き込んだsecrets.*な設定の削除 -
git config(グローバル)に書き込んだinit.templateDirな設定の削除 -
~/.git-templatesの削除
git config --global --editを実行するとエディタが起動するので、直接gitconfigのパラメータを更新することができます。
こちらから登録したsecrets.*のパラメータとinit.templateDirを削除して下さい。
最後に、テンプレートファイル~/.git-templatesも削除すれば完了です。
もしくはgit configのグローバルな設定は~/.gitconfigファイルに書き込まれているためこのファイルからsecrets.*、init.templateDirな設定を削除して下さい。
あとgit config --global --unset,git config --global --unset-allコマンドにパラメータ名をそれぞれ渡す方法でも削除できます。
[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
[init]
templateDir = C:/Users/Administrator/.git-templates/git-secrets
git secrets --scan
今まではコミット時にチェックを実施していましたが。
git secrets --scan を利用することにより、ファイルに対してチェックを実施できます。
# リポジトリ中で実行すればリポジトリのファイル全スキャン
git secrets --scan
# ファイル名を指定すれば対象のみをスキャン
git secrets --scan ./secret
# `git secrets --scan -`とすれば下記のような事もできる
Write-Output 'aws_secret_access_key = GitSecretsCommitTestCaseSampleKeysSample' | git secrets --scan -
総評
今回は紹介していませんが、git-secretsには自分でプロバイダを追加して、指定したルールでファイルをチェックする機能を提供しており。
設定さえすればAWSアクセスキー、シークレットキーに限らず、特定の機密情報のコミットを防ぐような事も実現できます。
一度設定したリポジトリを対象から外す際は、リポジトリのgit hook設定を元に戻したりと少し戸惑うかもしれませんが。
便利に利用できるツールになるかと思います。
