我們通常會(huì)用cdn套到服務(wù)器ip上,來(lái)為網(wǎng)站或者后端程序做加速、防御?墒莕ginx在設(shè)計(jì)上有個(gè)小缺陷,會(huì)因?yàn)閟sl證書(shū)泄露網(wǎng)站的原IP |
原理
用Nginx部署網(wǎng)站,在默認(rèn)或不正確的配置下,網(wǎng)站開(kāi)啟ssl,直接訪問(wèn)ip的443端口,即ip:443,Nginx會(huì)返回默認(rèn)一個(gè)站點(diǎn)的ssl證書(shū),間接的能讓別人掃到這個(gè)ip對(duì)應(yīng)的域名。
原理就是對(duì)ip的443端口發(fā)送clienthello,對(duì)方回復(fù)的 serverhello中有ssl證書(shū),ssl證書(shū)里的common name 有域名信息。這樣就知道了解析這個(gè)ip的域名。所以更準(zhǔn)確的說(shuō)是IP的443端口可能會(huì)暴露了域名。
動(dòng)作再大一點(diǎn),批量掃描機(jī)房的ip段,把對(duì)應(yīng)的域名-ip 的多值映射表統(tǒng)計(jì)起來(lái)。以后想查某個(gè)域名對(duì)應(yīng)的源站 ip 查這個(gè)表就夠了,這是黑產(chǎn)喜歡干的事。
同時(shí)也是很多站點(diǎn),明明套上了cdn,依然能被打到源站IP的原因。
解決辦法
禁止直接訪問(wèn)IP
# 禁止IP直接訪問(wèn)網(wǎng)站
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}
自簽IP的SSL證書(shū),返回444
自簽證書(shū)的目的不是為了訪問(wèn),而是避開(kāi)Nginx的這個(gè)缺陷。生成自簽的IP SSL證書(shū)可以用開(kāi)源的Mkcert()工具。Mkcert使用起來(lái)稍微麻煩,或者用一個(gè)測(cè)試證書(shū)的在線網(wǎng)頁(yè)工具:
在填寫(xiě)域名的位置填上IP地址,點(diǎn)生成按鈕會(huì)自動(dòng)測(cè)試證書(shū)展示在下面,各自保存為.pem文件和.key文件。然后在nginx里配置上“return 444”,類似配置大概:
{
listen 80 ;
listen 443 ssl http2 default_server;
server_name ip;
#HTTP_TO_HTTPS_END
ssl_certificate xxxx.pem;
ssl_certificate_key xxxx.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
return 444;
}
購(gòu)買(mǎi)合法IP站點(diǎn)的SSL證書(shū)
花點(diǎn)小錢(qián)買(mǎi)個(gè)合法的IP SSL證書(shū)配置到nginx里,IP證書(shū)一般一二百左右。
加錢(qián),世界觸手可及。
僅允許指定cdn的IP訪問(wèn)
Nginx僅允許指定cdn的IP訪問(wèn),避免放到公網(wǎng)上被任何人掃。以騰訊云CDN段為例,在Nginx網(wǎng)站配置文件里,添加如下:
location / {
allow 58.250.143.0/24;
allow 58.251.121.0/24;
allow 59.36.120.0/24;
allow 61.151.163.0/24;
allow 101.227.163.0/24;
allow 111.161.109.0/24;
allow 116.128.128.0/24;
allow 123.151.76.0/24;
allow 125.39.46.0/24;
allow 140.207.120.0/24;
allow 180.163.22.0/24;
allow 183.3.254.0/24;
allow 223.166.151.0/24;
deny all;
}
查一下使用的CDN商家的文檔,如果有新的IP段更新,也加到里面。