GitGuardianはGit内にクレデンシャルが含まれていないかどうかをリアルタイムでチェックするSaaSだ。普段から危険なクレデンシャルが含まれていないかは気をつけていたが、セキュリティの強化の一貫として、まずは個人プロジェクトに導入した。
導入
導入はとても簡単だった。おそらく5分もあればできる。GitGuardianにGithubログインし、リポジトリを連携するだけだ。
スキャンの実行
Githubのリポジトリを連携するとすぐにスキャンが始まり、数分後に149のインシデントを発見した。例えば、サンプルとして実装したDjangoのリポジトリのsettings.pyに含まれるSECRET_KEYは検知された。またフォークしているHomebrew-coreリポジトリに含まれるメールアドレス等も検知された。これら実害の無いものも含まれていた。
クレデンシャルのようなものは常にGitに入れてはいけない
仮に実害のないクレデンシャルであっても、Gitに入れてはいけない。今回のようにインシデントとして通知される件数が増えてしまうことで、本当に実害のある重大なインシデントに気付きにくくなる。
GitにはGit操作の前後に任意の処理を実行するフックという機構があり、それを用いてクレデンシャルが含まれているかをチェックしたほうがよさそうだ。つまりGitのコミットのPre hookでコミットされないようにする。コミットの直前にクレデンシャルが含まれていないかをチェックすれば、このサービスはいらない。
1人だけで開発するのであればそうなのだが、複数人が関わるような開発体制であれば、常に他の人の環境でそのフックが適切に設定されているかは分からない。またGitのフックは --no-verify
オプションを指定して実行を省略できたりするため確実ではない。SaaSであればチェックを強制できる。
誤検知を回避する
クレデンシャルはGitリポジトリに入れるべきではないが、それはGitで何を管理するかということにも関連してくる。例えばソフトウェアのドキュメントを記載しており、そこで例としてクレデンシャルっぽいデータを掲載することもあるだろうし、サンプルコードとして用意したコードの中にダミーのクレデンシャルを含めることもある。常に全てを排除できるわではないため、特定のファイルやパターンに応じて、検知を無視する仕組みが欲しくなる。GitGuardian(というかggshield)では .gitguardian.yaml
というファイルをリポジトリに設置する。そして ignored-matches
または ignored-paths
を用いることで、ファイル名や特定のファイルやパターンに関する検知を無視できる。以下に記述の例を示す。
version: 2
secret:
ignored-matches:
- match: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
name: Test code.
ignored-paths:
- '**/README.md'
GitGuardianのリポジトリには、もっと詳細な情報がある。ggshieldで実際に使用されている.gitguardian.yamlのリンクを掲載しておく。
https://github.com/GitGuardian/ggshield/blob/main/.gitguardian.yaml
料金
料金は1から25人のチーム、もしくはGithubでホスティングしている公開リポジトリの場合、無料で利用できる。26人以上のチームの場合に有料となり、人数に応じて月額の費用が高くなっていく。26人の場合 $434/month
、 現在のレートだと56,101.01円となる。5.6万円はちょっと高いが、安心には変えられない。
100人のチームでは10万円を越えていくため、小さなチームではGitGuardianを導入し、大きくなる前に内製化する方法もある。実際、クレデンシャルの検知ツールをGithub ActionsやCircleCIに組み込めばよいだけだから、内製化はそれほど難しくないだろう。
ggshieldを使ってローカルのファイルをスキャンする
GitGuardianはスキャンのために独自のコマンド ggshield
を使う。SaaSとして使用するには特にインストールの必要はないが、ローカルで同様のスキャンを行うためには ggshield
をインストールする必要がある。
インストール方法のドキュメント1を見ながら、Homebrewを使いインストールした。
brew install gitguardian/tap/ggshield
ggshieldでスキャンを行うには、認証を行いアクセストークンを取得しておく必要がある。
ggshield auth login
発行されたアクセストークンは Library/Application Support/ggshield/auth_config.yaml
にYAML形式で保存されていた。
ローカルのファイルに対しスキャンを行うには ggshield secret scan path
を実行する。
ggshield secret scan path --recursive .
スキャンの処理はローカルで行われるのではなく、GitGuardianに送信され、そこでスキャンされるようだった。これは好みが別れるように思う。
その他の選択肢
類似のツールやサービスとして以下のようなものがある。これらは使用感を確認していないが、時間があれば確認する。
- git-secrets https://github.com/awslabs/git-secrets
- gitleaks https://github.com/zricethezav/gitleaks
まとめ
まとめると次のようになる。
- 導入は非常に簡単。連携するだけ。
- 最初は安いが、チームの規模が大きくなると高くなる。 高くなる前に内製化したほうがよさそうだ。
- 実害のないクレデンシャルのようなもがGitに入れてはいけない。 誤検知がノイズとなって重大な問題に気付けない。
総じて良いサービスだった。今後も使用していくことにする。