◆吳翠芳 閻虎勤
(廈門國(guó)家會(huì)計(jì)學(xué)院 福建 361000)
隨著信息技術(shù)的發(fā)展,越來(lái)越多的事情需要通過(guò)互聯(lián)網(wǎng)來(lái)完成,網(wǎng)絡(luò)技術(shù)已滲透到人類生活的各個(gè)方面。與此同時(shí),各種黑客手段、計(jì)算機(jī)病毒、木馬也在不斷變異,信息系統(tǒng)建設(shè)必須直面日益嚴(yán)峻的安全問(wèn)題。
近些年網(wǎng)站被惡意攻擊事件時(shí)有發(fā)生,網(wǎng)站作為對(duì)外宣傳的窗口,其安全性尤為重要。但大多數(shù)用戶在開發(fā)Web系統(tǒng)時(shí)一般只在乎頁(yè)面的布局與美觀,重視業(yè)務(wù)功能實(shí)現(xiàn)及系統(tǒng)的穩(wěn)定性,而往往忽略了系統(tǒng)的安全問(wèn)題。Web系統(tǒng)的安全與程序代碼、服務(wù)器的漏洞及相關(guān)設(shè)置等綜合因素有關(guān),在缺少Web安全設(shè)備的條件下,搭建反向代理服務(wù)器,把Web服務(wù)器隔離在內(nèi)網(wǎng),起到防火墻的作用。
正向代理是代理客戶端,而反向代理是代理服務(wù)器,因多了一個(gè)中間代理屏障,客戶不能直接訪問(wèn)后端服務(wù),在實(shí)現(xiàn)負(fù)載均衡的同時(shí)增強(qiáng)安全性。反向代理是通過(guò)異步非阻塞的方式把請(qǐng)求傳給后端,提升并發(fā)處理能力;利用緩存,壓縮響應(yīng)提高響應(yīng)速度。使用反向代理,可以防止外網(wǎng)對(duì)內(nèi)網(wǎng)服務(wù)器的惡性攻擊,緩存以減少服務(wù)器的壓力,并進(jìn)行訪問(wèn)安全控制,還可以實(shí)現(xiàn)負(fù)載均衡,將用戶請(qǐng)求分配給多個(gè)服務(wù)器。
Nginx作為Web服務(wù)器一個(gè)重要的功能就是反向代理,用于管理從外部網(wǎng)絡(luò)到內(nèi)部網(wǎng)絡(luò)的連接或任何特定請(qǐng)求。反向代理服務(wù)器架設(shè)在外網(wǎng)與目標(biāo)服務(wù)器之間,通過(guò)緩沖經(jīng)常被請(qǐng)求的頁(yè)面來(lái)緩解服務(wù)器的工作量,將客戶機(jī)請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)的目標(biāo)服務(wù)器,并將從服務(wù)器得到的結(jié)果返回給Internet上請(qǐng)求連接的客戶端,此時(shí)代理服務(wù)器與目標(biāo)主機(jī)一起對(duì)外表現(xiàn)為一個(gè)服務(wù)器,如圖1。
圖1 Nginx反向代理
Nginx是一個(gè)很強(qiáng)大的高性能Web和反向代理服務(wù),具有性能高、穩(wěn)定性好、并發(fā)性強(qiáng)、資源消耗低,配置簡(jiǎn)單等優(yōu)點(diǎn),可運(yùn)行在多操作系統(tǒng)上,因輕巧、模塊化、友好的配置格式和強(qiáng)大的反向代理能力被廣泛應(yīng)用。本文介紹的Nginx反向代理是運(yùn)行在Linux操作系統(tǒng)上,主要從安全配置、性能優(yōu)化、日志管理三個(gè)方面介紹基于Nginx反向代理Web系統(tǒng)的安全與優(yōu)化管理。
Nginx反向代理配置簡(jiǎn)單,只需要修改配置文件就可以實(shí)現(xiàn),nginx.conf是其默認(rèn)的配置文件。
多數(shù)情況下,軟件的漏洞與版本有關(guān),因此,對(duì)在客戶端顯示有關(guān)Web系統(tǒng)的各類敏感信息應(yīng)盡量隱藏或者消除,如隱藏使用軟件的版本號(hào)、Web系統(tǒng)名稱等信息,以增加惡意用戶攻擊服務(wù)器的難度,從而加強(qiáng)Web服務(wù)器的安全性。在Nginx配置文件中增加server_tokens參數(shù)可隱藏Nginx的版本,由于用戶不清楚版本信息就難以做一些有針對(duì)性的攻擊;另外,響應(yīng)頭輸出的x-powered-by參數(shù)也會(huì)泄露Web系統(tǒng)的相關(guān)信息,可以通過(guò) proxy_hide_header 指令隱藏它。設(shè)置如下:
隱藏系統(tǒng)的版本和Web系統(tǒng)的相關(guān)信息,只能在一定程度上防止惡意攻擊,及時(shí)升級(jí)軟件、修補(bǔ)漏洞才是最終的解決方法。
在部署Nginx時(shí)經(jīng)常會(huì)忽略HTTP響應(yīng)頭的設(shè)置,合理配置響應(yīng)頭,可以有效防止XSS攻擊,避免點(diǎn)擊劫持和frame惡意引用等騷擾。如下設(shè)置:
案例1:本站在開啟響應(yīng)頭防XSS攻擊后,導(dǎo)致代理轉(zhuǎn)發(fā)的某一Web系統(tǒng)無(wú)法使用,主要原因是該系統(tǒng)使用了大量的跨站調(diào)用被阻止,無(wú)奈只能關(guān)閉該項(xiàng)功能。所以,在響應(yīng)頭配置防XSS攻擊,對(duì)應(yīng)用系統(tǒng)的調(diào)用關(guān)系要求很高,如果程序中采用大量的跨站訪問(wèn)模式,會(huì)造成系統(tǒng)無(wú)法正常運(yùn)行。
Nginx的默認(rèn)配置中的虛擬主機(jī)允許用戶通過(guò)IP訪問(wèn),或者通過(guò)未設(shè)置的域名訪問(wèn)。為了防止其他用戶惡意將域名解析到本站的IP上,可將默認(rèn)的虛擬主機(jī)server段修改為:
以上配置,還可以用rewrite進(jìn)行跳轉(zhuǎn)設(shè)置,把這些流量收集起來(lái),導(dǎo)入到自己的網(wǎng)站。
HTTPS是以安全為目標(biāo)的 HTTP 通道,在HTTP的基礎(chǔ)上通過(guò)傳輸加密和身份認(rèn)證保證傳輸過(guò)程的安全性。HTTPS 協(xié)議是由HTTP 加上TLS/SSL協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,主要通過(guò)數(shù)字證書、加密算法、非對(duì)稱密鑰等技術(shù)完成互聯(lián)網(wǎng)數(shù)據(jù)傳輸加密,實(shí)現(xiàn)互聯(lián)網(wǎng)傳輸安全保護(hù)。
TLS是傳輸層安全性協(xié)議,提供安全及數(shù)據(jù)完整性保障。隨著數(shù)據(jù)傳輸加密安全技術(shù)的更新升級(jí),TLSv1.0和TLS1.1被掃描出存在安全漏洞,為防黑客進(jìn)行概念驗(yàn)證式攻擊,加固數(shù)據(jù)安全,建議禁用TLSv1.0和TLS1.1,啟用TLS 1.2或TLS1.3。如下配置:
為加強(qiáng)Web訪問(wèn)安全,可以在HTTP的server中設(shè)置301重定向,將HTTP訪問(wèn)強(qiáng)制跳轉(zhuǎn)到HTTPS訪問(wèn)。
如果網(wǎng)站內(nèi)的圖片資源被其他站點(diǎn)所盜用,會(huì)額外消耗本站的帶寬資源和服務(wù)器的資源,還會(huì)影響Web系統(tǒng)的穩(wěn)定性,為了防止本站上的圖片資源被其他站點(diǎn)所盜用,可以在Nginx服務(wù)器上配置防盜鏈。nginx.conf配置文件中圖片防盜鏈配置如下:
以上是針對(duì)幾種圖片格式的防盜鏈,目錄防盜鏈的配置類似,也可以使用第三方模塊ngx_http_accesskey_module實(shí)現(xiàn)Nginx防盜鏈。
運(yùn)行在Linux操作系統(tǒng)上的Nginx性能穩(wěn)定,能夠支撐站點(diǎn)的大多數(shù)任務(wù),但是隨著代理轉(zhuǎn)發(fā)應(yīng)用業(yè)務(wù)和訪問(wèn)量的增多,需要對(duì)Nginx服務(wù)進(jìn)行調(diào)優(yōu)配置。可以從兩方面優(yōu)化Nginx服務(wù),一是調(diào)優(yōu)Nginx配置,使Nginx服務(wù)與硬件達(dá)到最大的協(xié)調(diào);另一是操作系統(tǒng)層面的優(yōu)化,主要是系統(tǒng)資源上的限制優(yōu)化,讓系統(tǒng)提供最優(yōu)的服務(wù)。
Nginx定義了對(duì)外提供Web服務(wù)時(shí)的worker進(jìn)程數(shù),一般設(shè)置等于CPU的核數(shù),worker進(jìn)程數(shù)除了要和CPU核數(shù)匹配外,也和硬盤存儲(chǔ)的數(shù)據(jù)及系統(tǒng)的負(fù)載有關(guān)。如果訪問(wèn)量快速增加,Nginx會(huì)啟動(dòng)更多的worker進(jìn)程以保證快速響應(yīng)處理用戶的請(qǐng)求,以避免造成擁塞。所以,在高流量高并發(fā)的場(chǎng)景下,可適當(dāng)加大worker進(jìn)程數(shù),在響應(yīng)訪問(wèn)請(qǐng)求時(shí),Nginx就不需要臨時(shí)啟動(dòng)新的進(jìn)程來(lái)提供服務(wù),這樣可縮短系統(tǒng)瞬時(shí)的開銷及提供服務(wù)的時(shí)間,提升服務(wù)速度。
Nginx默認(rèn)沒(méi)有開啟利用多核CPU,需要用參數(shù)worker_cpu_affinity將worker process與指定CPU核綁定,以減少由于多CPU核切換造成的性能損耗??梢詫orker_process 和worker_cpu_affinity設(shè)置為auto,這樣系統(tǒng)會(huì)根據(jù)實(shí)際業(yè)務(wù)情況自動(dòng)調(diào)節(jié)數(shù)量。
work_connections是單個(gè)worker進(jìn)程允許客戶端最大連接數(shù),這個(gè)數(shù)值一般根據(jù)服務(wù)器性能和內(nèi)存來(lái)制定,理論上每臺(tái)Nginx服務(wù)器的最大連接數(shù)為進(jìn)程數(shù)*連接數(shù)。Nginx默認(rèn)最大的并發(fā)數(shù)為1024,如果站點(diǎn)訪問(wèn)量過(guò)大,已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)默認(rèn)并發(fā)數(shù),必須修改worker_connecions的值,值越大并發(fā)數(shù)就越大,但是不能設(shè)置太大,以避免CPU滿負(fù)荷運(yùn)轉(zhuǎn)。另外,進(jìn)程的最大連接數(shù)受 Linux 系統(tǒng)進(jìn)程的最大打開文件數(shù)和Nginx最大打開文件數(shù)的限制,必須綜合考慮設(shè)置一個(gè)最優(yōu)的值。
worker_rlimit_nofile指令是描述單個(gè)Nginx進(jìn)程打開的最多文件數(shù)目,理論值應(yīng)該是最多打開文件數(shù)與Nginx進(jìn)程數(shù)相除,但是nginx分配請(qǐng)求并不是那么均勻,所以最好與Linux系統(tǒng)限制的最大進(jìn)程數(shù)保持一致。Linux 默認(rèn)安裝值只有1024,當(dāng)訪問(wèn)量增大時(shí),容易出現(xiàn)擁塞,文件打不開,日志提示“Too many open files”的錯(cuò)誤信息。所以,在設(shè)置Nginx最大打開文件數(shù)時(shí),應(yīng)先考慮Linux用戶的最大進(jìn)程數(shù),可以用ulimit命令來(lái)查看和設(shè)置Linux系統(tǒng)用戶的最大進(jìn)程數(shù),worker_rlimit_nofile參數(shù)的值不能超過(guò)這個(gè)數(shù)。
案例2:由于遠(yuǎn)程在線直播課程的開展,訪問(wèn)量直線上升,出現(xiàn)大量的擁塞、訪問(wèn)速度慢等問(wèn)題,導(dǎo)致站點(diǎn)一時(shí)崩潰,在Nginx日志中,查看到大量的異常信息:“Too many open files”。緊急排查后加大worker進(jìn)程數(shù)、最大連接數(shù)及Nginx最大打開文件數(shù),問(wèn)題得到緩解。考慮到進(jìn)程數(shù)需與CPU核數(shù)相匹配,故將CPU數(shù)擴(kuò)展翻倍,最終解決擁塞問(wèn)題。
epoll是多路復(fù)用I/O中的一種方式,用這個(gè)模型來(lái)高效處理異步事件。Web服務(wù)器在面對(duì)高并發(fā)的情況下,網(wǎng)絡(luò)的I/O一般選擇I/O復(fù)用,Nginx在linux 2.6后選擇Epoll做網(wǎng)絡(luò)IO,能增加Nginx系統(tǒng)的并發(fā)能力,從而提高Web服務(wù)的訪問(wèn)速率。
sendfile是一個(gè)操作系統(tǒng)特性,可以在Nginx上啟用,提供更快的TCP數(shù)據(jù)傳輸,能達(dá)到零拷貝的效率。與傳統(tǒng)文件傳輸相比,sendfile系統(tǒng)切換更少、數(shù)據(jù)拷貝更少,從而提升了文件傳輸?shù)男阅?。在開啟高效文件傳輸模式的同時(shí),可以將tcp_nopush on 和tcp_nodelay on 開啟,以防止網(wǎng)絡(luò)及磁盤I/O阻塞,提升Nginx工作效率。
keepalive_timeout用來(lái)設(shè)置http連接超時(shí)時(shí)間,默認(rèn)60s,功能是讓客戶端到服務(wù)器端的連接在設(shè)定的時(shí)間內(nèi)持續(xù)有效,當(dāng)出現(xiàn)對(duì)服務(wù)器的后繼請(qǐng)求時(shí),該功能避免了建立或者重新建立連接。這個(gè)參數(shù)不能設(shè)置過(guò)大,否則會(huì)導(dǎo)致許多無(wú)效的http連接占據(jù)著Nginx的連接數(shù),由于長(zhǎng)時(shí)間占著連接資源不釋放,導(dǎo)致請(qǐng)求的堆積,使Nginx處理請(qǐng)求效率大大降低。所以在對(duì)連接控制的同時(shí)要注意設(shè)置超時(shí)時(shí)間,通過(guò)超時(shí)機(jī)制自動(dòng)回收資源、避免資源浪費(fèi)。
Nginx代理和后端服務(wù)器之間的超時(shí)時(shí)間由proxy_read_timeout參數(shù)來(lái)設(shè)定,當(dāng)從upstream服務(wù)器讀取返回?cái)?shù)據(jù)時(shí),Nginx用來(lái)獲得請(qǐng)求響應(yīng)的等待時(shí)間,默認(rèn)60s,如果連續(xù)的60s內(nèi)沒(méi)有收到任何數(shù)據(jù),連接關(guān)閉。proxy_read_timeout是個(gè)局部參數(shù),具體操作在server的location中做配置:
案例3:代理轉(zhuǎn)發(fā)的某一Web系統(tǒng),有大量學(xué)員反應(yīng)在操作過(guò)程中,出現(xiàn)超時(shí)提示,不能繼續(xù)完成任務(wù)。查看Nginx的error.log日志,提示“[error]7748#0:*159043835 upstream timed out(110:Connection timed out)…”錯(cuò)誤信息??紤]到該系統(tǒng)要求在線閱讀15s的學(xué)員須知,可能是Nginx代理等待請(qǐng)求響應(yīng)超時(shí),試將proxy_read_timeout設(shè)置值提高到120s,該問(wèn)題解決。
Nginx調(diào)優(yōu)配置如圖2。
圖2 Nginx調(diào)優(yōu)配置
經(jīng)過(guò)優(yōu)化配置后的Nginx反向代理服務(wù)運(yùn)行穩(wěn)定,性能優(yōu)化需要在日常運(yùn)維工作中不斷總結(jié)和積累經(jīng)驗(yàn),根據(jù)實(shí)際業(yè)務(wù)情況選擇配置的參數(shù),讓服務(wù)和硬件發(fā)揮最佳的性能。
Nginx的默認(rèn)日志文件為access.log和error.log,通過(guò)訪問(wèn)日志,可以得到客戶端的地域來(lái)源、跳轉(zhuǎn)來(lái)源、使用終端、某個(gè)URL訪問(wèn)量等相關(guān)信息;通過(guò)錯(cuò)誤日志,可以得到某個(gè)Web系統(tǒng)服務(wù)或server的性能瓶頸等。
如果代理轉(zhuǎn)發(fā)有多個(gè)server,每個(gè)server的訪問(wèn)日志默認(rèn)是一起混雜寫在access.log文件中,為便于查看和管理,需要對(duì)訪問(wèn)日志按不同server進(jìn)行分離。在nginx.conf文件的server中配置如下:
隨著反向代理轉(zhuǎn)發(fā)的系統(tǒng)增多及訪問(wèn)量的增長(zhǎng),訪問(wèn)數(shù)據(jù)越來(lái)越多,access日志文件也越來(lái)越大,如果不按時(shí)間做合理的切割,訪問(wèn)日志文件將增大到無(wú)法打開地步。為保證日志的正常訪問(wèn),可以編寫一個(gè)Nginx日志切割腳本來(lái)自動(dòng)切割日志文件,在做日志分離的同時(shí),按時(shí)間進(jìn)行切割,并保存到其他目錄中。
根據(jù)網(wǎng)絡(luò)安全的要求,安全日志保留時(shí)間必須在180天以上。為保證日志的安全和方便存儲(chǔ)管理,可以編寫shell腳本,Nginx日志按每天自動(dòng)切割,并自動(dòng)刪除180天以前的日志。具體步驟如下:
(1)新建shell腳本:vi/usr/local/nginx/cutlog.sh 配置如圖3。
圖3 配置
(2)設(shè)置定時(shí)任務(wù)
定時(shí)任務(wù)在Linux系統(tǒng)中設(shè)置:
通過(guò)Nginx 日志可以查看系統(tǒng)運(yùn)行記錄和出錯(cuò)說(shuō)明,可以分析系統(tǒng)和服務(wù)器運(yùn)行的狀態(tài),了解業(yè)務(wù)數(shù)據(jù)情況。日志文件對(duì)日常運(yùn)維至關(guān)重要,如果沒(méi)有日志,排查問(wèn)題時(shí)很難判斷異常所在,日志管理是信息安全工作不可缺少的重要組成部分。
隨著網(wǎng)站的發(fā)展和對(duì)外應(yīng)用業(yè)務(wù)的增加,需要公網(wǎng)IP數(shù)也日益增長(zhǎng),搭建反向代理服務(wù)器轉(zhuǎn)發(fā)代理多個(gè)目標(biāo)應(yīng)用服務(wù),一方面可以加強(qiáng)安全防護(hù),同時(shí)也可以節(jié)約公網(wǎng)IP資源。網(wǎng)站的安全防護(hù)措施很多,利用Nginx反向代理技術(shù)是其中的一種方法,反向代理服務(wù)器介于內(nèi)網(wǎng)與外網(wǎng)之間,把Web應(yīng)用服務(wù)與外部隔離,起到安全過(guò)濾的作用,為站點(diǎn)提供基于Web攻擊行為的防護(hù),相當(dāng)于應(yīng)用防火墻(WAF)的功能。在加強(qiáng)安全防護(hù)的同時(shí)對(duì)Nginx配置進(jìn)行優(yōu)化,提升站點(diǎn)的訪問(wèn)性能,讓用戶有更好的訪問(wèn)體驗(yàn)。
信息安全建設(shè)已越來(lái)越被廣大用戶重視,網(wǎng)絡(luò)技術(shù)的發(fā)展,數(shù)據(jù)的共享,信息安全已提高到一個(gè)新的高度。網(wǎng)絡(luò)安全無(wú)處不在,信息安全是數(shù)字化校園的重要組成部分,維護(hù)Web系統(tǒng)的安全與穩(wěn)定是長(zhǎng)期而艱巨的任務(wù)。
網(wǎng)絡(luò)安全技術(shù)與應(yīng)用2022年8期