OCI Object Storageアクセス制御ポリシーの構成 (2024/04/25)

OCI Object Storageアクセス制御ポリシーの構成 (2024/04/25)

https://blogs.oracle.com/cloud-infrastructure/post/configuring-oci-object-storage-access-control-policies

投稿者: Ashutosh Mate | Sr. Principal Solutions Architect


Oracle Cloud Infrastructure (OCI) Identity and Access Management (IAM)ポリシーは、OCI Object Storageサービスのデータを含むOCIリソースへのアクセスを制御するために使用される強力なツールです。OCI IAMポリシーは、常に直感的に構成できるわけではないため、このブログ投稿では、OCI IAMポリシーを使用してOCI Object Storageのバケットおよびオブジェクトへのアクセスを制御する方法について説明します。正確なポリシーを設定するのに役立つサンプル・ポリシーとヒントを提供します。OCI Object Storageを保護するためのポリシーの使用に関する記事を読んで、基本的な知識を身に付けましょう。この投稿では、OCIオブジェクト・ストレージを保護するための特定のアクセス制御ポリシー設定について説明します。



概要


OCI IAMポリシーにより、OCIクラウド・リソースへの安全なアクセスが可能になります。OCI IAMポリシーでは、なんらかのアクションを実行できます。クラウド・リソースには暗黙的な拒否設定があります。つまり、ポリシーがリソースに適用されるまでは、デフォルトではアクションは許可されません。次の基本的なポリシー構文では、アクションが許可されます。


Allow <subject> to <verb> <resource-type> in <location> where <conditions>



図1: ポリシー形式


subject


subjectは、動詞で説明されているアクションを実行できるユーザーを指定します。ポリシー・サブジェクトはグループである必要があります。セキュリティ・プリンシパルまたはユーザーにはできません。したがって、サブジェクトは次の項目のいずれかである必要があります。


  • グループまたは動的グループの名前
  • グループまたは動的グループのOCID
  • 特別な「任意のユーザー」グループ(任意のセキュリティ・プリンシパル)


ポリシー・ステートメント内のサブジェクトは、グループの名前またはOCIDを使用して指定された1つ以上のカンマ区切りのグループにすることも、テナンシ内のすべてのユーザーを対象にする場合は"any-user"を指定することもできます。


構文: group <group_name> | group id <group_ocid> | dynamic-group <dynamic-group_name> | dynamic-group id<dynamic-group_ocid> | anyuser


ドメインを使用している場合、ポリシー構文は次の形式を使用します。


Allow <identity_domain_name>/<subject> to <verb> <resource-type> in <location> where <conditions>


ドメイン名はサブジェクトとともに指定する必要があります。


Syntax: group '<identity_domain_name>'/'<group_name>' | group id <group_ocid> | dynamic-group '<identity_domain_name>'/'<dynamic-group_name>' | dynamic-group id <dynamic-group_ocid> | any-user | service '<service_name>'


動詞


動詞は、サブジェクトが実行するポリシーで許可されるアクションを指定します。動詞は、「inspect」、「read」、「use」または「manage」で、ほとんどの場合最小限の能力の順になります。各動詞の正確な意味は、どのリソース・タイプとペアになっているかによって異なります。



リソース・タイプ


リソース・タイプは、ポリシーが適用されるOCIリソースを指定します。リソース・タイプは、クラスタ・ファミリ、インスタンス・ファミリ、オブジェクト・ファミリなどのリソースのファミリを定義します。リソース・タイプobject-familyは、バケットおよびオブジェクトを対象とします。オブジェクト・ストレージの動詞およびリソース・タイプの詳細は、「リソース・タイプ」を参照してください。



場所


場所には、ポリシーが適用されるコンパートメントの名前またはOCIDを使用して指定されたテナンシまたはコンパートメントを指定できます。


構文: [ tenancy | compartment <compartment_name> | compartment id <compartment_ocid> ]



条件


条件では、1つ以上の条件を指定できます。論理ORまたはANDに対して複数の条件を指定して"any"または"all"を使用します。


単一の条件の構文: variable = | != value


複数の条件の構文: any | all {<condition>、<condition>、...}


特定のリージョンに条件を適用できます。特定のリージョンまたは可用性ドメインへのアクセス権を付与するポリシーを作成するには、request.regionまたはrequest.ad変数を条件とともに使用します。ポリシーに条件を追加する場合、複数の変数がサポートされます。


詳細は、「すべてのリクエストの一般的な変数」を参照してください。オブジェクト・ストレージおよびアーカイブ・ストレージに固有の詳細は、オブジェクト・ストレージ、アーカイブ・ストレージおよびデータ転送の詳細を参照してください。



ポリシーの設定


Oracle Cloudコンソールでポリシー・ビルダーを使用するには、「アイデンティティ」に移動して「ポリシー」、「ポリシーの詳細」の順に選択し、IAMポリシーを構成します。


図2: Oracle CloudコンソールでのIAMポリシーの作成



図3: OCIポリシー・ビルダー


詳細な権限、ソースIPアドレスを使用してポリシー内のアクセスをスコープ設定する方法、および時間によるアクセスを制限する方法の例は、詳細ポリシー機能を参照してください。



Object Storageポリシーの例


次のポリシーの例は、ポリシーがどのように機能するか、共通ポリシーの例およびObject Storageのポリシー参照を示しています:


汎用テナンシ全体のポリシー


次の例は、Object Storageの使用を開始するための概要レベルのポリシーを示しています。


/* Allow admins to manage buckets & objects in tenancy */

Allow group ObjectAdmins to manage buckets in tenancy

Allow group ObjectAdmins to manage objects in tenancy

/* Service policy to allow object storage service to act on behalf of user */

  Allow service objectstorage-<region_identifier> to manage object-family in compartment <compartment_name>

/* To allow OS service to use customer keys in encrypted buckets.*

  Allow service objectstorage-<region> to use keys in tenancy 

/* To allow object storage service in multiple regions to use keys */

  allow service objectstorage-us-ashburn-1, objectstorage-us-phoenix-1to use keys in compartment ABC


特定のユーザーに対するコンパートメント全体のポリシー


次の例を使用して、バケットおよびオブジェクトに対するポリシーをコンパートメントレベルで、または特定のバケットタグまたは特定の操作を介して設定します。


/* Let group of users read or write to a particular bucket in a compartment*/

  Allow group ObjectWriters to read buckets in compartment ABC

  Allow group ObjectWriters to manage objects in compartment ABC

  where all {target.bucket.name= 'BucketA', any {request.permission= 'OBJECT_CREATE', request.permission='OBJECT_INSPECT'}}

/* Limit write access by bucket tag */

  Allow group ObjectWriters to read buckets in compartment ABC

  Allow group ObjectWriters to manage objects in compartment ABC

  where all {target.bucket.tag.MyTagNamespace.TagKey= 'MyTagValue' , any {request.permission= 'OBJECT_CREATE' , request.permission= 'OBJECT_INSPECT' }}

/* Let users download from particular bucket */

  Allow group ObjectReaders to read buckets in compartment ABC 

  Allow group ObjectReaders to read objects in compartment ABC where target.bucket.name= 'BucketA' 

/* Limit read access by bucket tag */ 

  Allow group ObjectReaders to read buckets in compartment ABC 

  Allow group ObjectReaders to read objects in compartment ABC where target.bucket.tag.MyTagNamespace.TagKey= 'MyTagValue'


顧客管理キーを使用するためのポリシー


次の例は、独自の暗号化キーを使用するようにポリシーを設定する方法を示しています:


/* Let users access customer data in object storage encrypted with customer managed key in any region */ 

  allow group <group_in_tenancy> to manage vaults in compartment <key_located_compartment> 

  allow group <group_in_tenancy> to manage keys in compartment <key_located_compartment> 

  allow group <group_in_tenancy> to manage key-delegate in compartment <key_located_compartment> 

  allow group <group_in_tenancy> to use object-family in compartment <key_located_compartment> 

  allow any-user to use keys in compartment <key_located_compartment> where 

  all {request.principal.type =  'service' , request.service.name = /objectstorage-*/} 


/* Let object storage service in a region use keys */ 

  Allow service objectstorage-<region_name> to use keys in compartment ABC where target.key.id =  '<key_ocid>' 


/* Let object storage service use keys in the vault */ 

  allow service objectstorage-<region_name> to use keys in compartment Compartments where target.key.id = ocid1.key.oc1........


バケットレベルの制限ポリシー


OCIでは、最小権限のプリンシパルに準拠するように、細かい粒度でポリシーを設定することをお薦めします。次の例に示すように、より多くのIAMポリシーを設定して、アクセスをさらに制限できます:


/* Restrict group access to specific buckets by name or pattern */ 


  Allow group BucketUsers to use buckets in tenancy where target.bucket.name= 'BucketFoo' 

  Allow group BucketUsers to use buckets in tenancy where target.bucket.name=/ProjectA_*/ 

/* Restrict group access to read or write objects in specific buckets */ 

  Allow group BucketUsers to read buckets in tenancy 

  Allow group BucketUsers to manage objects in tenancy 

  where all {target.bucket.name= 'BucketFoo' ,  

         any {request.permission= 'OBJECT_INSPECT' ,  

              request.permission= 'OBJECT_READ' }} 

  Allow group BucketUsers to read buckets in tenancy  

  Allow group BucketUsers to manage objects in tenancy 

    where all {target.bucket.name= 'BucketFoo' ,  

              any {request.permission= 'OBJECT_INSPECT' ,  

                   request.permission= 'OBJECT_CREATE' }} 

/* Restrict group access to read or write objects in specific buckets based on tags */ 

  Allow group BucketUsers to read buckets in tenancy 

  Allow group BucketUsers to manage objects in tenancy 

        where all {target.bucket.tag.MyTagNamespace.TagKey= 'MyTagValue' ,  

               any {request.permission= 'OBJECT_INSPECT' ,  

                    request.permission= 'OBJECT_READ' }} 

  Allow group BucketUsers to read buckets in tenancy  

  Allow group BucketUsers to manage objects in tenancy 

    where all {request.principal.group.tag.MyTagNamespace.TagKey=target.bucket.tag.MyTagNamespace.TagKey,  

              any {request.permission= 'OBJECT_INSPECT' ,  

                   request.permission= 'OBJECT_CREATE' }}

制限的なオブジェクトレベルのポリシー


OCI Object Storageは、オブジェクトレベルのアクセス制御をサポートするようになりました。次の例では、オブジェクト接頭辞またはパターンによって個々のオブジェクトまたはオブジェクトのグループに適用される詳細なポリシーを使用します。


/* Restrict access to read or write objects or groups of objects by prefix or pattern */ 

  ALLOW GROUP object-authZ-op-group-ost-object TO manage objects IN TENANCY where 

  any {target.object.name =  'ost-object-*' , request.operation =  'GetObject' } 

/* Restrict access to objects by prefix */ 

  ALLOW group test-group TO manage objects IN TENANCY where all {target.bucket.name =  'test-bucket' , target.object.name =  'prod/*' }  

/* Restrict access to a group to read only  forobjects */ 

  ALLOW group test-group TO manage objects IN TENANCY where 

    all {target.bucket.name =  'test-bucket' , target.object.name =  'prod/*' , any{request.permission= 'OBJECT_INSPECT' , request.permission= 'OBJECT_READ' }} 

/* Restrict access to a particular user to a group of objects by pattern */ 

  ALLOW any-user TO manage objects IN TENANCY where all {target.bucket.name =  'test-bucket' , target.object.name =  '*.pdf' , request.user.id= 'ocid1.user.oc1..exampleuniqueID' } 

/* Restrict resource access to a particular user */ 

  Allow any-user to read object-family in compartment ObjectStorage where request.user.id = 'ocid1.user.oc1..<user_ocid>'</user_ocid> /* Restrict access to read or write objects or groups of objects by prefix or pattern */ 

  ALLOW GROUP object-authZ-op-group-ost-object TO manage objects IN TENANCY where 

  any {target.object.name =  'ost-object-*' , request.operation =  'GetObject' } 

/* Restrict access to objects by prefix */ 

  ALLOW group test-group TO manage objects IN TENANCY where all {target.bucket.name =  'test-bucket' , target.object.name =  'prod/*' }  

/* Restrict access to a group to read only  forobjects */ 

  ALLOW group test-group TO manage objects IN TENANCY where 

    all {target.bucket.name =  'test-bucket' , target.object.name =  'prod/*' , any{request.permission= 'OBJECT_INSPECT' , request.permission= 'OBJECT_READ' }} 

/* Restrict access to a particular user to a group of objects by pattern */ 

  ALLOW any-user TO manage objects IN TENANCY where all {target.bucket.name =  'test-bucket' , target.object.name =  '*.pdf' , request.user.id= 'ocid1.user.oc1..exampleuniqueID' } 

/* Restrict resource access to a particular user */ 

  Allow any-user to read object-family in compartment ObjectStorage where request.user.id = 'ocid1.user.oc1..<user_ocid>'


ネットワーク・ソースからのアクセスの制限


OCIは、ネットワーク・ソースの作成をサポートしています。単一のネットワーク・ソースには、特定の仮想クラウド・ネットワーク(VCN)からのIPアドレス、パブリックIPアドレスまたはその両方を含めることができます。VCNを指定するには、次の例のように、許可するVCN OCIDおよびサブネットIP範囲が必要です。特定のVCNからのIPアドレスを許可するには、0.0.0.0/0を使用します。


  • パブリックIPアドレスまたはCIDRブロック: 192.0.2.143または192.0.2.0/24
  • VCN OCID: ocid1.vcn.oc1.iad.aaaaaaaaexampleuniqueID
  • サブネットのIPアドレスまたはCIDRブロック: 10.0.0.4、10.0.0.0/16


ネットワーク・ソースを作成したら、コンソールまたはAPIを介してcorpnetと入力します。条件でネットワーク・ソース変数を使用して、Object Storageへのアクセスを許可するポリシーを設定できます。


/* Restrict access from allowed IP address (by creating a Network source) */ 

  Allow group CorporateUsers to manage object-family in tenancy where request.networkSource.name= 'corpnet'


誤った削除の防止


次の例は、偶発的または意図しない操作のために問題を回避するポリシーを示しています。


/* Prevent delete of buckets & objects */ 

  Allow group BucketUsers to manage objects in tenancy 

    where request.permission!= 'OBJECT_DELETE' 

  Allow group BucketUsers to manage buckets in tenancy 

    where request.permission!= 'BUCKET_DELETE' 

/* Prevent delete of buckets & objects for specific bucket */ 

  Allow group BucketUsers to manage objects in tenancy 

    where any {target.bucket.name!= 'BucketFoo' ,  

              all {target.bucket.name= 'BucketFoo' , 

                   request.permission!= 'OBJECT_DELETE' }}


ライフサイクル管理


オブジェクト・ライフサイクル管理により、OCI Object Storageは、ユーザーにかわってオブジェクトのアーカイブや削除などのアクションを実行できます。これらのアクションを自動的に実行できるようにするには、サービスにアクセス権限が付与されている必要があります。


/* Service permission for OLM */ 

  Allow service objectstorage-<region_identifier> to manage object-family in compartment <compartment_name> 

/* More restrictive permissions */ 

  Allow service objectstorage-<region_identifier> to manage object-family in compartment <compartment_name> 

  where any {request.permission='BUCKET_INSPECT', request.permission= 'BUCKET_READ' , request.permission= 'OBJECT_INSPECT' , request.permission= 'OBJECT_UPDATE_TIER' , request.permission= 'OBJECT_DELETE' , request.permission= 'OBJECT_VERSION_DELETE' }


クロステナンシ・アクセス


1つのテナンシのユーザーは、クロステナンシ・アクセス・ポリシーを使用して、別のテナンシのObject Storageにアクセスできます。リソースにアクセスして共有するには、両方のテナンシの管理者が、アクセスおよび共有できるリソースを明示的に示す特別なポリシー・ステートメントを作成する必要があります。これらの特別なステートメントは、「define」、「endorse」、「admit」という語を使用します。


/* Source Tenancy Policy statements */ 

  Define tenancy DestinationTenancy as ocid1.tenancy.oc1..<unique_id> 

  Endorse group StorageAdmins to manage object-family in tenancy DestinationTenancy 


/* Destination Tenancy Policy statements */ 

  Define tenancy SourceTenancy as ocid1.tenancy.oc1..<unique_id> 

  Define group StorageAdmins as ocid1.group.oc1..<unique_id> 

  Admit group StorageAdmins of tenancy SourceTenancy to manage object-family in tenancy  

/* More restrictive policy  for compartment within tenancy */ 

  Define tenancy SourceTenancy as ocid1.tenancy.oc1..<unique_id> 

  Define group StorageAdmins as ocid1.group.oc1..<unique_id> 

  Admit group StorageAdmins of tenancy SourceTenancy to manage object-family in compartment SharedBuckets


ヒント


OCIでIAMポリシーを使用する際は、次のヒントを考慮してください。


  • OCI IAMポリシーでは、拒否アクションはサポートされていません。"allow"アクションのみがサポートされています。デフォルトでは、すべてが拒否されます。
  • すべてのグループのすべてのユーザーのみに適用されるポリシーのサブジェクトとして「any-user」を使用します。
  • 一部のポリシーではnameまたはOCIDの使用が許可されていますが、キーワードは異なる必要があります。たとえば、<group-name>で"group"を使用し、<group-OCID>で"group id"を使用できます。グループを使用せずにOCIDを指定すると、エラーが発生します。
  • ユーザーがアクセス権に問題がある場合は、そのユーザーがポリシーでアクセス権を付与されているグループに属していることを確認します。
  • ポリシーに記載されているコンパートメント名が正しくないか、大文字と小文字が正しくない場合があります。ポリシー・ステートメントを確認して、正しい名前が使用されていることを確認します。
  • OCIバケットはリージョナルです。よくある間違いは、別のリージョンのバケットへのアクセスを試行することです。バケットが存在するOCIリージョンにサブスクライブしていることを確認します。



まとめ


このブログ投稿の例をガイダンスとして使用して、OCI Object Storageリソースを使用および保護するためにOCI IAMポリシーを正しく設定してください。ポリシー構文の特定の側面の詳細は、ポストに埋め込まれたOCIドキュメントへのリンク、または最後にリンクされたドキュメントへのリンクを使用します。Oracle Cloudコンソールのポリシー・ビルダーを使用して、ポリシーを作成し、エラーを解決します。


OCI IAMポリシー、構文、Object Storageポリシー、共通ポリシーの例などを理解するには、次のOracle Cloud Infrastructureドキュメント・リソースの次のリソースを参照してください:

コメント

このブログの人気の投稿

Oracle RACによるメンテナンスのためのドレインとアプリケーション・コンティニュイティの仕組み (2023/11/01)

Oracle Cloud Infrastructure Secure Desktopsを発表: デスクトップ仮想化のためのOracleのクラウドネイティブ・サービス (2023/06/28)

新しいOracle Container Engine for Kubernetesの機能強化により、大規模なKubernetesがさらに簡単になりました (2023/03/20)