Skip to content
Latchkey

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認証情報であり、スコープを絞り、暗号化し、決してログに記録してはなりません。

関連ガイド