允許基於每個域的 IP - 解決方案驗證
背景
我有 2 個域。我需要允許某些 IP 地址如下:
- a.domain.io - 允許所有 IP
- b.domain.io - 只允許 IP 1.2.3.4
建議的解決方案
我不是基礎設施專家,但我提出了這個想法。
- Route53 將指向a.domain.io Application Load Balancer ALB-A 或指向b.domain.io作為ALB-B
- ALB-A將直接指向一個資源 ( EC2 )
- ALB-B將使用某種“防火牆”(可能是ACL 或安全組),只允許 IP 1.2.3.4 到達它,然後將流量轉發到EC2
問題
建議的解決方案是一個好的設置還是我應該完全放棄它或以某種方式對其進行調整?
2 平衡器解決方案的問題是它們中的任何一個都會不加選擇地接受任何
Host
標頭並將請求轉發到伺服器。將多個平衡器指向同一伺服器並沒有任何問題,但是如果惡意使用者知道,此配置會輕鬆繞過您的安全組設置a.example.com
——他們只需連接到 a.example.com 平衡器並註入Host: b.example.com
他們的請求,並且實例無法區分。
X-Forwarded-For
ALB向每個傳入請求添加一個 HTTP 標頭。這個header中最右邊的值代表連接客戶端的實際IP地址,不能偽造。最右邊值左側的任何地址都是由客戶端(通常是代理或腳本小子)提供的,出於您的目的,這些地址是不可信且毫無意義的。但是右邊的那個是準確的。最簡單的配置是使用單個 ALB,並且對於在實例上接受 HTTP 連接的任何東西(例如 Nginx、Apache),當
Host
標頭包含 b.example.com 但X-Forwarded-For
不以受信任的 IP結尾時,簡單地拒絕 HTTP 請求,例如 203.0.113.50。錯誤可能是403 Forbidden
,但也許更好503 Service Unavailable
。使用兩個平衡器設置和一個受安全組或 NACL 限制的平衡器,您的實例或平衡器需要阻止
b.example.com
通過a.example.com
平衡器的請求。實例不能,因為辨識哪個平衡器發送請求是不切實際的。當它們擴展或失敗(和恢復)時,它們的內部地址會發生變化。可以通過 ALB 通過
Host
標頭或路徑模式匹配來黑洞特定請求,正如我在 SF 上討論的那樣,通過創建一個沒有分配實例的虛擬目標組……所以 a.example.com 平衡器可以黑洞使用這種配置對 b.example.com 的請求。或者,您可以將 Amazon Web Application Firewall (WAF) 與 ALB 結合使用來阻止任何意外請求。無論如何,如果您打算使用 WAF,這是一個不錯的選擇。
但是…如果您確實使用 WAF,那麼您不需要兩個平衡器…您可以為兩個站點使用一個平衡器,並在 WAF 上添加規則以阻止請求,
Host: b.example.com
除非客戶端 IP 與允許的列表匹配。WAF 的唯一警告是,由於它會針對每個請求進行檢查,這意味著 WAF 中的中斷將導致您的站點中斷……因此 WAF 被設計為失敗打開。 WAF 故障意味著允許所有流量,但這種故障不太可能發生。WAF 是完全託管的,因此您無需維護任何東西。