secretlintは、ソースコードなどから機密情報を見つけて報告するLintツールです。

Gitのpre-commitにhookしてAWSやGitHubなどのトークンのコミットを防止したり、CIで不必要にハードコードされたアクセストークンが入らないようにチェックできます。

secretlint 3.3.0では--maskSecretsというオプションをサポートして、見つけた機密情報を報告するときにマスクした値を表示できるようになりました。

たとえば、次の例は、secretlintで AWS Secret Access key を見つけて報告しています。 --maskSecretsオプションを使った場合は、実際に見つけたアクセスキーを***でマスクした値を出力するようになります。

$ secretlint --maskSecrets .credential

/Users/user/.credential
  1:0  error  [AWSSecretAccessKey] found AWS Secret Access Key: ****************************************  @secretlint/secretlint-rule-preset-recommend > @secretlint/secretlint-rule-aws

✖ 1 problem (1 error, 0 warnings)

このマスク機能は、CIなどで実行したときに標準出力に機密情報が表示に反応するGitLabなどとSecretlintを連携するときに便利です。

また、CIなどのログは一定期間残ったり簡単に消せないことが多いので、機密情報は見つけたいがログには入れたくないときなどに利用できます。 (トークンやパスワードの場合はログに関係なくrevokeするのが正しいですが)

詳しいユースケースは元のIssueを見てください。

色々実装方法は悩みましたが、最終的にはGitHub ActionsやTravis CIのように、ルールがレポートしたデータを単純に文字列置換するという方法を取りました。 secretlintのルールはエラーメッセージを作るときに、テンプレートとなる関数にデータオブジェクトとして機密情報などのトークンを渡します。 この渡されたデータと一致する文字列を自動的に *** に置き換えるようにしました。

単純な文字列置換なので、機密情報とは関係ないけど同じ文字列だった場合も***にマスクされるのはGitHub Actionsなどと同様です。 単純すぎてfalse-positiveもありますが、マスクしたい場合はこれぐらいシンプルな方が良い気がしました。