こんにちは、CX事業本部 Delivery部の若槻です。
最近、GitHub から次のようなアナウンスがありました。
GitHub Actions で2つの SSL 中間証明書が使用されるようになったため、OIDC プロバイダーの thumbprint に次の2つの thumbprint の登録が必要となりました。
6938fd4d98bab03faadb97b34396831e3780aea1
1c58a3a8518e8759bf075b76b750d4f2df264fcd
今までは 6938fd4d98bab03faadb97b34396831e3780aea1
のみ登録されていれば良かったのですが、今後は上記の両方を登録しなければ、GitHub Actions からの AssumeRole が次のエントリで紹介しているエラー(※)となってしまいます。
※登録されていない証明書が通信に使用された場合
今回は、GitHub OIDC provider を AWS CDK で構成している場合の、複数の thumbprint の登録を試してみました。
thumbprint を明示的に指定しない場合
以前に次のエントリで GitHub OIDC provider などの OIDC 連携に必要なリソースを AWS CDK を利用して構成する方法を紹介しました。
その際の CDK コードは下記(一部省略)となります。OIDC provider の作成は OpenIdConnectProvider
コンストラクトクラスを利用するのですが、その際に thumbprints
は未指定としています。
lib/cdk-deploy-gh-oidc-stack.ts
import { Stack, StackProps, aws_iam } from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class CdkDeployGhOidcStack extends Stack {
constructor(scope: Construct, id: string, props: StackProps) {
super(scope, id, props);
// GitHub とのフェデレーション認証を行う OIDC プロバイダーを作成
const gitHubOidcProvider = new aws_iam.OpenIdConnectProvider(
this,
'GitHubOidcProvider',
{
url: 'https://token.actions.githubusercontent.com',
clientIds: ['sts.amazonaws.com'],
}
);
// 中略
}
}
この時、CDK デプロイにより追加される thumbprint は 6938fd4d98bab03faadb97b34396831e3780aea1
のみとなっています。
$ aws iam get-open-id-connect-provider \
--open-id-connect-provider-arn ${PROVIDER_ARN}
{
"Url": "token.actions.githubusercontent.com",
"ClientIDList": [
"sts.amazonaws.com"
],
"ThumbprintList": [
"6938fd4d98bab03faadb97b34396831e3780aea1"
],
"CreateDate": "2023-06-09T15:40:20.811000+00:00",
"Tags": []
}
OpenIdConnectProvider
の仕様を確認する
次のドキュメントで OpenIdConnectProvider
コンストラクトクラスの仕様を確認してみます。
OpenIdConnectProvider
では、Construct Props でオプションとして thumbprints
を string[]
形式で指定できます。thumbprints
は OIDC provider のサーバー証明書の thumbprint のリストを登録できるので、今回のケースでまさに使いたかったプロパティです。
指定可能数は最大 5 つで、また未指定の場合はルート認証局の thumbprint がプロバイダーのサーバーから取得されます。現在既定で取得される thumbprint は前述した 6938fd4d98bab03faadb97b34396831e3780aea1
となっているようです。
thumbprint を明示的に指定してみる
それでは OpenIdConnectProvider
実際に thumbprint を明示的に指定してみます。アナウンスされていた2つの thumbprint を指定します。
lib/cdk-deploy-gh-oidc-stack.ts
import { Stack, StackProps, aws_iam } from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class CdkDeployGhOidcStack extends Stack {
constructor(scope: Construct, id: string, props: StackProps) {
super(scope, id, props);
// GitHub とのフェデレーション認証を行う OIDC プロバイダーを作成
const gitHubOidcProvider = new aws_iam.OpenIdConnectProvider(
this,
'GitHubOidcProvider',
{
url: 'https://token.actions.githubusercontent.com',
clientIds: ['sts.amazonaws.com'],
thumbprints: [
'6938fd4d98bab03faadb97b34396831e3780aea1',
'1c58a3a8518e8759bf075b76b750d4f2df264fcd',
],
}
);
// 中略
}
}
CDK デプロイすると、指定した2つの thumbprint が OIDC provider に登録されていることが確認できました。
$ aws iam get-open-id-connect-provider \
--open-id-connect-provider-arn ${PROVIDER_ARN}
{
"Url": "token.actions.githubusercontent.com",
"ClientIDList": [
"sts.amazonaws.com"
],
"ThumbprintList": [
"1c58a3a8518e8759bf075b76b750d4f2df264fcd",
"6938fd4d98bab03faadb97b34396831e3780aea1"
],
"CreateDate": "2023-06-09T15:40:20.811000+00:00",
"Tags": []
}
その後は GitHub Actions での OIDC 連携も正常にできるようになりました。
登録できる thumbprint の制約
登録できる thumbprint には 40 文字以上のみという制約があります。文字数がそれ以下の thumbprint を指定してみます。
lib/cdk-deploy-gh-oidc-stack.ts
import { Stack, StackProps, aws_iam } from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class CdkDeployGhOidcStack extends Stack {
constructor(scope: Construct, id: string, props: StackProps) {
super(scope, id, props);
// GitHub とのフェデレーション認証を行う OIDC プロバイダーを作成
const gitHubOidcProvider = new aws_iam.OpenIdConnectProvider(
this,
'GitHubOidcProvider',
{
url: 'https://token.actions.githubusercontent.com',
clientIds: ['sts.amazonaws.com'],
thumbprints: [
'6938fd4d98bab03faadb97b34396831e3780aea1',
'1c58a3a8518e8759bf075b76b750d4f2df264fcd',
'hogehoge'
],
}
);
// 中略
}
}
CDK デプロイすると次のエラーとなります。
failed: Error: The stack named cdkCicdResourcesStack failed to deploy: UPDATE_ROLLBACK_COMPLETE: Received response status [FAILED] from custom resource. Message returned: ValidationError: 1 validation error detected: Value '[1c58a3a8518e8759bf075b76b750d4f2df264fcd, 6938fd4d98bab03faadb97b34396831e3780aea1, hogehoge]' at 'thumbprintList' failed to satisfy constraint: Member must satisfy constraint: [Member must have length less than or equal to 40, Member must have length greater than or equal to 40
文字列が短すぎると SSL 証明書の署名の意味を成さないので、この制約は当然といえば当然ですね。
おわりに
GitHub OIDC provider を AWS CDK で構成している場合の、複数の thumbprint の登録を試してみました。
GitHub と AWS の OIDC 連携に使用している中間証明書は、時々変更や追加があるので、エラーが発生した場合にも焦らずに対処したいですね。
参考
以上