
S3のゲートウェイエンドポイントポリシーを自アカウントのみに限定するときに許可が必要なAWS管理バケット
こんにちは、林です。
S3のゲートウェイエンドポイントのポリシーに aws:ResourceAccount の条件を付けると、VPCからアクセスできるバケットを自アカウントのもののみに限定できます。
公式ドキュメントには、この条件について次の注記があります。
アクセスされるリソースの AWS アカウント ID を指定するには、IAM ポリシーで
aws:ResourceAccountキーまたはs3:ResourceAccountキーを使用できます。ただし、一部の AWS のサービス は AWS マネージドバケットへのアクセスに依存していることに注意してください。したがって、IAM ポリシーでaws:ResourceAccountキーまたはs3:ResourceAccountキーを使用することは、これらのリソースへのアクセスにも影響する可能性があります。
注記にあるAWSマネージドバケットは、たとえばECRのイメージのレイヤーやAmazon Linux 2023のパッケージが置かれているバケットです。自アカウントのみに限定すると、これらへのアクセスも拒否されます。
インターネットに出られないプライベートサブネットのEC2で、何が失敗するのか、どのバケットを許可すれば成功するのかを確かめてみました。
先に結論
東京リージョンで、自アカウントのみを許可したポリシーを試したところ、自アカウントのバケットの取得は成功し、4つの操作がS3の403エラーで失敗しました。
| 操作 | 取得に失敗したバケット |
|---|---|
| dnfでのパッケージ取得 | al2023-repos-ap-northeast-1-de612dc2 |
| ECRからのイメージ取得(docker pull) | prod-ap-northeast-1-starport-layer-bucket |
| Patch Managerのスキャン(AWS-RunPatchBaseline) | aws-ssm-ap-northeast-1、patch-baseline-snapshot-ap-northeast-1 |
| SSM Agentの更新(AWS-UpdateSSMAgent) | amazon-ssm-ap-northeast-1 |
これらを含むAWS管理のバケットへの s3:GetObject を許可すると、4つとも成功しました。
許可を追加したポリシーです。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Access-to-own-account-buckets-only",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:ResourceAccount": "123456789012"
}
}
},
{
"Sid": "Access-to-AWS-managed-buckets",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": [
"arn:aws:s3:::prod-ap-northeast-1-starport-layer-bucket/*",
"arn:aws:s3:::al2023-repos-ap-northeast-1-de612dc2/*",
"arn:aws:s3:::amazon-ssm-ap-northeast-1/*",
"arn:aws:s3:::aws-ssm-ap-northeast-1/*",
"arn:aws:s3:::patch-baseline-snapshot-ap-northeast-1/*",
"arn:aws:s3:::aws-patch-manager-ap-northeast-1-4849fa78f/*",
"arn:aws:s3:::ap-northeast-1-birdwatcher-prod/*"
]
}
]
}
許可するアクションは s3:GetObject のみです。ECRとSystems Managerのガイドの例も s3:GetObject のみで、検証でも s3:ListBucket なしで5つの操作が成功しました。
aws-patch-manager-ap-northeast-1-4849fa78f と ap-northeast-1-birdwatcher-prod は、今回の検証では確認していませんが、Systems Managerのガイドの一覧に従って含めています。
バケット名はリージョンごとに決まっていて、AWSのユーザーガイドとAWS re:Postのナレッジセンター記事に記載があります。
| サービス | バケット名 | 記載場所 |
|---|---|---|
| ECR(イメージのレイヤー) | prod-{region}-starport-layer-bucket | ECRユーザーガイド「Amazon ECR の最小 Amazon S3 バケットアクセス許可」 |
| Amazon Linux 2023(dnf) | al2023-repos-{region}-de612dc2 | AWS re:Post「How do I update yum or install packages without internet access」 |
| SSM Agentの更新 | amazon-ssm-{region} | Systems Managerユーザーガイド「SSM Agent と AWS マネージド S3 バケットとの通信」 |
| Patch Managerの資材 | aws-ssm-{region} | 同上 |
| パッチベースラインのスナップショット | patch-baseline-snapshot-{region} または patch-baseline-snapshot-{region}-{接尾辞} | 同上 |
| Patch Managerのドキュメント | aws-patch-manager-{region}-{接尾辞} | 同上 |
| Distributor | {region}-birdwatcher-prod | 同上 |
{接尾辞} はリージョンごとに異なります。リージョンごとの実際の名前は「参照: パッチ適用オペレーション用の Amazon S3 バケット」にあります。
また、Systems Managerのガイドには、リージョンをワイルドカードにしないことについて次の注記があります。
このポリシーの特定のリージョンの代わりにワイルドカード文字 (*) を使用しないことをお勧めします。例えば、
arn:aws:s3:::aws-ssm-us-east-2/*を使用して、arn:aws:s3:::aws-ssm-*/*は使用しないでください。ワイルドカードを使用すると、アクセスを付与する S3 バケットへのアクセス権が付与される場合があります。複数のリージョンでインスタンスプロファイルを使用する場合は、各リージョンの最初のStatementブロックを繰り返すことをお勧めします。
Windows Serverを使う場合は、同じガイドに記載のある aws-windows-downloads-{region} も必要です。今回の検証はAmazon Linux 2023のため、ポリシーには入れていません。
検証方法
| 項目 | 内容 |
|---|---|
| EC2 | t4g.small、Amazon Linux 2023(arm64) |
| ネットワーク | インターネットゲートウェイとNATゲートウェイのないVPCのプライベートサブネット |
| VPCエンドポイント(ゲートウェイ型) | S3 |
| VPCエンドポイント(インターフェイス型) | ssm、ssmmessages、ec2messages、ecr.api、ecr.dkr |
| Docker | 25.0.14 |
| SSM Agent | 3.3.5390.0 |
| リージョン | 東京(ap-northeast-1) |
EC2のIAMロールには s3:Get* と s3:List* をすべてのリソースに許可し、変わる条件をエンドポイントポリシーのみにしました。docker pull の対象は、自アカウントのECRプライベートリポジトリに置いた amazonlinux:2023 です。
S3のゲートウェイエンドポイントのポリシーを3種類に切り替え、それぞれで同じ5つの操作をRun Commandで実行しました。
| ポリシー | 内容 |
|---|---|
| 既定 | すべて許可(エンドポイント作成時のポリシー) |
| 自アカウントのみ | aws:ResourceAccount が自アカウントのときのみ s3:* を許可 |
| 自アカウント+AWS管理バケット | 「先に結論」のポリシー |
「自アカウントのみ」のポリシーです。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Access-to-own-account-buckets-only",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:ResourceAccount": "123456789012"
}
}
}
]
}
実行した5つの操作です。
- 自アカウントのバケットのオブジェクトを
aws s3 cpで取得する dnf installでパッケージを取得する- ECRのイメージを
docker pullで取得する AWS-RunPatchBaselineをScanで実行するAWS-UpdateSSMAgentを実行する
結果
○は成功、×は失敗です。
| 操作 | 既定 | 自アカウントのみ | 自アカウント+AWS管理バケット |
|---|---|---|---|
| 自アカウントのバケットの取得 | ○ | ○ | ○ |
| dnfでのパッケージ取得 | ○ | × | ○ |
| ECRからのイメージ取得 | ○ | × | ○ |
| Patch Managerのスキャン | ○ | × | ○ |
| SSM Agentの更新 | ○ | × | ○ |
Run Commandの実行とSession Managerの接続は、S3を使わないのでどのポリシーでも成功しました。
失敗したときのエラー
「自アカウントのみ」のポリシーで失敗した4つの操作のエラーです。いずれも、403エラーのURLにアクセスできなかったバケット名が出ています。
dnf
リポジトリのミラーリストの取得で失敗しました。
Error: Failed to download metadata for repo 'kernel-livepatch': Cannot prepare internal mirrorlist: Status code: 403 for https://al2023-repos-ap-northeast-1-de612dc2.s3.dualstack.ap-northeast-1.amazonaws.com/kernel-livepatch/mirrors/al2023/aarch64/mirror.list?instance_id=i-0554d801acea99583 (IP: 52.219.16.122)
docker pull
ECRの認証とマニフェストの取得は成功し、レイヤーの取得で失敗しました。エラーメッセージには、拒否したのがVPCエンドポイントポリシーであることも出ています。
denied: User: arn:aws:sts::xxxxxxxxxxxx:assumed-role/storage-access-role-prod-ap-northeast-1/xxxxxxxx is not authorized to perform: s3:GetObject on resource: "arn:aws:s3:::prod-ap-northeast-1-starport-layer-bucket/..." because no VPC endpoint policy allows the s3:GetObject action
AWS-RunPatchBaseline
パッチ適用の資材の取得で失敗しました。
root [ERROR]: Unable to download payload: https://s3.ap-northeast-1.amazonaws.com/aws-ssm-ap-northeast-1/patchbaselineoperations/linux/payloads/patch-baseline-operations-1.252.tar.gz.
資材が前回の実行でキャッシュされている場合は、その次のパッチベースラインのスナップショットの取得で失敗しました。このエラーにはバケット名が出ないので、スナップショットの置き場である patch-baseline-snapshot-ap-northeast-1 はSystems Managerのガイドで確認しました。
root [ERROR]: Could not download a valid snapshot
AWS-UpdateSSMAgent
更新の有無を調べるマニフェストの取得で失敗しました。
failed to download file reliably, https://s3.ap-northeast-1.amazonaws.com/amazon-ssm-ap-northeast-1/ssm-agent-manifest.json, http request failed. status:403 Forbidden statuscode:403
まとめ
S3のゲートウェイエンドポイントのポリシーを自アカウントのみに限定すると失敗するAWSサービスと、許可が必要なバケットを確かめてみました。
- ECRのイメージ取得、Amazon Linux 2023のdnf、Patch Manager、SSM Agentの更新は、AWS管理のバケットから取得できず403エラーで失敗する
- 失敗したときのエラーには、取得できなかったバケット名が出る
- 許可が必要なバケット名はリージョンごとに決まっていて、AWSのユーザーガイドとAWS re:Postに記載がある
- AWS管理のバケットへの
s3:GetObjectを許可すると、どの操作も成功する
aws:ResourceAccount で限定するときは、使っているサービスがどのAWS管理バケットを使うかを確認し、許可しておく必要があります。
この記事がどなたかの参考になれば幸いです。最後までご覧いただきありがとうございました!
参考









