Oracle Cloud Infrastructureドキュメント

Object Storageの保護

セキュリティの推奨事項

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

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

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

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

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

データ耐久性

  • 承認されたユーザーによる誤った削除や悪意のある削除によるデータの損失を最小限に抑えるために、BUCKET_DELETEOBJECT_DELETEの権限を最小限のIAMユーザー/グループに与えることをお勧めします。 DELETE パーミッションは、テナンシとコンパートメントの管理者にのみ与えられることが望ましいです。
  • WORM (Write Once Read Many)コンプライアンスは、オブジェクトの削除や変更ができないことを要求します。 これは、OBJECT_CREATEOBJECT_READ、およびOBJECT_INSPECTアクセス許可をIAMグループに付与することで実現できます。 OBJECT_OVERWRITEは、OBJECT_DELETEと一緒に既存のオブジェクトへの変更を防ぐ権限を排除しています。

データの暗号化

  • オブジェクト・ストレージ内のすべてのデータは、AES-256を使用して安定して暗号化されます。 暗号化はデフォルトでオンになっており、オフにすることはできません。 各オブジェクトは暗号化キーで暗号化され、オブジェクト暗号化キーはマスター暗号化キーで暗号化されます。 さらに、クライアント側の暗号化を使用してオブジェクトを暗号化キーで暗号化してからオブジェクト・ストアのバケットに格納することもできます。 顧客にとって利用可能なオプションは、AWS SDK for Javaで利用できるクライアント側のオブジェクト暗号化サポートとともに、S3互換APIを使用することです。 このSDKの詳細はこちらで利用可能です(link : https://docs.cloud.oracle.com/iaas/Content/Object/Tasks/s3compatibleapi.htm)。
  • 顧客クライアント(SDKやCLIなど)とオブジェクト・ストレージの公開エンドポイント間を通過するデータは、デフォルトでTLS 1.2で暗号化されます。 FastConnectパブリック・ピアリングを使用すると、パブリック・インターネットではなく、プライベート回線を経由するオブジェクト・ストレージへのオンプレミス・アクセスが可能になります。

データ整合性

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

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

    Linuxはmd5sumコマンドライン・ユーティリティを提供し、ファイルのMD5ハッシュ値を16進形式でコンピュートします。

  • Object Storageサービスは、より効率的で復元力の高いアップロード、特に大きなオブジェクトのアップロードのために、マルチパート・アップロードをサポートします。 複数パート・アップロードでは、大きなオブジェクト(Object Storageにアップロードする)を(MB単位のパーツ・サイズを指定して)小さなパーツに分割し、各パーツを個別にアップロードしてObject Storageがすべてのパーツを結合して元のオブジェクトをまとめます。 いずれかのパーツがアップロードに失敗した場合、それらのパーツだけをアップロードのために再試行する必要があり、非常に効率的なオブジェクト全体を再試行する必要はありません。 複数パート・アップロードでは、MD5ハッシュ値が各パーツごとに計算され、MD5ハッシュがすべての個々のハッシュ値に対して計算されて出力MD5値が取得されます。 複数パートのアップロードで返されるMD5値を確認するには、オフラインMD5ハッシュ計算で同じプロセスを実行する必要があります。 Object Storageへのマルチパート・アップロードのためのMD5ハッシュ値のオフライン計算用のサンプル・スクリプトがここにあります(link : 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'}}

1回書込みを有効にする、オブジェクトに対して複数の準拠を読み取る

次のポリシーは、グループBucketUsersの権限を削除してオブジェクトの削除または更新を行うことにより、WORM (Write Once、Read Many)コンプライアンスを有効にします。

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コマンド

以下の例では、環境変数$NSと$ Cはそれぞれテナンシ・ネームスペースとコンパートメントOCIDに設定されています。

パブリック・バケットを一覧表示

次のコマンドは、ネームスペース内の各バケットのパブリック・アクセス・バケットを返します。

# "public-access-type" of 'NoPublicAccess' indicates a private bucket, and 
# anything else ('ObjectRead') indicates a public bucket 
oci os bucket get -ns $NS --bucket-name $BUCKET_NAME | grep "public-access-type"

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

# list all PARs for objects in bucket $BUCKET_NAME 
oci os preauth-request list -ns $NS -bn $BUCKET_NAME