2017-01-31 6 views
0

S3ユーザーがバケツのルートに新しいフォルダを作成しないようにしたいと考えています。つまり、ファイルをアップロードまたは変更するには、バケット内の既存のフォルダを使用する必要があります。これらの既存のフォルダにサブフォルダを作成することもできます。Amazon S3ポリシールートレベルのフォルダの作成を防止する

注:S3ポリシーを使用する。ユーザーは既存のフォルダを選択します。彼らにはフォルダーが割り当てられていません。

私はS3がファイルとフォルダの両方をオブジェクトとして扱っているので、これも実行できるとは思えませんが、私はコミュニティの可能性を信じています。

は、ここで私が欲しいものです:

バケツ名:テスト・バケット

  • 処置:テスト・バケットのルートにフォルダを作成します。 望ましい結果:拒否されました

  • 処置:テスト・バケットのルートでアップロードランダムなファイル。 望ましい結果:拒否されました

  • 処置:テスト・バケットの既存の "folder1の" フォルダ(テストバケット/ folder1の/ FILE1)でアップロードファイル "FILE1"。 望ましい結果:成功

  • 処置:テスト・バケットの既存の "folder1の" フォルダ内のフォルダ "サブのfolder1" を作成します(テスト・バケット/ folder1の/サブのfolder1 /)。 望ましい結果:成功

答えて

3

はあなたの概念モデルに問題が存在します。

私はS3が正しくないオブジェクト

として両方のファイルやフォルダを扱う知っています。

  • S3サービスとAPIは、フォルダの概念はありません:

    ここで正しいバージョンです。

  • S3オブジェクトは実質的に階層的ではありません。
  • S3コンソールは、フォルダの概念を持つ唯一のエンティティです。
  • S3サービスとAPIは接頭、区切り、および共通接頭辞の概念をサポートしています。

リストオブジェクトは、APIへのリクエスト指定された接頭辞を伴っている、それだけで接頭辞で始まるキーを持つオブジェクトは関係なく、接頭辞の後にそのオブジェクトのキーのいずれかの/の、返されます。

リストオブジェクト要求は接頭辞を伴うともデリミタ(通常/)であると、APIのみ要求で指定されたプレフィックスの後(後続/を持たないキープレフィックスに一致するオブジェクトを返します)をキーに入力します。これらは、「フォルダ内のファイル」に似ています。

/(指定された接頭辞の後)、その後は、彼らの次/に切り捨てられ、その接頭辞のユニークなリストにダウン合体されていない指定された接頭辞に一致するすべてのオブジェクトのキーのプレフィックスけど。これらは、「フォルダ内のフォルダ」に類似した共通の接頭辞です。

しかし、実際には、他には何も実際にはありません。

コンソールは、リストオブジェクトリクエストからの共通接頭辞をAPIに読み込み、フォルダとして表示することによって、フォルダの錯覚を作成します。

コンソールは、「フォルダを作成する」ことができますが、実際にはフォルダではなく、必要でもありません。これは単に最後の文字が/のキーを持つ空のオブジェクトです。このオブジェクトはS3の通常の操作には必要ではありませんが、「空のフォルダ」に移動して空のフォルダにファイルをアップロードできるように、便利な形で作成されています。

しかし、本当に起こっていることはこれです:

Console: "create folder foo in the root of the bucket" 
API: PUT /foo/ 
    Content-Length: 0 

Console: "click folder foo" 
API: GET /?prefix=foo/&delimiter=/ 

Console: "upload file bar.txt inside folder foo" 
API: PUT /foo/bar.txt 

...あなたは空のバケツを取り、API(ないコンソール)を使用する場合は、あなたができるだけでPUT /foo/bar.txt、あなたは正確に同じを得ますコンソールのnet結果 - 「bar.txt」を含む「foo」という名前のフォルダが表示されます。にはプレフィックスfoo/のオブジェクトがあるので、フォルダはと表示されます。オブジェクトを削除すると、フォルダは消えます。

逆に、コンソールで一番上から削除した場合は、「bar.txt」を削除してもまだフォルダが表示されるという唯一の空のオブジェクトなので、フォルダ "foo"その共通プレフィックスを持つ他のオブジェクトがない場合は、コンソールナビゲーションで

したがって、S3はファイルとフォルダの両方をオブジェクトとして扱いません。 S3 コンソールは、厳密にナビゲーションの援助として、フォルダを偽装するオブジェクトを作成します。ここでの魔法は、オブジェクトのキーが/で終わることです。一方、空のオブジェクトが存在しない場合、コンソールにはオブジェクトがフォルダ内にあるかのようにオブジェクトが表示されます。

次に、発生する問題を確認します。 S3サービスは、それが認識されておらず、実際に存在する必要のないものに対してテストするように要求することはできません。

だから、あなたが尋ねたことを正確に行うことは技術的に可能ではありません。ただし、回避策は限られているようです。主な制限は、 "フォルダが存在する必要があります"と指定することはできませんが、と指定できます。 "オブジェクトのキープレフィックスは事前定義されたパターンセットと一致する必要があります。

バケットまたはユーザーポリシーの関連する部分は、次のようになります。

"Action": "s3:PutObject", 
    "Resource": [ 
     "arn:aws:s3:::examplebucket/taxdocuments/*", 
     "arn:aws:s3:::examplebucket/personnel/*", 
     "arn:aws:s3:::examplebucket/unicorns/*" 
     ... 
    ], 

このポリシーの影響を受け、ユーザが「examplebucket」バケツの中taxdocuments /または人員/またはユニコーン/で始まるすべてのオブジェクトを作成することができるだろう、とそれらの一つせずにオブジェクトを作成することはできません接頭辞。それ以外では、これらのプレフィックスのいずれかがすべての偽のフォルダのオブジェクトキーの冒頭にある限り、 ""フォルダ内の ""フォルダ内のコンソールフォルダをいつでも作成できます。

もちろん、他のフォルダにアクセスできるようにするには、ポリシーを変更する必要があります。

また、これは動作しますが、慎重に進めるかもしれません:これはうまくいくかもしれないよう

"Resource": "arn:aws:s3:::examplebucket/?*/?*", 

は直感的にそれはそうですが、ここでは欠陥は - ?*/?*と仮定すると有効である(it seems to be)と?が0と一致しないことこの方法では*のように、ユーザーは、APIを使用して少なくとも1文字の名前で同時に何かを作成する限り、ルートに新しい(擬似)フォルダを作成することができますキーpics/cat.jpgを持つオブジェクトを作成すると、上に説明したように、「写真」フォルダがまだ存在しない場合は作成されます。コンソールからは、でルートに新しいフォルダが作成されないようにする必要がありますが、APIではそのような制限はありません。

0

あなたの丁寧な対応を感謝します。 APIとCLIの呼び出しは、空でない場合でもルートレベルのフォルダを作成し続けることができるということは間違いありません。コンソールとS3ブラウザのアクセスは、意図したとおりに動作します。それは妥協ですが、私たちが望んでいたものに最も近いものです。使用しているバケットポリシーは次のとおりです。

{ 
    "Version": "2012-10-17", 
    "Id": "Policy1486492608325", 
    "Statement": [ 

    { 
     "Sid": "Stmt1486492495770", 
     "Effect": "Allow", 
     "Principal": { 
     "*" 
     }, 
     "Action": [ 
     "s3:DeleteObject", 
     "s3:Get*", 
     "s3:List*", 
     "s3:PutObject" 
     ], 
     "Resource": [ 
     "arn:aws:s3:::test-storage", 
     "arn:aws:s3:::test-storage/*" 
     ] 
    }, 
    { 
     "Sid": "Stmt1486492534643", 
     "Effect": "Deny", 
     "Principal": { 
     "*" 
     }, 
     "Action": [ 
     "s3:DeleteObject", 
     "s3:PutObject" 
     ], 
     "NotResource": "arn:aws:s3:::test-storage/?*/?*" 
    } 
    ] 
} 
関連する問題