OAuth 2.0とは何か?パスワードを共有しない委任アクセス
OAuth 2.0は認可フレームワークであり、1つのアプリケーションがユーザーのパスワードを一切見ることなく、そのユーザーに代わってリソースへアクセスできるようにします。
OAuth 2.0は、"GitHubでサインイン"やWeb上のほとんどのアプリ間アクセスを支えるプロトコルです。パスワードではなくトークンを発行することで、サードパーティのアプリケーションにあなたのリソースへの限定的で取り消し可能なアクセスを付与できます。CI/CDでは、OAuthとそのトークンが、インテグレーションやパイプラインがソースホストやクラウドサービスへのスコープされたアクセスを得る仕組みを支えています。
OAuthが解決する問題
OAuth以前は、アクセスを共有するとはパスワードを渡すことを意味し、相手のアプリに完全な制御を与え、簡単に取り消す手段もありませんでした。OAuthはそれを、スコープされ、期限があり、取り消し可能なトークンに置き換えるため、必要なものだけを付与できます。
中心となる役割
- Resource owner: データを所有するユーザー。
- Client: アクセスを要求するアプリ。
- Authorization server: 同意の後にトークンを発行する。
- Resource server: データを保持し、トークンを受け入れる。
トークンの交換
clientはユーザーをauthorization serverへリダイレクトし、ユーザーが同意すると、serverはauthorization codeを返します。clientはそのcodeをaccess token(そしてしばしばrefresh token)と交換します。その後、clientはリクエストごとにaccess tokenをresource serverに提示します。
認証ではなく認可
OAuth 2.0は委任認可に関するものであり、アイデンティティを証明するものではありません。OpenID ConnectはOAuthの上にアイデンティティレイヤーを追加して認証を扱います。生のOAuth access tokenをアイデンティティの証明として扱うのは、よく知られたアンチパターンです。
CI/CDにおけるOAuth
CIプラットフォームやbotをソースホストに接続する際は、通常、スコープされたトークンを生み出すOAuthフローを使います。最新のパイプラインはOIDCのようなOAuth派生のフローも使い、jobごとに短命のトークンを発行することで、保存された長命のシークレットを完全に回避します。
トークンを安全に保つ
OAuthトークンはbearer認証情報です。保持している者は誰でも使えます。暗号化して保存し、狭くスコープを絞り、決してログに記録してはなりません。エフェメラルなrunner(Latchkeyのマネージドrunnerなど)では、job中に使われたトークンは、jobが終わると環境とともに破棄されます。
重要なポイント
- OAuth 2.0は、共有パスワードの代わりにトークンを介してスコープされた取り消し可能なアクセスを付与します。
- OAuthは認可を扱い、OpenID Connectがその上に認証を追加します。
- access tokenはbearer認証情報であり、スコープを絞り、暗号化し、決してログに記録してはなりません。