2017-01-25 78 views
2

我有一個要由前端JavaScript應用訪問的API網關。考慮到這一點,我們不能限制訪問API密鑰(我不認爲?),所以我真的想限制它的IP地址......但我找不到一種方法來做到這一點。這甚至可能,因爲它實際上不是來自服務器?限制公共API網關到特定IP

所以該網站是在接待託管在S3用的Cloudfront。 API網關接受幾個密鑰,並打到一個lambda腳本並保存到dynamodb。如果有人想要,他們可以用價值觀來詆譭它。我只希望網絡應用程序能夠與之交談。我仍然在學習很多AWS!我希望我可以使用Shield或WAF,但它似乎是不行的。有什麼建議麼?

回答

3

當然,在您的應用程序中對任何憑據或API密鑰進行硬編碼並不是一個好主意,大多數情況下,您會找到說明如何使用Web聯合身份提供程序授權API的文章通過API網關進行呼叫(請參閱Setting Credentials in a Web Browser),但由於您使用的是CloudFront,因此還有另一種解決方法。

你可以存儲在S3上一個單獨的文件API密鑰(甚至IAM憑證),但限制其特定的IP地址訪問權限,使你的腳本就可以拿到鑰匙並進行API調用。所有其他IP地址無法檢索API密鑰。因此,不能調用API方法。

  1. 要求您的用戶只能通過CloudFront訪問您的內容。參見:Using an Origin Access Identity to Restrict Access to Your Amazon S3 Content這樣,無法使用S3 URL來檢索API密鑰。
  2. 指定要用於創建簽名URL的AWS賬戶。參見:Specifying the AWS Accounts That Can Create Signed URLs and Signed Cookies (Trusted Signers)
  3. 創建使用帶有長期有效日期自定義策略簽署的URL。參見:Creating a Signed URL Using a Custom Policy。使用自定義策略(而不是固定策略)允許您指定可以訪問您的內容的用戶的IP地址或IP地址範圍。 只要您想調用API方法,就會使用此生成的簽名URL。
  4. 選擇CloudFront的分發,並添加行爲路徑模式指向您的API密鑰文件,例如,api-key.json。確保限制瀏覽器訪問設置爲的行爲。 確保此bahavior通過將其放置在頂部的列表中有過默認行爲優先,即優先級爲0
  5. 確保限制瀏覽器訪問設置爲沒有默認緩存行爲,這將使所有內容的公共的,除了上面的API密鑰文件。

注意:如果您確定您的標識的URL被安全地存儲,沒有人可以訪問它,您可以從您的自定義策略中刪除IP地址請求,因爲這將是多餘的檢查IP地址在這種情況下。當然,這將允許您使用罐裝策略。

+0

包裝盒外。我喜歡。 –

+0

感謝您的支持。但我不確定這個或者任何解決方案是否能夠在這個設置中起作用。由於應用程序是前端,服務器IP永遠不可用於發送,我不認爲? –

+0

由於您的前端應用程序是靜態的,因此客戶端腳本會在本地計算機上執行。因此,在這種情況下,IP地址是* YOUR * IP,而不是S3/CloudFront。如果您的位置沒有靜態IP,則可以保存簽名的URL並配置您的應用程序將其作爲參數接受以檢索API密鑰文件。我希望現在這種方法很明確。 –