OpenID Connect フェデレーション用のロールを作成する (コンソール) - AWS Identity and Access Management

OpenID Connect フェデレーション用のロールを作成する (コンソール)

AWS アカウントで AWS Identity and Access Management ユーザーを作成する代わりに、OpenID Connect (OIDC) フェデレーション ID プロバイダーを使用できます。ID プロバイダー (IdP) を使用すると、AWS の外部のユーザー ID を管理して、これらの外部ユーザー ID にアカウント内の AWS リソースに対するアクセス許可を付与できます。フェデレーションおよび IdPs (ID プロバイダー) について詳しくは、「ID プロバイダーとフェデレーション」を参照してください。

OIDC 用のロールを作成するための前提条件

OIDC フェデレーション用のロールを作成する前に、まず次の基本的なステップを実行する必要があります。

OIDC フェデレーション用のロールを作成する準備をするには
  1. フェデレーション OIDC ID を提供する 1 つ以上のサービスにサインアップします。AWS リソースにアクセスする必要があるアプリを作成する場合は、プロバイダー情報も合わせてアプリを設定します。サインアップすると、プロバイダーからアプリに固有のアプリケーション ID または対象者 ID が提供されます。(プロバイダーが異なれば、このプロセスには異なる用語が使用されます。このガイドでは、プロバイダーでアプリを識別するプロセスに設定という用語を使用します。) プロバイダーごとに複数のアプリを設定できます。または 1 つのアプリに複数のプロバイダーを設定できます。ID プロバイダーの使用に関する情報は以下で確認してください。

  2. IdP から必要な情報を受け取ったら、IAM で IdP を作成します。詳細については、「IAM で OpenID Connect (OIDC) ID プロバイダーを作成する」を参照してください。

    重要

    Google、Facebook、または Amazon Cognito の OIDC IdP を使用している場合は、AWS Management Console に個別の IAM IdP を作成しないでください。これらの OIDC ID プロバイダーは、すでに AWS に組み込まれており、ユーザーが使用できます。この手順をスキップして、次の手順で IdP を使用して新しいロールを作成します。

  3. IdP 認証ユーザーが引き受けるロールのポリシーを準備します。すべてのロールに該当することですが、モバイルアプリ用のロールにも 2 つのポリシーがあります。1 つは、ロールの引き受け先を指定する信頼ポリシーです。もう 1 つはアクセス許可ポリシーです。このポリシーでは、モバイルアプリにアクセスを許可または拒否する AWS アクションやリソースを指定します。

    ウェブ IdP については、Amazon Cognito を使用して ID を管理することをお勧めします。この場合、次の例に示すような信頼ポリシーを使用します。

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"Federated": "cognito-identity.amazonaws.com"}, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east-2:12345678-abcd-abcd-abcd-123456"}, "ForAnyValue:StringLike": {"cognito-identity.amazonaws.com:amr": "unauthenticated"} } } }

    us-east-2:12345678-abcd-abcd-abcd-123456 は、Amazon Cognito が割り当てる ID プール ID に置き換えます。

    OIDC IdP を手動で設定する場合は、信頼ポリシーの作成時に以下の 3 つの値を使用して当該アプリにのみロールを引き受けることを許可します。

    • Action 要素で、sts:AssumeRoleWithWebIdentity アクションを使用します。

    • Principal 要素で、{"Federated":providerUrl/providerArn} 文字列を使用します。

      • 一部の一般的な OIDC IdP の場合、providerUrl は URL です。以下の例では、いくつかの一般的な IdP のプリンシパルを指定する方法を示します。

        "Principal":{"Federated":"cognito-identity.amazonaws.com"}

        "Principal":{"Federated":"www.amazon.com"}

        "Principal":{"Federated":"graph.facebook.com"}

        "Principal":{"Federated":"accounts.google.com"}

      • 他の OIDC プロバイダーの場合は、次の例のように、ステップ 2 で作成した OIDC IdP の Amazon リソースネーム (ARN) を使用します。

        "Principal":{"Federated":"arn:aws:iam::123456789012:oidc-provider/server.example.com"}

    • Condition 要素で、StringEquals 条件を使用してアクセス許可を制限します。ID プール ID (Amazon Cognito の場合) またはアプリ ID (他のプロバイダーの場合) をテストします。この ID プール ID は、IdP でアプリを設定したときに取得したアプリ ID と一致する必要があります。この ID 間の一致により、リクエストが自分のアプリからであることを確認できます。

      注記

      Amazon Cognito アイデンティティプールの IAM ロールは、サービスプリンシパル cognito-identity.amazonaws.com を信頼してロールを引き受けます。このタイプのロールには、ロールを引き受けるプリンシパルを制限する条件キーが少なくとも 1 つ含まれている必要があります。

      クロスアカウントの IAM ロールを引き受ける Amazon Cognito アイデンティティプールには、その他の考慮事項が適用されます。これらのロールの信頼ポリシーは、cognito-identity.amazonaws.com サービスプリンシパルを受け入れる必要があり、ロールの引き受けを目的のアイデンティティプールのユーザーに制限するために aud 条件キーを含める必要があります。この条件なしで Amazon Cognito アイデンティティプールを信頼するポリシーでは、意図しないアイデンティティプールのユーザーがロールを引き受けるリスクが生じます。詳細については、「Amazon Cognito デベロッパーガイド」の「基本 (クラシック) 認証の IAM ロールの信頼ポリシー」を参照してください。

      使用している IdP に応じて、以下の例に示すような、条件要素を作成します。

      "Condition": {"StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east:12345678-ffff-ffff-ffff-123456"}}

      "Condition": {"StringEquals": {"www.amazon.com:app_id": "amzn1.application-oa2-123456"}}

      "Condition": {"StringEquals": {"graph.facebook.com:app_id": "111222333444555"}}

      "Condition": {"StringEquals": {"accounts.google.com:aud": "66677788899900pro0"}}

      OIDC プロバイダーの場合は、次の例に示すように、OIDC IdP の完全修飾 URL と aud コンテキストキーを使用します。

      "Condition": {"StringEquals": {"server.example.com:aud": "appid_from_oidc_idp"}}

    注記

    ロールの信頼ポリシーでプリンシパルとして指定する値は、IdP ごとに異なります。OIDC 用のロールで指定できるプリンシパルは 1 つだけです。したがって、モバイルアプリで複数の IdP からのサインインをユーザーに許可する場合は、サポートする IdP ごとに別個のロールを作成します。IdP ごとに別個の信頼ポリシーを作成します。

    ユーザーがモバイルアプリを使用して Login with Amazon からサインインする場合、次の例の信頼ポリシーが適用されます。この例では、amzn1.application-oa2-123456 は Login with Amazon を使用するアプリを設定したときに Amazon が割り当てるアプリ ID を表します。

    { "Version": "2012-10-17", "Statement": [{ "Sid": "RoleForLoginWithAmazon", "Effect": "Allow", "Principal": {"Federated": "www.amazon.com"}, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": {"StringEquals": {"www.amazon.com:app_id": "amzn1.application-oa2-123456"}} }] }

    ユーザーがモバイルアプリを使用して Facebook からサインインする場合、次の例の信頼ポリシーが適用されます。この例では、111222333444555 は Facebook が割り当てるアプリ ID を表します。

    { "Version": "2012-10-17", "Statement": [{ "Sid": "RoleForFacebook", "Effect": "Allow", "Principal": {"Federated": "graph.facebook.com"}, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": {"StringEquals": {"graph.facebook.com:app_id": "111222333444555"}} }] }

    ユーザーがモバイルアプリを使用して Google からサインインする場合、次の例の信頼ポリシーが適用されます。この例では、666777888999000 は Google が割り当てるアプリ ID を表します。

    { "Version": "2012-10-17", "Statement": [{ "Sid": "RoleForGoogle", "Effect": "Allow", "Principal": {"Federated": "accounts.google.com"}, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": {"StringEquals": {"accounts.google.com:aud": "666777888999000"}} }] }

    ユーザーがモバイルアプリを使用して Amazon Cognito からサインインする場合、次の例の信頼ポリシーが適用されます。この例では、us-east:12345678-ffff-ffff-ffff-123456 は Amazon Cognito が割り当てる ID プール ID を表します。

    { "Version": "2012-10-17", "Statement": [{ "Sid": "RoleForCognito", "Effect": "Allow", "Principal": {"Federated": "cognito-identity.amazonaws.com"}, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": {"StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east:12345678-ffff-ffff-ffff-123456"}} }] }

OIDC 用のロールの作成

前提条件を満たしたら、IAM でロールを作成できます。次の手順は、AWS Management Console で OIDC フェデレーション用のロールを作成する方法を示します。AWS CLI または AWS API からロールを作成するには、「サードパーティー ID プロバイダー (フェデレーション) 用のロールの作成」の手順を参照してください。

重要

Amazon Cognito を使用する場合は、Amazon Cognito コンソールを使用してロールをセットアップします。それ以外の場合は、IAM コンソールを使用して OIDC 用のロールを作成します。

OIDC フェデレーション用の IAM ロールを作成するには
  1. AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. ナビゲーションペインで [ロール] を選択した後、[ロールの作成] を選択します。

  3. 信頼されたエンティティタイプとして [ウェブアイデンティティ] を選択し、[次へ] を選択します。

  4. [Identity provider] (ID プロバイダー) で、ロールの IdP を選択します。

    • 個々のウェブ IdP 用のロールを作成する場合は、Login with AmazonFacebookGoogle のいずれかを選択します。

      注記

      サポートする各 IdP に対して別々のロールを作成する必要があります。

    • Amazon Cognito 用の高度なシナリオのロールを作成する場合は、Amazon Cognito を選択します。

      注記

      高度なシナリオで作業する場合に限り、Amazon Cognito で使用するロールを手動で作成する必要があります。それ以外の場合は、Amazon Cognito で自動的にロールを作成できます。Amazon Cognito の詳細については、[ Amazon Cognito Developer Guide ][Identity pools (federated) external identity providers]を参照してください。

    • GitHub Actions 用のロールを作成する場合は、まず GitHub OIDC プロバイダーを IAM に追加する必要があります。GitHub OIDC プロバイダーを IAM に追加したら、token.actions.githubusercontent.com を選択します。

      注記

      AWS を GitHub の OIDC のフェデレーティッド ID として信頼するよう設定する方法については、「GitHub Docs - Configuring OpenID Connect in Amazon Web Services」(GitHub Docs - アマゾン ウェブ サービスの OpenID Connect 設定) を参照してください。IAM IdP for GitHub に関連するロールへのアクセスを制限するベストプラクティスについては、このページの GitHub OIDC ID プロバイダーのロールの設定 を参照してください。

  5. アプリケーション用の ID を入力します。ID のラベルは、選択するプロバイダーによって異なります。

    • Login with Amazon 用のロールを作成する場合は、アプリ ID を [Application ID] (アプリケーション ID) ボックスに入力します。

    • Facebook 用のロールを作成する場合は、アプリ ID を [Application ID] (アプリケーション ID) ボックスに入力します。

    • Google 用のロールを作成する場合は、対象者名を [Audience] (対象者) ボックスに入力します。

    • Amazon Cognito 用のロールを作成する場合は、Amazon Cognito アプリケーション用に作成した ID プールの ID を、[Identity Pool ID] (ID プール ID) ボックスに入力します。

    • GitHub Actions のロールを作成する場合は、以下の情報を入力します。

      • [対象者] で [sts.amazonaws.com] を選択します。

      • GitHub 組織の場合、GitHub の組織名を入力します。GitHub 組織名は必須で、英数字 (ダッシュ (-) を含む) でなければなりません。GitHub 組織名に、ワイルドカード文字 (* と ?) は使用できません。

      • (オプション) [GitHub リポジトリ] に、GitHub リポジトリの名前を入力します。値を指定しない場合は、デフォルトでワイルドカード (*) になります。

      • (オプション) [GitHub ブランチ] に、GitHub ブランチ名を入力します。値を指定しない場合は、デフォルトでワイルドカード (*) になります。

  6. (オプション) [条件 (オプション)]で、[条件の追加] を選択して、ロールによって付与されたアクセス許可を使用する前にアプリケーションのユーザーが満たしておく必要がある追加条件を作成します。例えば、特定の IAM ユーザー ID にのみ AWS リソースに対するアクセス許可を付与する条件を追加できます。ロールを作成した後に、信頼ポリシーに条件を追加することもできます。詳細については、「ロールの信頼ポリシーの変更 (コンソール)」を参照してください。

  7. OIDC 情報を確認し、[次へ] を選択します。

  8. IAM には、あなたのアカウント内の AWS 管理ポリシーとカスタマー管理ポリシーのリストがあります。アクセス許可ポリシーとして使用するポリシーを選択するか、[Create policy] (ポリシーの作成) を選択して新しいブラウザタブを開き、新しいポリシーをゼロから作成します。詳細については、「IAM ポリシーの作成」を参照してください。ポリシーを作成したら、そのタブを閉じて元のタブに戻ります。OIDC ユーザーに割り当てるアクセス許可ポリシーの横にあるチェックボックスをオンにします。必要に応じて、この時点でポリシーを選択せずに、後でポリシーをロールにアタッチすることもできます。デフォルトでは、ロールにはいずれのアクセス権限もありません。

  9. (オプション) アクセス許可の境界を設定します。これはアドバンスド機能です。

    [Permissions boundary] (アクセス許可の境界) セクションを開き、[Use a permissions boundary to control the maximum role permissions] (アクセス許可の境界を使用してロールのアクセス許可の上限を設定する) を選択します。アクセス許可の境界として使用するポリシーを選択します。

  10. [Next] を選択します。

  11. [Role name] (ロール名) に、ロールの名前を入力します。ロール名は AWS アカウント アカウント内で一意である必要があります。大文字と小文字は区別されません。例えば、PRODROLEprodrole というロール名を両方作成することはできません。他の AWS リソースがロールを参照している場合があるため、作成後はロールの名前を編集できません。

  12. (オプション) [Description] (説明) には、新しいロールの説明を入力します。

  13. [Step 1: Select trusted entities] (ステップ 1: 信頼済みエンティティの選択) または [Step 2: Add permissions] (ステップ 2: 権限の追加) のセクションで [Edit] (編集) を選択し、ロールのユースケースと権限を変更します。

  14. (オプション) ロールにメタデータを追加するには、キーバリューのペアとしてタグをアタッチします。IAM におけるタグの使用の詳細については、「IAM リソースのタグ付け」を参照してください。

  15. ロール情報を確認し、ロールの作成 を選択します。

GitHub OIDC ID プロバイダーのロールの設定

GitHub を OpenID Connect (OIDC) ID プロバイダー (IdP) として使用する場合、ベストプラクティスは、IAM IdP に関連付けられたロールを引き受けることができるエンティティを制限することです。信頼ポリシーに条件ステートメントを含めると、ロールを特定の GitHub Organization、リポジトリ、またはブランチに制限できます。条件キー token.actions.githubusercontent.com:sub を文字列条件演算子と共に使用してアクセスを制限できます。条件を GitHub 組織内の特定のリポジトリまたはブランチのセットに制限することをお勧めします。AWS を GitHub の OIDC のフェデレーティッド ID として信頼するよう設定する方法については、「GitHub Docs - Configuring OpenID Connect in Amazon Web Services」(GitHub Docs - アマゾン ウェブ サービスの OpenID Connect 設定) を参照してください。

アクションワークフローまたは OIDC ポリシーで GitHub 環境を使用する場合は、セキュリティを強化するために保護ルールを環境に追加することを強くお勧めします。デプロイブランチとタグを使用して、環境にデプロイできるブランチとタグを制限します。保護ルールを使用して環境を設定する方法については、GitHub の記事「Using environments for deployment」(デプロイ用の環境の使用) に記載されている「Deployment branches and tags」(デプロイブランチとタグ) を参照してください。

GitHub の OIDC IdP がロールの信頼できるプリンシパルである場合、IAM はロールの信頼ポリシー条件をチェックして条件キー token.actions.githubusercontent.com:sub が存在していて、その値がワイルドカード文字 (* と ?) または null だけではないことを確認します。IAM は、信頼ポリシーが作成または更新されたときにこのチェックを実行します。条件キー token.actions.githubusercontent.com:sub が存在しない場合、またはキー値が上記の値基準を満たさない場合、リクエストは失敗し、エラーが返されます。

重要

条件キー token.actions.githubusercontent.com:sub を特定の組織またはリポジトリに制限しない場合、管理外の組織またはリポジトリの GitHub Actions は、AWS アカウントで GitHub IAM IdP に関連付けられたロールを引き受けることができます。

以下の信頼ポリシー例は、定義済みの GitHub Organization、リポジトリ、ブランチへのアクセスを制限します。次の例では条件キー token.actions.githubusercontent.com:sub の値は、GitHub が文書化しているデフォルトのサブジェクト値の形式です。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::012345678910:oidc-provider/token.actions.githubusercontent.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com", "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/GitHubRepo:ref:refs/heads/GitHubBranch" } } } ] }

次の例の条件は、定義された GitHub Organization とリポジトリへのアクセスを制限しますが、リポジトリ内の任意のブランチへのアクセスを許可します。

"Condition": { "StringEquals": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com" }, "StringLike": { "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/GitHubRepo:*" } }

以下の条件例は、定義された GitHub Organization 内の任意のリポジトリまたはブランチへのアクセスを制限します。条件キー token.actions.githubusercontent.com:sub は、アクセスを GitHub 組織内からの GitHub Actions へのアクセスに制限する特定の値に制限することをお勧めします。

"Condition": { "StringEquals": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com" }, "StringLike": { "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/*" } }

ポリシーの条件チェックで利用可能な OIDC フェデレーションのキーの詳細については、「OIDC AWS フェデレーションで使用できるキー」を参照してください。