5分鐘讓你的老舊網(wǎng)站支持IPv6、HTTPS、HTTP/2,不能再多了

     本文轉(zhuǎn)載自微信公眾號“ 鄭海山dump”(ID:zhsdump),作者:鄭海山

創(chuàng)新互聯(lián)專注于盤錦網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供盤錦營銷型網(wǎng)站建設(shè),盤錦網(wǎng)站制作、盤錦網(wǎng)頁設(shè)計(jì)、盤錦網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造盤錦網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供盤錦網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

 領(lǐng)導(dǎo)讓我一個(gè)月部署100臺服務(wù)器,我剛花了一天時(shí)間寫了個(gè)自動(dòng)化腳本,我現(xiàn)在占著工位吹著空調(diào)喝著咖啡刷著抖音看Ansible幫我敲命令,我是不是很沒有人性?我接下來29天只能這樣玩了我該不該告訴領(lǐng)導(dǎo)?

 注:Ansible不是某個(gè)同事的英文名,是一個(gè)自動(dòng)化部署工具,同類型的還有Puppet、Chef、Salt等等。有興趣以后再介紹。

 本Git代碼適用范圍

 假設(shè)你有一個(gè)老舊的Web站點(diǎn) http://dog.xmu.edu.cn ,IP地址為IPv4 1.2.3.4 ,你再提供一臺配置了IPv6的Ubuntu 18.04 LTS服務(wù)器,Clone我的代碼,跑一條命令,會(huì)幫你把HTTPS和HTTP/2全部配置完畢,然后你測試正常后,修改下DNS,把 dog.xmu.edu.cn 指向新的IPv4和IPv6地址即可。

 中間是無縫的,干凈的,測試完備的。時(shí)間在5分鐘。

 具體步驟

 ● 安裝一臺Ubuntu 18.04 LTS,配置好IPv6地址。

 ● Clone代碼 https://github.com/haishanzheng/nginx-install/tree/ansible ,最后會(huì)PR到 https://github.com/bg6cq/nginx-install 。

 ● cp hosts.template hosts.real,配置你的服務(wù)器IP地址、控制機(jī)IP、域名、上游原始IP等信息

 ● 跑一下 ansible-playbook site.yml -i hosts.real --ask-become-pass,5分鐘安裝完畢

 ● 跑一下 certbot --nginx certonly ,申請一個(gè)免費(fèi)的Lets Encrypt證書。

 ● 再跑下 Ansible腳本,加入HTTPS支持。因?yàn)锳nsible腳本是冪等的,所以你跑幾千次都沒問題。

 ● 跑下curl測試,強(qiáng)制域名指向新的IP地址和測試IPv6。curl --resolve dog.xmu.edu.cn:443:2001:da8:e800::42 -I --http2 https://dog.xmu.edu.cn -6 -v

 ● 如果curl正確,則更改DNS即可。再保險(xiǎn)點(diǎn),本地更改DNS,使用瀏覽器測試。

 ● 可以考慮提交網(wǎng)站到張煥杰的測試網(wǎng)站 https://ipv6.ustc.edu.cn/ ,肯定是100分以上。

 代碼

 代碼fork自中科大張煥杰的 https://github.com/bg6cq/nginx-install ,PR暫時(shí)未提交,張煥杰老師的文檔對Nginx進(jìn)行了加固,對系統(tǒng)進(jìn)行了配置優(yōu)化,可做為一步步操作手冊,了解內(nèi)部的具體配置機(jī)制,張煥杰也帶了個(gè)sh自動(dòng)化部署腳本,依賴較少。ansible目錄為我編寫的無腦自動(dòng)化部署腳本,依賴Python3,可重復(fù)運(yùn)行,冪等,會(huì)不定期同步張煥杰的配置。

 Ansible跑起來類似這樣子:

5分鐘讓你的老舊網(wǎng)站支持IPv6、HTTPS、HTTP/2,不能再多了

 具體看README.md文檔吧,如果真有人用,我考慮再更新,加個(gè)GoAccess統(tǒng)計(jì)啥的。。。

  如果你問我反代要怎么做,比較政治正確的說法我會(huì)告訴你去買大廠的應(yīng)用交付設(shè)備,啟用一鍵斷網(wǎng),并購買完善的維保服務(wù),接收廠商定期的更新和威脅情報(bào),并最終在出安全問題后甩鍋給設(shè)備和廠商,以避免你在余生中為自己的摳門和不專業(yè)而后悔。

為什么?以我的repo為例,如果你真的反代了你全校的網(wǎng)站,那這個(gè)服務(wù)器一定要三級等保合規(guī),你需要在上面安裝防病毒、惡意代碼檢測、完整性檢查、監(jiān)控、資源限制、審計(jì),你的日志需要到遠(yuǎn)程保留3個(gè)月,你必須時(shí)時(shí)更新安全補(bǔ)丁防止CVE漏洞,在Nginx新版發(fā)布后必須檢查changelog并關(guān)閉不必要的功能。為了防止單點(diǎn)故障,你應(yīng)該需要2臺反代,上面安裝Keepalived做高可用。為了方便分析,你還需要分析日志。

這些我改改代碼都可以在10分鐘內(nèi)讓你完成,但是我的代碼你自己審計(jì)了么?我是否了解了所有的坑?我是否會(huì)偷偷插入一些控制你全部站點(diǎn)的代碼?就比如更新免費(fèi)的HTTPS證書,你在反代上去下載一個(gè).sh文件就跑,安全么?如果為了隔離這個(gè)風(fēng)險(xiǎn),我會(huì)使用一臺不可變服務(wù)器,3個(gè)月定期部署他并讓他跑起來,使用DNS challenge,在最后得到證書后scp到反代上并且銷毀那個(gè)服務(wù)器。這么折騰為什么不直接花幾千元買個(gè)一年有效期更高等級的EV證書?

就算你信任我,但是我也不是鐵板一塊,如果我被黑了呢?

所以除非你有足夠的自信,否則不推薦,當(dāng)然張煥杰和我的文檔、repo也不是毫無用處,至少你可以借此揭開反代后面神秘的面紗。

潑了冷水,讓我們繼續(xù)來學(xué)習(xí)一下其他坑吧。寫的比較散,想到哪寫到哪,爭取這個(gè)系列就完結(jié)了。

  部署反代不是無創(chuàng)的

  IP地址傳遞

部署反代是一定需要的,反代的工作原理導(dǎo)致了你的應(yīng)用無法得到真實(shí)客戶端IP地址,所以反代一般會(huì)把X-Forwarded-For、X-Real-IP等參數(shù)往應(yīng)用后面?zhèn)?,又由于這個(gè)參數(shù)是放在Header里的,所以必須應(yīng)對偽造問題。

而且反代有時(shí)候是多級的,所以反代一定要找到自己的定位,在何時(shí)重置X-Forwarded-For、X-Real-IP字段,何時(shí)接受信任上級的字段。而應(yīng)用必須更改自己實(shí)現(xiàn)獲取客戶端IP地址的機(jī)制,只接收信任反代發(fā)送的Header。這個(gè)去年底我寫了個(gè)案例,就是根據(jù)偽造X-Forwarded-For字段來欺騙應(yīng)用突破IP地址授權(quán)驗(yàn)證的。

應(yīng)用的Web服務(wù)器日志配置也必須修改,否則只能得到反代的地址。有些關(guān)于X-Forwarded-For 的網(wǎng)上配置是錯(cuò)誤的。有些是簡單粗暴用X-Forwarded-For替換掉%h,比如

LogFormat "%h %l %u %t \"%r\" %>s %b" common

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" common

但是這樣子也不能解決偽造X-Forwarded-For的問題,所以為了統(tǒng)計(jì)分析方便,不建議你直接去更改Log格式,建議你應(yīng)當(dāng)生成2個(gè)日志,一個(gè)是%h的,一個(gè)是%{X-Forwarded-For}i。各自分析。

而如果你在系統(tǒng)里面配置了諸如fail2ban、安全軟件等根據(jù)IP來封禁的全部必須做相應(yīng)調(diào)整。

HTTP/2

以Nginx來做反代,Nginx對后端backend HTTP/2協(xié)議是無視的,這是由于HTTP/2協(xié)議本身特性造成的。所以你的反代必須清理所有backend傳過來跟連接相關(guān)的Header。舉個(gè)例子:

假設(shè)你用Chrome使用HTTP/2協(xié)議去反代取某個(gè)backend的網(wǎng)頁,然后反代以HTTP/1.1去backend取網(wǎng)頁,這時(shí)候支持HTTP/2的backend發(fā)現(xiàn)反代的協(xié)議好老,會(huì)給反代發(fā)送“upgrade: h3,h3c”頭部,就是告訴反代,你落伍了,該升級了,如果你的反代不清理這個(gè)頭部proxy_hide_header,那你的Chrome會(huì)拿到這個(gè)字段,他會(huì)覺得很莫名其妙。

IPv6

其實(shí)我覺得部署反代來解決IPv6問題是不是一個(gè)“上有政策下有對策”的做法,長期倒是會(huì)損害IPv6的發(fā)展,何時(shí)數(shù)據(jù)中心敢上純IPv6環(huán)境呢?

或者IPv6要真正推廣需要有應(yīng)用廠商幫忙來推,比如某個(gè)系統(tǒng)很早前就號稱支持IPv6,在很多學(xué)校部署得也很多,但是基本上都不用IPv6,不知道是什么問題。確實(shí),多一條路就多一個(gè)風(fēng)險(xiǎn)點(diǎn),而上了IPv6又不會(huì)讓你飛起來,大家就沒有動(dòng)力來推動(dòng)這個(gè)事情。

說到這個(gè)系統(tǒng),那繼續(xù)說下這個(gè)系統(tǒng)的安全問題吧,有些是部署的問題,有些是實(shí)現(xiàn)的問題。我不是具體負(fù)責(zé)這個(gè)系統(tǒng)的,我也只是零星使用時(shí)發(fā)現(xiàn)的。所以你不要讓我來看或者使用你的系統(tǒng),我會(huì)發(fā)現(xiàn)一些亂78糟的問題讓你我都很尷尬。

● 密碼防止暴力破解設(shè)計(jì)很奇特。如果你對某個(gè)賬戶破解密碼超過一定閾值后不是告訴你被鎖定而是不管你輸入正確還是錯(cuò)誤的密碼都告訴你密碼錯(cuò)誤,對用戶很困擾,對攻擊者也不友好。我曾經(jīng)寫信去咨詢希望能改變方式或者提供開關(guān)讓我們自己選擇,但是沒有下文。

● 直接把認(rèn)證信息加在URL里,類似 http://dog.xmu.edu.cn/index.php?login-user-hash-is=GUID ,這樣子也是非常不安全的,雖然這樣子是對cookiless友好的,但是如果沒有HTTPS,地址很容易被嗅探,并且地址也會(huì)加入Web服務(wù)器的Log內(nèi),甚至都無法預(yù)防有人站在你身后拍照你的屏幕傳給別人。后來指出后,加了個(gè)同來源IP地址的驗(yàn)證,也就是即使你拿到地址后,必須在同一個(gè)IP才能訪問。但是這個(gè)也不靠譜,在同一個(gè)物理NAT環(huán)境或者撥同一個(gè)VPN還是有可能被攻擊。而且在部署或者代碼里沒有對Referrer Policy進(jìn)行指定,瀏覽器的默認(rèn)Referrer Policy是no-referrer-when-downgrade,也就是,你在系統(tǒng)內(nèi)點(diǎn)擊鏈接后會(huì)把GUID傳給黑客的Web服務(wù)器。再后來是加了Cookie,安全了。其實(shí)我現(xiàn)在也不是太明白,有了Cookie后為什么還要有那個(gè)login-user-hash-is,可能是為了兼容舊應(yīng)用的API調(diào)用吧。

● 管理員界面和API調(diào)用綁定在普通用戶同一個(gè)Web服務(wù)器端口內(nèi),如果你的超級用戶密碼強(qiáng)壯,系統(tǒng)本身沒有問題這個(gè)是問題不大的,我們?yōu)榱吮kU(xiǎn)還是加了一層管理員IP限制,很多學(xué)校是沒有的。而且API認(rèn)證模式是使用IP地址認(rèn)證。

希望今后這個(gè)系統(tǒng)能真正對部署的安全梳理一層,提高各個(gè)學(xué)校的安全性吧。

關(guān)于IPv6地址規(guī)劃,我不是搞網(wǎng)絡(luò)的,我是搞應(yīng)用的,所以我不是太懂,宋崟川寫了個(gè) https://www.ipv6-cn.com/tutorials/ipv6-address-allocation-n-assignment.html 可以學(xué)習(xí),我是看不懂的,但是如果你是使用IPv4來映射出IPv6地址的,雖然簡單但是感覺可以變了。

IPv6巨大的地址池給我造成的問題就是,原先使用IP地址來做諸如投票IP地址唯一性判斷方法有點(diǎn)失效了。攻擊來源IP非暴力破解的判斷策略也需要更改了。

HTTPS

HTTPS可以提供保密性、完整性,簡單給Web網(wǎng)站加個(gè)HTTPS可以解決大部分問題,如果你想再上幾層,還有其他可以改進(jìn):

● DNS權(quán)威服務(wù)器要上DNSSEC,免得DNS就被人篡改了。

● 為了防止諸如以前的某些廠商等讓用戶安裝他們的根證書,然后被黑導(dǎo)致MTTM攻擊,可以在DNS上加CAA,只允許某些CA給你某個(gè)域名簽名。

● 目前瀏覽器默認(rèn)是訪問80端口的,未來可能會(huì)改變,所以一般網(wǎng)站的做法都是先訪問HTTP然后301到HTTPS,這中間是可能被攻擊的。所以你應(yīng)當(dāng)加HSTS、hsts preload list、STS-in-DNS等改變這個(gè)流程。

● 網(wǎng)頁如果加了HSTS一年,但是黑客可以利用NTP攻擊讓客戶端電腦時(shí)間推后一年導(dǎo)致HSTS無效。有人這么無聊么?反正都考慮到吧。

● HTTP服務(wù)器配置要防止SSL協(xié)議和加密方法降級攻擊。

HTTP/2

關(guān)于HTTP/2的介紹網(wǎng)絡(luò)上很多,我就不搬運(yùn)了,改變很大,基本上目前HTTP/2都必須前置有HTTPS,所以有些調(diào)試技巧失效了,而且你以前掌握的一些HTTP/1.1的優(yōu)化奇技淫巧也都沒用了,重新學(xué)習(xí)吧。

名稱欄目:5分鐘讓你的老舊網(wǎng)站支持IPv6、HTTPS、HTTP/2,不能再多了
標(biāo)題網(wǎng)址:http://muchs.cn/article14/ipjjge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、搜索引擎優(yōu)化、用戶體驗(yàn)、Google、動(dòng)態(tài)網(wǎng)站、App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名