バケットポリシー

バケットポリシーは、Access Policy Language (APL) を使用してストレージへのアクセス可否を定義します。

バケットの所有者のみが、バケットポリシーを定義することができます。

以下のようなことが定義可能です。

  • バケットレベルのパーミッション定義 (Allow/Deny レベルの設定)
  • バケット内のすべてのオブジェクトへのアクセス拒否
  • 所有者がバケットの所有者と同じオブジェクトへのアクセス許可(所有者が別ユーザのオブジェクトに対しては、所有者がACLを設定する必要がある)

バケットポリシーの内容はJSON形式で記述されます。

バケットポリシーの設定

バケットポリシーは PUT Bucket policy を用いて設定します。

以下は、2人のユーザ(1-22-333-4444, 3-55-678-9100)が バケット mybucket(grn:iijgio:dag:::mybucket/*)内のオブジェクトに対してGETリクエスト(dag:GetObject*)を実行できるようにする設定のサンプルです。

PUT /mybucket?policy HTTP/1.1
Host: s3api.iot.iij.jp
Date: Tue, 04 Apr 2010 20:34:56 GMT
Authorization: IIJGIO VGhpcyBSAMPLEBieSB1bHZpbmc=

{
"Version":"2008-10-17",
"Id":"aaaa-bbbb-cccc-dddd",
"Statement" : [
    {
        "Effect":"Allow",
        "Sid":"1",
        "Principal" : {
            "IIJGIO":["1-22-3333-4444","3-55-678-9100"]
        },
        "Action":["dag:GetObject*"],
        "Resource":"grn:iijgio:dag:::mybucket/*"
    }
  ]
}

バケットポリシーの取得

指定のバケットへ設定されているバケットポリシーの取得には GETBucketpolicy を使用します。

以下は “mybucket” のバケットに設定されているバケットポリシーを取得するサンプルです。

GET /mybucket?policy HTTP/1.1
Host: s3api.iot.iij.jp
Date: Wed, 28 Oct 2009 22:32:00 GMT
Authorization: IIJGIO 02236Q3V0WHVSRSAMPLEEX5sCYVf1bNRuU=

バケットの所有者は、デフォルトでGET Bucket policyを実行できる権限があります。

 

バケットポリシーの削除

バケットに関連するバケットポリシー設定の削除は、 DELETE Bucket policy を使用します。
以下は “mybucket” に関連するバケットポリシーを削除するサンプルです。

DELETE /mybucket?policy HTTP/1.1
Host: s3api.iot.iij.jp
Date: Tue, 04 Apr 2010 20:34:56 GMT
Authorization: IIJGIO VGhpcyBSAMPLEeSB1bHZpbmc=

DELETE Bucket policy オペレーションを行うには、DeletePolicy のパーミッションを所持しており、かつ対象バケットの所有者である必要があります。

 

サンプル

制約が追加された複数のアカウントに対して、パーミッションを設定するサンプル

以下はpublic-readというCanned ACLが含まれている複数のアカウントに対してPutObject, PutObjectAclを許可するサンプルです。

{
    "Version": "2008-10-17",
    "Statement": [{
        "Sid": "AddCannedAcl",
        "Effect": "Allow",
        "Principal": {
            "IIJGIO": ["SAMPLE00000000000000", "SAMPLE00000000000001"]
        },
        "Action": ["dag:PutObject","dag:PutObjectAcl"],
        "Resource": ["grn:iijgio:dag:::bucket/*"],
        "Condition": {
            "StringEquals": {
                "dag:x-iijgio-acl": ["public-read"]
            }
        }
    }]
}

anonymousユーザにパーミッションを設定するサンプル

以下はanonymousユーザにパーミッションを許可するサンプルです。

{
    "Version": "2008-10-17",
    "Statement": [{
        "Sid": "AddPerm",
        "Effect": "Allow",
        "Principal": {
            "IIJGIO": "*"
        },
        "Action": ["dag:GetObject"],
        "Resource": ["grn:iijgio:dag:::bucket/*"]
    }]
}

 

指定のIPアドレスに対してアクセスを制限するサンプル

以下はIPアドレス指定に基づくパーミッション付与のサンプルです。

{
   "Id": "S3PolicyIdl",
   "Statement": [
       {
           "Action": "dag:*",
           "Condition": {
               "IpAddress": {
                   "iijgio:SourceIp": "10.13.0.0/24"
               },
               "NotIpAddress": {
                   "iijgio:SourceIp": "10.13.0.2/32"
               }
           },
           "Effect": "Allow",
           "Principal": {
               "IIJGIO": "*"
           },
           "Resource": "grn:iijgio:dag:::bucket/*",
           "Sid": "IPAllow"
       },
       {
           "Action": "dag:*",
           "Condition": {
               "IpAddress": {
                   "iijgio:SourceIp": "10.12.0.0/24"
               }
           },
           "Effect": "Deny",
           "Principal": {
               "IIJGIO": "*"
           },
           "Resource": "grn:iijgio:dag:::bucket/*",
           "Sid": "IPDeny"
       }
   ],
   "Version": "2008-10-17"
}

 

指定のHTTP Refererに対してアクセスを制限するサンプル

以下はHTTP Refererに基づくパーミッション付与のサンプルです。

 {
    "Version": "2008-10-17",
    "Id": "http referer policy example",
    "Statement": [{
        "Sid": "Allow get requests referred by wwwmysitecom and mysite.com",
        "Effect": "Allow",
        "Principal": {
            "IIJGIO": "*"
        },
        "Action": "dag:GetObject",
        "Resource": "grn:iijgio:dag:::example-bucket/*",
        "Condition": {
            "StringLike": {
                "iijgio:Referer": [
                    "http://www.mysite.com/*",
                    "http://mysite.com/*"
                ]
            }
        }
    }]
}

 

Resources, Operaitons, Conditions について

バケットポリシー内にリソースを指定します。

Bucket Policy の中では、バケット, オブジェクトを参照させることができます。
リソースは、以下のようなリソース記述子(GRN)のフォーマットで記述します。

  • grn:iijgio:dag:::[resourcename]

リソース名には、アクセス対象のバケットの完全修飾名もしくはオブジェクト名を指定します。
対象がバケットの場合は、”BucketName” というように指定します。

対象がオブジェクトの場合は、”BucketName/ObjectKey” と指定します。

  • BucketName はバケット名、ObjectKey はオブジェクトのKey表しています。
  • 例) バケットが”mybucket”で、オブジェクトのKeyが”shared/developer/settings.conf”の場合は以下のようになります。
    • mybucket/shared/developer/settings.conf
ワイルドカードの指定について

Action、Principal、Resourceにはワイルドカード(アスタリスク)を指定することが可能です。

表. ワイルドカードの指定方法
要素設定方法詳細
Action中間一致での指定ができます

設定のサンプルを示します。

例1 “Action”: “dag:Get*”
Getから始まるすべてのActionを指定しています。

例2 “Action”: “dag:*Object*”
Objectを含むActionを指定しています。

Principal*を、全ユーザの意味で利用できます。

設定のサンプルを示します。

例1 “Principal”: “*”
全ユーザ(認証済み、匿名)を指定しています。

 

このような設定は無効です。
例2 “Principal”: “AAA*”

Resource*をオブジェクトのワイルドカードとして設定できます。バケットにはワイルドカードは指定できません。

設定のサンプルを示します。

例1 “Resource”: “grn:iijgio:dag:::バケット名/*”
バケット内の全オブジェクトを指定しています。

例2 “Resource”: “grn:iijgio:dag:::バケット名/*/aaa/*”
パスにaaaを含むオブジェクトを指定しています。

 

このような設定は無効です。
例3 “Resource”: “grn:iijgio:dag:::バケット名*/”

ワイルドカードを適用する際は慎重な判断をお願いします。
以下のサンプルではAction、Principalともにワイルドカードを指定しています。EffectはAllow(許可)です。
つまり、この バケットの全操作を全ユーザに許可している ことを意味しており、リスクが高い状態です。
このような設定は推奨しません。Conditionの設定やPrincipalの設定を行い、アクセス可能な範囲を限定してください。
{
     "Version": "2008-10-17",
     "Id": "policy-allow-all",
     "Statement": {
         "Sid": "allow-all",
         "Effect": "Allow",
         "Principal": {
             "IIJGIO": "*"
         },
         "Resource" , "grn:iijgio:dag:::bucket",
         "Action": "dag:*"
     }
 }
なお、ここでのサンプルは誤用防止の為に意図的にJSONとして不正な構造にしています。