Bitbucket Pipelines OpenID Connect を使用して AWS にデプロイする
AWS で OpenID Connect を使用するには、Pipelines を ウェブ ID プロバイダーとして設定して IAM ロールを作成し、ビルドを実行する前に、作成したロールを引き受けるようにビルドを設定する必要があります。
AWS でウェブ ID プロバイダーとして Bitbucket Pipelines を設定する
Web Identity Providers allow the system to receive an authentication token, and then use or exchange that token for temporary security credentials in AWS. These temporary security credentials map to an IAM role with permissions to use the resources in your AWS account. Learn more about Web Identity Providers from AWS
AWS ID およびアクセス管理 (IAM) にアクセスします。
左側のサイドバーの [アクセス管理] 見出しの下にある [ID プロバイダー] を選択します。
[Add provider (プロバイダーの追加)] ボタンを選択します。
[Configure provider (プロバイダーの設定)] セクションで、[OpenID Connect] を選択します。
Add the Provider URL, that is displayed as an identity provider on OpenID Connect in Bitbucket, to the corresponding text field. The Provider URL is the secure OpenID Connect URL used for authentication requests.
[Get thumbprint (サムプリントの取得)] ボタンを選択して、プロバイダー URL が一意で正確であることを確認します。
Add the Audience, that is displayed as an identity provider on OpenID Connect in Bitbucket, to the corresponding text field. The audience is the client ID issued by the Identity provider for your app.
[Add provider (プロバイダーの追加)] ボタンを選択します。
サムプリントを検証するには、OpenID Connect ID プロバイダーのルート CA サムプリントを取得するステップに従います。OpenSSL から取得したサムプリントは、次に示す内容である必要があります。
a031c46782e6e6c662c2c87c76da9aa62ccabd8e
ID とアクセス管理 (IAM) ロールを作成する
以下の手順に従って、この OIDC プロバイダーで Bitbucket Pipelines を使用するすべてのユーザーが引き受けられる新しい IAM ロールを作成します。
このロールの信頼されたエンティティはウェブ ID である必要があります。これによって、前の手順で作成したプロバイダーを選択できます。
AWS ID とアクセス管理 (IAM) にアクセスします。
左側のサイドバーの [アクセス管理] 見出しの下にある [ロール] を選択します。
[ロールの作成] を選択します。
信頼されたエンティティの種類として [ウェブ ID] を選択します。
[ID プロバイダー] ドロップダウン、上記の設定から作成した ID プロバイダーの順に選択します。
[対象者] ドロップダウン、上記の設定から作成した対象者の順に選択します。
[次へ]: [権限] を選択します。
新しいロールにアタッチする権限ポリシーの一覧から 1 つ以上の権限ポリシーを選択します。現在の一覧にポリシーが表示されない場合は、ポリシーを検索する必要があることがあります。
[次へ: タグ] を選択します。
必要に応じて、ラベル (タグ) を追加します。
[次へ: 確認] を選択します。
[ロールの作成] ページで、[ロール名] (必須) と [ロールの説明] (該当する場合) を入力します。
[ロールの作成] を選択します。
作成したロールを引き受けるようにビルドを設定する
この手順では、前の手順で作成したロールを引き受けるようにビルドを設定します。ロールを引き受けて、一時的な認証情報を要求するために使用できる一意の OIDC トークンを作成するには、BitbucketCI ステップを有効にする必要があります。このトークンは、環境変数 BITBUCKET_STEP_OIDC_TOKEN として公開されます。
bitbucket-pipelines.yml ファイルの例
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 情報を要求する方法を開始する前に、特定のリポジトリのみがロールを引き受けられるなど、下記のユース ケースで使用される各トークンのペイロードをより深く理解しておく必要があります。
生成されたトークンの例
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 を使用して他の部分 (ヘッダー、署名) を読み取れます。
{
"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」要求がどのように形成されるかを説明して、いくつか例を示します。
{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」要求を持つトークンのみがロールを引き受けるように制限します。
次の設定は、すべての変数を設定で置き換えた後に行います。
{
"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」要求を持つトークンのみがロールを引き受けるように制限します。
次の設定は、すべての変数を設定で置き換えた後に行います。
{
"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 からの引き受けリクエストのみがロールを引き受けるように制限します。
詳細情報
この内容はお役に立ちましたか?