2016-02-07 45 views
2

在Michael Hartl'Rails教程的第11.4.4節'Image upload in production'中,建議將Amazon Web Services S3用作雲存儲服務。在頁面底部的註釋中,作者自己將本書的這一部分定義爲「具有挑戰性」,並且還暗示它「可以不失連續性地被跳過」。AWS S3 IAM策略,用於在單個存儲桶上讀取和寫入權限

事實上,本節中最具挑戰性的部分之一是找到一個合適的IAM策略,該策略可以附加到AWS上的IAM用戶,以授予IAM用戶對S3存儲桶的讀寫權限。

我發現這在Stackoverflow是一個常見問題:請參閱例如'Trying to set up Amazon's S3 bucket: 403 Forbidden error & setting permissions'。

實際上,對於需要在單個S3存儲桶上具有讀寫權限的應用程序,Amazon Web Services's solution不起作用,試圖上傳圖像的用戶會從Heroku的AWS服務器收到403禁止狀態。

預定義的'AmazonS3FullAccess'策略確實可行,但不應將其視爲最終解決方案,因爲向IAM用戶授予太多權限並因此授予應用程序不是必需的,而且我想也可以是一個安全漏洞。

什麼是正確的IAM政策?

回答

5

如果'AmazonS3FullAccess'策略有效,那麼肯定會有一些對於應用程序工作至關重要的操作。

除了ListBucketPutObjectGetObjectDeleteObject行動,其存在似乎是合乎邏輯的,我發現PutObjectAcl也是必要的。

從AWS的Access Control List (ACL) Overview

「亞馬遜S3訪問控制列表(ACL)可以管理到水桶和對象的訪問每個桶和對象具有連接到它的子資源的ACL它定義該AWS。帳戶或組將被授予訪問權限和訪問類型當收到針對資源的請求時,Amazon S3會檢查相應的ACL以驗證請求者是否具有必要的訪問權限當您創建存儲桶或對象時,Amazon S3會創建一個默認ACL,授予資源所有者完全控制資源「

此外,從documentation on 'PutObjectAcl'

「此PUT操作的實現使用acl子資源爲存儲桶中已經存在的對象設置訪問控制列表(ACL)權限......對象的ACL設置爲對象版本級別。默認情況下,PUT設置當前版本的對象的ACL。「

我找不到解釋在亞馬遜論壇my request of support爲什麼PutObjectAcl是必要的,但從我的理解可能創建ACL的操作對象是第一次將對象上傳到存儲桶中,並且應該由進行上載的應用程序(或IAM用戶)明確請求。您可以在上述亞馬遜論壇討論和以下內容中找到我的政策副本:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Action": [ 
     "s3:ListBucket" 
     ], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3:::<bucket-name>" 
    }, 
    { 
     "Action": [ 
     "s3:DeleteObject", 
     "s3:GetObject", 
     "s3:PutObject", 
     "s3:PutObjectAcl" 
     ], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3:::<bucket-name>/*" 
    } 
    ] 
} 

請考慮您的存儲桶名稱的選擇Heroku's suggestions:避免例如標點符號。

+1

你在's3:PutObject'後面缺少一個'''',並且出現AWS約束也需要'Principal'和value。 – Jasper33

+1

感謝您注意到缺少的逗號。我編輯了原始代碼。但是,'Principal'元素僅在存儲桶策略中相關,如文檔中所述:http://amzn.to/2nJEu7q IAM策略是用戶策略 – Asarluhi

相關問題