🗑️

AWS CDKでGitHub Enterpriseの監査ログをOIDCでS3にストリーミングする方法

2023/10/29に公開

はじめに

AWS CDK(TypeScript)でAmazon S3 へのストリーミングの設定をする方法です。
この記事ではAWSのシークレットを管理することを避けるため、OpenID Connect (OIDC) を使用してGitHubからAWSに監査ログを送信しています。

公式のOpenID Connect を使用して S3 へのストリーミングを設定するの手順に沿って実装しているので、そちらも併せて確認ください。

CDKでいろいろを作成する

OpenID Connect を使用して S3 へのストリーミングを設定する1~4の手順をCDKで実現しています。

export class GitHubAuditLogsStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    
    // 1. GitHubのOIDCプロバイダーを IAM に追加します。
    const oidcProvider = new iam.OpenIdConnectProvider(
      this,
      "GitHubOidcProvider",
      {
        // プロバイダーの URL には、https://oidc-configuration.audit-log.githubusercontent.com を使います。
        url: "https://oidc-configuration.audit-log.githubusercontent.com",
        // [対象者] には、sts.amazonaws.com を使います。
	clientIds: ["sts.amazonaws.com"],
      },
    );
    
    // 2. バケットを作成し、バケットへのパブリック アクセスをブロックします。
    const bucket = new s3.Bucket(
      this,
      "GitHubAuditLogs",
      {
        // FIXME: <EXAMPLE-BUCKET> を自分のバケットの名前に変える。
        bucketName: "<EXAMPLE-BUCKET>",
        blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
      }
    );

    // 3. GitHubがバケットに書き込まれることを許可するポリシーを作成します。
    const policy = new iam.PolicyStatement({
      effect: iam.Effect.ALLOW,
      resources: [`arn:aws:s3:::${bucket.bucketName}/*`],
      // GitHubでは、このアクセス許可のみが必要になります。
      actions: ["s3:PutObject"],
    });

    // 4. GitHubIdPのロールと信頼ポリシーを構成します。
    const role = new iam.Role(
      this,
      "GithubAuditLogStreamRole",
      {
        roleName: "github-audit-log-stream-role",
        assumedBy: new iam.FederatedPrincipal(
          oidcProvider.openIdConnectProviderArn,
	  {
	    // 信頼関係を編集して、`sub`フィールドを検証条件に追加し、<ENTERPRISE>を自分のEnterpriseの名前に置き換えます。
            StringEquals: {
              "oidc-configuration.audit-log.githubusercontent.com:aud": 
	      "sts.amazonaws.com",
              "oidc-configuration.audit-log.githubusercontent.com:sub":
              "https://github.com/<ENTERPRISE>", // FIXME: 自分のEnterpriseの名前に置き換える
          },
        },
        "sts:AssumeRoleWithWebIdentity",
      ),
    });
    // 上で作成したアクセス許可ポリシーを追加して、バケットへの書き込みを許可します。
    role.addToPolicy(policy);
  }
}

GitHub EnterpriseとS3を連携する

CDKでリソースをデプロイできたら、あとは公式のOpenID Connect を使用して S3 へのストリーミングを設定する5~14 を手順に沿ってCDKで作成したバケット名とロール名(この例だとgithub-audit-log-stream-role)を入力すれば設定完了です。

  1. GitHub.com の右上の自分のプロファイル写真をクリックし、 [自分の Enterprise] をクリックします。
  1. Enterpriseのリストで、表示したいEnterpriseをクリックしてください。
  1. Enterprise アカウントのサイドバーで、 [設定] をクリックします。
  1. [設定] で、 [監査ログ] をクリックします。
  1. Audit log(監査ログ)のLog streaming(ログストリーミング) をクリックします。
  1. [ストリームの構成] ドロップダウン メニューを選び、 [Amazon S3] をクリックします。
  1. [認証] の [OpenID Connect] をクリックします。
  1. ストリームの設定を構成します。
  • [バケット] に、ストリーミング先のバケットの名前を入力します。 たとえば、auditlog-streaming-test のようにします。
  • [ARN ロール] に、前に記録した ARN ロールを入力します。 たとえば、arn:aws::iam::1234567890:role/github-audit-log-streaming-role のようにします。
  1. GitHub で Amazon S3 エンドポイントに接続して書き込めることを確認するには、Check endpoint (エンドポイントのチェック) をクリックします。
  1. エンドポイントを正常に確認したら、 [保存] をクリックします。

Discussion