『Gitleaks』で機密情報の漏洩を防ぐ〜コミット時の自動検査編〜
はじめに
CX事業本部 Delivery部の塚本です。
以前書いた記事の応用編で、機密情報の含まれたコミットを自動でブロックする設定をしていきます。
以前書いた記事↓
Gitleaksの基本的な説明やコマンドについては、コマンド編の記事をご覧ください。
記事で取り上げること
- huskyの基本事項
- Gitleaksとhuskyを組み合わせてコミット前の検査を自動化
記事で取り上げないこと
- Gitleaksの基本的な情報, Gitleaksのコマンドの使い方: コマンド編記事を参照
- GitHub Actionsでの利用方法
- 検出結果の妥当性、信頼性など
- 他類似ツールとの比較
今回検証で使ったソース
huskyとは
You can use it to lint your commit messages, run tests, lint code, etc... when you commit or push. Husky supports all Git hooks.
日本語:コミットやプッシュの際に、コミットメッセージのlint、テストの実行、コードのlintなどを行うために使用することができます。HuskyはすべてのGitフックをサポートしています。
コミットやプッシュの前に自動で実行したいコマンドを設定できるツールです。 内部的には Git hooksを利用しています。
Gitleaksの導入
こちらのコマンドで導入します。(※MacOS)
# MacOS brew install gitleaks
huskyの導入
こちらの手順通りに導入していきます。 パッケージマネージャは npm を利用しています。
% mkdir gitleaks-husky-sample % cd gitleaks-husky-sample % git init % npm init -y % npx husky-init && npm install
huskyでコミット前のフックを導入する
先ほどのコマンドを実行すると、.husky/pre-commit
のファイルが作成されています。
#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" npm test
初期設定では、npm test
を実行するようになっています。
今回はGitleaksで機密情報をコミットしないようにするのが目的なので、こちらのコマンドを gitleaks protect --staged
に変更します。
こちらのコマンドは、ステージされた変更( git add
された変更)を検出の対象とします。
#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" gitleaks protect --staged
これで設定ができたので、適当なファイルをコミットしてみましょう。
% echo "# README" >> README.md % git add README.md % git commit -m "first commit" ○ │╲ │ ○ ○ ░ ░ gitleaks 4:57PM INF 1 commits scanned. 4:57PM INF scan completed in 59.4ms 4:57PM INF no leaks found [main (root-commit) 291767c] first commit 1 file changed, 1 insertion(+) create mode 100644 README.md
しっかりGitleaksのコマンドが実行されており、機密情報が含まれていないのでコミットできることが確認できました。
機密情報のコミットをブロックする
続いて、機密情報がコミットされるのを防げるか検証します。
% echo "AWS_ACCESS_KEY_2 = AKIAXXXXXXXXXXXXXXXX" >> .env.example % git add .env.example % git commit -m "add env" ○ │╲ │ ○ ○ ░ ░ gitleaks 5:00PM INF 1 commits scanned. 5:00PM INF scan completed in 58.5ms 5:00PM WRN leaks found: 1 husky - pre-commit hook exited with code 1 (error)
シークレット情報がある時はコミットを防いでくれることが確認できました。
感想
これで最低限プロジェクトに導入するための検証ができました。 この後、さらにGitHub Actionsとの組み合わせを検証したら、記事にしようと思います。 最後まで読んでいただきありがとうございます!