S3のブロックパブリックアクセスをONにしても 設定可能なバケットポリシーは?

S3のブロックパブリックアクセスをONにしても 設定可能なバケットポリシーは?

こんにちは!Koty-Mousa 矢坂幸太郎 です!
クラスメソッドメンバーズのテクニカルサポートを担当しております。

本日は、S3の「パブリック」について調べてみましょう!

ブロックパブリックアクセス とは?

S3には、ブロックパブリックアクセス(Block Public Access)という設定があります。
これは、4つの設定から構成され、S3の内容が意図せず外部に公開されないようにするためのものです。

しかしながら、この設定がすべてON(ブロックする状態)になっていても、AWS外部からS3バケットにアクセスできるケースが存在することを確認しました。

ちなみに、これをチーム内で少し話したところ、同僚のさすけが爆速でブログ記事にまとめてくれました!
https://dev.classmethod.jp/articles/website_hosting_s3_blockpublicaccess/

アクセス可能なリソース

まず、ブロックパブリックアクセス(Block Public Access)が有効 かつ バケットポリシーが空でも、
同一AWSアカウント内で 適切なIAM権限 を持つユーザー、ロール、サービス(EC2、Lambda、CloudShellなど)、およびAWSサービスプリンシパルからはアクセスが可能です。

それ以外のすべてのアクセス(他のAWSアカウントからのアクセス、認証されていないアクセス、パブリックインターネットからのアクセスなど)は、バケットポリシーで明示的に許可しない限り、すべて拒否されます。

ブロックパブリックアクセス(Block Public Access)は、"パブリック" へ通信しようとすることを制限するための設定です。

ブロックパブリックアクセス(Block Public Access)を解除したからと言って、すぐに全世界からアクセス可能になるわけではありません。

バケットを世界に公開するには

では、どうすればバケットを外部に公開できるのでしょうか?
本当に全世界に公開する場合は、下記ポリシーで実現可能です。

ポリシーはこちら
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::YOUR-BUCKET-NAME/*"
        }
    ]
}

ブロックパブリックアクセス(Block Public Access)を有効にしていると、上記ポリシーは設定できず、Policy has invalid resource エラーが返されます。

「パブリック」とは?

では、下記AWSドキュメントをもとに、仕組みを読み解いてみましょう。
Blocking public access to your Amazon S3 storage - Amazon Simple Storage Service

S3バケットポリシーが「非パブリック」と判断されるためには、アクセスを許可する対象が「特定の固定された値」に限定されている必要があります。

具体的には、ワイルドカード(*)を含まない、および IAM ポリシー変数(例:${aws:username})を含まない値でなければいけません。
例:
 パブリック: arn:aws:iam::123456789012:user/*
 パブリック: arn:aws:iam::123456789012:user/${aws:username}
非パブリック: arn:aws:iam::123456789012:user/koty-mousa

また、aws:SourceIp では、
IPv4:/8・IPv6:/32 より 広い IP範囲はパブリックとみなされます。
したがって、RFC1918 の範囲(いわゆる "プライベートIP")も 非パブリックです。
例:
 パブリック: 43.0.0.1/1
 パブリック: 43.0.0.1/7
非パブリック: 43.0.0.1/8
非パブリック: 43.0.0.1/32

設定可能なバケットポリシーは?

複数のポリシーを組み合わせた場合は、1つでも "パブリック" ポリシーが含まれている場合、ポリシー全体が "パブリック" と判断されます。
ただし、元からアクセス可能な 同一AWSアカウント内の 適切なIAM権限 を持つユーザー・ロール・サービス、および AWS サービスプリンシパルはアクセスすることができます。

例えば、下記のようなポリシーを定めたとします。

ポリシー例
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "AllowCloudTrailService",
			"Effect": "Allow",
			"Principal": {
				"Service": "cloudtrail.amazonaws.com"
			},
			"Action": [
				"s3:GetBucketAcl",
				"s3:PutObject"
			],
			"Resource": [
				"arn:aws:s3:::example-mixed-policy-bucket",
				"arn:aws:s3:::example-mixed-policy-bucket/AWSLogs/*"
			]
		},
		{
			"Sid": "AllowCrossAccountAccess",
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::111111111111:root"
			},
			"Action": [
				"s3:GetObject",
				"s3:ListBucket"
			],
			"Resource": [
				"arn:aws:s3:::example-mixed-policy-bucket",
				"arn:aws:s3:::example-mixed-policy-bucket/*"
			]
		},
		{
			"Sid": "AllowSpecificIPRange",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:*",
			"Resource": [
				"arn:aws:s3:::example-mixed-policy-bucket",
				"arn:aws:s3:::example-mixed-policy-bucket/*"
			],
			"Condition": {
				"IpAddress": {
					"aws:SourceIp": "2.0.0.0/4"
				}
			}
		}
	]
}
  1. CloudTrailサービスにログの書き込み権限を付与するステートメント
  2. 別のアカウント222222222222に読み取り権限を付与するステートメント
  3. 2.0.0.0/4 からのアクセスを許可

この場合、3. がパブリックであり、1. 2. は非パブリックです。
しかしながら、1つでもパブリックポリシーが含まれている場合は、そのポリシー全体をパブリックと判断するため、上記ポリシーは「パブリック」扱いとなります。
ブロックパブリックアクセス を設定している場合は、本ポリシーは拒否されます。
※ 1. は サービスプリンシパルのため、ポリシーの拒否にかかわらず許可されます。

手元の環境では、下記エラーが返されました。

User: arn:aws:sts::111111111111: is not authorized to perform: s3:PutBucketPolicy on resource: "arn:aws:s3:::example-mixed-policy-bucket" because public policies are blocked by the BlockPublicPolicy block public access setting.

バケットポリシー、奥深い!

今回は バケットポリシーに関して確認してみました。

データの権限を調整することは、様々な観点から非常に重要です。
適切なポリシーを設定して、安全にAWSをご利用ください!

以上、Koty-Mousa 矢坂幸太郎 がお伝えしました!

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.