secret scanner
欲しくなったので調べる
TruffleHog
Python製のスキャナー
割りと老舗でファイル指定がJSONファイルだったり, exclude pathの指定がファイルだったりと外部ツールとの連携がやりづらいのが辛み
正規表現は基本的なものでいいのでワンライナーで全て完結して欲しい
rusty-hog
TruffleHogのRust実装
NewRelic製
git-secrets
AWS製
gitリポジトリから検索出来る
柔軟だが初期設定がちょい面倒か git secrets --register-provider aws
gitリポジトリのconfigに記録されるのでチーム間で設定を共有しづらい
detect-secrets
Yelp製
Enterpriseの巨大なコードベースを想定して既存のコードのシークレットはBaselineにして徐々に減らしていくという思想で実装されている模様
Pytyonベース
repo-supervisor
JSベース
auth0製
secretlint
azuさん (JSer.infoの人) 製
JSベースでnpm経由でインストール可能
他のよりはコンフィグが扱いやすそうに見える
.secretlint.json などでコンフィグを設定する
huskyやlint-stagedなどと連携しやすい
欲しいもの
出来ればワンバイナリー
scanするものは基本的なもののみで大丈夫
ただ途中から追加したりすることを想定してexcludeするファイルはパスで指定出来る
ignoreファイルで指定出来ると楽
ポン置きして引数で柔軟にコンフィグ出来るのが理想
ファイル指定とかやると相互運用性が下がる
--exclude public/vendor --exclude ~~ など複数の除外パスを指定出来る
基本的には正規表現でCIで動作させることを前提にする
gitのhistoryまで検索は想定しない
Git repositoryが流出した際にhistoryまで検索するのはそこまで多くない
lockファイルの膨大な変更などで検索に時間がかかる場合も多いから
クローラーレベルで検索するのはHEADからせいぜい数コミット以内
GitHub Actionでもいいけど
エントロピーベースで任意のAPIキーにマッチさせるようなものはFalse positive率が高くなるのでCIという観点ではあまりよい方法ではない気がしている
それよりDevSecOps的な観点でゼロ労力でシークレットスキャナーを導入することと、最速でCIが回るようになることが重要
最初に入れるタイミングを逃すといつまでも入れられないのでまず最初に最速でCopy&Pasteで導入出来ること
ランタイム自体は早さはそこまで求めない
実際時間はそこそこかかっても問題ないが、相互運用性の方が重要なので(他ツールのinputやoutputになること)
JSベースでも割りと早い
ソースコード自体は実際1000ファイルもなかったりするので1ファイル処理するのに10ミリ秒だとしても10ms * 1000 = 10sならCIでも十分許容範囲
JSであればGitHub Actionから利用するのも比較的容易
VSCodeでAlertを出すこともしやすい
デフォルト設定でFalse Positiveしないこと
必要ないものまで検知しないこと
Out of the boxで動くこと
コミット前のファイルについても検出出来ること
既存のgit-secretsやsecretlintはgitベースでコミット履歴に含まれて初めて検出出来るようになっているがstage状態や未stage状態でも検出はしてほしい(コミットするまで分からないとコミット
自分の期待するインターフェースというのはhistoryについては検査せずHEADのコミットについてのみ検査すること
Why? -> クローラがまず検査するのはデフォルトbranchのHEADでそれ以外のbranchの全てのコミットについても検査するというのは計算能力的に見合わない
よほど重要なリポジトリであればhistoryまで検査するかもしれないがクローリングした段階では不明、また計算リソースもそれなりに必要になりコスト対策に見合わない
そのため極論gitリポジトリである必要もない
検知出来た段階で通知、もしくはCIをfailedにさせればよいのだから極論historyはいらない
検知後にhistoryから削除したりcredentialを無効化するのはユーザの責務
historyから削除するようなツールが欲しいならそういった責務のツールを作るべき