おはようございます、YASUです。
以前Gitの設定を確認していた時、git config --global --listの結果に見覚えのないsecrets.*という項目がずらっと出てきたことがありました。「これ何だろう」と思いつつそのままにしていたのですが、今日はちゃんと調べて、その正体を突き止めてみました。
結論
git-secretsは、AWSのアクセスキーのような機密情報を、うっかりGitにコミットしてしまうのを機械的に防いでくれるツールでした。以前紹介した.gitignoreが「うっかり公開してしまうファイルそのものを除外する」仕組みだとすれば、git-secretsは「コミットしようとしている中身を検査して、危険なパターンが含まれていたら拒否する」という、もう一段踏み込んだ防御策です。
なぜこのツールが必要とされるのか
調べていると、AWSのアクセスキーをうっかりGitHubにコミットしてしまい、不正利用されて高額請求が届いた、という体験談がいくつも見つかりました。6,000ドル請求された話や、300万円請求された話など、検索するとすぐに出てくるくらい、よくある事故のようです。
仕組みとしては単純です。悪意のある第三者は、GitHub上に公開されているリポジトリを常に自動でスキャンしていて、AWSのアクセスキーのパターンを見つけると、すぐに不正利用(仮想通貨のマイニングなど)に使ってしまいます。「気をつけていたつもりでも、うっかりコミットしてしまう」というヒューマンエラーは、どれだけ注意していても完全にはなくせません。そこで、機械的にチェックしてくれる仕組みが必要になります。
git-secretsの仕組み
git-secretsは、コミットやコミットメッセージ、マージの内容をスキャンして、あらかじめ登録された正規表現パターンに一致する文字列が含まれていたら、そのコミット自体を拒否します。代表的なパターンはこんな感じです。
# AWSのアクセスキーIDらしき文字列のパターン
(A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}
AWSのアクセスキーIDは必ずAKIAなどの決まった文字列で始まるという特徴があるので、そのパターンに一致する文字列がコミットに含まれていたら、警告を出して弾いてくれる、という仕組みです。
導入の基本的な流れ
# git-secrets本体をインストール(Macの場合)
brew install git-secrets
# パソコン全体のGitリポジトリに保護をかける
git secrets --install ~/.git-templates/git-secrets
git config --global init.templatedir '~/.git-templates/git-secrets'
# AWS用の検知パターンを登録する
git secrets --register-aws --global
ポイントは--globalを付けて設定しておくことです。こうしておくと、これから新しくgit initするすべてのリポジトリに、自動的にこの保護が適用されるようになります。まさに、以前確認した自分のパソコンの設定に、この仕組みがすでに入っていました。
テスト用の除外パターンもある
学習や検証のために、公式ドキュメントに載っているサンプルのアクセスキー(AKIAIOSFODNN7EXAMPLEなど)を使うことはよくあります。これらは実在しない、説明用のダミーキーなので、誤って検知されないように、あらかじめ「許可リスト」に登録しておく仕組みも用意されています。
.gitignoreとの役割の違い
- .gitignore:特定の「ファイル」自体を、そもそも管理対象から除外する
- git-secrets:コミットしようとしている「中身(テキスト)」を検査して、危険なパターンが含まれていたら拒否する
.gitignoreに書き忘れたファイルや、コードの中に直接キーを書いてしまったケースなど、.gitignoreだけではカバーしきれない場面を、git-secretsが二重の防御線として補ってくれる、という位置づけです。
まとめ
- git-secretsは、AWSのアクセスキーなどの機密情報を、コミット時に機械的に検知して拒否してくれるツール
- AWSキーの流出による高額請求は、検索するとすぐ見つかるほどよくある事故
- –globalで設定しておけば、これから作る全リポジトリに自動的に保護がかかる
- .gitignoreが「ファイル単位」の防御なら、git-secretsは「中身のパターン単位」の防御
気づかないうちに自分のパソコンにも導入されていた、という発見から始まった今回の調査でしたが、実務でも欠かせない予防線だと分かりました。それでは、また明日!

コメント