git-secretsで機密情報の漏洩などのセキュリティ事故を防ぐ

git Git

gitで管理している実務案件や個人開発で誤って機密情報をコミットしてしまわないように、
git-secrets というツールの説明と設定方法をまとめました。

git-secrets とは何か?

AWSの認証情報やパスワードなどの機密情報を誤まってgitリポジトリにコミットしてしまう事故を防ぐために、AWSがオープンソースとして公開しているツールです。


Git Hooks というgit操作をきっかけに特定のスクリプトを実行する仕組みを使って、コミットするソースコードの内容が認証情報などの正規表現とマッチした場合にコミットができないようにしてくれます。
つまり「コミットを作成する」という操作をきっかけに、「コミットの内容に認証情報が含まれていたらコミットさせない」というスクリプトを実行します。

git-secretsの設定方法

git-secretsをインストール

$ brew install git-secrets でインストールします。
私はM2なので $ arch -arm64 brew install git-secrets でインストールしました。

awsの機密情報が漏れないよう設定

以下のコマンドでAWSが用意してくれている設定を反映することができます。

$ git secrets --register-aws --global

どんな設定がされたか $ git secrets --list もしくは $ cat ~/.gitconfig で確認できます。

$ 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

AWSの機密情報のパターンとマッチするよう正規表現の設定がされています。

git管理するプロジェクトにgit-secretsを反映する

以下のコマンドでgit init 実行時に git-secrets を有効します。

$ git secrets --install ~/.git-templates/git-secrets
$ git config --global init.templatedir '~/.git-templates/git-secrets'

git-secrets 導入前からgit管理しているリポジトリだと設定が反映されていないので、
リポジトリのルートディレクトリで `$ git secrets –install` を実行して設定を反映させる必要があります。

既にgit管理しているリポジトリでは以下の表示なれば設定が反映されています。

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

独自ルールで機密情報が漏れないよう設定

機密情報のファイルを読み込む

機密情報が記載されているファイルを読み込んで設定する方法があります。
しかし機密情報が1行ずつ記載されている必要があるので利用する機会はあまりないかもしれません。

$ git secrets --add-provider -- cat <機密情報が記載されたファイルのパス>

正規表現を設定する

AWSの機密情報にマッチする正規表現を設定したように、独自の正規表現を設定することもできます。
例えば password="1234qwer"password="ASDF@123" などのパスワードとマッチする正規表現を登録します。

$ git secrets --add "password=\s*\".+\""

テストなどで特定のパスワードをコミットに含めたい時があると思います。
例えば password=”test_password” という文字列はコミットできるように
`$ git secrets –add –allowed –literal “password=\”test_password\””` と弾かない例外を設定することも可能です。

実際にセキュリティ事故を防げるか試してみる

AWSの機密情報が漏洩しないかチェック

既にgit管理しているプロジェクトで試してみます。該当プロジェクトのルートディレクトリで以下を実行します。

$ echo "aws_secret_access_key = ABcDe1F2hIjkl3nop45sTUv6XYz7aBcDEFghIJKL" >> README.md
$ git add README.md
$ git commit -m "test"

以下のエラーが出て、無事にセキュリティ事故を防げました。

README.md:17:aws_secret_access_key=ABcDe1F2hIjkl3nop45sTUv6XYz7aBcDEFghIJKL

[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 --scan チェックしたいファイル名
$ git secrets --scan -r チェックしたいディレクトリ名

まとめ

セキュリティ事故を防ぐためにgit-secretsで機密情報をコミットさせない設定について説明しました。
しかしgit-secretsを信頼し過ぎず、普段から機密情報の管理を意識して開発するようにしましょう。

コメント

タイトルとURLをコピーしました