在 Linux 上保护 Apache Web 服务器的技巧

网友投稿 670 2022-05-30

如果您是系统管理员,则应遵循本文中提到的 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 身份运行)。

在 Linux 上保护 Apache Web 服务器的技巧

# ps -ef | grep -i http | awk '{print }' root apache apache apache apache apache

3.限制对根目录的访问(使用允许和拒绝)

通过在httpd.conf中设置以下内容来保护根目录

Options None Order deny,allow Deny from all

在上面:

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 时)。因此,不应允许索引。

Options None Order allow,deny Allow from all (or) Options -Indexes Order allow,deny Allow from all

6. 不允许.htaccess

在 htdocs (或任何外部)下的特定子目录中使用 .htaccess 文件,用户可以覆盖默认的 apache 指令。在某些情况下,这是不好的,应该避免。您应该禁用此功能。

您不应允许用户使用 .htaccess 文件并覆盖 apache 指令。为此,请在根目录中设置“ AllowOverride None ”。

Options None AllowOverride None Order allow,deny Allow from all

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 目录,它同时具有包含和索引:

Options Includes Indexes AllowOverride None Order allow,deny Allow from all

对于 /site/en 目录,如果您只需要来自 /site 的索引(而不是包含),并且如果您只想跟随符号链接到此目录,请执行以下操作。

Options -Includes +FollowSymLink AllowOverride None Order allow,deny Allow from all

/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 指令中提供网络地址。

Options None AllowOverride None Order deny,allow Deny from all Allow from 10.10.0.0/24

要允许特定 ip-address 访问您的站点,请在 Allow 指令中提供 ip-address。

Options None AllowOverride None Order deny,allow Deny from all Allow from 10.10.1.21

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 日志文件。

Apache Linux web前端

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:鸿蒙轻内核M核源码分析系列十六 MPU内存保护单元
下一篇:嵌入式开发要学多久?要学哪些课程
相关文章