別讓 SSL 證書暴露了你的網(wǎng)站服務(wù)器 IP
我們通常會(huì)用cdn套到服務(wù)器ip上,來(lái)為網(wǎng)站或者后端程序做加速、防御。可是nginx在設(shè)計(jì)上有個(gè)小缺陷,會(huì)因?yàn)閟sl證書泄露網(wǎng)站的原IP
原 理
用Nginx部署網(wǎng)站,在默認(rèn)或不正確的配置下,網(wǎng)站開啟ssl,直接訪問(wèn)ip的443端口,即ip:443,Nginx會(huì)返回默認(rèn)一個(gè)站點(diǎn)的ssl證書,間接的能讓別人掃到這個(gè)ip對(duì)應(yīng)的域名。
原理就是對(duì)ip的443端口發(fā)送clienthello,對(duì)方回復(fù)的 serverhello中有ssl證書,ssl證書里的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的原因。
解決辦法
- # 禁止IP直接訪問(wèn)網(wǎng)站
- server {
- listen 80 default_server;
- listen [::]:80 default_server;
- server_name _;
- return 444;
- }
自簽IP的SSL證書,返回444
自簽證書的目的不是為了訪問(wèn),而是避開Nginx的這個(gè)缺陷。生成自簽的IP SSL證書可以用開源的Mkcert(https://myssl.com/create_test_cert.html)工具。Mkcert使用起來(lái)稍微麻煩,或者用一個(gè)測(cè)試證書的在線網(wǎng)頁(yè)工具:https://myssl.com/create_test_cert.html
在填寫域名的位置填上IP地址,點(diǎn)生成按鈕會(huì)自動(dòng)測(cè)試證書展示在下面,各自保存為.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)買合法IP站點(diǎn)的SSL證書
花點(diǎn)小錢買個(gè)合法的IP SSL證書配置到nginx里,IP證書一般一二百左右。加錢,世界觸手可及。
僅允許指定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段更新,也加到里面。
本文轉(zhuǎn)載自微信公眾號(hào)「Linux就該這么學(xué)」,作者倪家興。轉(zhuǎn)載本文請(qǐng)聯(lián)系Linux就該這么學(xué)公眾號(hào)。