トークンスコープとは?認証情報にできることを制限する
トークンスコープとは、認証情報に付与されるラベルであり、その認証情報が触れることを許可されるアクションとリソースを制限するものです。
トークンスコープは、認証情報の危険性を下げる方法です。トークンにすべての鍵を渡すのではなく、必要な特定の権限のみ(例えば 1 つのリポジトリへの読み取りアクセスなど)を付与します。スコープは最小権限を実践的に体現したものであり、CI/CD では封じ込められた漏洩と侵害を分ける違いになることがしばしばあります。
スコープの仕組み
トークンが発行されると、リソースサーバーが各リクエストで強制する一連のスコープを保持します。読み取りにスコープされたトークンは書き込みできず、1 つのリポジトリにスコープされたトークンは別のリポジトリに到達できません。スコープはトークンとともに移動し、どこでもそれを制約します。
なぜ狭いスコープが重要なのか
- 漏洩した読み取り専用トークンは、悪意のあるコードを push できません。
- 1 つの repo にスコープされたトークンは、残りに到達できません。
- 狭いスコープは、あらゆる侵害の影響範囲を縮小します。
CI/CD におけるスコープ
GitHub Actions では GITHUB_TOKEN の権限を job ごとに設定できるため、job は必要なものだけを得ます。OIDC 経由で引き受けるクラウドロールは、特定のアクションとリソースにスコープされます。これらのスコープを絞り込むことは、最も安価で価値の高いパイプラインの hardening ステップの 1 つです。
過剰なスコープのコスト
よくあるアンチパターンは、便利だからという理由で、広くスコープされた 1 つのトークンを多くの job で使い回すことです。その単一の認証情報はマスターキーになります。一度漏洩すれば、攻撃者はすべてを手に入れます。狭い、タスクごとのスコープに分割することでこれを防げます。
スコープと短いライフタイム
スコープはトークンにできることを制限し、短いライフタイムはそれをどれだけの期間できるかを制限します。両者を組み合わせ、数分で期限切れになる狭くスコープされたトークンは、漏洩した認証情報をほぼ価値のないものにします。
スコープと runner
スコープされたトークンでも runner 上で実行されるため、隔離が重要です。ephemeral な runner(Latchkey の managed runner など)では、1 つの job が使用したスコープ付きトークンを別の job が拾い上げることはできず、スコープがすでに引いている境界を強化します。
重要なポイント
- トークンスコープは、認証情報が使用できるアクションとリソースを制限します。
- 狭いスコープは最小権限を体現し、漏洩の影響範囲を縮小します。
- スコープと短いライフタイムを組み合わせると、漏洩したトークンはほぼ無用になります。