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。所以,不用就禁用,这是铁律

知识体系总览

为了让大家更直观地理解这四款中间件的安全要点,我画了一张图:

Web中间件安全知识体系 Tomcat Nginx Apache IIS 核心组件 • Connector(禁用AJP) • Engine(Valve访问控制) • Host(关闭autoDeploy) • Context(关闭目录列表) 安全功能 • 反向代理(隐藏后端) • 负载均衡(轮询/权重) • 请求限流(limit_req) • 请求过滤(方法/路径) 安全配置 • 隐藏版本(ServerTokens) • 目录权限(Options -Indexes) • 禁用TRACE方法 • 限制请求体大小 安全基线 • 禁用WebDAV • 请求筛选限制 • 身份验证配置 • 日志记录启用 核心原则 最小权限 · 隐藏信息 · 限制资源 · 记录日志 禁用不必要功能 · 及时打补丁 · 定期审计

这张图把四款中间件的核心安全要点都列出来了。你想想看,不管是Tomcat的AJP禁用,还是Nginx的请求限流,本质上都是在做同一件事:减少攻击面,控制资源使用

好了,这一章的内容就到这里。中间件安全是Web安全的基础,把这些配置烂熟于心,你就能挡住80%的常见攻击。下一章咱们聊聊更深入的东西。


公众号:蓝海资料掘金营,微信deep3321