バケットとグループのアクセス ポリシー

StorageGRID Webscaleシステムには、バケットとそれらのバケット内のオブジェクトへのアクセスを制御するのに使用できるS3 REST APIポリシー言語のサブセットが実装されています。

概要

StorageGRID Webscaleでは、Amazon Web Services(AWS)のポリシー言語構文を使用してS3テナントのデータへのアクセス ポリシーを作成できます。S3 APIのアクセス ポリシーはJSON形式で記述されます。StorageGRID Webscaleでは2種類のアクセス ポリシーがサポートされています。
  • バケット ポリシーは、GET Bucket policy、PUT Bucket policy、DELETE Bucket policyの各S3 API処理を使用して設定されます。バケット ポリシーはバケットに関連付けられ、バケットとそのオブジェクトへのバケット所有者アカウントやその他のアカウントのユーザによるアクセスを制御するために使用されます。バケット ポリシーは1つのバケットにのみ適用され、場合によっては複数のグループに適用されます。
  • グループ ポリシーは、テナント管理インターフェイスまたはテナント管理APIを使用して設定されます。グループ ポリシーはアカウントの特定のグループに関連付けられ、そのアカウントが所有する特定のリソースへのアクセスをそのグループに許可するために使用されます。グループ ポリシーは1つのグループにのみ適用され、場合によっては複数のバケットに適用されます。
StorageGRID Webscaleのバケットとグループのポリシーは、Amazonが定義している特定の文法に従って記述されます。各ポリシーは一連のステートメントからなり、それぞれのステートメントは次の要素で構成されます。
  • Sid(ステートメントID)(オプション)
  • Effect
  • Principal / NotPrincipal
  • Resource / NotResource
  • Action / NotAction
  • Condition(オプション)

これらの要素を使用して、次の構文に従って権限を指定するポリシー ステートメントが構築されます。<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要素はオプションです。ポリシーを適用する条件を示す式を作成できます。
Action要素では、ワイルドカード文字(*)を使用してすべての処理や処理のサブセットを指定できます。たとえば、次のActionの値は、s3:GetObject、s3:PutObject、s3:DeleteObjectなどの権限に一致します。
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分を要することがあります。

デフォルトでは、バケット ポリシーに対するすべての更新の整合性レベルも結果整合性です。ただし、バケット ポリシーの更新の整合性保証は必要に応じて変更できます。たとえば、セキュリティ上の理由から、できるだけ速やかにバケット ポリシーの変更を有効にしなければならない場合があります。

その場合は、PUT Bucket policy要求でConsistency-Controlヘッダーを設定するか、PUT Bucket consistency要求を使用します。この要求で整合性制御を変更する場合は、値「all」を使用して最高レベルのリードアフターライト整合性を保証する必要があります。それ以外の整合性制御値をPUT Bucket consistency要求のヘッダーで指定すると、要求は拒否されます。PUT Bucket policy要求でそれ以外の値を指定した場合は、値が無視されます。バケット ポリシーが整合した状態になっても、ポリシー キャッシュのために、変更が有効になるまでさらに8秒を要することがあります。
注:新しいバケット ポリシーを速やかに有効にするために整合性制御レベルを「all」に設定する場合は、処理が完了したあとに必ずバケットレベルの制御を元の値に戻してください。そうしないと、それ以降のすべてのバケット要求で「all」の設定が使用されます。

ポリシー ステートメントでのURNの使用

ポリシー ステートメントでは、Principal要素とResource要素で次のようにしてURNを使用します。
  • S3リソースのURNの指定には次の構文を使用します。
    urn:sgws:s3:::bucket_name
    urn:sgws:s3:::bucket_name/object_key
  • アイデンティティ リソースのURN(ユーザおよびグループ)の指定には次の構文を使用します。
    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
その他の考慮事項:
  • オブジェクト キーの一部にワイルドカードとしてアスタリスク(*)を使用できます。アスタリスクは0文字以上の文字に一致します。
  • オブジェクト キーで指定できる国際文字は、JSON UTF-8形式またはJSON \uエスケープ シーケンスを使用してエンコードする必要があります。パーセント エンコーディング(「RFC 2141 URN Syntax」を参照)はサポートされていません。

    PUT Bucket policy処理のHTTP要求の本文は、charset=UTF-8でエンコードする必要があります。

ポリシーでのリソースの指定

ポリシー ステートメントでは、Resource要素を使用して、権限を許可または拒否するバケットやオブジェクトを指定できます。
  • Resource要素はポリシーの各ステートメントに必要です。ポリシーでは、「Resource」要素または「NotResource」要素(除外の場合)でリソースを指定します。
  • リソースはS3リソースのURNで指定します。

    次に例を示します。

    "Resource": "urn:sgws:s3:::mybucket/*"
  • オブジェクト キーの一部にポリシー変数を使用することもできます。
    例:
    "Resource": "urn:sgws:s3:::mybucket/home/${sgws:username}/*"

    使用できるポリシー変数のリストについては、ポリシーでの変数の指定を参照してください。

  • グループ ポリシーの作成時は、まだ存在しないバケットもリソースの値で指定することができます。

ポリシーでのプリンシパルの指定

ポリシー ステートメントでリソースへのアクセスを許可または拒否するユーザ、グループ、またはテナント アカウントを指定するには、Principal要素を使用します。
  • グループ ポリシーのステートメントを作成する際は、そのグループがプリンシパルとみなされるため、Principal要素は指定されません。
  • Principal要素はポリシーの各ステートメントに含める必要があります(グループ ポリシーの場合は除く)。ポリシーでは、「Principal」要素または「NotPrincipal」要素(除外の場合)でプリンシパルを指定します。
  • IDまたはURNを使用してアカウントベースのアイデンティティを指定する必要があります。
    "Principal": { "SGWS": "account_id"}
    "Principal": { "SGWS": "identity_urn" }
    
  • 次の例では、テナント アカウントID 27233906934684427525を使用しています。この場合、rootアカウントとそのすべてのユーザが含まれます。
     "Principal": { "SGWS": "27233906934684427525" }
  • rootアカウントのみを指定する場合は次のようになります。
    "Principal": { "SGWS": "urn:sgws:identity::27233906934684427525:root" }
  • 特定のフェデレーション ユーザ(「Bob」)のみを指定する場合は次のようになります。
    "Principal": { "SGWS": "urn:sgws:identity::27233906934684427525:federated-user/Bob" }
  • 特定のフェデレーション グループ(「Managers」)のみを指定する場合は次のようになります。
    "Principal": { "SGWS": "urn:sgws:identity::27233906934684427525:federated-group/Managers"  }
  • 匿名プリンシパルを指定する場合は次のようになります。
    "Principal": "*"
  • Bobが組織を離れてユーザ名Bobを削除したあとに、新たに加わったBobに同じユーザ名Bobを割り当てた場合、以前に在籍していたBobに付与されていた権限が意図せずに継承されることがあります。このようなあいまいさを排除するために、ユーザ名の代わりにUUIDを使用できます。次に例を示します。
    urn:sgws:identity::27233906934684427525:user-uuid/de305d54-75b4-431b-adb2-eb6b9e546013
  • グループ ポリシーの作成時は、まだ存在しないグループやユーザの名前もプリンシパルの値で指定することができます。

ポリシーでの権限の指定

ポリシーでは、Action要素を使用してリソースに対する権限を許可または拒否します。ポリシーで指定できる一連の権限が用意されており、それらを「Action」要素または「NotAction」要素(除外の場合)で指定します。それぞれがS3 REST APIの特定の処理に対応しています。

表 1. バケットに適用される権限
権限 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
表 2. オブジェクトに適用される権限
権限 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権限の使用

PutOverwriteObject権限は、オブジェクトを作成または更新する処理(PUTによる新規オブジェクトの作成処理やPUT Copyによるメタデータの更新処理など)に適用されます。この権限の設定により、オブジェクトのデータやメタデータをクライアントが上書きできるかどうかが決まります。有効な設定値は、Allow(クライアントがオブジェクトを上書きできる)とDeny(クライアントがオブジェクトを上書きできない)です。デフォルトの設定はAllowです。この権限が設定されていない場合は、Allowが設定されたものとして処理されます。

この権限がDenyに設定されている場合の動作は次のとおりです。

重要:現在のS3ポリシーで上書きが許可されていても、PutOverwriteObject権限がDenyに設定されている場合は、オブジェクトのデータやメタデータをクライアントが上書きすることはできません。また、グリッドの[Prevent Client Modify]オプションが[Enabled]に設定されている場合は、その設定がPutOverwriteObject権限の設定よりも優先されます。

PutOverwriteObject権限の使用例については、例:PutOverwriteObject権限を参照してください。

ポリシーでの条件の指定

条件を使用すると、要求の値に基づいてポリシーを適用できます。

条件演算子は次のように分類されます。
  • 文字列
  • 数値
  • ブーリアン
  • IPアドレス
  • Nullチェック

条件はキーと値のペアを使用して評価されます。1つのCondition要素に複数の条件を含め、各条件に複数のキーと値のペアを含めることができます。条件ブロックの形式は次のとおりです。

Condition: {
     condition_type: {
          condition_key: condition_values

次の例では、IpAddress条件でSourceIp条件キーを使用しています。


  "Condition": {
    "IpAddress": {
      "sgws:SourceIp": "54.240.143.0/24"
		...
},
		...
表 3. サポートされる条件演算子
条件演算子 説明
StringEquals キーを文字列値と比較し、完全に一致する場合にアクセスを提供します(大文字と小文字の区別あり)。
StringNotEquals キーを文字列値と比較し、完全に一致しない場合にアクセスを提供します(大文字と小文字の区別あり)。
StringEqualsIgnoreCase キーを文字列値と比較し、完全に一致する場合にアクセスを提供します(大文字と小文字の区別なし)。
StringNotEqualsIgnoreCase キーを文字列値と比較し、完全に一致しない場合にアクセスを提供します(大文字と小文字の区別なし)。
StringLike キーを文字列値と比較し、指定された文字列と一致する場合にアクセスを提供します(大文字と小文字の区別あり)。ワイルドカード文字の「*」と「?」を 使用できます。
StringNotLike キーを文字列値と比較し、指定された文字列と一致しない場合にアクセスを提供します(大文字と小文字の区別あり)。ワイルドカード文字の「*」と「?」を 使用できます。
NumericEquals キーを数値と比較し、指定された値と完全に一致する場合にアクセスを提供します。
NumericNotEquals キーを数値と比較し、指定された値を除くすべてにアクセスを提供します。
NumericGreaterThan キーを数値と比較し、指定された値よりも大きい場合にアクセスを提供します。
NumericGreaterThanEquals キーを数値と比較し、指定された値以上である場合にアクセスを提供します。
NumericLessThan キーを数値と比較し、指定された値よりも小さい場合にアクセスを提供します。
NumericLessThanEquals キーを数値と比較し、指定された値以下である場合にアクセスを提供します。
Bool キーをブール値と比較し、指定されたブール値(trueまたはfalse)と一致する場合にアクセスを提供します。
IpAddress キーを数値と比較し、指定されたIPまたはIPアドレスの範囲と一致する場合にアクセスを提供します。
NotIpAddress キーを数値と比較し、指定されたIPまたはIPアドレスの範囲を除くすべてのアドレスにアクセスを提供します。
Null 現在の要求のコンテキストに条件キーがあるかどうかを確認します。
表 4. サポートされる条件キー
カテゴリ 適用される条件キー 説明
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を使用してオブジェクトにアクセス権限を付与する必要がある 有効。オブジェクトはバケット所有者アカウントによって所有され、 バケット ポリシーが適用される