Oracle Cloud Infrastructureドキュメント

オブジェクト・ストレージの保護

セキュリティの推奨事項

オブジェクト・ファミリ内のリソース・タイプ(バケットおよびオブジェクト)には、IAMユーザーおよびグループの最小権限アクセス権を割り当てます。 たとえば、検査動詞には最低限の権限が付与されます。 検査により、バケットが存在するかどうかを確認でき(HeadBucket)し、コンパートメントにバケットをリスト表示します(ListBucket)。 動詞の管理では、リソースに対するすべての権限が与えられます。 IAMセキュリティ・ポリシーを作成すると、適切なバケットおよびオブジェクトのアクセス権を様々なIAMグループに付与できます。 IAMの動詞とオブジェクト・ストレージバケットおよびオブジェクトの権限の詳細は、「オブジェクト・ストレージ、アーカイブ・ストレージおよびデータ転送の詳細」を参照してください。 IAM資格証明のないユーザーには、認証前リクエスト(PAR)を使用して、オブジェクトまたはバケットへの時間バウンド・アクセスを付与することをお薦めします。

パブリック・バケット・セキュリティ・コントロール

  • パブリック・バケットは、バケット内のすべてのオブジェクトに対する認証されていない読み取りと匿名の読み取りを許可します。 パブリック・バケットを有効にする前に、パブリック・バケットの使用目的を慎重に評価してください。 事前認証済のリクエスト(PAR)を使用して、IAM資格証明がない場合にバケットまたはオブジェクトaccess(read or write)をユーザーに提供することをお薦めします。 デフォルトでは、バケットは公開アクセスなしで作成されます(アクセス・タイプはNoPublicAccessに設定されます)。
  • バケット・アクセス・タイプをObjectReadまたはObjectReadWithoutListに更新することで、既存のバケットを公開できます。 既存のバケットが意図せず(または悪意を持つ)パブリックになる可能性を最小限に抑えるには、BUCKET_UPDATE権限が最低限のIAMグループ・セットに制限されている必要があります。

事前認証リクエスト(PAR)

  • 事前認証リクエスト(PAR)は、IAMユーザーの資格証明を持たないユーザーに、バケットに格納されたオブジェクトへのアクセスを提供するメカニズムを提供します。 PARには、オブジェクトにアクセスするための適切な権限を持つIAMユーザーが、これらのオブジェクトに対する時間制限の読み取りまたは書き込みアクセスを許可するURLを作成できます。 PARの作成の詳細については、「事前認証済リクエストの使用」を参照してください。
  • PARの作成者には、PAR_MANAGE IAMの許可が必要です。 次のPARを作成できます:
    • バケットへの書込みを許可するためのバケットPAR
    • オブジェクトを読み取るためのオブジェクトPAR
    • オブジェクトを記述するためのオブジェクトPAR
    • オブジェクトを読み取りまたは書き込みするためのオブジェクトPAR。
  • PARは、バケット内のオブジェクトのリストには使用できません。
  • バケットまたはオブジェクトへのすべてのPARアクセスは、監査ログに記録されます。
  • 作成したPAR URLは書き留めておくことをお薦めします。 設計上、忘れたPAR URLを取得することはできません。 PAR URLを忘れた場合は、新しいPARを作成する必要があります。

データ耐久性

  • 認可されたユーザーまたは悪意のある削除によって誤って削除されたため、データ損失を最小限に抑えます。 最低限のIAMユーザーおよびグループのセットにBUCKET_DELETEおよびOBJECT_DELETE権限を与えることをお薦めします。 DELETE権限をテナンシおよびコンパートメント管理者にのみ付与します。
  • 書込みを何度も読み取る(WORM)コンプライアンスでは、オブジェクトを削除または変更できないことが規定されています。 WORMは、IAMグループにOBJECT_CREATEOBJECT_READおよびOBJECT_INSPECTの権限を付与することで実現します。 既存のオブジェクトを変更しないように、OBJECT_OVERWRITE権限を付与します。

データの暗号化

  • オブジェクト・ストレージのすべてのデータは、AES-256.を使用して残りのサイトで暗号化されます。 暗号化はデフォルトでオンになっており、オフにすることはできません。 各オブジェクトは暗号化キーで暗号化され、オブジェクト暗号化キーはマスター暗号化キーで暗号化されます。 また、顧客は、クライアント側暗号化を使用してオブジェクトをオブジェクト・ストレージ・バケットに格納する前に、暗号化キーでオブジェクトを暗号化できます。 カスタマが利用できるオプションは、AWS SDK for Javaで利用できるクライアント側のオブジェクト暗号化サポートとともに「Amazon S3互換性API」を使用することです。 このSDKの詳細は、「Amazon S3互換性API」を参照してください。
  • 顧客クライアント間で送信されるデータ(SDKとCLIなど)とオブジェクト・ストレージ公開エンドポイントは、デフォルトでTLS 1.2で暗号化されます。 FastConnectパブリック・ピアリングを使用すると、オブジェクト・ストレージへのオンプレミス・アクセスがパブリック・インターネットではなくプライベート・ネットワークを経由できます。

データ整合性

  • オブジェクトのデータ整合性を検証するには、オブジェクト・ストレージにアップロードされるすべてのオブジェクトに対して、MD5を使用した暗号化ハッシュが提供されます。 アップロード後にオブジェクトのオフラインMD5ハッシュがコンソールまたはAPIによって返されたハッシュ値と一致するかどうかを確認することをお薦めします。 Oracle Cloud Infrastructureでは、base64エンコーディングでオブジェクト・ハッシュ値が提供されます。 base64エンコードされたハッシュ値を16進値に変換するには、次のコマンドを使用します:

    python -c 'print "BASE64-ENCODED-MD5-VALUE".decode("base64").encode("hex")'

    Linuxでは、オブジェクトのMD5ハッシュ値を16進形式でコンピュートするmd5sumコマンドライン・ユーティリティが提供されています。

  • オブジェクト・ストレージ・サービスは、より効率的で復元力の高いアップロード、特に大きなオブジェクトのアップロードのために、マルチパート・アップロードをサポートします。 マルチパート・アップロードでは、MiBで部品サイズを指定することで、大きなオブジェクトを小さい部品に分割します。 各部品は個別にアップロードされます。 次に、オブジェクト・ストレージにより、すべての部品が結合され、元のオブジェクトが作成されます。 部品のアップロードに失敗した場合は、アップロード用に再試行する必要があるのは部品のみであり、オブジェクト全体は再試行する必要はありません。 マルチパート・アップロードでは、各パートのMD5ハッシュ値がコンピュートされ、個々のハッシュ値すべてに対してMD5ハッシュがコンピュートされて、出力MD5値が取得されます。 マルチパート・アップロードに対して返されるMD5値を検証する場合は、同じプロセスに従ってオフラインMD5ハッシュ計算を行います。 オブジェクト・ストレージへのマルチパート・アップロードのMD5ハッシュ値のオフライン計算のサンプル・スクリプトをここで使用できます(リンク) : https://gist.github.com/itemir/f5bc9fded6483cd79c89ebf4ca1cfd30).

セキュリティ・ポリシーの例

次の例では、ポリシーはテナンシにスコープ指定されます。 ただし、コンパートメント名を指定すると、テナンシの特定のコンパートメントへのスコープが縮小されます。

特定のバケットへのグループ・アクセスを制限

特定のバケット名(target.bucket.name)、正規表現と一致する正規表現(/*name/, /name* /,/*name*/)、または定義済みタグ(target.tag.definition.name)を使用して、グループごとのアクセスを特定のバケットに制限できます。

以下は、グループBucketUsersによるアクセスを特定のバケットに制限する例です。

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

このポリシーを変更すると、グループBucketUsersによるアクセスを、名前の先頭にProjectA_が付いているすべてのバケットに制限することができます。

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

修正後の(/*_ProjectA/)または部分文字列(/*ProjectA*/)についても照合できます。

特定のバケット内のオブジェクトへのグループ・アクセスを制限

次の例では、BucketFooという名前の特定のバケットから、グループBucketUsersでオブジェクトをリストしたり読み取ったりすることができます。

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'}}

次のポリシーは、オブジェクトをBucketFooにリストしたり書き込んだりすることができるように、以前のポリシーを変更します。

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'}}

このポリシーで、特定のバケットではなく正規表現またはタグを使用して、バケット・セットに対する読取りまたは書込みアクセスを制限できます。

バケットまたはオブジェクトの削除を防止

次の例では、グループBucketUsersは、削除以外のバケットとオブジェクトに対するすべてのアクションを実行できます。

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'

次の例では、特定のバケット(BucketFoo)からのオブジェクト削除をさらに制限します。

Allow group BucketUsers to manage objects in tenancy
  where any {target.bucket.name!='BucketFoo', 
             all {target.bucket.name='BucketFoo',
                  request.permission!='OBJECT_DELETE'}}

オブジェクトに対するWORM準拠の有効化

次のポリシーでは、グループBucketUsersの権限を削除してオブジェクトを削除または更新することにより、WORM準拠を有効にします。

Allow group BucketUsers to manage objects in tenancy
 where any {request.permission='OBJECT_INSPECT', 
            request.permission='OBJECT_READ', 
            request.permission='OBJECT_CREATE'}

次のポリシーでは、WORMの準拠が認められています。

Allow group BucketUsers to manage buckets in tenancy
 where any {request.permission='BUCKET_INSPECT', 
            request.permission='BUCKET_READ', 
            request.permission='BUCKET_CREATE', 
            request.permission='PAR_MANAGE'}

パブリック・バケットの構成を禁止

前の項で説明したように、BUCKET_CREATEおよびBUCKET_UDPATE権限は、バケットの作成または既存のプライベート・バケットの公開に必要です。 これらの権限を削除すると、ユーザーはバケットを作成したり、既存のバケットを公開できなくなります。

Allow group BucketUsers to manage buckets in tenancy
 where any {request.permission='BUCKET_INSPECT', 
            request.permission='BUCKET_READ', 
            request.permission='PAR_MANAGE'}

便利なCLIコマンド

次に、テナンシにパブリック・バケットまたはPARSがあるかどうかを確認するための便利なコマンドを示します。

パブリック・バケットのリスト

次のコマンドは、バケットに割り当てられたパブリック・アクセス・タイプを戻します。

# "public-access-type" of 'NoPublicAccess' indicates a private bucket, and 
# anything else ('ObjectRead') indicates a public bucket 
oci os bucket get -ns <your_namespace> --bucket-name <bucket_name> | grep "public-access-type"

バケット事前認証済リクエスト(PAR)のリスト

次のコマンドは、バケット内のオブジェクトPARのリストを戻します。

# list all PARs for objects in bucket $BUCKET_NAME 
oci os preauth-request list -ns <your_namespace> -bn <bucket_name>