コンテンツにスキップ

アクセス制御(2) - ポリシーによる制御

バケットやオブジェクトに設定するACLとは別に、バケットやクラウドストレージアカウントに対する「アクセス制御ポリシー」を設定することができます。これにより、ACLでは設定できないようなアクセス制御が可能です。

「アクセス制御ポリシー」には「バケットポリシー」と「ユーザーポリシー」の2種類あります。

  • バケットポリシー: バケットに対してアクセス制御ポリシーを設定します。
  • ユーザーポリシー: クラウドストレージアカウントに対してアクセス制御ポリシーを設定します。

「バケットポリシー」は利用者用のクラウドストレージアカウントで設定可能ですが、「ユーザーポリシー」を設定するには管理者用のクラウドストレージアカウントが必要です。権限がない場合は、所属グループの利用管理者等、管理者用のクラウドストレージアカウントを持つ者に設定、あるいは権限の付与を依頼してください。

デフォルトのアクセス許可

デフォルトでは、バケットやオブジェクトにACLが特に設定されていなければ、グループ内のクラウドストレージアカウントはグループ内のデータにフルアクセス(読み書き両方)できる設定となっています。

デフォルトのまま使う場合には、以降に説明するポリシーの追加設定を行う必要はありません。特定のクラウドストレージアカウントを読み取りしかできないようする、あるバケットにアクセスできるのは一部のクラウドストレージアカウントだけにするなど、細かい制御が必要な場合には、以下を参考にポリシーを設定してください。

アクセス制御ポリシー共通の注意点

バケットポリシー、ユーザーポリシーに共通の注意点を挙げます。

  • エンドポイントは https://s3.abci.ai です。
  • 順番に関係なく、DenyルールがAllowルールよりも優先されます。同一ポリシー内でなくとも、別のポリシーにDenyルールがあればそれが優先されます。
  • ポリシーの名前(--policy-nameに指定する名前)は、大文字を用いてもエラーにはなりませんが、問題になるケースがあるため、小文字英字と数字、およびハイフン(0x2d)で構成してください。

バケットポリシーの設定

バケットポリシーではバケットに対してアクセス制御ポリシーを設定します。これにより、バケット単位でアクセス制御が可能です。

バケットポリシーの設定では、JSON形式でアクセス許可の定義を書きます。Effect, Action, Resource, Principal の組み合わせにより、何を許可するか、何を拒否するかなどを記述します。

Effect には、"Allow" または "Deny" が設定できます。許可するルールなのか、拒否するルールなのかを記します。

Action には、どのようなリクエスト(動作)に対する制限なのかを記述します。例えば、オブジェクトのダウンロードについては、s3:GetObject を指定します。ワイルドカード (s3:*) を使うこともできます。

アクションの一覧:

  • バケット
アクション 説明
s3:CreateBucket バケットの作成
s3:DeleteBucket バケットの削除
s3:ListBucket バケットの一覧を表示
s3:PutBucketACL バケットにACLを適用
s3:GetBucketACL バケットに設定されたACLの一覧を取得
  • オブジェクト
アクション 説明
s3:GetObject オブジェクトのダウンロード
s3:PutObject オブジェクトのアップロード
s3:DeleteObject オブジェクトの削除
s3:GetObjectACL オブジェクトに設定されたACLを取得
s3:PutObjectACL オブジェクトにACLを適用
s3:HeadObject オブジェクトのメタデータの取得
s3:CopyObject オブジェクトのコピー

Resource には、アクセス対象となるリソースを記述します。例えば、arn:aws:s3:::sensor8 は、sensor8 という名前のバケットを示しています。その中のオブジェクトは、arn:aws:s3:::sensor8/test.dat のように記します。ワイルドカード (*) も使うことができます。

Principal には、アクセス権を設定するユーザーを記述します。ワイルドカード (*) を指定してインターネット上の誰からでもアクセスできる(パブリックアクセス)設定を行うこともできます。 なお、NotPrincipal はサポートされていません。

Caution

誰からでも読み取りアクセスができる設定を行う場合は、下記をよくお読みいただき、データを公開することが適切であるかご確認の上、設定をお願いします。

Caution

第三者によって意図しない利用がなされる恐れがありますので、誰からでも書き込みアクセスができる設定はしないでください。

Note

バケットポリシーでは Condition がサポートされていません。そのため、例えば接続元IPアドレスによるアクセス制限といった条件を設定できません。

例1:ABCIグループ間でバケットを共有する

ABCIグループ間でバケットを共有する方法について説明します。 この例では、グループAが所有する share-bucket というバケットをグループBに所属する bbb00000.1、bbb00001.1 という2人のクラウドストレージアカウントにアクセスを許可します。

まず、アクセスを許可するアカウント bbb00000.1 と bbb00001.1 の Arn の値をグループBのユーザが aws iam get-user で確認します。 aws iam get-user を実行するには管理者用のクラウドストレージアカウントが必要です。

[username@es1 ~]$ aws --endpoint-url https://s3.abci.ai iam get-user --user-name bbb00000.1 --query User.Arn
"arn:aws:iam::987654321098:user/bbb00000.1"
[username@es1 ~]$ aws --endpoint-url https://s3.abci.ai iam get-user --user-name bbb00001.1 --query User.Arn
"arn:aws:iam::987654321098:user/bbb00001.1"

次に、グループAのユーザが以下の内容の cross-access-pc.json というファイルを作成します。説明上、cross-access-pc.json としますが、任意のファイル名を使うことができます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::987654321098:user/bbb00000.1",
                    "arn:aws:iam::987654321098:user/bbb00001.1"
                ]
            },
            "Action": [
                "s3:List*",
                "s3:Get*"
            ],
            "Resource": [
                "arn:aws:s3:::share-bucket",
                "arn:aws:s3:::share-bucket/*"
            ]
        }
    ]
}

上記では、bbb00000.1 と bbb00001.1 に share-bucket バケットに対する読み取り専用のアクセスを許可するポリシーを定義しています。

このポリシーを share-bucket バケットに適用します。

[username@es1 ~]$ aws --endpoint-url https://s3.abci.ai s3api put-bucket-policy --bucket share-bucket --policy file://cross-access-pc.json

上記により bbb00000.1 と bbb00001.1 は、share-bucket バケットにアクセスできるようになります。

バケットに適用されたポリシーを確認する場合は、aws --endpoint-url https://s3.abci.ai s3api get-bucket-policy --bucket share-bucket を実行してください。

また、ポリシーを削除する場合は、aws --endpoint-url https://s3.abci.ai s3api delete-bucket-policy --bucket share-bucket を実行してください。

ユーザーポリシーの設定

ユーザーポリシーではクラウドストレージアカウントに対してアクセス制御ポリシーを設定します。これにより、クラウドストレージアカウント単位でアクセス制御が可能です。

ユーザーポリシーの設定では、JSON形式でアクセス許可の定義を書きます。Effect, Action, Resource, Condition の組み合わせにより、何を許可するか、何を拒否するか、どのような条件で判定するかなどを記述します。

Effect, Action, Resource についてはバケットポリシーの設定を参照してください。

Condition には、条件演算子と条件キーを記述します。

条件演算子 説明
StringEquals 指定した文字列と完全一致することをチェックする文字列条件演算子です。
StringNotEquals 指定した文字列に一致しないことをチェックする文字列条件演算子です 。
StringLike 指定したパターンに一致することをチェックする文字列条件演算子です。複数文字一致のワイルドカード (*) と 1 文字一致のワイルドカード (?) を使うことができます。
StringNotLike 指定したパターンに一致しないことをチェックする文字列条件演算子です。複数文字一致のワイルドカード (*) と 1 文字一致のワイルドカード (?) を使うことができます。
DateLessThan 指定した日時よりも前であるかチェックする日付条件演算子です。日付は "2019-09-27T01:30:00Z" のような形式で記述します。
DateGreaterThan 指定した日時よりも後であるかチェックする日付条件演算子です。日付のフォーマットは DateLessThan と同じです。
IpAddress 指定のIPアドレスに一致する、または指定のアドレスレンジの範囲に含まれていることをチェックするIPアドレス条件演算子です。
NotIpAddress 指定のIPアドレスに一致しない、または指定のアドレスレンジの範囲に含まれていないことをチェックするIPアドレス条件演算子です。
条件キー 説明
aws:username 例えば aaa00000.1 のようなクラウドストレージアカウント名です。文字列条件演算子でチェックします。
aws:SourceIp 接続元IPアドレスです。IPアドレス条件演算子でチェックします。
aws:CurrentTime 現在の日時です。日付条件演算子でチェックします。
aws:UserAgent HTTPヘッダのUser-Agentです。文字列条件演算子でチェックします。偽装が可能なためアクセスの禁止などには適しませんが、例えば、特定のアプリケーション向けに用意したバケットへの誤ったアクセスを防止する対策などに使うことが考えられます。

フォーマットについては、以下の例を参考にしてください。 Condition要素は、必要なければ省略可能です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "s3:*",
            "Resource": "*",
            "Condition": {"StringLike": {"aws:UserAgent" : "aws-cli*"}}
        }
    ]
}

以降ではいくつか例を挙げて、ユーザーポリシーによるアクセス制御の方法を説明します。

例1:バケットにアクセスできるアカウントを限定する

グループ内に aaa00000.1、aaa00001.1、aaa00002.1、aaa00003.1 という4人のクラウドストレージアカウントが作られており、sensor8 というバケットがあるものとします。今回、そこにアクセスできるユーザーを、aaa00000.1 と aaa00001.1 の 2人に限定する方法を説明します。

以下の内容の sensor8.json というファイルを作成します。説明上、sensor8.json としますが、任意のファイル名を使うことができます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "s3:*",
            "Resource": ["arn:aws:s3:::sensor8", "arn:aws:s3:::sensor8/*"],
            "Condition" : { "StringNotEquals" : { "aws:username" :
                ["aaa00002.1", "aaa00003.1"]}}
        }
    ]
}

上記では aaa00002.1 と aaa00003.1 が sensor8 にアクセスを禁止するポリシーを定義しています。 Denyルールが優先されるため、他のポリシーで aaa00002.1 と aaa00003.1 に対して Allowルールが適用されていたとしても、本ポリシーを適用することでアクセスを禁止することができます。

本ポリシーをクラウドストレージに登録します。

[username@es1 ~]$ aws --endpoint-url https://s3.abci.ai iam create-policy --policy-name sensor8policy --policy-document file://sensor8.json
{
    "Policy": {
        "PolicyName": "sensor8policy",
        "CreateDate": "2019-07-30T06:22:47Z",
        "AttachmentCount": 0,
        "IsAttachable": true,
        "PolicyId": "51OFYS8BQEFTP68KT4I63AAZYHNBPHHA",
        "DefaultVersionId": "v1",
        "Path": "/",
        "Arn": "arn:aws:iam::123456789012:policy/sensor8policy",
        "UpdateDate": "2019-07-30T06:22:47Z"
    }
}

カレントディレクトリの sensor8.json の内容を sensor8policy という名前で登録しています。 Arn の値は、クラウドストレージアカウントへの適用時に必要になるので、控えておいてください。

本ポリシーを制限したいクラウドストレージアカウント、すなわち aaa00002.1 と aaa00003.1 に適用します。

[username@es1 ~]$ aws --endpoint-url https://s3.abci.ai iam attach-user-policy --policy-arn arn:aws:iam::123456789012:policy/sensor8policy --user-name aaa00002.1
[username@es1 ~]$ aws --endpoint-url https://s3.abci.ai iam attach-user-policy --policy-arn arn:aws:iam::123456789012:policy/sensor8policy --user-name aaa00003.1

--policy-arnに指定するポリシーのARNは、ポリシーを登録した時に出力されていますが、 aws --endpoint-url https://s3.abci.ai iam list-policies を実行して確認することもできます。

上記の登録により aaa00002.1 と aaa00003.1 は、sensor8 バケットにアクセスできなくなりました。aaa00000.1 と aaa00001.1 は、これまで通りアクセスできます。

クラウドストレージアカウントに適用されたポリシーを確認する場合は、aws --endpoint-url https://s3.abci.ai iam list-attached-user-policies --user-name aaa00002.1 を実行してください。

例2:バケットにアクセスできるホストを限定する

接続元IPアドレスによるアクセス制限を行う例として、ABCI内部ネットワーク(10.0.0.0/17)からのアクセスと外部ホスト 203.0.113.2 からのアクセスのどちらでもない場合に、アクセスを拒否する設定を行う方法を説明します。

以下の内容のポリシーを定義した src-ip-pc.json というファイルを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "s3:*",
            "Resource": "*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "10.0.0.0/17",
                        "203.0.113.2/32"
                    ]
                }
            }
        }
    ]
}

このポリシーをクラウドストレージに登録します。

[username@es1 ~]$ aws --endpoint-url https://s3.abci.ai iam create-policy --policy-name src-ip-pc --policy-document file://src-ip-pc.json
{
    "Policy": {
        "PolicyName": "src-ip-pc",
        "CreateDate": "2019-08-08T13:24:54Z",
        "AttachmentCount": 0,
        "IsAttachable": true,
        "PolicyId": "K9B9SFWR0JL4GSY8Z1K2441VJERSC2Q7",
        "DefaultVersionId": "v1",
        "Path": "/",
        "Arn": "arn:aws:iam::123456789012:policy/src-ip-pc",
        "UpdateDate": "2019-08-08T13:24:54Z"
    }
}

次に、グループ内の各クラウドストレージアカウントに本ポリシーを適用していきます。以下の例ではクラウドストレージアカウント aaa00004.1 にポリシーを適用しています。ポリシーのARNは、ポリシーを登録した時に出力されていますが、aws --endpoint-url https://s3.abci.ai iam list-policies を実行して確認することもできます。

[username@es1 ~]$ aws --endpoint-url https://s3.abci.ai iam attach-user-policy --policy-arn arn:aws:iam::123456789012:policy/src-ip-pc --user-name aaa00004.1

デフォルトでは、接続元IPアドレスによる制限がないため、本ポリシーを適用していないアカウントは接続元の制限なくアクセスができる状態です。グループ内のクラウドストレージアカウントをリストするには、aws --endpoint-url https://s3.abci.ai iam list-users を実行してください。