6

我想將WAF放在API網關前面,並且通過(little) info我發現只有在APIG前面手動添加一個啓用了WAF的額外Cloudfront分配。這有點令人遺憾,尤其是因爲APIG現在支持本地的自定義域名,但它應該可以工作。AWS Cloudfront(帶WAF)+ API網關:如何通過Cloudfront強制訪問?

我們使解決方案的安全,而不僅僅是模糊的,我想執行這些API只能通過發行的Cloudfront進行訪問。 這樣做的最佳選擇是什麼?

  • 我一直希望能夠使用類似於S3的'Origin Access Identities',但沒有看到如何做到這一點。
  • 如果我能分配一個IAM用戶(或角色?)給的Cloudfront發行版,我可以用APIG IAM功能,但我看不出如何可以做到這一點。
  • 我可能需要APIG中的API密鑰,並將其作爲來自Cloudfront的原始自定義標頭傳遞。這可以起作用,只要我們不希望將API密鑰用於其他目的,所以我並不完全爲此感到高興。
  • 可以使用虛擬(!)自定義授權者,令牌驗證表達式實際檢查作爲Cloudfront的原始自定義標頭傳遞的祕密。應該工作,它更靈活,但有點骯髒...或不?

更好的想法?或者,也許「正確的方式」做到這一點,但我忽略了它?

+1

子彈1和2是不合格的。 CloudFront使用原始訪問身份*代替IAM角色/用戶,但僅適用於S3 ...因此子彈3和4是獲勝者。我很慚愧地承認,雖然4對我來說很明顯,但我沒有想到3,除非你想要API密鑰,否則這似乎更好。 –

回答

4

我來自API網關。

不幸的是,我們截至目前就是最好的解決方案注入的CloudFront的原點自定義頁眉和驗證,在一個自定義的認證器(選項4在你的問題)。

我們已經意識到這種限制和不太好的解決方法。我們期待在未來提供更好的WAF集成,但我們沒有ETA。

+2

您不知道這對我們有多大麻煩,請添加WAF集成API網關ASAP – sscarduzio

+3

現在您可以使用區域域名並創建面向區域域端點的自己的CloudFront分佈。您可以在CloudFront分配中設置WAF。欲瞭解更多詳情,請參閱https://aws.amazon.com/about-aws/whats-new/2017/11/amazon-api-gateway-supports-regional-api-endpoints/ – Balaji

+0

@Balaji我希望更多的信息這應該如何配置。我正在做這些事情,WAF,CloudFront,APIG和REGIONAL。我的DNS指向CloudFront,並正確阻止WAF規則之外的網絡流量。但是,我仍然可以通過4G上的手機訪問APIG終端... –

1

您可以使用自定義域名並將DNS指向帶有WAF的分發。然後直接請求原始API網關分配將不起作用。

+1

這並不完全正確,因爲自定義域名與與API本身關聯的隱藏CloudFront分配相關聯,並且自定義域名與您創建並指向DNS的CloudFront分配相關聯。全球只有一個CloudFront分配可以與給定的域名關聯。 –

+0

@Michael或多或少地拋開:我從來沒有意識到這一點,但這是很好的知道。對於記錄,嘗試這樣會導致「com.amazonaws.services.cloudfront.model.CNAMEAlreadyExistsException:您提供的一個或多個CNAME已與不同的資源相關聯(服務:AmazonCloudFront;狀態碼:409;錯誤代碼: CNAMEAlreadyExists; ...「 –

+1

@Vitalii即使它可能不起作用,我必須說我看不到你的觀點:如果你在APIG中創建一個自定義域名,你仍然可以直接通過它的https:// xxx.execute-api.eu-west-1.amazonaws.com端點,對嗎? –

1

「正確」的方法是使用自定義authorizo​​r在API網關如其他人所說。

「便宜」的方式是子彈3,api鍵。如果您試圖抵禦ddos攻擊,您可能只會提供waf - > cloudfront - > api網關。所以如果有人發現你的api網關url,並決定使用ddos而不是cloudfront,那麼定製的授權者意味着你現在正在攻擊lambda中受到衝擊。 Api網關每秒可處理超過10k個請求,默認的lambda限制爲每秒100個。即使你有亞馬遜增加你的限制,你是否願意支付每秒10k lambda的持續攻擊?

AWS代表會告訴你,「API密鑰用於鑑定,不進行身份驗證。該鍵不用於簽名的請求,並且不應該被用來作爲一種安全機制」 https://aws.amazon.com/blogs/aws/new-usage-plans-for-amazon-api-gateway/

但說實話,如果你是不要在你的lambda中做更好的事情,而不是去驗證一些巨大的混亂的字符串,爲什麼不把這個負擔和成本留給其他人。 (最大密鑰長度爲128個字符)

也許你可以有計劃的lambda函數發出一個新的API密鑰和更新CloudFront的的頭,每6小時?

如果你想使用api密鑰作爲其他的事情,那麼只需要一個api網關來源進行認證,另一個來源和api網關的一切。通過這種方式,在ddos攻擊中,您可以每秒向auth api處理10k個請求,而所有其他已登錄的客戶每秒都有10k個集體使用您的api。 Cloudfront和waf每秒可以處理100K,因此在這種情況下它們不會阻止你。

另一個需要注意的地方是,如果你在api網關後面使用lambda,你可以使用lambda @ edge並且只是一起跳過api網關。 (這不適合大多數場景,因爲lambda @ edge是嚴格限制的,但我想我會把它扔出去的。)

但最終我們需要WAF與API網關集成! :)

+0

感謝您的回覆。關於自定義授權者意味着lambda獲得所有匹配的事實:自定義授權者響應可以被緩存,所以每TTL秒只能有一個lambda請求(仍然是dummy),對吧?請參閱http://docs.aws.amazon.com/apigateway/latest/developerguide/use-custom-authorizer.html#configure-api-gateway-custom-authorization-with-console –

+0

已認證的用戶被緩存。有人提出你的系統只會爲每個請求創建隨機令牌。 https://stackoverflow.com/questions/44687654/secure-aws-api-gateway-with-lambda-integration。這個論壇也深入到這個主題:https://forums.aws.amazon.com/thread.jspa?messageID=703917 – Neo

+0

lambda是虛擬的 - 實際的檢查是由令牌驗證表達式完成的。只有當緩存未被命中並且驗證表達式成功時,纔會調用Lambda。對? –