2015-07-13 73 views
0

假設我想創建一個簡單版本的Dropbox網站,您可以在其中註冊並對上傳,下載,刪除,重命名等文件執行操作 - 漂亮很像在this question。我想使用Amazon S3來存儲文件。 AWS SDK的這一切都非常簡單,除了一件事情:安全性。沒有AWS賬戶的Amazon S3對象的權限

顯然用戶A不應該被允許訪問用戶B的文件。我可以通過處理我的應用程序中的權限來添加「通過默默無聞的安全性」,但它不足以擁有公共文件並依賴它,因爲那麼具有正確URL的任何人都可以訪問它們應該無法訪問的文件。因此我已經搜索並查看了AWS文檔中的解決方案,但是我一直無法找到合適的解決方案。問題是我所能找到的所有東西都與基於AWS賬戶的權限有關,並且我不適合創建數千個IAM用戶。我認爲IAM用戶,鬥策略,S3的ACL,預籤網址等

可以確實在我的應用程序權限的一切,在我的桶設置權限,以便只有我的應用程序可以訪問對象解決這個問題,然後讓用戶通過我的應用程序下載文件。但是,這會增加我的應用程序的負載,我真的希望人們通過Amazon S3直接下載文件以利用其可伸縮性。

有沒有辦法可以做到這一點?爲了澄清,我想給我的應用程序中的給定用戶僅訪問Amazon S3中的對象的一個​​子集,而不創建數千個IAM用戶,這是不可擴展的。

回答

0

讓用戶在您的應用程序的幫助下下載文件,但不是您的應用程序。

將每個鏈接作爲鏈接指向應用程序的端點。當每個請求進入時,評估用戶是否有權下載文件。使用用戶的會話數據對此進行評估。

如果不是,則返回錯誤響應。

如果是這樣,預先登錄下載URL爲對象,具有非常短的期滿時間(例如5秒),並用302 Found重定向用戶的瀏覽器,並設置簽署URL在Location:響應頭。只要在簽名的URL到期前下載開始,如果在下載過程中URL到期,它將不會被中斷。

如果與您的應用程序的連接以及簽名URL的方案都是HTTPS,則可以非常低的資源成本爲任何未經授權的下載提供相當程度的安全性。

+0

在下載文件的情況下,這確實是一個好方法。我擔心的是,必須預先爲所有操作(上傳,下載,刪除,重命名,移動...)預先簽名URL纔算是矯枉過正,並不是一個好方法。然而,[你的另一個答案](http://stackoverflow.com/questions/24896743/aws-s3-presigned-url-limit#answer-24901501)讓我意識到簽署完全由AWS SDK完成,因此爲什麼生成大量的預先簽名的URL不應該成爲問題。你是否同意對於對象上的所有其他操作都採用相同的方法? – Andy0708