Skip to content
Latchkey

CIにおけるSecretとは?

CIのsecretとは、APIトークン、deploy key、パスワードといった機密値で、暗号化して保存され、jobが実行されるときだけそのjobに注入されます。

パイプラインはdeployや公開、API呼び出しのために認証情報を必要とすることがよくあります。それらをrepoにハードコードすると、読み取り権限を持つ誰にでも露出してしまいます。secretはそうした値を暗号化して保存し、実行時に環境変数や入力としてjobに提供します。

secretの保存と使用方法

プラットフォームのUIまたはAPIでsecretを追加すると、保存時に暗号化されます。workflowがそれを参照し - 例えば ${{ secrets.NPM_TOKEN }} - プラットフォームは実行中、その値をjobの環境に注入します。

スコープとアクセス

  • secretはrepo、組織、またはdeployment environmentにスコープできます。
  • environmentのsecretは、公開される前に承認を要求できます。
  • forkからのpull requestは通常、secretへのアクセスを拒否されます。

小さな例

公開のstepは環境から NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} を読み取ります。トークンはrepoにもログにも現れず、secretがスコープ内にある保護されたbranchでのみ実行されます。

なぜforkは制限されるのか

forkからのpull requestは、攻撃者が制御できるコードを実行します。もしそれがsecretを読み取れたら、誰でもそれらを流出させるPRを開けてしまいます。だからこそsecretはデフォルトでfork PRから保留されます - これは重要なCIのセキュリティ境界です。

ベストプラクティス

可能な限り保存されたクラウドキーよりOIDCを優先し、各secretに最も狭いスコープを与え、定期的にローテーションし、secretをログに出力しないでください。プラットフォームは既知のsecret値をマスクしますが、組み立てられた文字列は依然として漏洩する可能性があります。

重要なポイント

  • secretとは、暗号化して保存され実行時に注入される機密値です。
  • secretはrepo、org、environmentにスコープし、forkにはアクセスを拒否します。
  • OIDCを優先し、頻繁にローテーションし、secretをログに出力しないでください。

関連ガイド