S3のアクセス制御方法は色々とあります。「バケットポリシー」「IAMポリシー」「ACL」「パブリックアクセス設定」とあり、複雑なので整理します。
アクセス制御のユースケース
アクセス制御のユースケースは多岐に渡ります。
- 何に対して
- バケット
- オブジェクト
- 誰に
- 特定AWSアカウント
- 特定IAMポリシー
- 特定サービス(CloudFrontなど)
- 特定IP
- 全ユーザ
- etc
- 何のアクションを
- オブジェクト一覧取得
- オブジェクト作成
- etc
- どうする
- 明示的拒否
- 明示的許可
- デフォルト拒否
S3はこれらのユースーケースに対応できます。便利な反面、多少混乱します。
各制御方法を確認します。
制御方法|バケットポリシー
概要
バケット単位でアクセス制御したいときに向いています。
指定バケット > アクセス権限 > バケットポリシー
から設定できます。JSON形式で記載します。
制御例
例を示します。
バケット内のオブジェクト
を 世界中の全ての人
が 読み取れる
ようにしたい場合、以下のようにします。
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"AddPerm",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::examplebucket/*"]
}
]
}
バケット内のオブジェクト
を CloudFront
が 読み取れる
ようにしたい場合、以下のようにします。
{
"Version":"2012-10-17",
"Id":"PolicyForCloudFrontPrivateContent",
"Statement":[
{
"Sid":" Grant a CloudFront Origin Identity access to support private content",
"Effect":"Allow",
"Principal":{"CanonicalUser":"CloudFront Origin Identity Canonical User ID"},
"Action":"s3:GetObject",
"Resource":"arn:aws:s3:::examplebucket/*"
}
]
}
参考
制御方法|IAMポリシー
概要
特定のIAMユーザー、IAMロールだけ操作できるようにしたいとき利用します。
IAMポリシー
を作成して、ユーザー、ロールに紐づけることで制御します。
IAM > ポリシー > ポリシーの作成
から作成できます。
指定できる内容はバケットポリシーと同じです。
参考
制御方法|ACL
( BucketACL, ObjcetACL )
概要
オブジェクト単位で制御したいときに向いています。
バケットのアクセス制御を設定できます。
指定バケット > アクセス権限 > アクセスコントロールリスト
から設定できます。
オブジェクトのアクセス制御を設定できます。
指定オブジェクト > アクセス権限
から設定できます。
参考
公開防止|パブリックアクセス設定
概要
アクセス制御方法が様々なため、誤ってバケット、オブジェクトを公開してしまうという危険性があります。
そこで、2018年11月に パブリックアクセス設定
の機能が追加されました。
例えば、ACLで意図しないオブジェクトが公開状態になっているケースを考えます。
管理者は気づきづらい状態ですが、この設定を有効にしておくことで非公開にできます。
新規バケットを作成するとき設定できます。
既存バケットの場合は、指定バケット > アクセス権限 > パブリックアクセス設定
から設定できます。
参考
- How Do I Block Public Access to S3 Buckets?
- https://aws.amazon.com/jp/blogs/aws/amazon-s3-block-public-access-another-layer-of-protection-for-your-accounts-and-buckets/
アクセス許可の確認
概要
バケット一覧ページの アクセス
でアクセス状態を確認できます。
オブジェクトは公開可能
- パブリックアクセス設定を無効にしています。
バケットとオブジェクトは非公開
- パブリックアクセス設定を有効にしています。
公開
- パブリックアクセス設定を無効にしています。
- ACLでバケット公開しています。