🦔

Github Enterprise での AWS の OIDC

2024/03/13に公開

やりたいこと

Github Actions で OIDC を使って認証をして AWS リソースの操作をしたい!

環境

  • 社内環境にある Github Enterprise サーバを利用
  • Github Actions にて AK/SK を利用してAWS 環境へのデプロイを行っている

背景

  • AK/SK の管理をしたくない、、
  • 出来れば一時的な権限を使用して AWS 環境にデプロイを行っていきたい、セキュリティ的にも

みたいな思いがありました。

いきなり結論

以下 3 点の設定が必要です

  1. Github Actions のパイプラインを定義している yaml ファイルにて、クレデンシャルを設定する箇所で以下のようにロールの ARN を指定
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        role-to-assume: 'arn:aws:iam::xxxxxxxxxxxx:role/< OIDC 用 IAM ロール名 >'
        aws-region: ap-northeast-1 # 展開するリージョン
  1. IAM の ID プロバイダ設定にてプロバイダを以下フォーマットで指定して作成する
    <Github Enterprise の URL >/_services/token
    例:githubenterprise.example.com/_services/token

  2. OIDC で利用する IAM ロールの信頼するエンティティの "Principal" にて以下を上記の ID プロバイダで作成したものの ARN を指定する

"Principal": {
  "Federated": "arn:aws:iam::xxxxxxxxxxxx:oidc-provider/<Github Enterprise の URL >/_services/token"
}

例:

"Principal": {
  "Federated": "arn:aws:iam::xxxxxxxxxxxx:oidc-provider/githubenterprise.example.com/_services/token"
}

はまったポイント

世の中に出回っているサンプルについては私が調べた際はほとんどが Github で OIDC での認証を行うもので Github Enterprise で実施されているものは中々見つけることが出来ませんでした。(私の検索力のせいかもしれないですが)

そのため、プロバイダ設定をするものが何かを判断することが出来なかったです。
もちろん Github の場合のプロバイダ設定ではできませんでした。

Github の場合の OIDC の設定

https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services

参照

https://zenn.dev/kou_pg_0131/articles/gh-actions-oidc-aws
https://ten-snapon.com/archives/2835

追加のポイント

Github Actions に IAM ロールを認証して使用する場合、"Condition" にて認証可能なリポジトリを指定しないとすべてのリポジトリから認証可能になってしまいます。
Github の場合は複数の方がサンプルたくさん記載いただいているので Github Enterprise 版をサンプルとして載せておきます。

特定組織、特定リポジトリからのみの認証を受け付ける信頼されたエンティティの定義です

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::xxxxxxxxxxxx:oidc-provider/<Github Enterprise の URL >/_services/token"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringLike": {
                    "<Github Enterprise の URL >/_services/token:sub": "repo:< 組織名 >/< リポジトリ名 >:*"
                }
            }
        }
    ]
}

最後に

当時調べた時は意外と情報がなく苦戦しました。。。
同じように困っている方の参考になれば幸いです~

Discussion