
S3のブロックパブリックアクセスをONにしても 設定可能なバケットポリシーは?
こんにちは!Koty-Mousa 矢坂幸太郎 です!
クラスメソッドメンバーズのテクニカルサポートを担当しております。
本日は、S3の「パブリック」について調べてみましょう!
ブロックパブリックアクセス とは?
S3には、ブロックパブリックアクセス(Block Public Access)という設定があります。
これは、4つの設定から構成され、S3の内容が意図せず外部に公開されないようにするためのものです。
しかしながら、この設定がすべてON(ブロックする状態)になっていても、AWS外部からS3バケットにアクセスできるケースが存在することを確認しました。
ちなみに、これをチーム内で少し話したところ、同僚のさすけが爆速でブログ記事にまとめてくれました!
アクセス可能なリソース
まず、ブロックパブリックアクセス(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"
}
}
}
]
}
- CloudTrailサービスにログの書き込み権限を付与するステートメント
- 別のアカウント
222222222222
に読み取り権限を付与するステートメント 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 テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。