StorageGRID Webscaleシステムには、バケットとそれらのバケット内のオブジェクトへのアクセスを制御するのに使用できるS3 REST APIポリシー言語のサブセットが実装されています。
これらの要素を使用して、次の構文に従って権限を指定するポリシー ステートメントが構築されます。<Effect>を付与して、<Condition>に該当する場合に<Principal>に<Resource>に対する<Action>の実行を許可または拒否します。
ポリシーの各要素の説明を次に示します。
要素 | 説明 |
---|---|
Sid | Sid要素はオプションです。Sidはユーザに対する説明としてのみ使用されます。StorageGRID Webscaleシステムに格納はされますが、システムで解釈されません。 |
Effect | Effect要素では、指定した処理を許可するか拒否するかを指定します。Action要素でサポートされるキーワードを使用して、バケットまたはオブジェクトで許可(または拒否)する処理を指定する必要があります。 |
Principal / NotPrincipal | ユーザ、グループ、またはアカウントを指定して、特定のリソースへのアクセスや特定の処理の実行を許可できます。要求にS3の署名が含まれていない場合は、ワイルドカード文字(*)をプリンシパルとして指定することで匿名アクセスが許可されます。デフォルトでは、アカウントが所有するリソースへのアクセスはrootアカウントにのみ許可されます。 Principal要素を指定する必要があるのはバケット ポリシーだけです。グループ ポリシーの場合は、ポリシーが関連付けられたグループが暗黙的にプリンシパルになります。 |
Resource / NotResource | Resource要素では、バケットおよびオブジェクトを指定します。Uniform Resource Name(URN)を使用してリソースを指定して、バケットやオブジェクトに対する権限を許可または拒否することができます。 |
Action / NotAction | 権限はAction要素とEffect要素の2つで構成されます。グループがリソースを要求すると、権限に基づいてリソースへのアクセスが許可または拒否されます。権限を明示的に割り当てていなければアクセスは拒否されますが、明示的な拒否を使用して別のポリシーで付与された権限を拒否することもできます。 |
Condition | Condition要素はオプションです。ポリシーを適用する条件を示す式を作成できます。 |
s3:*Object
Resource要素では、ワイルドカード文字の「*」と「?」を使用できます。アスタリスク(*)は0文字以上の文字に一致し、疑問符(?)は任意の1文字に一致します。
Principal要素では、匿名アクセスを設定してすべてのユーザに権限を付与する場合を除き、ワイルドカード文字はサポートされません。Principalの値としてワイルドカード(*)を設定する例を次に示します。
"Principal":"*"
次に、Effect、Principal、Action、およびResourceの各要素を使用して記述したステートメントの例を示します。このバケット ポリシーのステートメントでは、Effectで「Allow」を指定して、Principalで指定したadminグループ(federated-group/admin)とfinanceグループ(federated-group/finance)に、「mybucket」という名前のバケットに対するs3:ListBucket処理とそのバケット内のすべてのオブジェクトに対するs3:GetObject処理を実行する権限を付与しています。
{ "Statement": [ { "Effect": "Allow", "Principal": { "SGWS": [ "urn:sgws:identity::27233906934684427525:federated-group/admin", "urn:sgws:identity::27233906934684427525:federated-group/finance" ] }, "Action": [ "s3:ListBucket", "s3:GetObject" ], "Resource": [ "urn:sgws:s3:::mybucket", "urn:sgws:s3:::mybucket/*" ] } ] }
バケット ポリシーのサイズの上限は20,480バイトで、グループ ポリシーのサイズの上限は5,120バイトです。
デフォルトでは、グループ ポリシーに対するすべての更新の整合性レベルは結果整合性です。グループ ポリシーが整合した状態になっても、ポリシー キャッシュのために、変更が有効になるまでさらに15分を要することがあります。
デフォルトでは、バケット ポリシーに対するすべての更新の整合性レベルも結果整合性です。ただし、バケット ポリシーの更新の整合性保証は必要に応じて変更できます。たとえば、セキュリティ上の理由から、できるだけ速やかにバケット ポリシーの変更を有効にしなければならない場合があります。
urn:sgws:s3:::bucket_name urn:sgws:s3:::bucket_name/object_key
urn:SGWS:ID::account_id:root urn:sgws:identity::account_id:user/user_name urn:sgws:identity::account_id:group/group_name urn:sgws:identity::account_id:federated-user/user_name urn:sgws:identity::account_id:federated-group/group_name
PUT Bucket policy処理のHTTP要求の本文は、charset=UTF-8でエンコードする必要があります。
次に例を示します。
"Resource": "urn:sgws:s3:::mybucket/*"
"Resource": "urn:sgws:s3:::mybucket/home/${sgws:username}/*"
使用できるポリシー変数のリストについては、ポリシーでの変数の指定を参照してください。
グループ ポリシーの作成時は、まだ存在しないバケットもリソースの値で指定することができます。
"Principal": { "SGWS": "account_id"} "Principal": { "SGWS": "identity_urn" }
"Principal": { "SGWS": "27233906934684427525" }
"Principal": { "SGWS": "urn:sgws:identity::27233906934684427525:root" }
"Principal": { "SGWS": "urn:sgws:identity::27233906934684427525:federated-user/Bob" }
"Principal": { "SGWS": "urn:sgws:identity::27233906934684427525:federated-group/Managers" }
"Principal": "*"
urn:sgws:identity::27233906934684427525:user-uuid/de305d54-75b4-431b-adb2-eb6b9e546013
グループ ポリシーの作成時は、まだ存在しないグループやユーザの名前もプリンシパルの値で指定することができます。
ポリシーでは、Action要素を使用してリソースに対する権限を許可または拒否します。ポリシーで指定できる一連の権限が用意されており、それらを「Action」要素または「NotAction」要素(除外の場合)で指定します。それぞれがS3 REST APIの特定の処理に対応しています。
権限 | S3 REST APIの処理 |
---|---|
s3:CreateBucket | PUT Bucket |
s3:DeleteBucket | DELETE Bucket |
s3:DeleteBucketMetadataNotification | DELETE Bucket metadata notification configuration |
s3:DeleteBucketPolicy | DELETE Bucket policy |
s3:GetBucketAcl | GET Bucket ACL |
s3:GetBucketConsistency | GET Bucket Consistency |
s3:GetBucketLastAccessTime | GET Bucket Last Access Time |
s3:GetBucketLocation | GET Bucket location |
s3:GetBucketMetadataNotification | GET Bucket metadata notification configuration |
s3:GetBucketNotification | GET Bucket notification |
s3:GetBucketPolicy | GET Bucket policy |
s3:GetBucketReplication | GET Bucket replication |
s3:GetBucketVersioning | GET Bucket versioning |
s3:ListAllMyBuckets | GET Service、GET Storage Usage |
s3:ListBucket | GET Bucket (List Objects)、HEAD Bucket |
s3:ListBucketMultipartUploads | List Multipart Uploads |
s3:ListBucketVersions | GET Bucket versions |
s3:PutBucketConsistency | PUT Bucket Consistency |
s3:PutBucketLastAccessTime | PUT Bucket Last Access Time |
s3:PutBucketMetadataNotification | PUT Bucket metadata notification configuration |
s3:PutBucketNotification | PUT Bucket notification |
s3:PutBucketPolicy | PUT Bucket policy |
s3:PutBucketReplication | PUT Bucket replication |
s3:PutBucketVersioning | PUT Bucket versioning |
権限 | S3 REST APIの処理 |
---|---|
s3:AbortMultipartUpload | Abort Multipart Upload |
s3:DeleteObject | DELETE Object、DELETE Multiple Objects |
s3:DeleteObjectTagging | DELETE Object Tagging |
s3:DeleteObjectVersionTagging | DELETE Object Tagging(オブジェクトの特定のバージョン) |
s3:DeleteObjectVersion | DELETE Object(オブジェクトの特定のバージョン) |
s3:GetObject | GET Object、HEAD Object |
s3:GetObjectAcl | GET Object ACL |
s3:GetObjectTagging | GET Object Tagging |
s3:GetObjectVersionTagging | GET Object Tagging(オブジェクトの特定のバージョン) |
s3:GetObjectVersion | GET Object(オブジェクトの特定のバージョン) |
s3:ListMultipartUploadParts | List Parts |
s3:PutObject | PUT Object、PUT Object - Copy、Initiate Multipart Upload、Complete Multipart Upload、Upload Part、Upload Part - Copy |
s3:PutObjectTagging | PUT Object Tagging |
s3:PutObjectVersionTagging | PUT Object Tagging(オブジェクトの特定のバージョン) |
s3:PutOverwriteObject | PUT Object、PUT Object - Copy、Complete Multipart Upload |
PutOverwriteObject権限は、オブジェクトを作成または更新する処理(PUTによる新規オブジェクトの作成処理やPUT Copyによるメタデータの更新処理など)に適用されます。この権限の設定により、オブジェクトのデータやメタデータをクライアントが上書きできるかどうかが決まります。有効な設定値は、Allow(クライアントがオブジェクトを上書きできる)とDeny(クライアントがオブジェクトを上書きできない)です。デフォルトの設定はAllowです。この権限が設定されていない場合は、Allowが設定されたものとして処理されます。
この権限がDenyに設定されている場合の動作は次のとおりです。
PutOverwriteObject権限の使用例については、例:PutOverwriteObject権限を参照してください。
条件を使用すると、要求の値に基づいてポリシーを適用できます。
条件はキーと値のペアを使用して評価されます。1つのCondition要素に複数の条件を含め、各条件に複数のキーと値のペアを含めることができます。条件ブロックの形式は次のとおりです。
Condition: { condition_type: { condition_key: condition_values
次の例では、IpAddress条件でSourceIp条件キーを使用しています。
"Condition": { "IpAddress": { "sgws:SourceIp": "54.240.143.0/24" ... }, ...
条件演算子 | 説明 |
---|---|
StringEquals | キーを文字列値と比較し、完全に一致する場合にアクセスを提供します(大文字と小文字の区別あり)。 |
StringNotEquals | キーを文字列値と比較し、完全に一致しない場合にアクセスを提供します(大文字と小文字の区別あり)。 |
StringEqualsIgnoreCase | キーを文字列値と比較し、完全に一致する場合にアクセスを提供します(大文字と小文字の区別なし)。 |
StringNotEqualsIgnoreCase | キーを文字列値と比較し、完全に一致しない場合にアクセスを提供します(大文字と小文字の区別なし)。 |
StringLike | キーを文字列値と比較し、指定された文字列と一致する場合にアクセスを提供します(大文字と小文字の区別あり)。ワイルドカード文字の「*」と「?」を 使用できます。 |
StringNotLike | キーを文字列値と比較し、指定された文字列と一致しない場合にアクセスを提供します(大文字と小文字の区別あり)。ワイルドカード文字の「*」と「?」を 使用できます。 |
NumericEquals | キーを数値と比較し、指定された値と完全に一致する場合にアクセスを提供します。 |
NumericNotEquals | キーを数値と比較し、指定された値を除くすべてにアクセスを提供します。 |
NumericGreaterThan | キーを数値と比較し、指定された値よりも大きい場合にアクセスを提供します。 |
NumericGreaterThanEquals | キーを数値と比較し、指定された値以上である場合にアクセスを提供します。 |
NumericLessThan | キーを数値と比較し、指定された値よりも小さい場合にアクセスを提供します。 |
NumericLessThanEquals | キーを数値と比較し、指定された値以下である場合にアクセスを提供します。 |
Bool | キーをブール値と比較し、指定されたブール値(trueまたはfalse)と一致する場合にアクセスを提供します。 |
IpAddress | キーを数値と比較し、指定されたIPまたはIPアドレスの範囲と一致する場合にアクセスを提供します。 |
NotIpAddress | キーを数値と比較し、指定されたIPまたはIPアドレスの範囲を除くすべてのアドレスにアクセスを提供します。 |
Null | 現在の要求のコンテキストに条件キーがあるかどうかを確認します。 |
カテゴリ | 適用される条件キー | 説明 |
---|---|---|
IPの演算子 | sgws:SourceIp | 要求の送信元のIPアドレスと比較します。バケットまたはオブジェクトの処理に使用できます。 |
リソース / アイデンティティ | sgws:username | 要求の送信者のユーザ名と比較します。バケットまたはオブジェクトの処理に使用できます。 |
S3:ListBucket および S3:ListBucketVersions権限 |
s3:delimiter | GET Bucket要求またはGET Bucket Object versions要求で指定されたdelimiterパラメータと比較します。 |
s3:max-keys | GET Bucket要求またはGET Bucket Object versions要求で指定されたmax-keysパラメータと比較します。 | |
s3:prefix | GET Bucket要求またはGET Bucket Object versions要求で指定されたprefixパラメータと比較します。 |
ポリシーで変数を使用すると、該当するポリシーの情報を設定することができます。ポリシー変数は、Resource要素とCondition要素の文字列比較で使用できます。
次の例では、Resource要素で変数${sgws:username}を使用しています。
「リソース」: 「urn:sgws:s3:::bucket-name/home/${sgws:username}/*"
次の例では、条件ブロックの条件の値で変数${sgws:username}を使用しています。
"Condition": { "StringLike": { "s3:prefix": "${sgws:username}/*" ... }, ...
変数 | 説明 |
---|---|
${sgws:SourceIp} | SourceIpキーを指定の変数として使用します。 |
${sgws:username} | usernameキーを指定の変数として使用します。 |
${s3:prefix} | サービス固有のprefixキーを指定の変数として使用します。 |
${s3:max-keys} | サービス固有のmax-keysキーを指定の変数として使用します。 |
${*} | 特殊文字です。文字「*」をリテラル文字として使用します。 |
${?} | 特殊文字です。文字「?」をリテラル文字として 使用します。 |
${$} | 特殊文字です。文字「$」をリテラル文字として使用します。 |
ポリシーで付与される権限によって、アカウントのrootユーザがロックアウトされるなど、セキュリティや継続的な運用に支障が生じることがあります。StorageGRID WebscaleのS3 REST APIの実装では、ポリシーの検証時の制限はAmazonよりも厳しくありませんが、評価時は同等の制限が適用されます。
ポリシーの説明 | ポリシーのタイプ | Amazonの動作 | StorageGRIDの動作 |
---|---|---|---|
自身に対しrootアカウントに対するすべての権限を拒否する | バケット | 有効で適用されるが、S3バケットのすべてのポリシー処理に対する権限は引き続きrootユーザ アカウントに割り当てられる | 同じ |
自身に対しユーザ / グループに対するすべての権限を拒否する | グループ | 有効で適用される | 同じ |
外部アカウントのグループに対し権限を許可する | バケット | 無効なプリンシパル | 有効だが、S3バケットのすべてのポリシー処理に対する権限をポリシーで許可すると405 Method Not Allowedエラーが返される |
外部アカウントのrootまたはユーザに対し任意の権限を許可する | バケット | 有効だが、S3バケットのすべてのポリシー処理に対する権限をポリシーで許可すると405 Method Not Allowedエラーが返される | 同じ |
すべてのユーザに対しすべての処理に対する権限を許可する | バケット | 有効だが、外部アカウントのrootおよびユーザについては、S3バケットのすべてのポリシー処理に対する権限で405 Method Not Allowedエラーが返される | 同じ |
すべてのユーザに対しすべての処理に対する権限を拒否する | バケット | 有効で適用されるが、S3バケットのすべてのポリシー処理に対する権限は引き続きrootユーザ アカウントに割り当てられる | 同じ |
プリンシパルとして新規のユーザまたはグループを指定する | バケット | 無効なプリンシパル | 有効 |
リソースとして新規のS3バケットを指定する | グループ | 有効 | 同じ |
プリンシパルとしてローカル グループを指定する | バケット | 無効なプリンシパル | 有効 |
ポリシーで非所有者アカウント(匿名アカウントを含む)にオブジェクトをPUTする権限を付与する | バケット | 有効。オブジェクトは作成者アカウントによって所有され、バケット ポリシーは適用されない。作成者アカウントは、オブジェクトのACLを使用してオブジェクトにアクセス権限を付与する必要がある | 有効。オブジェクトはバケット所有者アカウントによって所有され、 バケット ポリシーが適用される |