溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2020-08-11 14:31:47 來源:ITPUB博客 閱讀:873 作者:李雪薇 欄目:互聯(lián)網(wǎng)科技

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

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

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

  本Git代碼適用范圍

  假設(shè)你有一個老舊的Web站點(diǎn) http://dog.xmu.edu.cn ,IP地址為IPv4 1.2.3.4 ,你再提供一臺配置了IPv6的Ubuntu 18.04 LTS服務(wù)器,Clone我的代碼,跑一條命令,會幫你把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 ,最后會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 ,申請一個免費(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ī)制,張煥杰也帶了個sh自動化部署腳本,依賴較少。ansible目錄為我編寫的無腦自動化部署腳本,依賴Python3,可重復(fù)運(yùn)行,冪等,會不定期同步張煥杰的配置。

  Ansible跑起來類似這樣子:

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

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

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

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

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

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

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

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

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

  IP地址傳遞

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

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

  應(yīng)用的Web服務(wù)器日志配置也必須修改,否則只能得到反代的地址。有些關(guān)于X-Forwarded-For 的網(wǎng)上配置是錯誤的。有些是簡單粗暴用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個日志,一個是%h的,一個是%{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。舉個例子:

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

  IPv6

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

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

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

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

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

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

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

  關(guān)于IPv6地址規(guī)劃,我不是搞網(wǎng)絡(luò)的,我是搞應(yīng)用的,所以我不是太懂,宋崟川寫了個 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)站加個HTTPS可以解決大部分問題,如果你想再上幾層,還有其他可以改進(jìn):

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

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

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

  ● 網(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í)吧。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI