『Gitleaks』で機密情報の漏洩を防ぐ〜コミット時の自動検査編〜

Gileaksでシークレット情報を検出し、huskyでコミット時の検査を自動化する設定をしてみました。Gitleaksをプロジェクトで使う際の最低限の設定の参考になればと思います。
2023.06.09

はじめに

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 のファイルが作成されています。

.husky/pre-commit

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm test

初期設定では、npm testを実行するようになっています。

今回はGitleaksで機密情報をコミットしないようにするのが目的なので、こちらのコマンドを gitleaks protect --staged に変更します。

こちらのコマンドは、ステージされた変更( git add された変更)を検出の対象とします。

.husky/pre-commit

#!/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との組み合わせを検証したら、記事にしようと思います。 最後まで読んでいただきありがとうございます!

参考文献