摘要:隨著企業(yè)數(shù)字化和互聯(lián)網(wǎng)發(fā)展,企業(yè)內(nèi)部系統(tǒng)訪問互聯(lián)網(wǎng)服務(wù)的需求日益增長(zhǎng),相較于直接開放互聯(lián)網(wǎng)訪問權(quán)限,正向代理系統(tǒng)具有更好的安全性和管控能力。然而,隨著在線服務(wù)逐漸HTTPS化,代理系統(tǒng)又缺少服務(wù)器證書,設(shè)計(jì)正向代理系統(tǒng)面臨著更大的困難。為應(yīng)對(duì)這一挑戰(zhàn),文章設(shè)計(jì)并實(shí)現(xiàn)了一種基于開源軟件Nginx的HTTPS正向代理系統(tǒng),在無(wú)需服務(wù)器證書的情況下實(shí)現(xiàn)了高效轉(zhuǎn)發(fā),并具備HTTPS域名端口復(fù)用、域名白名單、源IP地址訪問控制等多種功能,為企業(yè)內(nèi)部系統(tǒng)訪問互聯(lián)網(wǎng)HTTPS服務(wù)提供了安全、全面的解決方案。
關(guān)鍵詞:Nginx;正向代理;HTTPS;SNI;SSL Preread
中圖分類號(hào):TP393.08" 文獻(xiàn)標(biāo)志碼:A
作者簡(jiǎn)介:劉旻昊(1985— ),男,高級(jí)工程師,碩士;研究方向:網(wǎng)絡(luò)接入與傳輸。
0" 引言
近年來(lái),隨著企業(yè)數(shù)字化和互聯(lián)網(wǎng)服務(wù)的飛速發(fā)展,企業(yè)內(nèi)部系統(tǒng)調(diào)用互聯(lián)網(wǎng)服務(wù)的需求變得越來(lái)越頻繁和強(qiáng)烈,如何讓內(nèi)部系統(tǒng)安全、高效地訪問互聯(lián)網(wǎng)服務(wù),是眾多企業(yè)面臨的挑戰(zhàn)。如果直接開放內(nèi)部服務(wù)器的互聯(lián)網(wǎng)訪問權(quán)限,將帶來(lái)多種安全風(fēng)險(xiǎn),相比之下,正向代理系統(tǒng)能提供更好的訪問控制、流量管理和安全保障,具有明顯的優(yōu)勢(shì)。然而,隨著互聯(lián)網(wǎng)的迅猛發(fā)展,越來(lái)越多的在線服務(wù)開始采用超文本傳輸安全協(xié)議(Hypertext Transfer Protocol Secure,HTTPS)協(xié)議[1],由于HTTPS通信過程需要驗(yàn)證服務(wù)器的身份證書,而企業(yè)自身一般沒有需訪問的互聯(lián)網(wǎng)域名的證書,無(wú)法使用通用的四七層SSL代理模式解密流量,因此HTTPS的普及給企業(yè)設(shè)計(jì)正向代理系統(tǒng)帶來(lái)了更大的難度。
1" 系統(tǒng)設(shè)計(jì)思路
HTTPS正向代理系統(tǒng)的設(shè)計(jì)思路以適應(yīng)HTTPS流量代理轉(zhuǎn)發(fā)的關(guān)鍵技術(shù)選型為核心展開,基本思想是利用域名解析將內(nèi)部系統(tǒng)訪問互聯(lián)網(wǎng)接口的HTTPS加密流量引流傳輸至正向代理系統(tǒng),通過選取合適的軟件和技術(shù),以實(shí)現(xiàn)正向代理系統(tǒng)在無(wú)需服務(wù)器證書情況下能夠獲取域名信息,從而轉(zhuǎn)發(fā)至互聯(lián)網(wǎng)HTTPS接口。
1.1" 技術(shù)需求
伴隨著技術(shù)進(jìn)步、政策倡導(dǎo)和大型互聯(lián)網(wǎng)公司的推動(dòng),互聯(lián)網(wǎng)已實(shí)現(xiàn)了HTTPS的廣泛應(yīng)用,據(jù)網(wǎng)絡(luò)技術(shù)調(diào)查網(wǎng)站W(wǎng)3Techs的最新數(shù)據(jù),在其監(jiān)測(cè)的數(shù)百萬(wàn)個(gè)互聯(lián)網(wǎng)網(wǎng)站中,已經(jīng)有85.7%默認(rèn)使用了HTTPS協(xié)議[2]。HTTPS使用SSL/TLS加密技術(shù)以確保用戶與服務(wù)器之間的通信過程不受第三方的竊聽、篡改或冒充。
另一方面,正向代理系統(tǒng)作為常見的企業(yè)內(nèi)部網(wǎng)絡(luò)安全架構(gòu),代理服務(wù)器充當(dāng)企業(yè)內(nèi)部和外部網(wǎng)絡(luò)間的中介,將內(nèi)部請(qǐng)求轉(zhuǎn)發(fā)至外部服務(wù)器并將響應(yīng)返回。相比直接開放訪問外部網(wǎng)絡(luò)資源權(quán)限,正向代理系統(tǒng)在安全性上具有明顯優(yōu)勢(shì),它能集中管理和控制對(duì)外訪問流量,并加以審計(jì),更合理地分配權(quán)限,防止敏感數(shù)據(jù)泄露,還可以對(duì)經(jīng)過的流量加以控制和過濾,降低惡意軟件和網(wǎng)絡(luò)攻擊的風(fēng)險(xiǎn)。
由于HTTPS的普及,企業(yè)內(nèi)部系統(tǒng)在調(diào)用互聯(lián)網(wǎng)外部服務(wù)時(shí),通常需要直接使用HTTPS協(xié)議訪問,而且不同的系統(tǒng)需訪問多個(gè)不同的域名。此外,如果是使用第三方服務(wù)商提供的軟件開發(fā)工具包(Software Development Kit,SDK),還可能出現(xiàn)協(xié)議、域名和端口均無(wú)法更改的情況,因此,在設(shè)計(jì)一個(gè)理想、完備的HTTPS正向代理系統(tǒng)時(shí),需盡量滿足如下功能需求:(1)內(nèi)部訪問源服務(wù)器無(wú)需修改訪問域名、協(xié)議和端口;(2)支持多域名復(fù)用,即可以同時(shí)代理多個(gè)不同域名的HTTPS請(qǐng)求流量。(3)無(wú)需代理的互聯(lián)網(wǎng)域名的服務(wù)器證書。
除了功能需求外,為了提高正向代理系統(tǒng)的安全性,還須進(jìn)一步考慮如下2個(gè)方面的安全需求:(1)域名白名單控制,按照權(quán)限最小化原則,正向代理系統(tǒng)應(yīng)能實(shí)現(xiàn)對(duì)代理域名的精準(zhǔn)控制,除了確需訪問的域名外,內(nèi)部服務(wù)器使用其他互聯(lián)網(wǎng)域名訪問正向代理系統(tǒng)時(shí),不應(yīng)被順利通過。(2)源IP地址訪問控制,在域名白名單的基礎(chǔ)上,可以進(jìn)一步收縮訪問權(quán)限,除了允許的內(nèi)部服務(wù)器IP地址外,正向代理系統(tǒng)不允許其他服務(wù)器訪問。
1.2" 關(guān)鍵技術(shù)點(diǎn)研究
1.2.1" 代理軟件選型
代理軟件選型是整個(gè)正向代理系統(tǒng)設(shè)計(jì)的核心,該軟件需同時(shí)具備優(yōu)秀的性能和強(qiáng)大的代理功能,經(jīng)過對(duì)主流代理軟件的研究,文章選取了開源軟件Nginx搭建系統(tǒng)。Nginx是一款高性能、高并發(fā)的開源Web服務(wù)器軟件,自2004年發(fā)布以來(lái),它憑借其輕量級(jí)、穩(wěn)定性和高效性被廣泛應(yīng)用于大型網(wǎng)站和互聯(lián)網(wǎng)服務(wù)提供商,據(jù)W3Techs網(wǎng)站數(shù)據(jù),截至2024年5月,Nginx以34.2%的使用率位居全球使用量最高的Web服務(wù)器[3]。Nginx不僅能在高并發(fā)環(huán)境下實(shí)現(xiàn)優(yōu)秀的性能和低延遲[4],而且具備強(qiáng)大且多樣化的代理功能,同時(shí)支持四層和七層代理模式。在四層代理中,Nginx可負(fù)責(zé)TCP和UDP流量的轉(zhuǎn)發(fā);在七層代理中,Nginx可針對(duì)HTTP和HTTPS協(xié)議提供代理服務(wù)。
1.2.2" HTTPS加密流量的識(shí)別
HTTPS通信過程從客戶端向服務(wù)器發(fā)起請(qǐng)求開始,雙方通過握手協(xié)議協(xié)商加密算法、交換密鑰,并驗(yàn)證服務(wù)器的身份證書,在客戶端和服務(wù)器之間建立了一個(gè)安全的加密通道,通道建立后,客戶端和服務(wù)器可在此基礎(chǔ)上進(jìn)行加密數(shù)據(jù)的傳輸,以確保數(shù)據(jù)傳輸過程的機(jī)密性、完整性和可靠性。如前文所述,正向代理系統(tǒng)本身并沒有代理的互聯(lián)網(wǎng)域名的服務(wù)器SSL證書,因此無(wú)法直接以通用的SSL配置方式將代理的HTTPS加密流量進(jìn)行解密,查看其內(nèi)容,如何識(shí)別HTTPS加密流量并正確轉(zhuǎn)發(fā)是關(guān)鍵的技術(shù)難點(diǎn)。
為解決該問題,文章利用了一種擴(kuò)展安全傳輸層協(xié)議(Transport Layer Security,TLS)和SSL協(xié)議的技術(shù)——服務(wù)器名稱指示協(xié)議(Server Name Indication,SNI),其主要目的是解決在同一IP地址和端口上托管多個(gè)域名的SSL/TLS證書的問題[5]。其技術(shù)原理是在客戶端與服務(wù)器建立SSL/TLS連接時(shí),客戶端在ClientHello消息中攜帶SNI字段,指明所請(qǐng)求的域名,使得服務(wù)器能在不解密整個(gè)SSL/TLS連接的情況下獲取客戶端請(qǐng)求的域名信息,從而根據(jù)請(qǐng)求的域名提供相應(yīng)的證書。
要在Nginx軟件中讀取SNI信息,須要利用SSL預(yù)讀?。⊿SL Preread)技術(shù),它是一種TLS協(xié)議的擴(kuò)展,Nginx在1.11.5版本中引入了該功能,用于解析客戶端流量中的ClientHello消息,提取SNI字段后,Nginx就能獲取客戶端請(qǐng)求的域名信息,并根據(jù)該信息將傳入的SSL/TLS連接路由到適當(dāng)?shù)暮蠖朔?wù)器。這樣,不僅實(shí)現(xiàn)了無(wú)服務(wù)器證書場(chǎng)景下的HTTPS加密流量識(shí)別與代理,還避免了Nginx對(duì)整個(gè)SSL/TLS連接進(jìn)行解密,降低了計(jì)算開銷,簡(jiǎn)化了證書管理,非常適用于處理大量加密流量的正向代理應(yīng)用場(chǎng)景。
2" 系統(tǒng)設(shè)計(jì)
文章設(shè)計(jì)的基于Nginx的HTTPS正向代理系統(tǒng)總體架構(gòu)如圖1所示。
該系統(tǒng)主要由以下幾個(gè)主要組件組成。hosts/內(nèi)部DNS引流:該組件可通過2種方式實(shí)現(xiàn),可以在企業(yè)內(nèi)部服務(wù)器上配置hosts,也可以利用內(nèi)部的DNS服務(wù)器,目的是將內(nèi)部服務(wù)器需要訪問的互聯(lián)網(wǎng)域名解析至Nginx正向代理系統(tǒng)的IP,從而讓HTTPS流量經(jīng)過正向代理系統(tǒng)。Nginx正向代理軟件:Nginx軟件的主要功能為接收SSL加密流量,利用SSL Preread功能提取客戶端請(qǐng)求的域名信息,隨后以四層模式轉(zhuǎn)發(fā)至互聯(lián)網(wǎng)的對(duì)應(yīng)域名服務(wù)。Nginx服務(wù)器集群負(fù)載:為保證正向代理系統(tǒng)的健壯服務(wù),可通過多種方式搭建Nginx服務(wù)器集群的負(fù)載均衡,比如利用企業(yè)內(nèi)部的硬件負(fù)載均衡設(shè)備實(shí)現(xiàn)多臺(tái)Nginx正向代理服務(wù)器的流量均衡分配,或使用開源的Keepalived軟件實(shí)現(xiàn)2臺(tái)Nginx服務(wù)器的高可用方案。
3" 技術(shù)實(shí)現(xiàn)
3.1" 環(huán)境準(zhǔn)備
實(shí)驗(yàn)環(huán)境:操作系統(tǒng)Centos 7.9,Nginx 1.24.0,Keepalived 1.3.5。
服務(wù)器IP、端口規(guī)劃如表1所示。
內(nèi)部應(yīng)用服務(wù)器1須訪問互聯(lián)網(wǎng)https://a.com資源,內(nèi)部應(yīng)用服務(wù)器2須訪問互聯(lián)網(wǎng)https://b.com資源。
3.2" 安裝配置Nginx軟件
3.2.1" 安裝Nginx所需的依賴lib庫(kù)
包括PCRE、zlib和OpenSSL庫(kù)以及它們的開發(fā)包,命令如下:
sudo yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel
3.2.2" 編譯安裝
從https://Nginx.org/官網(wǎng)下載Nginx 1.24.0軟件源碼包,解壓后編譯,由于要使用四層模式處理SSL流量,并啟用SSL Preread功能,需要在編譯參數(shù)中啟用相關(guān)2個(gè)模塊,具體步驟如下:
#tar -xzf Nginx-1.24.0.tar.gz
#cd Nginx-1.24.0/
#./configure" --prefix=/usr/local/Nginx --with-stream --with-stream_ssl_preread_module
#make amp;amp; make install
3.2.3" Nginx代理功能配置
在Nginx主配置文件Nginx.conf底部新增如下配置,即可啟用stream_ssl_preread_module模塊,實(shí)現(xiàn)讀取SNI信息并轉(zhuǎn)發(fā)。
#vi /usr/local/Nginx/conf/Nginx.conf
…
#HTTPS正向代理
server {
#監(jiān)聽443端口的流量
listen 443;
#設(shè)置DNS服務(wù)器,用于對(duì)互聯(lián)網(wǎng)域名的解析
resolver 114.114.114.114 valid=600s;
# 設(shè)置代理超時(shí)
proxy_connect_timeout 15s;
proxy_timeout 15s;
# 使用SSL Preread模塊進(jìn)行SNI解析
ssl_preread on;
#根據(jù)ssl_preread域名轉(zhuǎn)發(fā)SSL流量
proxy_pass $ssl_preread_server_name:$server_port;
}
3.2.4" Nginx安全配置
(1)域名白名單。
在Nginx中,map指令功能可用于創(chuàng)建一個(gè)基于輸入變量值的映射,以便根據(jù)請(qǐng)求信息動(dòng)態(tài)地設(shè)置輸出變量。在四層代理stream上下文中,它是由ngx_stream_map_module模塊提供的。為了設(shè)置正向代理的域名白名單,可以按如下方式使用map指令,實(shí)現(xiàn)的效果為當(dāng)白名單之外的域名SSL流量到達(dá)Nginx時(shí),Nginx會(huì)立刻關(guān)閉連接,不再轉(zhuǎn)發(fā)。將如下內(nèi)容增加至Nginx.conf中的stream段中:
#---設(shè)置允許代理的域名白名單
map $ssl_preread_server_name $allowed_hosts
{
a.com" a.com:443;" #a.com正常轉(zhuǎn)發(fā)
b.com" b.com:443;" #b.com正常轉(zhuǎn)發(fā)
default" 127.0.0.1∶18443;" #其他域名轉(zhuǎn)發(fā)給本機(jī)18443端口
}
#---拒絕白名單之外的域名流量
server {
listen 18443;
return 444;" #關(guān)閉連接
}
同時(shí),將監(jiān)聽443端口的server段中的轉(zhuǎn)發(fā)指令配置修改如下:
server {
listen 443;
…
#根據(jù)域名白名單轉(zhuǎn)發(fā)流量
proxy_pass $allowed_hosts;
…
}
(2)源IP地址訪問控制列表。
基于ngx_stream_access_module模塊,Nginx可配置IP訪問控制列表[6],利用allow和deny指令,加上IP地址和掩碼,即可實(shí)現(xiàn)靈活的配置,具體配置方法為在Nginx.conf中stream段中監(jiān)聽443端口的server段里新增如下配置:
server {
listen 443;
…
#設(shè)置IP訪問控制列表,僅允許2臺(tái)內(nèi)部服務(wù)器訪問
allow 192.168.1.1/32;
allow 192.168.1.2/32;
deny all;
…
}
3.2.5" 啟動(dòng)Nginx
#/usr/local/Nginx/sbin/Nginx
3.3" 安裝配置Keepalived
文章使用開源軟件Keepalived方式搭建Nginx服務(wù)器的雙機(jī)高可用集群。
3.3.1" 安裝Keepalived
#yum -y install keepalived
3.3.2" 配置Keepalived高可用虛擬IP
按照IP規(guī)劃,在Nginx正向代理服務(wù)器上分別配置角色、優(yōu)先級(jí)和高可用虛擬IP:
#vi /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
…
state MASTER" #服務(wù)器1設(shè)為MASTER,服務(wù)器2為BACKUP
priority 100" #服務(wù)器1設(shè)為100,服務(wù)器2設(shè)為80,值越大優(yōu)先級(jí)越高
virtual_ipaddress {
192.168.2.10" #VRRP高可用虛擬IP
}
}
3.3.3" 啟動(dòng)Keepalived
#systemctl enable keepalived.service amp;amp; systemctl start keepalived.service
可通過ip addr命令觀察高可用虛擬IP的生效情況,正常情況下僅在主機(jī)上生效。
3.4" 配置hosts文件實(shí)現(xiàn)DNS引流
根據(jù)規(guī)劃,在內(nèi)部應(yīng)用服務(wù)器1上/etc/hosts文件中配置如下hosts條目:
192.168.2.10 a.com
同理,在內(nèi)部應(yīng)用服務(wù)器2上/etc/hosts文件中配置如下hosts條目:
192.168.2.10 b.com
配置完成后,即可在2臺(tái)內(nèi)部應(yīng)用服務(wù)器上分別通過curl或wget命令測(cè)試https請(qǐng)求的連通性,驗(yàn)證返回的內(nèi)容。
4" 結(jié)語(yǔ)
文章提出的基于Nginx的HTTPS正向代理系統(tǒng)不僅有效解決了企業(yè)內(nèi)部服務(wù)器在缺少服務(wù)器證書的情況下代理訪問互聯(lián)網(wǎng)HTTPS資源的代理難題,而且通過合理選擇和使用Nginx各模塊的功能,實(shí)現(xiàn)了多域名復(fù)用端口、域名白名單和源IP地址訪問控制等多種功能,有力提升了企業(yè)內(nèi)部的網(wǎng)絡(luò)安全。
參考文獻(xiàn)
[1]張濤濤.HTTPS安全性討論[J].中國(guó)科技信息,2021(2):73-74.
[2]W3Techs.Usage statistics of Default protocol https for websites[EB/OL].(2024-05-20)[2024-05-20].https://w3techs.com/technologies/details/ce-httpsde fault.
[3]W3Techs.Usage statistics and market shares of web servers[EB/OL].(2024-05-19)[2024-05-20].https://w3techs.com/technologies/overview/web_server.
[4]戴偉,馬明棟,王得玉.基于Nginx的負(fù)載均衡技術(shù)研究與優(yōu)化[J].計(jì)算機(jī)技術(shù)與發(fā)展,2019(3):77-80.
[5]毛偉杰,李永忠.基于SNI的加密流量檢測(cè)在蜜罐中的研究與應(yīng)用[J].信息技術(shù),2021(8):97-101.
[6]劉旻昊.Nginx服務(wù)器“秘籍”[J].中國(guó)傳媒科技,2018(4):13-14.
(編輯" 王永超)
Design and implementation of an HTTPS forward proxy system based on Nginx
LIU" Minhao, CHENG" Peng, WEI" Haitao, WANG" Meng, LI" Qian
(Xinhua News Agency, Beijing 100803, China)
Abstract:" As the digitalization of enterprises and the expansion of Internet services continue, the demand for secure and efficient access to Internet services by internal systems has grown significantly. In contrast to directly granting Internet access permissions to internal servers, forward proxy systems offer enhanced security and management capabilities. Nevertheless, the widespread adoption of HTTPS in online services, coupled with the lack of server certificates, poses substantial challenges in designing forward proxy systems. In response to these challenges, this study presents the design and implementation of an HTTPS forward proxy system based on the open-source software Nginx. The proposed system enables efficient traffic forwarding without necessitating server certificates, while incorporating features such as HTTPS domain port reuse, domain-level whitelisting, and source IP address access control. Consequently, this solution provides a secure and comprehensive approach for enterprise internal systems to access Internet-based HTTPS services.
Key words: Nginx; forward proxy; HTTPS; SNI; SSL Preread