Nginx 常見基礎配置—獲取client ip,訪問控制(allow/deny,auth身份驗證指令,LDAP服務)

獲取請求的 IP地址

Nginx會將客戶端的 IP地址信息存放在 $ remote_ addr變量中,但在生產環境下往往會有各種代理,讓獲取真實的 IP地址變得困難重重。

獲取用戶的真實 IP地址

大部分互聯網公司的反向代理都會用到下圖所示的 CDN加速代理流程圖。用戶的請求並不直接和 Nginx打交道,而是由 CDN( Content Delivery Network,即內容分發網絡)或WAF 等其他網元設備 傳遞給 Nginx。所以在默認情況下, Nginx看到的客戶端 IP地址是經過 CDN處理後的 IP地址,這對日誌的記錄和分析、後端服務的業務邏輯都可能產生不良的影響。如果需要獲取用戶的真實 IP地址,就要用到 realip模塊。


使用realip模塊需要執行withhttp_realip_module命令,並在Nginx的http塊中配置如下代碼:

  • set_ real_ ip_ from:設置可信任的 IP地址,即白名單,之後會使用 real_ ip_ header從這些 IP地址中獲取請求頭信息。
  • real_ ip_ header:從指定的請求頭中獲取客戶端的 IP地址, IP地址是通過請求頭傳遞給 Nginx的,請求頭可能包括多個 IP地址(以逗號分隔),此時只會獲取最左邊的 IP地址並賦值給 $ remote_ addr(客戶端地址),此請求頭一般會用到 X-Forwarded-For。
  • real_ ip_ recursive:如果設置爲 on,則表示啓用遞歸搜索, realip_ module在獲取客戶端地址時,會在 real_ ip_ header指定的請求頭信息中逐個匹配 IP地址,最後一個不在白名單中的 IP地址會被當作客戶端地址。默認爲 off,表示禁用遞歸搜索,此時,只要匹配到白名單中的 IP地址,就會把它作爲客戶端地址。由此,可以獲取到用戶的真實 IP地址,如果希望獲取 CDN的節點 IP地址(有助於排查和 CDN有關的問題),可以使用 $ realip_ remote_ addr。

防止 IP地址僞造

X-Forwarded-For請求頭已經是業界的通用請求頭,有些惡意攻擊會僞造這個請求頭進行訪問,通過混淆服務器的判斷來掩藏攻擊者的真實 IP地址。但如果在 Nginx之前還有一個 CDN的話,可以使用如下方案解決這個問題。

  • 和 CDN廠商確定約束規範,使用一個新的祕密的請求頭,如 X_ Cdn_ Ip。
  • 在 CDN代理客戶端請求時,要求 CDN傳遞用戶的 IP地址,並且在建立連接的過程中,通過 CDN清除僞造的請求頭,避免透傳到後端。

注意:如果沒有使用 CDN,客戶端的請求會直接和 Nginx打交道。 Nginx可以使用自定義的請求頭傳遞用戶的 IP地址,如 proxy_ set_ header X-Real-IP $ remote_ addr。

後端服務器對 IP地址的需求

有時後端服務器也要用到用戶的客戶端 IP地址,在這種情況下,研發團隊需要在 IP地址的獲取上制定統一的規範,從規定的請求頭信息中獲取客戶端 IP地址。請求頭中的 IP地址可能有多個(經過了多次代理),它們以逗號分隔,其中第一個 IP地址就是客戶端 IP地址。

管理請求的行爲

作爲 HTTP服務,有些請求不適合暴露在公網上,那麼就需要配置訪問限制來提高安全性,此時可以通過 Nginx來限制後臺或內部的接口。

限制 IP地址的訪問

要對 IP地址的訪問進行限制,首先需要了解 allow和 deny這兩個指令, allow和 deny指令的說明見下表:


allow和 deny都可以在多個指令塊中配置,圖 3-4是指令 deny在不同指令塊中的配置效果, allow的配置亦是如此。

舉個例子,對訪問某個 location塊的 IP地址進行限制,代碼如下:

通過對訪問的 IP地址進行限制,可以阻擋可疑 IP地址對服務的攻擊,也可以確保內部接口只被內網訪問。

auth身份驗證指令

allow和 deny基於 IP地址來配置訪問限制,除此之外,還可以通過密碼驗證的方式對訪問進行限制,即通過配置 auth_ basic來設置用戶須輸入指定的用戶名和密碼才能訪問相關資源。這樣做既不用限制用戶的 IP地址,又在一定程度上保證了資源的安全。

利用 LDAP服務加強安全

如果 auth_ basic使用統一的賬號和密碼會讓請求無法對訪問的用戶進行區分,這對安全性要求較高的服務,還是不夠安全,特別是當用戶流動性較大時。此時,可以使用更精確的賬號管理接口。常用的接口是 LDAP( Lightweight Directory Access Protocol,即輕量目錄訪問協議), LDAP最基礎的功能就是讓每個用戶都使用自己的賬號和密碼。通過配置 LDAP認證,可以提升 Nginx權限配置的靈活性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章