# クラウド プロバイダーでの OpenID Connect の構成

ワークフロー内で OpenID Connect を使用して、クラウド プロバイダーでの認証を行います。

## 概要

OpenID Connect (OIDC) を使用すると、有効期間の長いGitHub Actions シークレットとして資格情報を格納しなくても、GitHub ワークフローからクラウド プロバイダー内のリソースにアクセスできます。

OIDC を使用するには、まず、フェデレーション ID として GitHubの OIDC を信頼するようにクラウド プロバイダーを構成してから、トークンを使用して認証するようにワークフローを更新する必要があります。

## 前提条件

* GitHubで OpenID Connect (OIDC) を使用する方法の基本的な概念とそのアーキテクチャと利点については、[OpenID Connect](/ja/actions/concepts/security/openid-connect) を参照してください。

* 先に進む前に、アクセス トークンが予測可能な方法でのみ割り当てられるようにセキュリティ戦略を計画する必要があります。 クラウド プロバイダーがアクセス トークンを発行する方法を制御するには、少なくとも 1 つの条件を定義し、信頼できないリポジトリがクラウド リソースにアクセス トークンを要求できないようにする**必要があります**。 詳細については、「 [OpenID Connect リファレンス](/ja/actions/reference/security/oidc#oidc-claims-used-to-define-trust-conditions-on-cloud-roles)」を参照してください。

## GitHub Actions ワークフローの更新

OIDC のワークフローを更新するには、YAML に 2 つの変更を行う必要があります。

1. トークンのアクセス許可設定を追加します。
2. クラウド プロバイダーの公式アクションを使用して、OIDC トークン (JWT) をクラウド アクセス トークンと交換します。

クラウド プロバイダーでまだ公式アクションを提供していない場合は、ワークフローを更新して手動でこれらの手順を実行できます。

> \[!NOTE]
> 環境がワークフローまたは OIDC ポリシーで使われる場合は、セキュリティを強化するために環境に保護規則を追加することをお勧めします。 たとえば、環境のデプロイ規則を構成して、環境にデプロイできるブランチとタグを制限したり、環境シークレットにアクセスしたりできます。 詳しくは、「[デプロイメント用の環境管理](/ja/actions/how-tos/deploy/configure-and-manage-deployments/manage-environments)」をご覧ください。

### アクセス許可設定の追加

ジョブまたはワークフローの実行には、`permissions`の OIDC プロバイダーが実行ごとに JSON Web トークンを作成できるように、[`id-token: write`](/ja/actions/tutorials/authenticate-with-github_token#modifying-the-permissions-for-the-github_token)を含むGitHub設定が必要です。

> \[!NOTE] ワークフローのアクセス許可で `id-token: write` を設定しても、リソースへの変更または書き込みを行うアクセス許可はワークフローに付与されません。 そうではなく、ワークフローは、アクションまたはステップのための OIDC トークンを要求 (フェッチ) して使用 (設定) することのみが許可されます。 その後、このトークンは、有効期間の短いアクセス トークンを使って外部サービスで認証を行うために使われます。

必要なアクセス許可、構成例、高度なシナリオについて詳しくは、「[OpenID Connect リファレンス](/ja/actions/reference/security/oidc#workflow-permissions-for-the-requesting-the-oidc-token)」をご覧ください。

### 公式アクションの使用

クラウド プロバイダーが、 GitHub Actionsで OIDC を使用するための公式アクションを作成している場合は、OIDC トークンをアクセス トークンと簡単に交換できます。 その後、クラウド リソースにアクセスするときにこのトークンを使用するようにワークフローを更新できます。

たとえば、Alibaba Cloud は、`aliyun/configure-aliyun-credentials-action` と OIDC を使用して統合するために [](https://github.com/aliyun/configure-aliyun-credentials-action) を作成しました。

## カスタム アクションの使用

クラウド プロバイダーに公式のアクションがない場合、またはカスタム スクリプトを作成する場合は、 GitHubの OIDC プロバイダーに JSON Web トークン (JWT) を手動で要求できます。

公式のアクションを使用していない場合 GitHub は、Actions コア ツールキットを使用することをお勧めします。 または、次の環境変数を使用して、`ACTIONS_ID_TOKEN_REQUEST_TOKEN`、`ACTIONS_ID_TOKEN_REQUEST_URL` トークンを取得できます。

このアプローチを使用してワークフローを更新するには、YAML に 3 つの変更を加える必要があります。

1. トークンのアクセス許可設定を追加します。
2. GitHub の OIDC プロバイダーから OIDC トークンを取得するコードを追加します。
3. OIDC トークンをクラウド プロバイダーで交換してアクセス トークンを取得するコードを追加します。

### Actions コア ツールキットを使用した JWT の要求

次の例では、`actions/github-script` ツールキットで`core`を使用して、GitHubの OIDC プロバイダーに JWT を要求する方法を示します。 詳しくは、「[JavaScript アクションを作成する](/ja/actions/tutorials/create-actions/create-a-javascript-action#adding-actions-toolkit-packages)」をご覧ください。

```yaml
jobs:
  job:
    environment: Production
    runs-on: ubuntu-latest
    steps:
    - name: Install OIDC Client from Core Package
      run: npm install @actions/core@1.6.0 @actions/http-client
    - name: Get Id Token
      uses: actions/github-script@v8
      id: idtoken
      with:
        script: |
          let id_token = await core.getIDToken()
          core.setOutput('id_token', id_token)
```

### 環境変数を使用した JWT の要求

次の例では、環境変数を使用して JSON Web トークンを要求する方法を示します。

デプロイ ジョブでは、`actions/github-script` ツールキットで `core` を使用して、トークン設定を定義する必要があります。 詳しくは、「[JavaScript アクションを作成する](/ja/actions/tutorials/create-actions/create-a-javascript-action#adding-actions-toolkit-packages)」をご覧ください。

次に例を示します。

```yaml
jobs:
  job:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/github-script@v8
      id: script
      timeout-minutes: 10
      with:
        debug: true
        script: |
          const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN']
          const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL']
          core.setOutput('TOKEN', token.trim())
          core.setOutput('IDTOKENURL', runtimeUrl.trim())
```

次に、`curl` を使用して GitHub OIDC プロバイダーから JWT を取得できます。 次に例を示します。

```yaml
    - run: |
        IDTOKEN=$(curl -H "Authorization: Bearer ${{steps.script.outputs.TOKEN}}" ${{steps.script.outputs.IDTOKENURL}}  -H "Accept: application/json; api-version=2.0" -H "Content-Type: application/json" -d "{}" | jq -r '.value')
        echo $IDTOKEN
        jwtd() {
            if [[ -x $(command -v jq) ]]; then
                jq -R 'split(".") | .[0],.[1] | @base64d | fromjson' <<< "${1}"
                echo "Signature: $(echo "${1}" | awk -F'.' '{print $3}')"
            fi
        }
        jwtd $IDTOKEN
        echo "idToken=${IDTOKEN}" >> $GITHUB_OUTPUT
      id: tokenid
```

### クラウド プロバイダーからのアクセス トークンの取得

アクセス トークンを取得するには、OIDC JSON Web トークンをクラウド プロバイダーに提示する必要があります。

デプロイごとに、ワークフローでは、OIDC トークンをフェッチしてクラウド プロバイダーに提示するクラウド ログイン アクション (またはカスタム スクリプト) を使用する必要があります。 その後、クラウド プロバイダーではトークン内の要求を検証します。成功した場合は、そのジョブ実行でのみ使用できるクラウド アクセス トークンが提供されます。 提供されたアクセス トークンは、ジョブ内の後続のアクションでクラウドに接続し、そのリソースにデプロイするために使用できます。

OIDC トークンをアクセス トークンと交換する手順は、クラウド プロバイダーごとに異なります。

### クラウド プロバイダー内のリソースへのアクセス

アクセス トークンを取得したら、特定のクラウド アクションまたはスクリプトを使用して、クラウド プロバイダーに対する認証を行い、そのリソースにデプロイできます。 これらの手順は、クラウド プロバイダーごとに異なる場合があります。

たとえば、Alibaba Cloud は OIDC 認証に関する独自の手順を保持しています。 詳細については、「[Alibaba Cloud のドキュメントで OIDC ベースの SSO の概要](https://www.alibabacloud.com/help/en/ram/user-guide/overview-of-oidc-based-sso)」を参照してください。

さらに、このアクセス トークンの既定の有効期限は、クラウドごとに異なる場合があり、クラウド プロバイダー側で構成できます。

## 参考資料

* [再利用可能なワークフローでの OpenID Connect の使用](/ja/actions/how-tos/secure-your-work/security-harden-deployments/oidc-with-reusable-workflows)
* [セルフホステッド ランナー リファレンス](/ja/actions/reference/runners/self-hosted-runners)