2013-09-24 108 views
1

我有一個網站從亞馬遜S3提供我們的內容。目前,我能夠從我的網站服務器/網站讀取和寫入數據到S3。 ACL權限很好 - 我擁有網站的完全權限,只需閱讀公共權限即可。針對盜鏈的S3存儲桶政策阻止了寫入

然後,我添加了一個S3桶策略來防止盜鏈。您可以在下面看到S3政策。

此策略運行良好 - 除了一個問題 - 它現在阻止來自我的網絡服務器的文件寫入請求。所以,雖然我的公共網站提供的內容很好,但當我嘗試進行文件或目錄操作(如上傳圖像或移動圖像(或目錄))時,我現在收到「拒絕訪問」錯誤。 (通過我的Web應用程序服務器,即Railo/Coldfusion)

我不知道爲什麼會發生這種情況?最初我以爲這可能是因爲我的網絡服務器和S3之間的文件讀/寫請求是通過我的IP而不是我的域名來的,但即使在添加我的IP之後,錯誤仍然存​​在。

如果我刪除該政策,一切正常工作再次。

有誰知道是什麼原因導致這個或我在這裏失蹤?謝謝

 { 
    "Version": "2008-10-17", 
    "Statement": [ 
    { 
     "Sid": "Allowinmydomains", 
     "Effect": "Allow", 
     "Principal": { 
     "AWS": "*" 
     }, 
     "Action": "s3:GetObject", 
     "Resource": "arn:aws:s3:::cdn.babeswithbraces.com/*", 
     "Condition": { 
     "StringLike": { 
      "aws:Referer": [ 
      "http://www.babeswithbraces.com/*", 
      "http://babeswithbraces.com/*", 
      "http://64.244.61.40/*" 
      ] 
     } 
     } 
    }, 
    { 
     "Sid": "Givenotaccessifrefererisnomysites", 
     "Effect": "Deny", 
     "Principal": { 
     "AWS": "*" 
     }, 
     "Action": "s3:GetObject", 
     "Resource": "arn:aws:s3:::cdn.babeswithbraces.com/*", 
     "Condition": { 
     "StringNotLike": { 
      "aws:Referer": [ 
      "http://www.babeswithbraces.com/*", 
      "http://babeswithbraces.com/*", 
      "http://64.244.61.40/*" 
      ] 
     } 
     } 
    } 
    ] 
} 
+0

如果在允許之前放置拒絕,或者完全刪除「StringNotLike」/第二個策略塊,該怎麼辦?第一個「StringLike」條件應該可以阻止任何不是來自您的域的請求。 – Brian

+0

@Brian:交換他們什麼都不做。刪除StringNotLike塊允許所有請求通過,從而使得防鏈接無效。我還在某處讀到,您必須同時擁有允許和拒絕塊,才能實現此效果,因爲它們都處於同一位置。 – Cheeky

回答

2

當您使用存儲桶策略時,拒絕總是會覆蓋授權。由於您拒絕所有帳戶(包括已通過身份驗證的用戶)的存儲桶政策對GetObject的訪問權限與特定引薦來源列表不符,因此您的應用會產生Access denied錯誤。

默認情況下,S3中的對象將其ACL設置爲私有。如果您的存儲桶存在這種情況,則您的存儲桶策略中不需要有AllowDeny規則。只要有一個Allow條件就足以允許匿名用戶與某些特定的引用者匹配,即允許訪問存儲桶中的對象。

在上述情況下,你的水桶政策應該是這樣的:

{ 
    "Id": "Policy1380565362112", 
    "Statement": [ 
    { 
     "Sid": "Stmt1380565360133", 
     "Action": [ 
     "s3:GetObject" 
     ], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3:::cdn.babeswithbraces.com/*", 
     "Condition": { 
     "StringLike": { 
      "aws:Referer": [ 
      "http://www.babeswithbraces.com/*", 
      "http://babeswithbraces.com/*", 
      "http://64.244.61.40/*" 
      ] 
     } 
     }, 
     "Principal": { 
     "AWS": [ 
      "*" 
     ] 
     } 
    } 
    ] 
} 

如果該對象的ACL已經允許公衆訪問您可以刪除這些ACL使默認情況下私人對象或包括Deny規則在您的存儲桶政策中,並修改您從應用發送到S3的請求,以包含預期的推薦鏈接頭。目前沒有辦法在您的存儲桶政策中使用僅影響匿名請求的Deny規則。

+0

非常感謝 - 您的解釋也非常有幫助。這裏的主要問題是我的ACL權限設置爲允許公共讀取該文件夾。就像你說的那樣,一旦我拿走了這些ACL文件夾權限,然後添加了「允許」策略,它就完美了。 – Cheeky

+0

不客氣! – dcro