Gitleaksによる機密情報漏洩防止の実践
gitleaks導入と基本走査
gitleaksの導入と基本操作
Gitリポジトリはコードの宝庫ですが、時としてAPIキーやパスワードといった機密情報が誤ってコミットされてしまうことがあります。このような「シークレット」を自動で検出してくれるのが、静的解析ツールgitleaksです。コードの変更を監視し、定義済みのルールに合致する文字列を高速でスキャンしてくれます。
インストール方法
gitleaksは様々な環境で利用できます。お使いの環境に合わせてインストール方法を選びましょう。macOSやLinuxユーザーであれば、Homebrewを使うのが最も手軽です。
# Homebrew (macOS/Linux)
brew install gitleaks
特定のバージョンに依存しない実行環境が欲しい場合は、Dockerを利用するのが便利です。以下のコマンドでgitleaksのDockerイメージを取得できます。
# Docker
docker pull zricethezav/gitleaks
これでgitleaksを使う準備が整いました。
リポジトリをスキャンする
gitleaksにはいくつかのスキャン方法がありますが、最も基本的なのはdetectコマンドとhistoryコマンドです。まずは、現在の作業ディレクトリの状態をスキャンしてみましょう。
detectコマンドは、コミットされていない変更を含む、現在のディレクトリ内のファイルをスキャンします。変更をコミットする前の最終チェックに最適です。
スキャンしたいGitリポジトリのルートディレクトリに移動し、以下のコマンドを実行します。-v (verbose) オプションを付けると、スキャンの進行状況が詳しく表示されます。
gitleaks detect -v
もし機密情報が見つかれば、検知された内容がリスト形式で出力されます。結果はJSON形式で、どのファイルのどの行で、どのルール(例:「AWS Access Key」)に違反したかが詳細にわかります。
[
{
"Description": "AWS Access Key",
"StartLine": 23,
"EndLine": 23,
"StartColumn": 34,
"EndColumn": 54,
"Match": "AKIAIOSFODNN7EXAMPLE",
"Secret": "AKIAIOSFODNN7EXAMPLE",
"File": "config/credentials.yml",
"Commit": "local",
"Author": "unknown",
"Email": "unknown",
"Date": "0001-01-01T00:00:00Z",
"Message": "local",
"Tags": [],
"RuleID": "aws-access-key",
"Fingerprint": "..."
}
]
次に、リポジトリの全コミット履歴をスキャンする方法です。過去に誤ってコミットされ、その後削除されたシークレットも発見できます。これにはhistoryコマンドを使います。
gitleaks history .
このコマンドは、リポジトリの最初から最新までの全コミットを一つずつチェックします。大規模なリポジトリでは時間がかかることがありますが、徹底的な監査には不可欠です。
スキャン結果の活用
スキャン結果はデフォルトで標準出力に表示されますが、-rまたは--report-pathオプションでファイルに保存することもできます。レポート形式はJSONがデフォルトですが、CSVやSARIF形式も指定可能です。
# 結果をJSONファイルとして保存
gitleaks detect -v -r gitleaks-report.json
# 結果をCSVファイルとして保存
gitleaks detect -v --report-path gitleaks-report.csv --report-format csv
レポートには、検出されたシークレットの種類(Description)、ファイル名(File)、行番号(StartLine)、そして問題の文字列(Secret)が含まれます。この情報を元に、対象のキーを無効化し、リポジトリから該当のコミットを安全に削除するなどの対応を取る必要があります。
注意:
git filter-repoなどのツールを使って履歴からシークレットを削除しても、一度公開されたキーは危険な状態にあると考え、必ず無効化(再発行)してください。
これでgitleaksの基本的な使い方はマスターです。定期的にスキャンを実行し、リポジトリの安全性を維持する習慣をつけましょう。
静的解析ツールgitleaksの主な目的は何ですか?
gitleaks detectコマンドを実行したとき、スキャンの対象となるのは何ですか?