別讓 SSL 證書暴露了你的網(wǎng)站服務(wù)器 IP
我們通常會用cdn套到服務(wù)器ip上,來為網(wǎng)站或者后端程序做加速、防御。可是nginx在設(shè)計上有個小缺陷,會因為ssl證書泄露網(wǎng)站的原IP
原 理
用Nginx部署網(wǎng)站,在默認或不正確的配置下,網(wǎng)站開啟ssl,直接訪問ip的443端口,即ip:443,Nginx會返回默認一個站點的ssl證書,間接的能讓別人掃到這個ip對應(yīng)的域名。
原理就是對ip的443端口發(fā)送clienthello,對方回復(fù)的 serverhello中有ssl證書,ssl證書里的common name 有域名信息。這樣就知道了解析這個ip的域名。所以更準確的說是IP的443端口可能會暴露了域名。
動作再大一點,批量掃描機房的ip段,把對應(yīng)的域名-ip 的多值映射表統(tǒng)計起來。以后想查某個域名對應(yīng)的源站 ip 查這個表就夠了,這是黑產(chǎn)喜歡干的事。
同時也是很多站點,明明套上了cdn,依然能被打到源站IP的原因。
解決辦法
- # 禁止IP直接訪問網(wǎng)站
- server {
- listen 80 default_server;
- listen [::]:80 default_server;
- server_name _;
- return 444;
- }
自簽IP的SSL證書,返回444
自簽證書的目的不是為了訪問,而是避開Nginx的這個缺陷。生成自簽的IP SSL證書可以用開源的Mkcert(https://myssl.com/create_test_cert.html)工具。Mkcert使用起來稍微麻煩,或者用一個測試證書的在線網(wǎng)頁工具:https://myssl.com/create_test_cert.html
在填寫域名的位置填上IP地址,點生成按鈕會自動測試證書展示在下面,各自保存為.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;
- }
購買合法IP站點的SSL證書
花點小錢買個合法的IP SSL證書配置到nginx里,IP證書一般一二百左右。加錢,世界觸手可及。
僅允許指定cdn的IP訪問
Nginx僅允許指定cdn的IP訪問,避免放到公網(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)載自微信公眾號「Linux就該這么學(xué)」,作者倪家興。轉(zhuǎn)載本文請聯(lián)系Linux就該這么學(xué)公眾號。