如何保护Apache Web服务器
Apache和Nginx共同为整个互联网上运行的至少80%的做出了贡献。
Web安全性的主题超出了Web服务器软件包本身的范围(我们将仅讨论Apache Web服务器软件包及其在Linux服务器上的相关安全性配置)。
配置Web服务器程序包并进行仔细检查只是一个起点。
另外,其他Web安全漏洞也不直接依赖于Web服务器。
例如,防火墙,Web服务器的DNS,网络安全性等都是Web安全性的一部分。
讨论Web安全的所有这些方面不在本文的讨论范围之内。
1.Apache Web服务器的非特权用户。
大多数Linux发行版都有一个名为nobody的默认用户(当然,这是用于安全运行某些守护程序的非特权用户)。
与无特权的用户一起运行诸如Apache之类的进程的主要思想是,即使有人破坏了Web服务器,他也应该只能执行允许该用户(正在运行Web服务器进程的用户)执行的任何操作。
但是由于没有人是默认的非特权用户,因此大多数守护程序和应用程序默认都使用它。
因此,我不建议以nobody用户身份运行Apache。
创建自己希望运行Apache的新非特权用户。
#groupadd apache #useradd apache -g apache -d /dev/null/-s /sbin/nologin
上面显示的命令将执行以下操作。
- 它将创建一个名为apache的组。
- 它将创建一个名为apache的用户作为该组(我们使用第一个命令创建的Apache组)的一部分,并将其主目录设置为/dev/null并将登录shell设置为/sbin/nologin(基本上,该用户将不会获得shell或者说将无法登录)
现在,一旦完成,请使用以下内容修改Apache配置文件。
User httpd Group httpd
信息安全有一个术语,或者我必须说安全通常称为隔离。
分区化的思想是整个系统,例如Linux服务器(当然,它可以同时运行许多不同的服务),但是必须以良好的方式将所有这些服务彼此分离,以便在发生某些情况时他们中的任何一个都不应该影响对方。
对于服务器上每个正在运行的服务,只有一个唯一的隔离用户可以从特权角度确保这一点,以防万一。
2.从Binary安装Apache以提高安全性
我知道关于如何安装Apache以提高安全性有两种思路。
关于从二进制安装它的建议,有些人可能与我不同意,但由于以下原因,我建议从二进制安装Apache。
- 与从源代码安装相比,从二进制文件安装要容易得多。由于其安装过程简单,因此不易出错。鉴于大多数组织都雇用新手管理员来完成这些任务(对于安全和系统管理的新手来说,他们通常以完成任务而不是安全的方式完成任务)。
- 提供二进制软件包的操作系统供应商可能已经对其进行了自定义,以使其完全适合环境。
- 所有Linux发行商在发布升级或者软件包到其官方存储库之前,都经过严格的测试。因此,我必须说,在安装之前,它必须已经经过了大量测试。
- 由供应商本身提供的对关键安全问题的更新,并且更易于应用(大多数情况下,我们可以自动应用这些更新)
3.小巧的HTTP配置文件
几个月前,我正在阅读一些与安全相关的白皮书,他们的建议之一对我很有吸引力。
没什么...
使配置文件小而又短,并且我们必须知道启用了什么,没有启用什么...小文件更易于阅读和消化。
我们必须意识到默认的Apache配置文件太长的事实(可能是因为注释太多)。
当文件太长时,在跳过文件时,我们一定会错过一些已启用/禁用的选项。
因此,我的建议是从一个空的Apache配置文件开始,然后开始添加配置选项,这对于正常运行是必不可少的。
4.仅允许提供DocRoot
Apache可以提供它可以访问的任何文件。
虽然这是一个不错的功能,但是从安全角度来看,这是一件危险的事情。
如果文件具有Apache的读取权限,则最终用户可以通过使用..%2f和%2e%2e%5c之类的字符对请求进行url编码来打开该文件,以遍历目录并直接访问预期的文件。
因此,这是一个很好的习惯,即只允许将docroot服务于所有人,而拒绝其他人。
以下代码段仅允许我们的文档根目录和拒绝/目录一起使用。
<Directory Order Deny,Allow Deny from all </Directory> <Directory /var/www/html> Order Allow,Deny Allow from all </Directory>
5.不显示Apache服务器信息
收集有关Web服务器的信息是入侵者要做的第一件事。
他拥有的信息量越多,成功闯入的机会就越大。
因此,系统管理员需要以这样的方式配置其Web服务器,使其显示有关其自身的信息量更少。
当Apache遇到404或者其他类似错误时,默认情况下将显示其自己的版本和系统详细信息。
以下配置不会将这些版本信息显示给其他人。
ServerSignature Off ServerTokens Prod
6,仅允许使用必需的HTTP方法
用户代理出于不同目的将不同类型的HTTP方法发送给服务器。
下面提到HTTP方法的一些示例。
- 得到
- 邮政
- 放
- 删除
- 头
- 痕迹
这里要注意的一点是仅允许正常运行所需的那些方法。
我们可以使用Apache中的ModSecurity禁用/启用不同的方法类型。
但是由于ModSecurity本身就是一个大话题,因此我们将使用LimitExcept(这是apache配置文件中的指令)。
<LimitExcept GET POST OPTIONS> Deny from all </LimitExcept>
不幸的是,无法使用上面显示的方法禁用TRACE方法。
HTTP跟踪基本上用于调试服务器端问题。
基本上,它将服务器收到的请求返回给客户端。
因此,客户端将确切地知道服务器如何看待该请求。
我们可以在Apache中禁用跟踪方法,如下所示。
TraceEnable Off
7.将Apache放入chroot Jail环境
对于ftp或者http之类的任何公共可用服务,必须采取的一项很好的安全措施是启用chroot环境。
Chroot不过是一种用于限制由特定进程访问时对文件系统的访问的方法。
只需选择一个文件夹并将其设置为新的文件系统根即可。
Chroot具有以下优点。
- 即使有人设法进入,他也只能访问受限制的环境(或者说是文件系统的一部分,在本例中是我们为该进程创建的根目录)。入侵者将无法触摸其他文件。
- 如果入侵者进入chroot环境中,则将没有shell程序和其他工具(如编译器)将对入侵者可用。由于这个原因,他可以执行的事情将是最少的。我必须说,他只会在chroot环境中拥有可用的东西(文件系统中该部分中的文件和可执行文件)
正如我们刚刚讨论的那样,将应用程序放入chroot的主要优点是访问受限。
这是因为我们只能运行chroot目录中的内容。
这意味着如果我想在chroot监狱环境中运行apache,那么我将需要将所有共享库文件复制到chroot目录中,以便apache可以运行它。
如果我需要php,那么我将不得不将所有php所需的库复制到我的chroot目录中,类似地,perl等。
Chroot不过是创建一个新的根目录(/,目录用于进程运行...因此,所有配置文件,库文件现在都将位于新根目录中)
8.显示自定义错误消息
每个Web服务器都有自己的显示错误消息的样式。
有时攻击者可以有意地请求Web服务器上不存在的页面来检查错误消息(因为他们可以识别默认错误消息并找到Web服务器版本)
为避免此类漏洞,我建议为所有众所周知的HTTP错误状态代码提供自定义错误消息。
例如,显示我们自己的400、401、500、404等消息。
可以在apache中完成,如下所示。
ErrorDocument 400 /mycute400.html ErrorDocument 401 /mycute401.html ErrorDocument 403 /mycute401.html ErrorDocument 404 /mycute404.html ErrorDocument 405 /mycute405.html ErrorDocument 500 /mycute500.html
9,删除Apache中的默认文件
几乎所有的Web服务器都带有一些默认文件,这些文件可以帮助系统管理员最初设置服务器。
尽管它们在一开始可能很有帮助,但随后可能会导致安全问题。
这是因为,这些文件可以向外部人员揭示有关Web服务器的许多信息。
下面提到了我们需要从Web服务器中删除的文件。
- 默认HTML文件。 Apache有时会使用这些文件向系统管理员显示默认网页。这可以作为向系统管理员的确认消息,表明Web服务器正在按预期工作。
- 默认的CGI脚本。 Apache附带了一些默认的CGI脚本。 CGI脚本在安全领域总是有不好的声誉。默认情况下,Apache附带有printenv和test-cgi脚本。这两个都应删除或者重命名。
- 还要删除apache手册目录。
#rm -rf /usr/local/apache2/htdocs/* #rm –rf /usr/local/apache2/cgi-bin/* #rm –rf /usr/local/apache2/manual
10.禁用apache中的目录列表
如果文档根目录中没有索引文件,则apache的默认行为是列出该目录的内容。
这意味着它将在浏览器本身内显示该目录内的所有文件。
像单击并打开/下载它们。
应该关闭此行为,因为它可以揭示有关docroot的许多详细信息。
以下options指令可用于禁用Apache中的目录列表。
<Directory /var/www/html> Options -Indexes </Directory>
完成上述配置后,该目录的默认目录列表将被HTTP禁止消息替换。
11.仅允许已知版本的HTTP协议
不响应具有未知http协议版本号的请求是一个好主意。
简单的类似curl的程序可以将格式错误的http协议版本号发送到Web服务器,以查看服务器如何响应此类请求。
这些事情基本上被证明对试图从目标服务器收集信息的人有用。
因此,我们需要限制允许的HTTP协议版本。
可以如下所示进行。
RewriteEngine On RewriteCond %{THE_REQUEST} !HTTP/(0\.9|1\.[01])$ RewriteRule .* - [F]
12.限制apache中允许的文件类型
文档根目录中可能有一些文件,其中包含内部的关键代码和其他详细信息。
最终用户应禁止直接请求这些文件。
这可以通过限制服务器允许的文件类型来实现。
或者说,让我们对允许提供的文件扩展名进行限制。
我们系统管理员的名称文件如.backup或者.old等用于制作另一个副本或者备份,因此我们不允许这些常见的扩展类型。
<Files ~ "(.bak|.config|.old)"> Order allow,deny Deny from all </Files>
因此,继续添加我们不希望得到的扩展。
13.在一定程度上可以抵御DOS中的DOS攻击。
尽管使用以下方法完全无法完全防御DDOS攻击,但是我们仍然可以抵抗小带宽攻击。
保护服务器免受大型和大型ddos攻击超出了Apache的保护范围(以及与此相关的任何Web服务器)。
这主要是因为Web服务器不是为了解决该问题而设计的,并且不能超出一定范围来保护自己免受此类攻击。
必须在流量到达网络服务器之前就已经根据数据包大小,数据包标头等对流量进行了强大的过滤。
此类事情由网络提供商执行,后者具有用于根据最终用户给出的标准对深层数据包进行检查并进行快速处理/过滤的硬件。
讨论此类措施不在本文讨论范围之内。
因此,让我们讨论一下系统管理员可以采取哪些措施来保护其apache Web服务器,或者我必须说最小程度的保护,以防止此类小型攻击。
相关:如何保护和保护Apache免受Slowloris攻击
打开与Web服务器的连接将消耗其服务器资源。
太多的连接意味着太多的资源(至少在apache的情况下,如果活动的连接太多,那么将占用太多的资源。
)
阅读:Nginx和Apache之间的主要区别
攻击者可以利用此优势,并且可以通过打开过多的连接而永远不会关闭它们来消耗服务器资源。
因此,Web服务器将无法处理其他合法请求。
我们可以通过调整apache中的TimeOut值在一定程度上防止这种情况的发生。
apache中的超时值表示服务器从客户端接收消息之前等待的时间(以秒为单位)(关闭连接之前)。
默认超时值为300秒。
等待与服务器的每个连接所需的时间太长。
因此,让我们将其减少到10秒左右。
Timeout 10
每当客户端请求页面时,页面内就会有多个资源。
所有这些资源都需要通过单独的请求来获取。
因此,如果Apache在提供请求的资源后关闭了连接,则来自同一客户端的另一个请求必须首先重新创建连接。
这是一项繁重的cpu密集型任务(如果服务器的通信量很大,则很好)。
而且,对于客户端而言,这将降低性能。
因此,apache中有一种机制可以使连接在一定时间内保持活动状态,以便客户端成功建立连接后,他可以更快地处理其后续请求(因为他不再创建连接)。
此设置称为keepAlive。
尽管出于性能方面的考虑,尽管建议打开keepalive设置,但服务器等待的时间(以秒为单位)应该更少,因为攻击者可以通过发送垃圾请求来建立大量连接,并不必要地继续重置计时器。
因此,保持连接的时间越短,用于新连接的服务器上的内存就越高。
KeepAlive On KeepAliveTimeout 15
14.限制Apache中的HTTP请求正文,字段和大小
限制请求正文是一件好事,因为它对客户端发送到服务器的数据量增加了一定程度的限制。
例如,如果我们有一个Web服务器,该服务器接受来自客户端的表单和数据文件。
换句话说,HTTP POST和PUT请求。
<Directory "/var/www/html"> LimitRequestBody 102400 </Directory>
上述设置仅允许最大大小为10 KB。
现在,如果我们愿意,可以根据要求增加它。
以上配置中显示的值以字节为单位。
我们需要在服务器端限制的另一件事是客户端可以发送到服务器的添加标头的数量。
可以在apache网络服务器上完成此操作,如下所示。
LimitRequestFields 20
上面显示的示例仅限制了其他标头的数量,但让我们继续进行微调,以使服务器可接受的标头的大小受到限制。
LimitRequestFieldSize 7000
15.限制对所需网络的访问
有时,我们不希望外部访问。
或者说一个特定的目录(doc root)只能由一个特定的子网访问,那么最好将docroot配置为仅允许访问那些子网。
可以使用所需目录定义中的“允许,拒绝”参数来完成此操作,如下所示。
<Directory /var/www/html> Options None AllowOverride None Order deny,allow Deny from all Allow from 10.1.136.0/24 </Directory>
16.从源代码编译时禁用不需要的模块
从二进制文件安装apache是我的选择,但是有时我们需要修改apache中包含的默认功能集。
在这种情况下,人们会发现从源代码包安装很有用。
出于安全原因,很少有可以禁用的模块,如下所示。
./configure --disable-userdir --disable-autoindex --disable-status --disable-negotiation
userdir:与用户相关的目录将在URL中可见。
换句话说,URL中的用户名将转换为用户的目录路径
自动索引:这将立即在安装过程中禁用目录列表。
而不是通过我们已经看到的较早的方法来禁用它。
状态:这是一个模块,通常用于显示apache服务器的当前状态
协商:这将禁用apache服务器中的内容协商
17.如果不需要,请禁用Htaccess
apache中有一个功能,每个文档的根目录可以有自己的配置文件。
这是一个了不起的功能,负责该特定目录的用户可以拥有自己的配置集,而无需修改主httpd.conf文件。
在不同用户将apache Web服务器用于他们自己的个人的情况下,这变得很方便。
共享托管最常使用的配置。
例如cpanel。
可以使用网络服务器托管如此多的,每个都有自己的文档根目录,并具有自己的特定配置。
此特定配置将覆盖服务器范围的配置文件http.conf
但是,如果实际上不需要,最好禁用此功能。
<Directory /var/ww/html> Options None AllowOverride None Order allow,deny Allow from all </Directory>
18.强制X-XSS-Protection
几乎所有主要的浏览器都具有防止跨站点脚本编写的功能。
但是,默认情况下未启用此功能,有时用户会禁用此功能。
可以在服务器端启用此功能,并强制客户端使用它。
这可以通过在apache配置文件中添加以下配置来完成。
<IfModule mod_headers.c> Header set X-XSS-Protection: "1; mode=block" </IfModule>
19.禁用Etag
Etags(实体标签)用于验证Web浏览器缓存中的组件是否与Web服务器中的组件相同。
我必须说etag用于标识内容的特定版本。
因此,基本上,浏览器会将服务器返回的etag与它在其缓存中已经具有的文档版本进行比较。
比较之后,浏览器将etag返回到Web服务器,如果服务器发现etag与Web服务器给定的etag匹配,则服务器将返回304响应,表示未修改。
默认情况下,Apache使用索引节点编号和时间戳创建Etag。
apache中有一个关于其etag的漏洞,攻击者可以其中获取inode详细信息,子进程ID等。
请参阅:ETAG漏洞cve
可以通过在apache Web服务器上完全禁用etag标头来保护此安全。
请注意,缓存功能将取决于Web服务器。
FileETag none
20.对SSL使用更长的密钥长度
如果我们使用的是SSL,则最好为密钥使用更长的密钥长度。
尽管危害SSL绝非易事,但我还是建议我们使用高密钥长度。
可以在创建SSL密钥和csr的同时创建2048位密钥,然后再提交给证书颁发机构,如下所示
openssl genrsa -des3 -out myservere.key 2048 openssl req -new -key myserver.key -out myserver.csr
现在,将myserver.csr文件提交到CA以进行签名。
21.禁用Apache 2中的SSL版本2以提高安全性
默认情况下,几乎所有Web服务器上都允许使用SSL版本2.
SSL版本2具有许多已知漏洞,必须将其禁用。
我们可以在apche Web服务器上禁用SSL版本2,如下所示。
SSLProtocol –ALL +SSLv3 +TLSv1
22.禁用较弱的SSL密码
Web服务器上提到了SSL密码及其允许的列表。
默认情况下,几乎所有的Web服务器都允许所有通用的ssl密码。
这可能是由于兼容性原因,因此,即使是较旧的Web浏览器也可以使用服务器允许的任何允许的密码列表。
但是,某些密码(例如RC4)具有众所周知的漏洞,必须禁用这些密码以防止中间人攻击或者其他数据篡改。
每个Web服务器(无论是否为Apache)都有其允许的密码列表。
在网络服务器上提到这些密码的顺序在选择过程中起着重要作用。
因此,强制采用更高安全性的密码总是更好,并且应该排在第一位。
下面的apache配置将强制执行高阶密码,并禁用RC4密码,以及其他较弱的密码。
SSLCipherSuite HIGH:!MEDIUM:!aNULL:!MD5:!RC4
23.禁用不需要的模块。
上实际上可能并不需要我们当前在服务器上启用的许多模块。
禁用尽可能多的功能实际上可以使服务器免受未知漏洞的侵害。
Web服务器配置文件上的快速grep可以显示所有已加载的模块(除了嵌入到apache本身的默认模块)。
grep LoadModule httpd.conf
希望本教程对实现apache Web服务器上的基本安全性有所帮助。