Bitbucket Pipelines OpenID Connect を使用して AWS にデプロイする

AWS で OpenID Connect を使用するには、Pipelines を ウェブ ID プロバイダーとして設定して IAM ロールを作成し、ビルドを実行する前に、作成したロールを引き受けるようにビルドを設定する必要があります。

AWS でウェブ ID プロバイダーとして Bitbucket Pipelines を設定する

ウェブ ID プロバイダーは、システムが認証トークンを受け取って、そのトークンを AWS の一時的なセキュリティ認証情報として使用または交換できるようにします。これらの一時的なセキュリティ認証情報は、AWS アカウントのリソースを使用する権限を持つ IAM ロールにマッピングされます。AWS のウェブ ID プロバイダーに関する詳細をご参照ください。

  1. AWS ID およびアクセス管理 (IAM) にアクセスします。

  2. 左側のサイドバーの [アクセス管理] 見出しの下にある [ID プロバイダー] を選択します。

  3. [Add provider (プロバイダーの追加)] ボタンを選択します。

  4. [Configure provider (プロバイダーの設定)] セクションで、[OpenID Connect] を選択します。

  5. Bitbucket の OpenID Connect に ID プロバイダーとして表示されるプロバイダー URL を、対応するテキスト フィールドに追加します。プロバイダー URL は、認証要求に使用されるセキュアな OpenID Connect URL です。

  6. [Get thumbprint (サムプリントの取得)] ボタンを選択して、プロバイダー URL が一意で正確であることを確認します。

  7. Bitbucket の OpenID Connect に ID プロバイダーとして表示される対象者を、対応するテキスト フィールドに追加します。対象者は、アプリの ID プロバイダーによって発行されたクライアント ID です。

  8. [Add provider (プロバイダーの追加)] ボタンを選択します。

サムプリントを検証するには、OpenID Connect ID プロバイダーのルート CA サムプリントを取得するステップに従います。OpenSSL から取得したサムプリントは、次に示す内容である必要があります。

1 a031c46782e6e6c662c2c87c76da9aa62ccabd8e

ID とアクセス管理 (IAM) ロールを作成する

以下の手順に従って、この OIDC プロバイダーで Bitbucket Pipelines を使用するすべてのユーザーが引き受けられる新しい IAM ロールを作成します。

このロールの信頼されたエンティティはウェブ ID である必要があります。これによって、前の手順で作成したプロバイダーを選択できます。

  1. AWS ID とアクセス管理 (IAM) にアクセスします。

  2. 左側のサイドバーの [アクセス管理] 見出しの下にある [ロール] を選択します。

  3. [ロールの作成] を選択します。

  4. 信頼されたエンティティの種類として [ウェブ ID] を選択します。

  5. [ID プロバイダー] ドロップダウン、上記の設定から作成した ID プロバイダーの順に選択します。

  6. [対象者] ドロップダウン、上記の設定から作成した対象者の順に選択します。

  7. [次へ]: [権限] を選択します。

  8. 新しいロールにアタッチする権限ポリシーの一覧から 1 つ以上の権限ポリシーを選択します。現在の一覧にポリシーが表示されない場合は、ポリシーを検索する必要があることがあります。

  9. [次へ: タグ] を選択します。

  10. 必要に応じて、ラベル (タグ) を追加します。

  11. [次へ: 確認] を選択します。

  12. [ロールの作成] ページで、[ロール名] (必須) と [ロールの説明] (該当する場合) を入力します。

  13. [ロールの作成] を選択します。

作成したロールを引き受けるようにビルドを設定する

この手順では、前の手順で作成したロールを引き受けるようにビルドを設定します。ロールを引き受けて、一時的な認証情報を要求するために使用できる一意の OIDC トークンを作成するには、BitbucketCI ステップを有効にする必要があります。このトークンは、環境変数 BITBUCKET_STEP_OIDC_TOKEN として公開されます。

bitbucket-pipelines.yml ファイルの例

1 2 3 4 5 6 7 8 9 10 11 12 image: amazon/aws-cli pipelines: default: - step: oidc: true script: - export AWS_REGION=us-west-2 - export AWS_ROLE_ARN=arn:aws:iam::XXXXXXXXXXXX:role/oidc-demo - export AWS_WEB_IDENTITY_TOKEN_FILE=$(pwd)/web-identity-token - echo $BITBUCKET_STEP_OIDC_TOKEN > $(pwd)/web-identity-token - aws s3 cp s3://bucket/XXXXXX ./XXXXXXX

上記のコードは、bitbucket-pipelines.yml ファイルの例です。このファイルは、AWS リソースへのアクセスに使用できる一時的な認証情報をリクエストするロールを引き受けます。

ビルドを実行する

AWS で Pipelines をウェブ ID プロバイダーとして設定してウェブ ID プロバイダー内に IAM ロールを作成し、作成したロールを引き受けるようにビルドを設定したらビルドを実行します。


ID トークンでクレームを使用して、AWS の IAM ロールへのアクセスを制限する

上記の手順では、ワークスペースの下にある任意のリポジトリが作成されたロールを引き受けられます。また、トークンを持つすべてのユーザーが、ロールを引き受けられます。このセクションでは、それ以上にアクセスを制限する方法について説明します。

アクセス トークンを使用して認証サーバーから追加の ID 情報を要求する方法を開始する前に、特定のリポジトリのみがロールを引き受けられるなど、下記のユース ケースで使用される各トークンのペイロードをより深く理解しておく必要があります。

生成されたトークンの例

1 eyJraWQiOiJ0ZXN0X2tpZCIsInR5cCI6IkpXVCIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJ7MWRlNDg5YmUtY2U2YS00MmEwLWE4YzgtZWFkYmYxMTc0YWM3fTp7YmQ3MTU3NDAtYzk3MC00ODZiLWI2OGEtYjQyMWVjMmExZjhifTp7NzU5ZGUwYzYtZWFlZS00ZWFhLWI3YTYtYzUwN2VlYzc1OWE3fSIsImF1ZCI6ImFyaTpjbG91ZDpiaXRidWNrZXQ6OndvcmtzcGFjZVwvOTIyZTExOGMtZjM0Zi00MjI2LWE4OTctMGUwYWZiZWM1NTNkIiwic3RlcFV1aWQiOiJ7NzU5ZGUwYzYtZWFlZS00ZWFhLWI3YTYtYzUwN2VlYzc1OWE3fSIsImRlcGxveW1lbnRFbnZpcm9ubWVudCI6InRlc3RpbmciLCJpc3MiOiJodHRwczpcL1wvYXBpLmJpdGJ1Y2tldC5vcmdcLzIuMFwvd29ya3NwYWNlc1wvYmJjaXRlc3RcL3BpcGVsaW5lcy1jb25maWdcL2lkZW50aXR5XC9vaWRjIiwicmVwb3NpdG9yeVV1aWQiOiJ7MWRlNDg5YmUtY2U2YS00MmEwLWE4YzgtZWFkYmYxMTc0YWM3fSIsImJyYW5jaE5hbWUiOiJvaWRjLWRlbW8iLCJleHAiOjE1Nzg3NjIzMDAsImlhdCI6MTU3ODc0NzYwMCwicGlwZWxpbmVVdWlkIjoie2JlZTMyZjM1LTVkYzAtNDY3Ni05YWQxLTY1NzM2M2JlMGVkMH0iLCJ3b3Jrc3BhY2VVdWlkIjoiezkyMmUxMThjLWYzNGYtNDIyNi1hODk3LTBlMGFmYmVjNTUzZH0ifQ.kjY0g_gDrqb3SN2g0E5OdUgIfKv9bLaG6eBeCLo47pMmh7-Jkcd-_G9-jB9isOuIaF706n5M8kh8aqgYDypyM1Rof825u_GRUQNr-ZnaYKkaRQjWQVKv-i7mDL1Rdfb1EQZ2c7N-ol9s73Rwwp_JKYfEmARhJVHpKR9F6iyfZ4ni0FO8ExfQgNH6aZ2nIlKe8ru57lRARexoMSENqQC7iQZnr5SaEqsl8kDM9WWkzZ_ONLiQEqAu6UbA1ce9BqmyuS52rIw2iia7gyi_64iL5GvgpiaAJh5hnV6DRv8MafUB45WX50peX9hK9_N85kjLWiwzLB7HkdWEd3yNfmH05R120l31Pghdi07FBjViOs_w19lktGJ7gwGzsj686-9rN6UutqfrSUgf6CJTWgbIO8nLj4BIXKxojcjDOO6ULvhhmMwMjPqVqHOJFKWmF9rUUoxap-p3ezzzgGYfGeqpp65Vryf-A_1Q0X8t8o6Qm_QjihU9ucU1e_Bt2-f0HznZ

上記のトークンの例のペイロードを、次に示します。jwt.io を使用して他の部分 (ヘッダー、署名) を読み取れます。

1 2 3 4 5 6 7 8 9 10 11 12 13 { "sub": "{1de489be-ce6a-42a0-a8c8-eadbf1174ac7}:{bd715740-c970-486b-b68a-b421ec2a1f8b}:{759de0c6-eaee-4eaa-b7a6-c507eec759a7}", "aud": "ari:cloud:bitbucket::workspace/922e118c-f34f-4226-a897-0e0afbec553d", "stepUuid": "{759de0c6-eaee-4eaa-b7a6-c507eec759a7}", "deploymentEnvironment": "testing", "iss": "https://api.bitbucket.org/2.0/workspaces/bbcitest/pipelines-config/identity/oidc", "repositoryUuid": "{1de489be-ce6a-42a0-a8c8-eadbf1174ac7}", "branchName": "oidc-demo", "exp": 1578762300, "iat": 1578747600, "pipelineUuid": "{bee32f35-5dc0-4676-9ad1-657363be0ed0}", "workspaceUuid": "{922e118c-f34f-4226-a897-0e0afbec553d}" }

現在、AWS では信頼ポリシーでは一連のクレームのみを使用できます。AWS ウェブ ID フェデレーションで使用できるキーの詳細をご参照ください。AWS ウェブ ID フェデレーションで使用できるキーに基づいて、より厳格な信頼ポリシーを作成するために使用できる情報で「sub」要求を生成しました。

次に、生成された「sub」要求がどのように形成されるかを説明して、いくつか例を示します。

1 2 3 4 {REPOSITORY_UUID}[:{ENVIRONMENT_UUID}]:{STEP_UUID} E.g. {1de489be-ce6a-42a0-a8c8-eadbf1174ac7}:{bd715740-c970-486b-b68a-b421ec2a1f8b}:{759de0c6-eaee-4eaa-b7a6-c507eec759a7} {1de489be-ce6a-42a0-a8c8-eadbf1174ac7}:{759de0c6-eaee-4eaa-b7a6-c507eec759a7}

ENVIRONMENT_UUID: 手順がデプロイ環境に割り当てられている場合にのみ表示されます。この部分は、環境ごとに厳格なポリシーを構築するために非常に重要です。

特定のリポジトリのみがロールを引き受けられるようにする

次の手順では、信頼ポリシーを更新して、特定のリポジトリのみがロールを引き受けられるようにする方法を示します。

ロールの信頼関係を編集する

この手順では、ロールの信頼関係を編集して、リポジトリに一致する「sub」要求を持つトークンのみがロールを引き受けるように制限します。

ハイライト: ロールの信頼関係を編集して、リポジトリ sub 要求を持つトークンを制限する

次の設定は、すべての変数を設定で置き換えた後に行います。

1 2 3 4 5 6 7 8 9 10 11 12 { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::{AWS_ACCOUNT_NUMBER}:oidc-provider/api.bitbucket.org/2.0/workspaces/{WORKSPACE}/pipelines-config/identity/oidc" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringLike": { "api.bitbucket.org/2.0/workspaces/{WORKSPACE}/pipelines-config/identity/oidc:sub": "{REPO_UUID}:{*}" } } }

デプロイ手順からのリクエストのみがロールを引き受けられるようにする

次の手順では、信頼ポリシーを更新して、デプロイ手順のみがロールを引き受けられるようにする方法を示します。

ロールの信頼関係を編集する

この手順では、ロールの信頼関係を編集して、デプロイ環境に一致する「sub」要求を持つトークンのみがロールを引き受けるように制限します。

ハイライト: ロールの信頼関係を編集して、環境 sub 要求を持つトークンを制限する

次の設定は、すべての変数を設定で置き換えた後に行います。

1 2 3 4 5 6 7 8 9 10 11 12 { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::{AWS_ACCOUNT_NUMBER}:oidc-provider/api.bitbucket.org/2.0/workspaces/{WORKSPACE}/pipelines-config/identity/oidc" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringLike": { "api.bitbucket.org/2.0/workspaces/{WORKSPACE}/pipelines-config/identity/oidc:sub": "{REPO_UUID}*:{ENVIRONMENT_UUID}:*" } } }

Bitbucket Pipelines IP 範囲からのリクエストのみが、ロールを引き受けられるようにする

次の手順では、信頼ポリシーを更新して、IP 範囲からのリクエストのみがロールを引き受けられるようにする方法を示します。

ロールの信頼関係を編集する

この手順では、ロールの信頼関係を編集して、Bitbucket Pipelines IP からの引き受けリクエストのみがロールを引き受けるように制限します。

ハイライト: ロールの信頼関係を編集して、IP 範囲 sub 要求を持つトークンを制限する

次の設定は、すべての変数を設定で置き換えた後に行います。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::{AWS_ACCOUNT_NUMBER}:oidc-provider/api.bitbucket.org/2.0/workspaces/{WORKSPACE}/pipelines-config/identity/oidc" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringLike": { "api.bitbucket.org/2.0/workspaces/{WORKSPACE}/pipelines-config/identity/oidc:sub": "{REPO_UUID}:*" }, "IpAddress": { "aws:SourceIp": [ "34.199.54.113/32", "34.232.25.90/32", "34.232.119.183/32", "34.236.25.177/32", "35.171.175.212/32", "52.54.90.98/32", "52.202.195.162/32", "52.203.14.55/32", "52.204.96.37/32", "34.218.156.209/32", "34.218.168.212/32", "52.41.219.63/32", "35.155.178.254/32", "35.160.177.10/32", "34.216.18.129/32" ] } } }

詳細情報

その他のヘルプ