アクセス制御(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
を実行してください。