2016-08-17 7 views
2

S3バケットポリシーを使用してバケットに一般的なアクセスを提供すると同時に、ロールポリシーを使用してロールに特定のアクセスを許可しようとしています。この役割は、バケット内のオブジェクトを処理するためにラムダ関数によって使用されます。最初のハードルで停止しています。ロールポリシーでは許可されていて、バケットポリシーで明示的に拒否されていないにもかかわらず、接頭辞 "incoming /"を持つものは取得できません。S3バケットポリシーとIAMロールの競合

役割ポリシー:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "AllowBucketPut", 
      "Effect": "Allow", 
      "Action": [ 
       "s3:PutObject" 
      ], 
      "Resource": "arn:aws:s3:::bucket-name/*" 
     }, 
     { 
      "Sid": "AllowIncomingGetDelete", 
      "Effect": "Allow", 
      "Action": [ 
       "s3:GetObject", 
       "s3:DeleteObject" 
      ], 
      "Resource": "arn:aws:s3:::bucket-name", 
      "Condition": { 
       "StringLike": { 
        "s3:prefix": "incoming/*" 
       } 
      } 
     } 
    ] 
} 

注:「:AWS:* S3 :::バケット名/入ARN」、唯一の方法を変えたようだった私も、条件を削除し、リソースへの変更を試みましたポリシーシミュレータが動作しました。別の注意: "incoming/*"接頭辞を付けたバケットからGETすると、実際にはシミュレータでは機能しません。

私は関連性のあるものがわからないため、以下のバケツポリシーの文を削除していません。 IPアドレスは省略されています。

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "AllowPublicList", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "*" 
      }, 
      "Action": "s3:ListBucket", 
      "Resource": "arn:aws:s3:::bucket-name", 
      "Condition": { 
       "StringLike": { 
        "s3:prefix": "public*" 
       } 
      } 
     }, 
     { 
      "Sid": "AllowPublicGet", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "*" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::bucket-name/public*" 
     }, 
     { 
      "Sid": "AllowPrivateList", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "*" 
      }, 
      "Action": "s3:ListBucket", 
      "Resource": "arn:aws:s3:::bucket-name", 
      "Condition": { 
       "StringLike": { 
        "s3:prefix": "private*" 
       }, 
       "IpAddress": { 
        "aws:SourceIp": [ 
         "..." 
        ] 
       } 
      } 
     }, 
     { 
      "Sid": "AllowPrivateGet", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "*" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::bucket-name/private*", 
      "Condition": { 
       "IpAddress": { 
        "aws:SourceIp": [ 
         "..." 
        ] 
       } 
      } 
     }, 
     { 
      "Sid": "AllowIncomingPut", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "*" 
      }, 
      "Action": "s3:PutObject", 
      "Resource": "arn:aws:s3:::bucket-name/incoming*", 
      "Condition": { 
       "IpAddress": { 
        "aws:SourceIp": [ 
         "..." 
        ] 
       } 
      } 
     } 
    ] 
} 

テキストの壁にお詫び申し上げます。

私の役職が接頭辞「着信/」でオブジェクトを取得できない理由はわかりません。次の操作を実行したときに

ラムダ関数は、403回のアクセス拒否を取得している:

S3.download_file(bucket, key, localfile) 

答えて

0

あなたはバケットポリシーに以下の文を追加してみてくださいことはできますか?

{ 
     "Sid": "AllowIncomingGet", 
     "Effect": "Allow", 
     "Principal": { 
      "AWS": "*" 
     }, 
     "Action": "s3:GetObject", 
     "Resource": "arn:aws:s3:::bucket-name/incoming/*", 
     "Condition": { 
      "IpAddress": { 
       "aws:SourceIp": [ 
        "..." 
       ] 
      } 
     } 
    } 
4

ドキュメント(http://docs.aws.amazon.com/AmazonS3/latest/dev/amazon-s3-policy-keys.html)によると、s3:prefix条件がListBucket操作上の接頭辞を指定するには、発信者を強制するために、唯一のs3:ListBucket APIに適用されます。 GetObject API呼び出しには当てはまりません。あなたが効果的ではありませんので、:そのための

、(「接頭辞S3」、それらの要求は、ポリシーキーが含まれていないので!)s3:prefix == ...は、任意のGET(オブジェクト)の要求と一致しないであろう条件付きGetObject上ごAllowこれらの要求をロールポリシーで許可します。バケツポリシーでその要求を許可していないようで、どこにも拒否ステートメントがないので、ラムダコードはで暗黙的に拒否されていますです。

ポリシーシミュレータで説明したとおり、"Resource": "arn:aws:s3:::bucket-name/incoming/*"のように、代わりにResourceを使用してください。

また、ポリシーを正確に指定する理由があるかもしれませんが、ちょっと変わったようです。通常は、S3関連ポリシーの"Resource"要素です。プレフィックスを記述したい場合は、ちょうど...incoming*の代わりに...incoming/*のようなものです。これにより、予期しない結果を防ぐことができます。たとえば、incoming/と呼ばれる「フォルダ」があり、後でincoming-top-secret/という名前のフォルダを作成したとします。あなたがポリシーを書いたやり方で、あなたは両方のプレフィックスへのアクセスを許可しています!しかし、あなたの環境の正確な詳細を本当に知らなくても、本当に必要なものを教えるのは難しいです。ちょうどあなた(そしてこれを読んでいる誰か)がこの微妙な(しかし重要な)細部を認識していることを確かめたいと思っています!

これはあなたが与えた説明に基づいて私が考えることができるすべてです。これらの変更を試しても問題が解決しない場合は、試した新しいポリシーに合わせて質問を更新してください。がんばろう!

+0

ご清聴ありがとうございます。あなたが説明したようにリソースを指定するのと同じ動作をします。私は問題を理解した。私は職場に戻ったときに更新します。 – unclemeat

関連する問題