世の中パスワードやアクセスキーといったSecretを公開リポジトリにPUSHしてしまうというような事故が起きます。GitHubにはSecret Scanningという機能があり、PUSHされた内容をスキャンしてSecretを検出できます。 もちろんGitLabにも同様の機能があり、Secret Detectionという機能として提供されています。
Secret Detectionの仕組み
Secret Detectionは、GitLab CI/CDのジョブとして実行されます。そのため、Secret Detectionを有効にするには、まずはGitLab CI/CDを有効にする必要があります。
すでに.gitlab-ci.yaml
を用意することでGitLab CI/CDを有効化している場合は、次のようなinclude
節を追加することでSecret Detectionを有効化します。
ここでは、GitLabが提供しているSecret Detectionのテンプレートを指定しています。
include: - template: Jobs/Secret-Detection.gitlab-ci.yml
このテンプレートを見るとわかりますが、test
ステージでsecret_detection
ジョブが実行されるようになっています。test
ステージの存在は必須なので、こちらがまだ用意されていない場合はtest
ステージを定義するようにしましょう。
何を検知してくれるのか
gitleaks.toml
にルールセットが定義されています。
たとえばAWSのアクセスキーは次のようなルールとして定義されています。
[[rules]] id = "AWS" description = "AWS Access Token" regex = '''\bAKIA[0-9A-Z]{16}\b''' tags = ["aws", "revocation_type"] keywords = [ "AKIA", ]
このようなルールでシークレットが検知されると、当然secret_detection
ジョブは失敗し、リポジトリのユーザはそれにきづくことができます。また、それだけではなくGitLab側で当該シークレットの無効化等も実装が可能なようです。
この辺りの情報はAutomatic response to leaked secretsに詳しく書かれています。たとえばGitLabのPersonal access tokensが検知された場合、GitLab側で自動的にそのPersonal access tokensが無効化されます。
まとめ
GitLabにもSecret Detectionという機能が提供されており、GitHubと同様にSecretの検知が可能です。
ちなみにOSSとしてはSecretlintがあり、こちらを用いてもSecretの検知ができます。SecretlintはGitHub ActionsやGitLab CI/CDで利用できます。