AWS/S3のバケットポリシー入門


バケット、オブジェクトのアクセス権限をJSONで定義できます。

「S3のマネジメントコンソール > アクセス権限 > バケットポリシー」で設定できます。

  • ポリシーを定義できるのはバケット所有者のみです
  • バケット/オブジェクトレベルのアクセス権を設定できます
  • オブジェクトのアクセス権設定は、バケットとオブジェクトの所有者が一致する場合のみ可能です
  • バケットポリシーのサイズは20KBまで

🐮 ポリシー要素の意味

要素 意味
Version バージョン情報です。”Version”:”2012-10-17”でポリシー変数を使うことができます
Principal AWSアカウントID、IAMユーザーのARNなどを指定できます
Effect この条件を許可するならAllow、拒否するならDenyを指定します
Action 許可するアクションの設定。s3:GetObjectは読み込み権限
"Resource": "arn:aws:s3:::xxx" 取り扱うオブジェクトのARN。arn:aws:s3:::xxxでS3のバケットを示します
Condition オプショナルな要素。ポリシーの実行条件を細かく指定できます。詳細はこちら

Principalの設定例:

// AWSアカウント単位
"Principal":{"AWS":"123456789012"}
// IAMユーザ
"Principal":{"AWS":"arn:aws:iam::123456789012:root"}

🎳 ポリシー変数

ポリシー変数とは、リクエスト時に受け取ることができる変数のことです。
Resource要素とCondition要素で使うことができます。

// Resource要素
"Resource":["arn:aws:S3:::bucket/home/${aws:username}/*"]
// Condition要素
"Condition": {
"StringLike": {
"sns:endpoint": "https://example.com/${aws:usernmae}/*"
}
}

以下はポリシー変数の紹介です。

ポリシー変数 説明
aws:SecureTransport リクエストがSSLを使用して送信されたかどうかを示すBool値
aws:SourceIp リクエスト元のIPアドレス
aws:UserAgent クライアントアプリケーションに関する情報
aws:FederatedUser どのプロパイダでログインしたかを示す。www.amazon.comなど

🐡 誰でもオブジェクトを閲覧できるようにする

バケットをWebサイトとして設定するなど、誰でもオブジェクトを読めるようにする設定は次のとおりです。

{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"AddPerm",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::example-bucket/*"]
}
]
}

😎 特定のIPからだけ閲覧できるようにする

特定のIPからだけアクセスを行えるようにして、それ以外はブロックする設定です。

{
"Version": "2012-10-17",
"Id": "S3PolicyId1",
"Statement": [
{
"Sid": "IPAllow",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::examplebucket/*",
"Condition": {
"IpAddress": {"aws:SourceIp": "54.240.143.0/24"},
"NotIpAddress": {"aws:SourceIp": "54.240.143.188/32"}
}
}
]
}

🏀 特定のWebページから発生するGETリクエストだけ受け入れる

特定のWebページから発生するGETリクエストだけ受け入れて、画像や動画のリンクを表示する設定です。

{
"Version": "2012-10-17",
"Id": "http referer policy example",
"Statement": [
{
"Sid": "Allow get requests referred by www.mysite.com and mysite.com",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::examplebucket/*",
"Condition": {
"StringLike": {"aws:Referer": ["http://www.example.com/*","http://example.com/*"]}
}
},
{
"Sid": "Explicit deny to ensure requests are allowed only from specific referer.",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::examplebucket/*",
"Condition": {
"StringNotLike": {"aws:Referer": ["http://www.example.com/*","http://example.com/*"]}
}
}
]
}

👽 補足:Amazonリソースネーム(ARN)

AWSサービスのリソースを指定するためのフォーマットです。

arn:partition:service:region:account:resource

各パラメータの意味は次のとおりです。

パラメータ 意味
partition 標準のAWSリージョンはaws、中国リージョンならaws-cnです
service AWS製品を示しています。IAMリソースの場合はiamです
region リソースが置かれている領域です。IAMやS3では空白です
account ハイフンのないのAWSアカウントIDです。IAMやS3では空白です
resource 特定のリソースを名前で識別する部分です

🎃 参考リンク

📚 おすすめの書籍

🖥 サーバについて

このブログでは「Cloud Garage」さんのDev Assist Program(開発者向けインスタンス無償提供制度)でお借りしたサーバで技術検証しています。 Dev Assist Programは、開発者や開発コミュニティ、スタートアップ企業の方が1GBメモリのインスタンス3台を1年間無料で借りれる心強い制度です!(有償でも1,480円/月と格安)