Secret Maskingとは?
secret maskingはCIのログ出力をスキャンし、登録されたsecret値を *** に置き換えることで、認証情報がbuildログに現れないようにします。
buildログは多くの人に見られ、長期間保存されることがよくあります。もしsecretが出力されれば、広範囲に漏洩してしまいます。maskingはそのセーフティネットです。プラットフォームはsecret値を把握し、出力から自動的に伏せ字にします。
maskingの仕組み
secretを登録すると、プラットフォームはその正確な値を記録し、ログ出力にそれがないか監視して、ログが保存または表示される前に一致する箇所をアスタリスクに置き換えます。実行時にマスクする追加の値を登録することもできます。
小さな例
GitHub Actionsでは、echo "::add-mask::$DERIVED_TOKEN" によって、runnerに実行時に計算された値(設定済みのsecretだけでなく)を伏せ字にするよう指示できます。これにより、job中に導出したトークンも以降のログ行でマスクされます。
maskingが失敗する場面
- 変換されたsecret - base64エンコード、URLエンコード、または分割されたもの - は一致しない場合があります。
- より大きな出力文字列の中に埋め込まれたsecretはすり抜ける可能性があります。
- jobがartifactとしてuploadするファイルに書き込まれたsecretはマスクされません。
最後の防波堤として扱う
maskingは偶発的な露出を減らしますが、保証にはなりません。本当の防御は、そもそもsecretを出力せず、ログ出力をsecretから導出しないことです。maskingは設計ではなく、うっかりミスを拾うものです。
debug出力に注意
verboseやdebugのログを有効にすると、maskingが検出できない形式でsecret由来の値を含む環境変数やコマンドラインが出力されることがあります。認証情報を扱うjobでdebugログを有効にする際は注意してください。
重要なポイント
- maskingは登録されたsecret値をCIのログから自動的に伏せ字にします。
- 変換または埋め込まれたsecretはmaskingをすり抜けることがあります。
- maskingは最後の防波堤と捉え、慎重な取り扱いの代替にはしないでください。
関連ガイド
What Is a Secret in CI?A CI secret is a sensitive value - token, key, password - stored encrypted and injected into jobs at runtime.…
What Is an Environment Variable in CI?An environment variable in CI is a named value passed into your job to configure behavior. Learn how they are…
What Is Least Privilege?Least privilege means giving each CI job only the permissions it needs and nothing more. Learn how to scope t…