在 Linux 上保护 Apache Web 服务器的技巧
如果您是系统管理员,则应遵循本文中提到的 10 个提示来保护您的 Apache Web 服务器。
1.禁用不必要的模块
如果您打算从源代码安装 apache,则应禁用以下模块。如果您执行 ./configure –help,您将看到所有可以禁用/启用的可用模块。
- userdir – 将请求映射到用户特定的目录。即 URL 中的 ~username 将被翻译到服务器中的目录
- autoindex – 不存在 index.html 文件时显示目录列表
- status – 显示服务器统计信息
- env – 清除/设置 ENV 变量
- setenvif – 将 ENV 变量放在标题上
- cgi – CGI 脚本
- actions - 请求触发的动作
- negotiation——内容协商
- alias——将请求映射到不同的文件系统部分
- include——服务器端包括
- filter – 智能过滤请求
- version – 使用 IfVersion 处理配置文件中的版本信息
- as-is - 原样文件类型
执行 ./configure 时禁用所有上述模块,如下所示
./configure \
--enable-ssl \
--enable-so \
--disable-userdir \
--disable-autoindex \
--disable-status \
--disable-env \
--disable-setenvif \
--disable-cgi \
--disable-actions \
--disable-negotiation \
--disable-alias \
--disable-include \
--disable-filter \
--disable-version \
--disable-asis
如果启用 ssl 并禁用 mod_setenv,您将收到以下错误。
- 错误:/usr/local/apache2/conf/extra/httpd-ssl.conf 第 223 行的语法错误:无效命令“BrowserMatch”,可能拼写错误或由服务器配置中未包含的模块定义
- 解决方案:如果您使用 ssl,请不要禁用 setenvif。或者,如果禁用 mod_setenvif,请在 httpd-ssl.conf 中注释掉 BrowserMatch。
安装后,当您执行httpd -l时,您将看到所有已安装的模块。
# /usr/local/apache2/bin/httpd -l
Compiled in modules:
core.c
mod_authn_file.c
mod_authn_default.c
mod_authz_host.c
mod_authz_groupfile.c
mod_authz_user.c
mod_authz_default.c
mod_auth_basic.c
mod_log_config.c
mod_ssl.c
prefork.c
http_core.c
mod_mime.c
mod_dir.c
mod_so.c
在此示例中,我们安装了以下 apache 模块。
- core.c – Apache 核心模块
- mod_auth* – 用于各种认证模块
- mod_log_config.c – 记录客户端请求。提供额外的日志灵活性。
- mod_ssl.c – 用于 SSL
- prefork.c – 用于 MPM(多处理模块)模块
- httpd_core.c – Apache 核心模块
- mod_mime.c – 用于设置文档 MIME 类型
- mod_dir.c – 用于目录路径上的斜杠重定向。如果您指定 url/test/,它会转到 url/test/index.html
- mod_so.c - 用于在启动或重启期间加载模块
2. 以单独的用户和组运行 Apache
默认情况下,apache 可能会作为无人值守或守护进程运行。最好在自己的非特权帐户中运行 apache。例如:阿帕奇。
创建 apache 组和用户。
groupadd apache
useradd -d /usr/local/apache2/htdocs -g apache -s /bin/false apache
修改httpd.conf,适当设置User和Group。
# vi httpd.conf
User apache
Group apache
在此之后,如果你重新启动 apache,然后执行 ps -ef,你会看到 apache 以“apache”的身份运行(除了第一个 httpd 进程,它总是以 root 身份运行)。
# ps -ef | grep -i http | awk '{print $1}'
root
apache
apache
apache
apache
apache
3.限制对根目录的访问(使用允许和拒绝)
通过在httpd.conf中设置以下内容来保护根目录
<Directory />
Options None
Order deny,allow
Deny from all
</Directory>
在上面:
- Options None- 将此设置为无,这将不会启用任何可选的额外功能。
- Order deny,allow – 这是处理“拒绝”和“允许”指令的顺序。这首先处理“拒绝”,然后处理“允许”。
- Deny from all – 这会拒绝所有人对根目录的请求。根目录没有 Allow 指令。所以,没有人可以访问它。
4.为conf和bin目录设置适当的权限
bin 和 conf 目录只能由授权用户查看。最好创建一个组,并将所有允许查看/修改 apache 配置文件的用户添加到该组。
让我们称这个组为:apacheadmin
创建组。
groupadd apacheadmin
允许访问此组的 bin 目录。
chown -R root:apacheadmin /usr/local/apache2/bin
chmod -R 770 /usr/local/apache2/bin
允许访问该组的 conf 目录。
chown -R root:apacheadmin /usr/local/apache2/conf
chmod -R 770 /usr/local/apache2/conf
向该组添加适当的成员。在这个例子中,ramesh 和 john 都是 apacheadmin 的一部分
# vi /etc/group
apacheadmin:x:1121:ramesh,john
5.禁用目录浏览
如果您不这样做,用户将能够看到您的根目录(或任何子目录)下的所有文件(和目录)。
例如,如果他们访问 http://{your-ip}/images/ 并且如果您在图像下没有 index.html,他们将看到列出的所有图像文件(和子目录)浏览器(就像 ls -1 输出)。从这里,他们可以单击单个图像文件进行查看,或单击子目录查看其内容。
要禁用目录浏览,您可以将Options 指令的值设置为“None”或“-Indexes”。A - 在选项名称前面会将其从为该目录强制执行的当前选项列表中删除。
索引将在浏览器的目录中显示可用文件和子目录的列表(仅当该文件夹中不存在 index.html 时)。因此,不应允许索引。
<Directory />
Options None
Order allow,deny
Allow from all
</Directory>
(or)
<Directory />
Options -Indexes
Order allow,deny
Allow from all
</Directory>
6. 不允许.htaccess
在 htdocs (或任何外部)下的特定子目录中使用 .htaccess 文件,用户可以覆盖默认的 apache 指令。在某些情况下,这是不好的,应该避免。您应该禁用此功能。
您不应允许用户使用 .htaccess 文件并覆盖 apache 指令。为此,请在根目录中设置“ AllowOverride None ”。
<Directory />
Options None
AllowOverride None
Order allow,deny
Allow from all
</Directory>
7.禁用其他选项
以下是 Options 指令的可用值:
- Options All- 启用所有选项(多视图除外)。如果您不指定 Options 指令,则这是默认值。
- Options ExecCGI – 执行 CGI 脚本(使用 mod_cgi)
- Options FollowSymLinks – 如果您在此目录中有符号链接,它将被跟踪。
- Options Includes- 允许服务器端包括(使用 mod_include)
- Options IncludesNOEXEC – 允许服务器端包含但不能执行命令或 cgi。
- Options Indexes- 禁用目录列表
- Options MultiViews - 允许内容协商的多视图(使用 mod_negotiation)
- Options SymLinksIfOwnerMatch – 类似于 FollowSymLinks。但是,只有当链接和链接到的原始目录之间的所有者相同时,才会出现这种情况。
永远不要指定“全部选项”。始终指定一个(或多个)上述选项。您可以在一行中组合多个选项,如下所示。
Options Includes FollowSymLinks
当您有嵌套的目录并希望覆盖父目录指令中的选项时,选项值前面的 + 和 – 很有帮助。
在此示例中,对于 /site 目录,它同时具有包含和索引:
<Directory /site>
Options Includes Indexes
AllowOverride None
Order allow,deny
Allow from all
</Directory>
对于 /site/en 目录,如果您只需要来自 /site 的索引(而不是包含),并且如果您只想跟随符号链接到此目录,请执行以下操作。
<Directory /site/en>
Options -Includes +FollowSymLink
AllowOverride None
Order allow,deny
Allow from all
</Directory>
- /site 将具有包含和索引
- /site/en 将有索引和 FollowSymLink
8.删除不需要的DSO模块
如果您已将任何动态共享对象模块加载到 apache,它们将出现在 httpd.conf 中的“LoadModule”指令下。
请注意,静态编译的 apache 模块不会被列为“LoadModule”指令。
在 httpd.conf 中注释掉任何不需要的“LoadModules”
grep LoadModule /usr/local/apache2/conf/httpd.conf
9. 限制对特定网络(或 IP 地址)的访问
如果您希望您的站点只能由特定的 IP 地址或网络查看,请执行以下操作:
要允许特定网络访问您的站点,请在 Allow 指令中提供网络地址。
<Directory /site>
Options None
AllowOverride None
Order deny,allow
Deny from all
Allow from 10.10.0.0/24
</Directory>
要允许特定 ip-address 访问您的站点,请在 Allow 指令中提供 ip-address。
<Directory /site>
Options None
AllowOverride None
Order deny,allow
Deny from all
Allow from 10.10.1.21
</Directory>
10.不显示或发送Apache版本(设置ServerTokens)
默认情况下,服务器 HTTP 响应标头将包含 apache 和 php 版本。类似于以下内容。这是有害的,因为我们不希望攻击者知道具体的版本号。
Server: Apache/2.2.17 (Unix) PHP/5.3.5
为避免这种情况,请在 httpd.conf 中将 ServerTokens 设置为 Prod。这将显示“Server: Apache”,没有任何版本信息。
# vi httpd.conf
ServerTokens Prod
以下是可能的 ServerTokens 值:
- ServerTokens Prod displays “Server: Apache”
- ServerTokens Major displays “Server: Apache/2”
- ServerTokens Minor displays “Server: Apache/2.2”
- ServerTokens Min displays “Server: Apache/2.2.17”
- ServerTokens OS displays “Server: Apache/2.2.17 (Unix)”
- ServerTokens Full displays “Server: Apache/2.2.17 (Unix) PHP/5.3.5” (如果您未指定任何 ServerTokens 值,则为默认值)
除了以上 10 条提示之外,请确保保护您的 Linux 操作系统。如果您的操作系统不安全,那么保护您的 apache 毫无意义。此外,始终保持您的 apache 版本是最新的。最新版本的 apache 包含所有已知安全问题的修复程序。确保经常查看您的 apache 日志文件。
- 点赞
- 收藏
- 关注作者
评论(0)