【S3 VPCエンドポイントポリシー】特定のアカウントとAWSリポジトリにアクセスを限定させる方法

  • 2023年11月5日
  • 2023年11月5日
  • AWS, IT
AWS

こんにちはますのです。
S3バケットポリシーの制御と併せて、VPCエンドポイントポリシーでもS3バケットにアクセスする先を制御が出来ないか検証しました。

構成

図のような構成でEC2→VPCエンドポイントポリシー→S3へのアクセス制御を検討します。

アクセス要件

  • EC2はS3にアクセスするためにVPCエンドポイントを経由する
  • 同じアカウント内にあるS3バケットは全てアクセス可能とする
  • 外部のAWSアカウントのS3バケットに対する通信はVPCエンドポイントで通信を遮断する
  • AmazonLinux(AL)、AmazonLinux2(AL2)、AmazonLinux2023(AL2023)へのリポジトリデータはVPCエンドポイント経由で取得可能とする

VPCエンドポイントポリシーを設定する

以下のVPCエンドポイントポリシーを設定することで実現可能でした。
「ap-northeast-1」としている部分は、対象のリージョンを選択してください。

{
	"Version": "2008-10-17",
	"Statement": [
		{
			"Effect": "Deny",
			"Principal": "*",
			"Action": "*",
			"NotResource": [
				"arn:aws:s3:::packages.ap-northeast-1.amazonaws.com/*",
				"arn:aws:s3:::repo.ap-northeast-1.amazonaws.com/*",
				"arn:aws:s3:::amazonlinux.ap-northeast-1.amazonaws.com/*",
				"arn:aws:s3:::amazonlinux-2-repos-ap-northeast-1/*",
				"arn:aws:s3:::al2023-repos-ap-northeast-1-de612dc2/*"
			],
			"Condition": {
				"StringNotEquals": {
					"aws:PrincipalAccount": "123456789012"
				}
			}
		},
		{
			"Effect": "Allow",
			"Principal": "*",
			"Action": "*",
			"Resource": "*"
		}
	]
}

下記のナレッジセンターに記載があったので抜粋します。
Amazon Linux 1、Amazon Linux 2 または Amazon Linux 2023 を実行している EC2 インスタンスで yum を使用するとエラーが発生するのはなぜですか?

Amazon Linux 2023: の場合

arn:aws:s3:::al2023-repos-us-east-1-de612dc2/*

Amazon Linux 1: の場合

arn:aws:s3:::packages.region.amazonaws.com/*
arn:aws:s3:::repo.region.amazonaws.com/*

Amazon Linux 2: の場合

arn:aws:s3:::amazonlinux.region.amazonaws.com/*
arn:aws:s3:::amazonlinux-2-repos-region/*
設定値を間違えて「arn:aws:s3:::al2023-repos-us-east-1-de612dc2/*」に設定してもdnf installコマンドは成功しました。
恐らくマルチリージョンにリポジトリがあるからかと思いますが、us-east-1に取り行くよりも各リージョンに合わせた設定をしたほうがレイテンシーも少ないので気を付けます。
もしくはリージョンを気にしないのであれば「arn:aws:s3:::al2023-repos-*-de612dc2/*」とワイルドカードで縮めることも可能です。

上手くいなかった設定

最初に試していた際は、ポリシー内に「Allow」の設定を明示していませんでした。
IAMポリシーでは「S3フルアクセス権限」も許可しているので「aws s3 ls」は明示的なAllowで許可されると考えましたが想定とは異なりました。

[root@ip-172-16-0-8 ~]# aws s3 ls
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

また、リポジトリアクセスも同様に、403エラーが表示されて取得出来ない状況を確認しました。

Downloading Packages:
[=== ] 800 B/s | 243 B --:-- ETA
The downloaded packages were saved in cache until the next successful transactio n.
You can remove cached packages by executing 'yum clean packages'.
Error: Error downloading packages:
Status code: 403 for https://al2023-repos-ap-northeast-1-de612dc2.s3.dualstack.ap-northeast-1.amazonaws.com/core/mirrors/2023.2.20231030/x86_64/mirror.list (IP: 52.219.137.40)

VPCエンドポイントポリシーでは明示的に「Allow」を設定する必要があり、以下を追加することでDeny条件に該当しない場合の挙動を制御することになるようです。
※ドキュメント等では見つけられなかったので動作結果からの予想になります。

		{
			"Effect": "Allow",
			"Principal": "*",
			"Action": "*",
			"Resource": "*"
		}

まとめ

  • EC2に持ち込まれたIAMアクセスキーを利用する外部S3に対してのアクセス制御が可能になる
  • IAMのみでは実現できなかったより細かいアクセス制御が可能になる

参考資料

最新情報をチェックしよう!