Web服务容器如Tomcat与Nginx的安全加固
摘要:# 别让黑客在你家Tomcat和Nginx里“开派对” 我前两天帮朋友看一个线上问题,登录服务器一看,好家伙,Tomcat用的还是8.0.30,Nginx配置里一堆`default_server`,日志目录权限777。朋友还一脸无辜:“这不跑得好好的吗?…
别让黑客在你家Tomcat和Nginx里“开派对”
我前两天帮朋友看一个线上问题,登录服务器一看,好家伙,Tomcat用的还是8.0.30,Nginx配置里一堆default_server,日志目录权限777。朋友还一脸无辜:“这不跑得好好的吗?”
说白了,这种配置就像把家门钥匙插在锁上,还贴了张纸条写着“欢迎光临”。
很多团队搞安全,总盯着防火墙、WAF这些“大门”,却忘了自家应用容器——Tomcat、Nginx这些每天直接处理流量的“客厅”——才是黑客最爱摸进来的地方。今天咱就捞点干的,不说那些“加强安全意识”的片儿汤话,直接告诉你几个我亲自踩过坑、也帮别人填过坑的加固实操。
Tomcat:别让它“裸奔”在公网上
我见过最离谱的部署,是把Tomcat直接绑在公网IP的8080端口,管理后台密码还是admin/admin。这种站点,用Shodan一搜一个准,黑客都不用费劲渗透,直接“推门就进”。
第一个大实话:能不用Tomcat当对外服务,就别用。
如果业务必须,这几件事你今晚就得做:
1. 管理后台?藏起来,或者干脆废了。
Tomcat默认的/manager/html和/host-manager是著名的靶子。生产环境我建议你直接禁掉:在conf/tomcat-users.xml里,把相关role注释掉。如果某些自动化部署工具非得用,那就用Nginx做个反向代理,加IP白名单,只允许内网特定IP访问。别信什么“改个复杂密码就行”,爆破工具可不管密码多复杂。
2. 版本号?给我抹掉。
在conf/server.xml里,找到Connector配置,加上这两个参数:
server=" "
xpoweredby="false"
这能防止黑客直接通过报错信息判断你的Tomcat版本,然后去搜对应的漏洞。(对,我知道这算“安全通过隐匿”,但有用,为啥不做?)
3. 那些用不着的默认功能,关!
conf/web.xml里默认有一堆默认Servlet,比如default、jsp。如果你用不到JSP,直接把org.apache.jasper.servlet.JspServlet映射注释掉。用不到的HTTP方法(比如PUT、DELETE),也可以用security-constraint限制。
我自己的经验是,给Tomcat做次“瘦身手术”,把webapps目录下自带的docs、examples、ROOT(除非你需要)全删了,能砍掉一大半被利用的风险。
Nginx:你的第一道“真”防线
很多人把Nginx当个简单的转发工具,配置写得跟大学实验报告似的。其实它要是配好了,能帮你挡掉不少脏东西。
1. 错误信息,别给得太“实在”。
默认的Nginx错误页,会告诉你404 Not Found,甚至有些配置会泄露后端服务器信息。改它:
server {
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
# 关键在这句:关闭server_tokens
server_tokens off;
}
server_tokens off; 这行能让Nginx在响应头里隐藏版本号。你想想,黑客看到“Nginx/1.18.0”,下一秒就去查这个版本的CVE了,这跟自报家门有啥区别?
2. 限流,防的就是CC攻击。 那种慢速的、低频的CC攻击,专门消耗你的连接资源。在Nginx里配个限流,成本几乎为零,但效果立竿见影:
http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 10; # 单个IP同时最多10个连接
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location / {
limit_req zone=one burst=20 nodelay;
}
}
}
这个配置的意思是,单个IP每秒超过10个请求,我就开始延迟处理;超过20个(burst),就直接返回503。对于很多中小网站,这配置能扛住大部分野路子CC攻击了。
3. 屏蔽那些“不正常”的访问。
在server块里加上这些:
# 屏蔽非法的HTTP方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
# 屏蔽一些常见的恶意扫描User-Agent(这里只是个例子,你得根据自己日志更新)
if ($http_user_agent ~* (nmap|sqlmap|wget|curl|harvest) ) {
return 444;
}
# 防止目录遍历
location ~* \.(env|log|htaccess|htpasswd|git|svn) {
deny all;
}
注意,用if要小心,在Nginx里它算“邪恶的”,但用在server上下文的简单判断上,问题不大。return 444;是Nginx特有的,直接关闭连接,不给任何响应,让扫描器摸不着头脑。
组合拳:Tomcat + Nginx的最佳安全姿势
最理想的架构是:用户 -> Nginx (80/443) -> 内网反代/负载均衡 -> Tomcat (内网端口)。
- Tomcat只监听内网地址,比如
127.0.0.1:8080或192.168.x.x:8080。别让它出现在公网网卡上。 - Nginx做SSL终结,证书、加解密这些耗CPU的活儿都交给它,Tomcat专心处理业务。
- 在Nginx和Tomcat之间,可以再加一层应用层WAF(比如ModSecurity),或者简单的IP白名单(只允许Nginx服务器IP访问Tomcat管理端口)。
还有个小细节:文件权限。
别用root用户跑Tomcat!新建个低权限用户,比如tomcat,把整个Tomcat目录的属主改成它。webapps目录的权限收紧,别让上传的文件有执行权限(比如通过chmod -R 755设置)。
最后说点扎心的
安全加固这活儿,没有“一劳永逸”的银弹。你今天按这篇文章配好了,下个月可能出新漏洞。所以:
- 关注CVE。订阅一下Tomcat和Nginx的安全邮件列表,或者用软件资产管理系统扫一下。
- 看日志。Nginx的
access.log和error.log,Tomcat的localhost_access_log,定期看看有没有奇怪的请求。很多攻击前期都有扫描试探。 - 别瞎升级,但也别太老。我知道生产环境求稳,但用着官方都不再维护的版本(比如Tomcat 7系列),那不是稳,是赌。选一个长期支持(LTS)的稳定版本,做好测试再更新。
安全就是个持续的过程,跟家里打扫卫生一样,不可能扫一次就永远干净。但这些基础的、不花钱的加固措施,能帮你把90%的“脚本小子”和自动化扫描挡在门外。
行了,别光收藏了,趁现在,去服务器上看看你的server.xml和nginx.conf吧。

