AWS CDK で作成した GitHub OIDC provider に複数の thumbprint を登録してみた

2023.07.05

こんにちは、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 でオプションとして thumbprintsstring[] 形式で指定できます。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 連携に使用している中間証明書は、時々変更や追加があるので、エラーが発生した場合にも焦らずに対処したいですね。

参考

以上