👌

github actions OIDCとs3 bucket policyの例外指定にハマった

2023/01/29に公開

概要

github actionsでのAWS認証をIAM userからrole for OIDCに移行する際に、s3 bucket policyの例外指定にハマった

なんで移行するの

  • userを使用する場合、AWS認証情報をsecretとして扱う必要があり、以下のような課題があったため
    • secret漏洩リスク
    • 漏洩リスクを考慮したローテーションの手間
    • userを意図しない用途で使用できてしまう

何をしたのか

userをroleに置換

  1. 新しいroleを作成
  2. userにattachしていたpolicyをroleにattach
  3. s3 bucket policyのnot principalをuserからroleに更新

s3 bucket policyを例示すると、userを使用していた時は以下。

{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Deny",
        "NotPrincipal": {"AWS": [
            "arn:aws:iam::444455556666:user/Bob",
            "arn:aws:iam::444455556666:root"
        ]},
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::BUCKETNAME",
            "arn:aws:s3:::BUCKETNAME/*"
        ]
    }]
}

roleを使用するために書き換えた後は以下。

{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Deny",
        "NotPrincipal": {"AWS": [
            "arn:aws:iam::444455556666:role/cross-account-read-only-role",
            "arn:aws:iam::444455556666:root"
        ]},
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::Bucket_AccountAudit",
            "arn:aws:s3:::Bucket_AccountAudit/*"
        ]
    }]
}

github actionsを更新

userを使用していた時は以下のように環境変数としてAWS認証情報をstepに渡していた。

jobs:
  workflow:
    steps:
      - name: Confirm s3 bucket
        run: aws s3 ls s3://bucket-name
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}

roleを使用するために以下のように認証のstepを追加した。

jobs:
  workflow:
    steps:
      - name: Configure AWS
        uses: aws-actions/configure-aws-credentials@v1
        with:
          role-to-assume: arn:aws:iam::444455556666:role/cross-account-read-only-role
          role-session-name: cross-account-audit-app
          aws-region: AWS_REGION

なぜかAccess Denied

  • user使用時と同じpolicyを使用しているので、permission不足等の可能性はなさそう
  • s3 bucket policyの方に問題があると判断

ドキュメントを読む

つまり、適切なs3 bucket policyは以下のようになる。

{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Deny",
        "NotPrincipal": {"AWS": [
            "arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/cross-account-audit-app",
            "arn:aws:iam::444455556666:role/cross-account-read-only-role",
            "arn:aws:iam::444455556666:root"
        ]},
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::Bucket_AccountAudit",
            "arn:aws:s3:::Bucket_AccountAudit/*"
        ]
    }]
}

気づき

  • 当たり前のことだけど、ドキュメントをちゃんと読みましょうってお話。

Ref.

  1. Configure AWS Credentials
  2. AWS JSON policy elements: NotPrincipal
GitHubで編集を提案

Discussion