2016-05-24 4 views
1

Ich habe einen Amazon S3-Bucket mybucket und möchte nur den Zugriff auf Inhalte in einem bestimmten verschachtelten Ordner (oder in S3-Termini mit einem bestimmten "Präfix") ermöglichen.Amazon S3: Wie kann der Zugriff auf einen bestimmten Pfad nur für einen bestimmten Referer zugelassen werden?

Ich habe versucht, die folgende S3-Bucket-Richtlinie, aber es funktioniert nicht. Nachdem ich die Bedingung hinzugefügt hatte, fing ich an, Zugriff verweigert Fehler im Browser zu erhalten.

{ 
    "Version": "2012-10-17", 
    "Id": "Policy for mybucket", 
    "Statement": [ 
     { 
      "Sid": "Allow access to public content only from my.domain.com", 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::mybucket/public/content/*", 
      "Condition": { 
       "StringLike": { 
        "aws:Referer": [ 
         "http://my.domain.com/*" 
        ] 
       } 
      } 
     } 
    ] 
} 

Wie sollte die Richtlinie aussehen, um dies zu erreichen?

+0

definieren Diese Richtlinie ist gültig. –

+0

Hallo @ Michael-sqlbot, habe ich meine Aussage geklärt. Um ehrlich zu sein, debugge ich das immer noch. Ich erhalte anscheinend den Referer, zumindest bei Cloudfront, der den Inhalt in meinem Bucket verteilt (Logs on S3, wo noch nicht verfügbar). Das Verhalten ist wirklich seltsam, wenn ich die Bedingung mit dem Referer erhalte, bekomme ich Zugriff verweigert Fehler. – Visionscaper

+0

CloudFront leitet den Referer standardmäßig nicht an S3 weiter, und es ist ein bisschen schwierig, dies zu tun - und das ist wahrscheinlich eine schlechte Idee, da es die Trefferquote im Cache beeinträchtigt (CloudFront würde den Cache überprüfen eine Antwort für die gleiche URL * und * Referer, so dass jeder mögliche Referer eine eigene zwischengespeicherte Kopie hätte, andernfalls würde die Anfrage an S3 gesendet werden, um den Referer zu validieren). Verwenden Sie eine CloudFront-Herkunftszugangsidentität, damit CloudFront auf den Bucket zugreifen kann, und die Verwendung [AWS Web Application Firewall] (https://aws.amazon.com/waf/), um den Zugriff auf CloudFront zu steuern. –

Antwort

1

Sie müssen die Richtlinie in zwei Anweisungen aufteilen. Ein Zugriff auf den Ordner (Präfix) zu ermöglichen, und ein Zugriff zu verweigern, wenn der Referer nicht einer der weißen Liste Domains ist: „funktioniert nicht“

{ 
    "Version": "2012-10-17", 
    "Id": "Policy for mybucket", 
    "Statement": [ 
     { 
      "Sid": "Allow access to public content", 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::mybucket/public/content/*" 
     }, 
     { 
      "Sid": "Deny access to public content when not on my.domain.com", 
      "Effect": "Deny", 
      "Principal": "*", 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::mybucket/public/content/*", 
      "Condition": { 
       "StringNotLike": { 
        "aws:Referer": [ 
         "http://my.domain.com/*" 
        ] 
       } 
      } 
     } 
    ] 
} 
+0

Das hat für mich funktioniert. Ich habe Cloudfront bereits verwendet und den Bucket eingeschränkt, sodass ich den zweiten Teil der Richtlinie nicht benötigte. –

+0

Hmmm ... Ich glaube, ich habe zu früh gesprochen. Ich habe am Ende ein separates Verhalten in meiner Cloudfront-Distribution hinzugefügt, damit dies funktioniert. –

Verwandte Themen