《安全配置从默认开始》
第4章 Web服务器安全配置(Apache)

4、Web服务器安全配置(Apache)

Apache HTTP Server 是全球使用最广泛的 Web 服务器软件之一。然而,默认安装的 Apache 往往存在诸多安全隐患,如信息泄露、目录遍历、不必要的模块加载等。本课程将带您从默认配置出发,逐步加固 Apache 服务器,构建一个安全、可靠的 Web 服务环境。

4.1 Apache默认配置风险

Apache 在默认安装后,会开启许多不必要的功能和服务,这些功能在方便开发的同时,也为攻击者提供了可乘之机。以下是常见的默认配置风险:

⚠️ 主要风险点

  • 默认页面存在:It works! 页面暴露服务器类型
  • 目录列表开启:访问无索引文件的目录时,会列出所有文件
  • 服务器状态页面:/server-status 可能未限制访问
  • CGI 脚本示例:/cgi-bin/ 目录下的测试脚本可能被利用
  • 符号链接跟随:Options +FollowSymLinks 可能导致越权访问
Apache 默认配置风险 Apache 默认页面 (It works!) 目录列表 (Indexes) 服务器状态 (/server-status) CGI 示例脚本 👤 攻击者 利用
💡 安全建议:安装 Apache 后,应立即删除默认页面文件 /var/www/html/index.html(或根据发行版调整),并检查 httpd.conf 或 apache2.conf 中的配置项。

4.2 目录权限设置

合理的目录权限设置是 Web 安全的第一道防线。Apache 通过 <Directory> 指令控制目录的访问行为,错误的配置可能导致敏感文件泄露或代码执行。

核心配置原则

配置项 推荐值 说明
Options -Indexes -FollowSymLinks 禁用目录列表和符号链接跟随
AllowOverride None 禁止 .htaccess 覆盖配置,提升性能和安全
Require Require all denied(默认) 拒绝所有访问,再按需开放
目录权限控制流程 用户请求 检查 <Directory> Options / AllowOverride ? ✅ 允许 ❌ 拒绝 访问资源 403 禁止

安全配置示例

<Directory /var/www/html>
    Options -Indexes -FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

# 保护敏感目录
<Directory /var/www/html/admin>
    Require ip 192.168.1.0/24
</Directory>

# 禁止访问 .git 等隐藏目录
<DirectoryMatch "^/.*/\.">
    Require all denied
</DirectoryMatch>

4.3 隐藏版本信息

Apache 默认会在 HTTP 响应头中发送版本信息(如 Server: Apache/2.4.57 (Unix)),这为攻击者提供了精确的漏洞利用目标。隐藏版本信息是安全加固的基本操作。

🔧 配置方法

在 Apache 主配置文件(httpd.conf 或 apache2.conf)中添加或修改以下指令:

# 隐藏 Apache 版本和操作系统信息
ServerTokens Prod
ServerSignature Off

参数说明:

  • ServerTokens Prod:仅返回 Apache,不包含版本号和操作系统
  • ServerSignature Off:关闭错误页面底部的版本信息
隐藏版本信息效果对比 修改前 Server: Apache/2.4.57 (Unix) 修改后 Server: Apache 攻击者无法获取精确版本号 降低针对性攻击风险
🔍 验证方法:使用 curl -I http://your-server.com 查看响应头中的 Server 字段,确认不再显示详细版本号。

4.4 禁用不必要的模块

Apache 默认加载了许多模块,其中不少模块在实际业务中并不需要。每个加载的模块都可能成为攻击面,因此应遵循“最小权限原则”,只启用必要的模块。

常见危险模块

模块名称 风险说明 禁用方法
mod_info 泄露服务器配置信息 a2dismod info
mod_status 暴露服务器状态和活动连接 a2dismod status
mod_autoindex 目录列表功能,信息泄露 a2dismod autoindex
mod_userdir 允许用户目录访问,扩大攻击面 a2dismod userdir
Apache 模块管理:禁用不必要的模块 mod_rewrite ✅ mod_ssl ✅ mod_info ❌ mod_status ❌ ... ❌ ✅ 保留必要模块(如 rewrite、ssl) ❌ 禁用危险/非必要模块(如 info、status、autoindex)

模块管理命令

# 查看已启用的模块
apache2ctl -M

# 禁用模块(Debian/Ubuntu)
a2dismod info status autoindex userdir

# 禁用模块(RHEL/CentOS)
# 编辑 /etc/httpd/conf.modules.d/ 下的配置文件,注释掉不需要的 LoadModule 行

4.5 HTTPS配置基础

HTTPS 通过 SSL/TLS 协议加密通信,防止数据在传输过程中被窃听或篡改。为 Apache 配置 HTTPS 是保障 Web 安全的基本要求。

配置步骤

  1. 获取 SSL 证书:可从 Let's Encrypt 免费获取,或购买商业证书
  2. 启用 SSL 模块:a2enmod ssl
  3. 配置虚拟主机:监听 443 端口,指定证书路径
  4. 强制 HTTPS 重定向:将 HTTP 请求重定向到 HTTPS
  5. 测试配置:apache2ctl configtest
HTTPS 通信流程 客户端 Apache ① ClientHello ② ServerHello + 证书 ③ 密钥交换 ④ 加密通信开始 🔒 🔒 数据加密传输

HTTPS 虚拟主机配置示例

<VirtualHost *:443>
    ServerName www.example.com
    DocumentRoot /var/www/html

    # SSL 配置
    SSLEngine on
    SSLCertificateFile      /etc/ssl/certs/example.com.crt
    SSLCertificateKeyFile   /etc/ssl/private/example.com.key
    SSLCertificateChainFile /etc/ssl/certs/chain.crt

    # 安全协议和加密套件
    SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite          HIGH:!aNULL:!MD5:!3DES
    SSLHonorCipherOrder     on

    <Directory /var/www/html>
        Options -Indexes
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

# HTTP 自动跳转 HTTPS
<VirtualHost *:80>
    ServerName www.example.com
    Redirect permanent / https://www.example.com/
</VirtualHost>
🔒 安全加分项:使用 mod_security(WAF)和 mod_evasive(防DDoS)进一步增强 Apache 安全性。定期使用 sslscan 或 testssl.sh 检查 SSL 配置强度。

📌 总结:Apache 安全配置应从默认开始,逐步收紧权限、隐藏信息、精简模块、启用加密。安全是一个持续的过程,请定期审查配置并关注安全公告。

专注课程资料整理