# 今更知ったGitHub Actionsからのキーなし認証（OIDC認証）の解説とやり方

> GitHub ActionsからGoogle Cloudへ安全にアクセスするためのOIDC認証について、その仕組みや設定手順を詳しく解説しています。従来のサービスアカウントキー方式に代わるキーレス認証のメリットやWorkload Identity Federationの要素についても説明しています。

- 公開日: 2025-03-28
- 更新日: 2025-03-28
- 著者: やました
- タグ: GCP, CI/CD, Github Actions
- URL: https://tech.anycloud.co.jp/articles/github-actions-oidc

---

これまで、GitHub ActionsからGoogle Cloudへアクセスする場合は、サービスアカウントキーを用いた認証が一般的でした。しかし、この方法には「**キーが漏洩すると不正アクセスのリスクが非常に高い**」「**定期的なキーの管理やローテーションが大変**」という課題があります。

最近知ったことなのですが、実はGoogle Cloudではかなり以前から**OIDC（OpenID Connect）を利用したキーレス認証**が提供されていました。

<div class="link-card-wrap"><a class="link-card" href="https://cloud.google.com/blog/ja/products/identity-security/enabling-keyless-authentication-from-github-actions" target="_blank" rel="noopener noreferrer"><span class="link-card-body"><span class="link-card-title">GitHub Actions からのキーなしの認証の有効化 | Google Cloud 公式ブログ</span><span class="link-card-description">Workload Identity 連携を使用して Google Cloud リソースを作成および管理するために、GitHub Actions から認証を行います。</span><span class="link-card-meta"><img class="link-card-favicon" src="./linkcard-01-favicon.ico" alt=""><span class="link-card-domain">cloud.google.com</span></span></span><img class="link-card-image" src="./linkcard-01-image.webp" alt=""></a></div>

今更ながら、これまで使ってきたサービスアカウントキーからOIDC認証に切り替えるべく、その仕組みや設定手順を調査し、実際に設定してみましたので、同じようにこれから取り組む方のために詳しく解説していきます。

（👇の画像はChatGPTでこの記事をグラレコっぽくまとめてもらった画像です）

<figure><img src="./image-001.webp" alt="" width="1536" height="1024"></figure>

## OIDCを利用したキーレス認証とは？

OIDCを利用したキーレス認証とは、簡単に言うと「一時的なトークンを使ってGoogle Cloudへ安全にアクセスする仕組み」です。

### サービスアカウントキー方式との違いは？

従来のサービスアカウントキー方式と比べ、OIDC認証のメリットは次のようなものがあります。

**セキュリティの向上**

サービスアカウントキーは一度漏洩すると長期間悪用される可能性があります。

一方、OIDC認証は短時間のみ有効なトークンを利用するため、万が一漏洩しても影響は限定的です。

**管理負担の軽減**

サービスアカウントキーのようにキーの生成、保存、定期的なローテーションが不要です。

GitHub Actionsにキーを保存しなくて良いので、秘密情報がGitHub上に存在するリスクがなくなります。

このOIDC認証をGoogle Cloudで実現するための仕組みが、次に説明するWorkload Identity Federationです。

## Workload Identity Federationとは？

Workload Identity Federationは、外部サービス（GitHub ActionsやAWSなど）から発行された認証情報をGoogle Cloud上で安全に受け入れるための仕組みです。

具体的には、次の3つの重要な要素があります。

### 1\. Workload Identity プール

Workload Identityプールは、GitHub Actionsのような外部認証サービスから発行されたOIDCトークンをGoogle Cloudが安全に受け入れるための**入れ物**です。

プールの中には複数のプロバイダを設定でき、Google CloudのIAMが一元的に管理します。

### 2\. Workload Identity プロバイダ

Workload Identityプロバイダは、GitHub Actionsなどの外部サービスが発行したOIDCトークンの信頼性を検証するための**身元確認係**です。

例えば、GitHub Actionsの場合は以下のような設定をします。

-   **Issuer（発行元）**：`https://token.actions.githubusercontent.com`
-   **Audience（対象者）**：`https://github.com/example-org/my-repo`（対象となるGitHubリポジトリのURL）

### 3\. プロバイダの属性（Attributes）

OIDCトークン内には、発行元や発行された条件に関する情報（クレーム）が含まれています。

これらの情報をGoogle Cloudが認証条件として利用するためにマッピングする設定が「プロバイダの属性」です。

例えば、GitHub Actionsでよく使われる属性には以下のようなものがあります。

-   **リポジトリ名**（例：`example-org/my-repo`）
-   **ブランチ名**（例：`refs/heads/main`）
-   **実行ユーザー名**（例：`github-username`）

プロバイダ設定時にこれらのクレームをGoogle Cloud側の属性として次のようにマッピングします。

```plaintext
google.subject: assertion.sub
attribute.actor: assertion.actor
attribute.repository: assertion.repository
```

## 実際にGitHub ActionsでキーなしのOIDC認証を設定する手順

では実際に、Google CloudとGitHub ActionsでキーなしのOIDC認証を設定する手順を解説していきます。

### 1\. Google Cloud側の設定（GUI操作）

まずGoogle Cloudコンソールにログインし、「Workload Identityプール」を作成します。

IAMと管理 > Workload Identity プール から「プールを作成」を押します。

ID プールを作成する入力フォームが表示されるので値を入力します。

プールの名前には用途が分かりやすい名前（例：`github-actions-pool`）を設定します。

<figure><img src="./image-002.webp" alt="" width="648" height="595"></figure>

次に、作成したプール内に新しいプロバイダを追加します。

プロバイダは「OpenID Connect (OIDC)」を選択します。その後、各項目は下記のように入力します。

<table><tbody><tr><th colspan="1" rowspan="1"><p>項目</p></th><th colspan="1" rowspan="1"><p>入力内容</p></th></tr><tr><td colspan="1" rowspan="1"><p>プロバイダの選択</p></td><td colspan="1" rowspan="1"><p>OpenID Connect（OIDC）</p></td></tr><tr><td colspan="1" rowspan="1"><p>プロバイダ名</p></td><td colspan="1" rowspan="1"><p>管理用の任意の名前です。例えば、<code>github-provider</code> や <code>gha-prod-provider</code> など、わかりやすい名前にしておくと後で便利です。</p></td></tr><tr><td colspan="1" rowspan="1"><p>発行元（URL）</p></td><td colspan="1" rowspan="1"><p>OIDCトークンを発行するサービスのURL（Issuer）を入力します。</p><p>Github Actionsの場合は <code>https://token.actions.githubusercontent.com</code> を設定</p></td></tr><tr><td colspan="1" rowspan="1"><p>JWKファイル（JSON）</p></td><td colspan="1" rowspan="1"><p>通常は入力不要です。JWK（JSON Web Key）ファイルは、OIDCの発行者が公開鍵を公開していない特殊な場合にのみ必要です。</p><p>GitHub Actionsのような一般的なサービスでは自動的に取得されるため、ここは空欄で問題ありません。</p></td></tr></tbody></table>

<figure><img src="./image-003.webp" alt="" width="611" height="704"></figure>

最後にプロバイダの属性のマッピング値を設定します。

下記のように設定すると良いです。

<table><tbody><tr><th colspan="1" rowspan="1"><p>Google Cloud側の属性</p></th><th colspan="1" rowspan="1"><p>OIDCトークンのクレーム（入力値）</p></th><th colspan="1" rowspan="1"><p>解説</p></th></tr><tr><td colspan="1" rowspan="1"><p><code>google.subject</code></p></td><td colspan="1" rowspan="1"><p><code>assertion.sub</code></p></td><td colspan="1" rowspan="1"><p>トークンの主体（GitHub Actionsでの実行者情報など）をGoogle Cloudの内部的なIDとして使用。必須。</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>attribute.aud</code></p></td><td colspan="1" rowspan="1"><p><code>assertion.aud</code></p></td><td colspan="1" rowspan="1"><p>トークンが意図する受信者。OIDCトークンの <code>aud</code> フィールドを使用します。</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>attribute.actor</code></p></td><td colspan="1" rowspan="1"><p><code>assertion.actor</code></p></td><td colspan="1" rowspan="1"><p>GitHub Actionsを実行したユーザー名。</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>attribute.repository</code></p></td><td colspan="1" rowspan="1"><p><code>assertion.repository</code></p></td><td colspan="1" rowspan="1"><p>トークンが発行された GitHub リポジトリ名（例：<code>example-org/my-repo</code>）。</p></td></tr></tbody></table>

属性条件には `assertion.repository_owner == '[Organization名]'` を指定することで、この Workload Identity が使えるのは特定の GitHub Organization に限定されるようにしています。

```plaintext
assertion.repository_owner == "<GitHub の Organization 名>"
```

<figure><img src="./image-004.webp" alt="" width="622" height="823"></figure>

### 2\. サービスアカウントとの紐づけ

作成したWorkload Identity のプールとサービスアカウントを紐づけます。予めサービスアカウントを作成しておいてください。

作成したプールの詳細からアクセスを許可をクリックし、そこから該当のサービスアカウントを指定し紐付けることができます。

プリンシパルは属性名を `repository` 、属性値としてGitHub Organization とリポジトリ名を `<Organization>/<Repository>` の形式で入力します。

<figure><img src="./image-005.webp" alt="" width="599" height="831"></figure>

これで設定が完了です！

最後に下記のようなGithub Actionsの設定を実行してみて問題ないかを確認します。

```yaml
name: Deploy to Google Cloud

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: "Authenticate to Google Cloud"
        uses: "google-github-actions/auth@v2"
        with:
          workload_identity_provider: "principal://iam.googleapis.com/projects/<Worklord Identityのプロジェクト番号>/locations/global/workloadIdentityPools/<Worklord IdentityプールID>"
          service_account: "<サービスアカウント名>@<プロジェクトID>.iam.gserviceaccount.com"

      - name: Set up Cloud SDK
        uses: google-github-actions/setup-gcloud@v2
```

## まとめ

OIDC認証を導入することで、サービスアカウントキーのように長期間有効な認証情報が漏洩するリスクを回避できるだけでなく、キー管理の負担も軽減できます。

Workload Identity Federationを理解することで、安全かつ効率的なクラウド運用が可能になります。

まだサービスアカウントキーを使っている方は、ぜひこの機会にOIDCを利用したキーなし認証への移行を検討してみてはいかがでしょうか。
