2、Web中间件基础:Tomcat架构与核心组件、Nginx反向代理与负载均衡、Apache HTTP Server基础配置、IIS安全基线
各位同学,咱们今天聊点实在的。Web中间件,说白了就是你家网站的大门和门卫。你想想看,没有它,用户怎么找到你的应用?攻击者又怎么被你拦住?我做了十几年安全,见过太多因为中间件配置不当被日穿的案例。今天咱们就把Tomcat、Nginx、Apache、IIS这四兄弟扒开看看。
2.1 Tomcat架构与核心组件
Tomcat这东西,我最早接触是在2008年,那时候还在用Tomcat 5.5。说实话,它的架构这么多年没大变过,核心就那几样东西。
2.1.1 整体架构
Tomcat本质上是一个Servlet容器 + HTTP服务器。它由以下几个核心组件构成:
- Server:最顶层,代表整个Tomcat实例。一个Server可以包含多个Service。
- Service:由Connector和Engine组成。说白了就是「监听端口 + 处理请求」的组合。
- Connector:负责接收客户端连接。常见的有HTTP Connector、AJP Connector。
- Engine:处理请求的核心引擎。它下面有Host、Context等子组件。
我个人的习惯:在生产环境里,我会把Connector的maxThreads和acceptCount调大。为什么?因为默认值太保守了,稍微有点并发就排队,攻击者一个慢速攻击就能把线程池打满。
2.1.2 核心组件详解
| 组件 | 作用 | 安全关注点 |
|---|---|---|
| Connector | 监听端口,接收HTTP/AJP请求 | 禁用AJP(CVE-2020-1938教训深刻) |
| Engine | 请求路由到Host | 配置Valve做访问控制 |
| Host | 虚拟主机,对应一个域名 | 限制autoDeploy,防止热部署被利用 |
| Context | 一个Web应用 | 关闭directory listing,配置session超时 |
嗯,这里要注意。Tomcat的AJP协议,我曾经在某个金融客户那里遇到过。他们用了AJP做负载均衡,结果Ghostcat漏洞一出,直接能读取任意文件。从那以后,我建议所有项目:不用AJP就彻底禁用,用的话必须升级到最新版。
2.1.3 安全配置示例
<!-- server.xml 关键配置 -->
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="400" acceptCount="200"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
server="None" />
<!-- 禁用AJP -->
<!-- <Connector port="8009" protocol="AJP/1.3" /> -->
<!-- 配置Valve限制IP -->
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192\.168\.\d+\.\d+|10\.\d+\.\d+\.\d+" />
避坑指南:我曾经见过有人把server.xml里的server="None"写成server="Apache"。结果攻击者一看响应头就知道你用的是Tomcat,直接针对Tomcat漏洞打。记住,隐藏版本信息是第一道防线。
2.2 Nginx反向代理与负载均衡
Nginx这东西,我用了快十年了。它最大的好处是什么?轻量、高性能、配置灵活。但很多人只把它当反向代理用,其实它的安全功能也很强大。
2.2.1 反向代理原理
说白了,Nginx就是站在用户和后端服务器之间的「中间人」。用户请求先到Nginx,Nginx再转发给后端。这样做的好处:
- 隐藏后端真实IP
- 统一SSL卸载
- 做请求过滤和限流
- 缓存静态资源
2.2.2 负载均衡策略
Nginx支持多种负载均衡算法,我常用的有:
| 策略 | 说明 | 适用场景 |
|---|---|---|
| 轮询(默认) | 按顺序分配请求 | 后端服务器配置相同 |
| 权重 | 按权重分配,weight越大越多 | 服务器性能不均 |
| IP Hash | 同一IP固定到同一服务器 | 需要session保持 |
| Least Connections | 分配给连接数最少的服务器 | 长连接场景 |
我建议:如果后端是Tomcat,尽量用IP Hash或者配置session共享。否则用户刷新一下页面,session丢了,那体验就太差了。
2.2.3 安全配置示例
# 限制请求速率
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
listen 443 ssl;
server_name example.com;
# 隐藏版本号
server_tokens off;
# 限制请求方法
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 405;
}
# 防止SQL注入和XSS(简单过滤)
if ($query_string ~* "union.*select.*\(") {
return 403;
}
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 限制上传大小
client_max_body_size 10m;
# 超时设置
proxy_connect_timeout 5s;
proxy_read_timeout 10s;
}
# 限制访问路径
location ~* \.(git|svn|env|log)$ {
deny all;
}
}
注意:Nginx的if语句是邪恶的。我踩过坑,if里面用rewrite会导致意想不到的问题。能用map或return解决的,就别用if。
2.3 Apache HTTP Server基础配置
Apache虽然老了,但江湖地位还在。很多老系统还在用,而且它的.htaccess机制确实灵活。不过,灵活也意味着容易出错。
2.3.1 核心配置项
Apache的配置主要分布在httpd.conf和虚拟主机配置里。我重点关注这几个:
- DocumentRoot:网站根目录,别放在/var/www/html这种默认路径
- Directory:目录权限控制,Options别乱开
- AllowOverride:是否允许.htaccess覆盖,生产环境建议关闭
- LimitRequestBody:限制请求体大小,防止大文件上传攻击
2.3.2 安全基线配置
# 隐藏版本信息
ServerTokens Prod
ServerSignature Off
# 禁用不必要的模块
# LoadModule status_module modules/mod_status.so
# LoadModule info_module modules/mod_info.so
# 目录权限
<Directory /var/www/html>
Options -Indexes -FollowSymLinks
AllowOverride None
Require all granted
</Directory>
# 限制请求大小
LimitRequestBody 10485760
# 禁用TRACE方法
TraceEnable Off
# 配置SSL
SSLEngine on
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5
避坑指南:我曾经在客户那里看到Options +Indexes +FollowSymLinks,结果攻击者直接遍历目录找到了备份文件。记住,Options -Indexes是必须的。
2.4 IIS安全基线
IIS,Windows上的老大哥。说实话,我接触IIS不多,但每次遇到都是因为安全问题。Windows的权限模型和Linux不一样,配置起来要格外小心。
2.4.1 核心安全配置
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 身份验证 | Windows身份验证或匿名(禁用基本身份验证) | 基本身份验证明文传输密码 |
| 请求筛选 | 启用,限制URL长度、查询字符串长度 | 防止缓冲区溢出 |
| ISAPI和CGI限制 | 只允许必要的扩展 | 减少攻击面 |
| 日志记录 | 启用,记录所有请求 | 便于事后审计 |
2.4.2 安全基线示例
# 通过PowerShell配置IIS安全基线
# 移除不必要的模块
Remove-WebConfigurationProperty -PSPath IIS:\ -Filter system.webServer/modules -Name "." -AtElement @{name="WebDAVModule"}
# 禁用目录浏览
Set-WebConfigurationProperty -Filter system.webServer/directoryBrowse -Name enabled -Value $false
# 限制HTTP方法
Add-WebConfigurationProperty -PSPath IIS:\ -Filter system.webServer/security/requestFiltering/verbs -Name "." -Value @{verb="GET";allowed=$true}
Add-WebConfigurationProperty -PSPath IIS:\ -Filter system.webServer/security/requestFiltering/verbs -Name "." -Value @{verb="POST";allowed=$true}
Add-WebConfigurationProperty -PSPath IIS:\ -Filter system.webServer/security/requestFiltering/verbs -Name "." -Value @{verb="HEAD";allowed=$true}
# 设置请求限制
Set-WebConfigurationProperty -Filter system.webServer/security/requestFiltering/requestLimits -Name maxAllowedContentLength -Value 30000000
Set-WebConfigurationProperty -Filter system.webServer/security/requestFiltering/requestLimits -Name maxURL -Value 4096
Set-WebConfigurationProperty -Filter system.webServer/security/requestFiltering/requestLimits -Name maxQueryString -Value 2048
注意:IIS的WebDAV模块,我见过太多人忘记禁用了。攻击者可以通过WebDAV上传webshell,直接getshell。所以,不用就禁用,这是铁律。
知识体系总览
为了让大家更直观地理解这四款中间件的安全要点,我画了一张图:
这张图把四款中间件的核心安全要点都列出来了。你想想看,不管是Tomcat的AJP禁用,还是Nginx的请求限流,本质上都是在做同一件事:减少攻击面,控制资源使用。
好了,这一章的内容就到这里。中间件安全是Web安全的基础,把这些配置烂熟于心,你就能挡住80%的常见攻击。下一章咱们聊聊更深入的东西。
公众号:蓝海资料掘金营,微信deep3321