Nginx 泛域名配置的隐患与对策

💡 原文中文,约3400字,阅读约需8分钟。
📝

内容提要

Nginx泛域名配置存在安全隐患,如任意二级域名可访问网站,影响SEO和合规。对策包括:手动列出域名、使用白名单校验并重定向或断开连接(return 444)、配置默认主机阻断未备案域名、通过ssl_reject_handshake防止SNI泄露,以及为IP访问自签证书。最后提及Caddy处理更简单,可自动管理证书并限制子域名访问。

🔎

延伸解读

泛域名绑定的风险来源

文章指出,泛域名绑定(如 *.example.com)在网站程序未正确处理多站点模式时,可能导致任意二级域名都能访问网站内容。这种未预期的行为可能被恶意利用,生成奇怪链接并被爬虫收录,进而影响SEO并带来合规风险。理解这一风险有助于运维人员评估是否需要收紧配置。

白名单与默认主机的配合

对于仍需保留泛域名的场景,文章建议将主域名放在server_name首位,并通过正则匹配实现白名单校验:对已知子域名(如cdn、api)放行,对未预期域名使用return 444直接断开连接。同时,配置默认主机(default_server)并返回444,可阻断未备案域名指向服务器的风险,但需注意保留IP访问时的判断逻辑。

SNI泄露与HTTPS防护

即使Nginx断开连接,HTTPS握手时仍可能通过证书泄露SNI域名列表,暴露服务器与域名的关联。文章建议在server块中启用ssl_reject_handshake on来拒绝握手,若需支持IP访问,则需为IP地址自签证书并配置相应SSL证书。这一措施对使用CDN隐藏真实IP的场景尤为重要。

Caddy的替代方案

文章末尾的评论提到,Caddy在处理类似问题时更简单,可通过通配符证书自动管理,并利用host匹配和fallback机制限制子域名访问,未匹配的子域名返回403。这为读者提供了另一种工具选择,但需注意评论内容并非原文主体,仅供参考。

Q&A

Nginx 泛域名配置(如 *.example.com)会带来哪些隐患?

如果网站不是真正的多站点模式,任意二级域名都能访问网站内容,可能导致未预期的访问、影响 SEO,并带来合规风险(如未备案域名指向服务器)。

如何避免 Nginx 泛域名配置导致任意二级域名都能访问?

如果二级域名数量有限,可以手动列出所有二级域名;如果需要保留泛域名,可以添加白名单校验,对未预期的域名使用 return 444 断开连接,或对旧域名进行重定向。

Nginx 中 $server_name 变量有什么作用?

$server_name 代表 server_name 配置中的第一个值,因此将主域名放在第一位便于后续处理,例如用于重定向或判断。

如何配置 Nginx 默认主机来阻断未备案域名?

可以配置一个默认服务器块,设置 server_name _; 并返回 return 444; 来断开所有未指定域名的连接。如果希望支持 IP 直接访问,可以添加条件判断,仅对 IP 地址放行。

如何防止 HTTPS 访问时 SNI 域名泄露?

在 Nginx 的 server 块中设置 ssl_reject_handshake on; 可以拒绝 SSL 握手,从而避免客户端从证书中获取 SNI 域名列表。如果希望支持 IP 直接访问,则需要为 IP 配置自签证书。

如何为 IP 地址生成自签 SSL 证书?

可以使用 openssl 命令生成,例如:openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ip.key -out ip.crt -subj "/CN=1.2.3.4" -addext "subjectAltName=IP:1.2.3.4"。如果同时支持 IPv4 和 IPv6,需要创建配置文件并指定多个 IP。

Caddy 相比 Nginx 在处理泛域名配置上有何优势?

Caddy 可以自动管理泛域名证书,并通过类似 handle 的指令限制子域名访问,配置更简单,能避免 Nginx 中需要手动处理的安全隐患。

🏷️

标签

➡️

继续阅读