2010-06-22 138 views
31

我想設置一個Amazon S3帳戶,創建一個存儲桶,上傳一些數據,並且該數據將使用HTTP GET ,且基本身份驗證Amazon S3是否支持帶有基本身份驗證的HTTP請求

我知道有幾種方法獲得S3數據認證(查詢字符串等),但我希望能夠提供一個簡單的用戶名/密碼方案進行身份驗證。

這可能嗎?

+1

您可以使用[s3auth.com(http://www.s3auth.com),這是你需要什麼 – yegor256 2012-08-26 14:18:00

+0

一個免費的託管解決方案[s3auth ](http://www.s3auth.com/)絕對是解決方案。 – 2017-04-21 13:45:21

回答

10

不,這是不可能的。 您必須符合Amazons Authentication API

查看一些列出的包裝here

+1

我不認爲那篇文章聲稱你可以使用S3的基本身份驗證。 – 2011-02-04 16:47:59

+1

參見http://aws.amazon.com/s3/faqs/#How_can_I_control_access_to_my_data_stored_on_Amazon_S3 – 2011-02-04 16:49:00

0

我來自AdroitLogic。關於鏈接的文章,它展示了UltraESB如何放置在您的客戶端和Amazon S3之間以驗證您的請求。如果需要,它可以創建一個「代理」服務,它將接受客戶端的基本身份驗證,並按照Amazon S3的要求發送憑證。這可以以微不足道的方式完成,並且會隱藏客戶的任何複雜性。

20

你可以自己開發它作爲一個Web應用程序或現有應用程序的一部分。它將使用HTTP請求,檢索其URI組件,將其轉換爲S3對象名稱並使用getObject()獲取其內容(使用可用的S3 SDK之一,例如AWS Java SDK)。

否則,您可以嘗試託管解決方案 - s3auth.com(我是開發人員)。這是一個開源項目,你可以看到這個機制是如何在one of its core classes的內部實現的。 HTTP請求由服務處理,然後重新轉換到Amazon S3內部認證方案:

http://s3auth:[email protected]/texry/packages.png

此體系結構圖說明如何項目實施。 PNG圖片從亞馬遜S3存儲桶maven.s3auth.com加載,這是不可匿名讀取的。這一形象的完整URL是

http://s3auth:[email protected]/texry/packages.png 

檢查也這篇文章:Basic HTTP Auth for S3 Buckets

+0

這正是我一直在尋找!說明最近已被澄清,並且設置起來非常簡單。 – 2012-10-11 19:57:16

+0

要澄清你的答案的最後一點,一個資源的標準URL將是'http:// maven.s3auth.com/texry/packages.png',但是一旦它被認證,它就變成'http:// s3auth:s3auth @ maven.s3auth.com/texry/packages.png',對嗎? – 2012-12-05 10:34:16

+0

什麼是「標準網址」? :)可以下載文檔的URL是'http:// s3auth:s3auth @ maven.s3auth.com/texry/packages.png',它包含我嘗試在我的賬戶中實現的驗證信息 – yegor256 2012-12-05 11:28:32

11

通過分層多AWS服務,您可以實現一些接近基本HTTP授權。

  1. 創建一個s3靜態網站。
  2. 創建CloudFront的分發服務S3的靜態網站(使用靜態網站的網址,而不是鬥名)
  3. 使用AWS WAF來創建一個規則只允許有正確的HTTP Authorization頭的請求。這將是Authorization標頭內容的刺激匹配規則。
  4. 使用Route53路由自定義域到CloudFront的分發

你現在應該有這隻能使用正確的用戶名和密碼訪問的靜態站點。

注:使用此設置的請求被阻止了403禁止代替401未授權你將不會被提示輸入您的憑據。

注意:您可以直接在s3存儲桶前創建CloudFront分配,但不能默認爲子文件夾中的根索引文件。

+1

流式傳輸向請求添加標題的建議? Chrome插件還是一些這樣的? – 2017-03-06 07:57:35

13

現在可以使用CloudFront和Lambda @ Edge(自2017年7月以來一直在us-east-1地區提供)。

  1. 創建S3桶
  2. 設置一個CloudFront的分佈在前方剷鬥,限制接入到桶,以便只有CloudFront的可以直接訪問它
  3. 創建lambda函數,這將模仿基本HTTP與瀏覽器進行身份驗證握手。將其分配給CloudFront行爲。

這裏的lambda函數: https://gist.github.com/lmakarov/e5984ec16a76548ff2b278c06027f1a4

這裏有更多細節的文章: https://medium.com/@lmakarov/serverless-password-protecting-a-static-website-in-an-aws-s3-bucket-bfaaa01b8666

3

簡短的回答是否定的,不使用基本身份驗證。但是,這是一種與基本身份驗證完全相同的方式,而且比其他列出的解決方案更容易。我相信這是安全的,但我不確定。

您可以在符合請求標題的s3存儲桶上設置條件。作爲一個例子,您可以使用useragentreferer標頭作爲與基本身份驗證中的用戶名和密碼等效的內容。通常情況下,用戶代理是瀏覽器,OS(如Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0),以及引薦是先前網頁。

下面是一個例子S3存儲策略,允許通過用戶代理匹配將對象,並獲取對象和referer(注意變化:BUCKETNAMEUSERNAMEPASSWORDAWS_REGIONFILENAME到您的詳細信息):

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "allow-username-and-password-access", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "*" 
      }, 
      "Action": [ 
       "s3:PutObject", 
       "s3:GetObject" 
      ], 
      "Resource": "arn:aws:s3:::BUCKETNAME/*", 
      "Condition": { 
       "StringEquals": { 
        "aws:UserAgent": "USERNAME", 
        "aws:Referer": "PASSWORD" 
       } 
      } 
     } 
    ] 
} 

爲了把資源桶中,你可以使用這樣的捲曲請求(注變化:BUCKETNAMEUSERNAMEPASSWORDAWS_REGION,和FILENAME):

curl --user-agent USERNAME --referer PASSWORD --upload-file "FILENAME" --request PUT "https://s3-AWS_REGION.amazonaws.com/BUCKETNAME/FILENAME" 

要獲得使用資源,你可以使用這樣的事情:再次

curl --user-agent USERNAME --referer PASSWORD "https://s3-AWS_REGION.amazonaws.com/BUCKETNAME/FILENAME" > FILENAME 

,我相信這是安全的,因爲用戶代理,如果你是引用者應該加密使用https,但請告訴我,如果它不是。

+0

非常好。這正是我一直在尋找的!我同意它是安全的。 – sudheerchamarthi 2018-03-05 05:04:06

0

我自己試圖找到解決這個問題的方法。 This這裏的帖子已經列出了他們全部。引用行:

我一直在尋找解決方案的基礎HTTP身份驗證添加到亞馬遜的S3桶的數月。有些選項涉及預先簽名的URL(僅限單個對象),使用第三方免費或商業服務(隱私問題),啓動EC2/Heroku /等。用中間件來代理請求(複雜而不是無服務器),使用page redirects and bucket policies(不安全)。

桶政策的解決方案: 我親自嘗試這樣做,它似乎完全安全的,我(除非你有辦法繞過AWS桶政策)。它只需要s3桶來操作。簡單實施。基本思想:

  1. 限制訪問整個網站,但允許公開訪問條目文件和祕密文件。
  2. 項文件secure.html一個接受用戶輸入的密碼,並重定向到保密文件
  3. 祕密文件thisisasecret重定向到主文件(爲index.html)託管網站
  4. 的實際內容
  5. 主文件main.html只允許訪問源自同一站點的請求。
  6. 所有其他內容,如CSS,JS文件會被斗的政策,這將使他們擔任當且僅當請求源於你的水桶URL限制。

使用AWS LAMBDA @邊緣:這種解決方案需要S3,AWS Lambda和AWS CloudFront的操作。基本構思:

  1. 創建一個secure.html。創建文本框以在此處輸入來自用戶的基本憑據。這個文件應該公開訪問,並且應該調用一個lambda函數。
  2. 雖然配置cloudfront會創建一個行爲,說'如果您想要訪問index.html,則需要通過Signed URL進行操作'。
  3. 就像上面一樣,創建一個桶策略,以便只有當源是您的存儲桶URL時才允許訪問js,css等文件。
+0

鏈接到Lambda解決方案:http://johnpreston.ews-network.net/posts/s3-and-cloudfront-basic-auth-hack – rahuljain1311 2017-10-03 10:08:41

0

看看這個有點相關的問題my answer here

的問題有得到沒有必要重S3登錄認證水桶對象列表。所以,從你的問題,我的回答並沒有真正解釋你的Http-request with basic username/password authentication查詢 - 而是給人一種可能性,使鬥私,仍然獲取其數據的瞭解和identity-pool (ID)一個Amazon Resource Name (ARN)(你可以考慮類似的用戶名和密碼)。當然,要獲得(ID)和(ARN),您必須執行一些設置 - 在AWS主頁as described in my 17-step answer here...中工作 - 此外,它不是GET請求的一部分,而是在Amazon提供的AWSS3框架內提供的。我希望,它仍然給您更多的選擇,你的問題;)