理系学生日記

おまえはいつまで学生気分なのか

GitLabにもSecret Detectionがある

世の中パスワードやアクセスキーといった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で利用できます。