Apache安全和加固提示
- 文档根目录: 在 /var/www/html 或 /var/www
- 主配置文件:/etc/httpd/conf/httpd.conf 中 (RHEL / CentOS/ Fedora)和 /etc/apache2/apache2.conf 中 (于Debian / Ubuntu)。
- 默认HTTP端口:TCP 80
- 默认HTTPS端口: TCP 443
- 检测配置文件的设置和语法:httpd -t
- Web服务器的访问日志文件:/var/log/httpd/access_log
- Web服务器的错误日志文件:/var/log/httpd/error_log
1. 如何从错误页面中隐藏Apache版本和操作系统标识
当您使用源代码或类似 yum的任何其他软件包安装程序安装 Apache,它会在错误页面显示您的服务器的 操作系统名称和 Apache Web服务器 的版本 。 它还显示有关服务器中 安装的 Apache模块的信息。显示Apache版本
# vim /etc/httpd/conf/httpd.conf (RHEL/CentOS/Fedora) # vim /etc/apache2/apache2.conf (Debian/Ubuntu)
ServerSignature Off ServerTokens Prod
# service httpd restart (RHEL/CentOS/Fedora) # service apache2 restart (Debian/Ubuntu)
隐藏Apache版本
2. 禁用目录列表
由默认的Apache列出在没有 索引文件的文档根目录的所有 内容 。请参见下面的图片。Apache目录列表
<Directory /var/www/html> Options -Indexes </Directory>
隐藏Apache目录列表
3. 定期更新Apache
Apache的开发者社区将继续努力在安全问题和新的安全选项释放它的更新版本 。 所以它总是建议使用最新版本的Apache作为Web服务器。 要检查 Apache的版本 :你可以用 httpd -v 命令查看当前版本。# httpd -v Server version: Apache/2.2.15 (Unix) Server built: Aug 13 2013 17:29:28您可以使用以下命令更新您的版本。
# yum update httpd # apt-get install apache2此外,还建议把你的 内核和 操作系统更新到最新的稳定版本,如果你不运行它仅在特定操作系统或内核适用于任何特定的应用程序。
4. 禁用不必要的模块
这是一件好事,不给任何 网络攻击的受害者的机会。 因此我们建议禁用所有那些不使用目前 的模块 。您可以使用以下命令列出Web服务器的所有已编译模块。# grep LoadModule /etc/httpd/conf/httpd.conf # have to place corresponding `LoadModule' lines at this location so the # LoadModule foo_module modules/mod_foo.so LoadModule auth_basic_module modules/mod_auth_basic.so LoadModule auth_digest_module modules/mod_auth_digest.so LoadModule authn_file_module modules/mod_authn_file.so LoadModule authn_alias_module modules/mod_authn_alias.so LoadModule authn_anon_module modules/mod_authn_anon.so LoadModule authn_dbm_module modules/mod_authn_dbm.so LoadModule authn_default_module modules/mod_authn_default.so LoadModule authz_host_module modules/mod_authz_host.so LoadModule authz_user_module modules/mod_authz_user.so LoadModule authz_owner_module modules/mod_authz_owner.so LoadModule authz_groupfile_module modules/mod_authz_groupfile.so LoadModule authz_dbm_module modules/mod_authz_dbm.so LoadModule authz_default_module modules/mod_authz_default.so LoadModule ldap_module modules/mod_ldap.so LoadModule authnz_ldap_module modules/mod_authnz_ldap.so LoadModule include_module modules/mod_include.so LoadModule log_config_module modules/mod_log_config.so LoadModule logio_module modules/mod_logio.so LoadModule env_module modules/mod_env.so LoadModule ext_filter_module modules/mod_ext_filter.so ....以上是默认启用,但往往并不需要的模块列表 :mod_imap,mod_include ,mod_info,mod_userdir,mod_autoindex。 要禁用特定的模块,你可以插入一个 “#”在该行的开头,并重新启动该服务。
5. 以单独的用户和组运行Apache
默认安装 Apache运行,它与用户 nobody或 守护进程。 为了安全起见,建议在其 自己的 非特权帐户运行 Apache。 例如 :http-web 。创建Apache用户和组
# groupadd http-web # useradd -d /var/www/ -g http-web -s /bin/nologin http-web现在,你需要告诉 Apache这个新的用户运行,为此,我们需要在 /etc/httpd/conf/httpd.conf中的条目,然后重新启动该服务。 用vim编辑器中打开 /etc/httpd/conf/httpd.conf中 ,并搜索关键字“ User”和“ Group”,并在那里你会需要指定的 用户名和 组名使用。
User http-web Group http-web
6. 使用“允许”和“拒绝”限制对目录的访问
我们可以限制使用“ 允许 ”和“ 拒绝 ”在 httpd.conf文件选项进入目录。 在这里,在这个例子中,我们将通过设置在 httpd.conf文件下面进行保护 的根目录 。<Directory /> Options None Order deny,allow Deny from all </Directory>
- Options “None” -这个选项将不允许用户启用任何可选功能。
- Order deny, allow -这是其中的“ 拒绝 ”和“ 允许 ”指令将被处理的顺序。 在这里,它会“ 拒绝 ”第一,“ 允许 ”下一个。
- Deny from all -这将拒绝来自大家的根目录要求,任何人都无法访问根目录。
7. 使用mod_security和mod_evasive模块来保护Apache
这两个模块“ 的mod_security”和 “mod_evasive”是在安全方面的Apache非常流行的模块。Mod_security
mod_security的工作为我们的Web应用程序 防火墙 ,使我们能够 监测实时的基础上 的流量 。 这也有助于我们保护我们的网站或Web服务器从 蛮力攻击 。 您可以直接在服务器上使用默认安装包的帮助下安装 mod_security。在Ubuntu / Debian上安装mod_security
$ sudo apt-get install libapache2-modsecurity $ sudo a2enmod mod-security $ sudo /etc/init.d/apache2 force-reload
在RHEL / CentOS / Fedora上安装mod_security
# yum install mod_security # /etc/init.d/httpd restart
Mod_evasive
mod_evasive工作非常有效,它需要一个请求来处理和处理得很好。 它可以防止 DDOS攻击从做太大的伤害。 mod_evasive的这一特点使它能够处理 HTTP brute force和 DOS或 DDos攻击。此模块使用三种方法检测攻击。- 如果这么多请求在每秒几次中到达同一页面。
- 如果任何子进程试图让超过50个并发请求。
- 如果有任何IP仍试图做出新的请求时,它暂时列入黑名单 。
8. 禁用Apache的以下符号链接
由默认的 Apache如下 符号链接 ,我们可以将此功能 关闭用 Options指令 FollowSymLinks。为此,我们需要在主配置文件中进行以下输入。Options -FollowSymLinks而且,如果任何特定 用户或 网站需要启用 了FollowSymLinks,我们可以简单的写在该网站的“ .htaccess”文件的规则。
# Enable symbolic links Options +FollowSymLinks注意:要启用“ .htaccess”文件 设置“AllowOverride All”内部重写规则应该出现在主要全局配置。
9. 关闭服务器端包含和CGI执行
如果没有必要,我们可以 关闭服务器端包含 (mod_include)和 CGI执行,这样做,我们需要修改主要的配置文件。Options -Includes Options -ExecCGI我们可以为目录标记的一个特定的目录。在这里,在这个例子中,我们 关闭包括和“ /var/www/html/web1”目录的CGI脚本的执行。
<Directory "/var/www/html/web1"> Options -Includes -ExecCGI </Directory>下面是用 可以打开或 关闭 Options指令其他值。
- Options All - 要启用所有选项一次。这是默认值,如果您不想在Apache conf文件或.htaccess中显式指定任何值。
- Options IncludesNOEXEC - 该选项允许服务器端包含没有执行权限的命令或CGI文件。
- Options MultiViews - 允许使用mod_negotiation模块模块内容协商多视图。
- Options SymLinksIfOwnerMatch - 这是类似的FollowSymLinks。但是,只有当链接和链接到的原始目录之间的所有者是相同的时,才会遵循。
10. 限制请求大小
由默认的 Apache对HTTP请求,即无限的总规模没有限制,当你允许在Web服务器上的大型请求其可能的,你可能是 拒绝服务攻击的受害者。 我们可以限制一个Apache指令 “LimitRequestBody”与目录标签的要求大小。 您可以从 0( 无限制 )字节的值设置为允许在请求主体 2147483647(2GB)。您可以根据网站需要设置此限制,假设您有一个网站允许上传,并且您想限制特定目录的上传大小。 在这里,在这个例子中 ,user_uploads是包含由用户上载的文件的目录。 我们投入的 500K这一限制。<Directory "/var/www/myweb1/user_uploads"> LimitRequestBody 512000 </Directory>
11. 保护DDOS攻击和加固
好了,这是真的,你不能完全保护您的网站在 DDoS攻击 。这里有一些指令,可以帮助你有一个控制它。- TimeOut:该指令允许你设置的时间服务器将等待某些事件来完成它失败之前的金额。 它的默认值是300秒 。 这是很好的保持这个值低的那些网站上这是受DDOS攻击 。 这个值完全取决于样的要求您得到您的网站 注意 :这可能会带来问题,来CGI脚本。
- MaxClients:该指令允许您设置将同时服务的连接限制。 每个新连接将在此限制后排队。 它可以与prefork和worker这两个MPM。 它的默认值是256。
- KeepAliveTimeout:其服务器将等待一个后续请求关闭连接之前的时间量。 默认值是5秒 。
- LimitRequestFields:它可以帮助我们设定了一个上限将从客户端接受HTTP请求的报头字段的数目。 它的默认值是100。 建议如果DDOS攻击正在发生,因为许多HTTP请求头的结果,以降低此值。
- LimitRequestFieldSize:它帮助我们设置HTTP请求头大小限制。
12. 启用Apache日志记录
Apache可以让你独立登录您的 操作系统的日志记录 。启用Apache日志记录是明智的,因为它提供了更多信息,例如由与Web服务器交互的用户输入的命令。 要做到这一点,你需要包括 mod_log_config模块。 Apache有三个主要的与日志相关的指令。- TransferLog:创建一个日志文件。
- LogFormat:指定自定义格式。
- CustomLog:创建和格式的日志文件。
<VirtualHost *:80> DocumentRoot /var/www/html/example.com/ ServerName www.example.com DirectoryIndex index.htm index.html index.php ServerAlias example.com ErrorDocument 404 /story.php ErrorLog /var/log/httpd/example.com_error_log CustomLog /var/log/httpd/example.com_access_log combined </VirtualHost>
13. 使用SSL证书保护Apache
最后,但并非最不重要 的SSL证书 ,可以在Internet上使用SSL安全证书以加密的方式为你的所有通信。 假设你有一个网站,使人们通过登录证明其登录凭据,或者你有一个电子商务网站,人们提供自己的 银行信息或 借记卡 / 信用卡信息购买产品,默认情况下您的Web服务器以纯将这些信息发送-文本格式,但是当你使用 SSL证书到你的网站 ,Apache的密文的所有信息。 您可以从那么多不同的SSL提供商,如 namecheap.com 购买SSL证书 。 如果你正在运行一个非常小的网络业务,并做不愿意 购买你仍然可以分配一个 自 SSL证书 签名证书到您的网站 。Apache使用 mod_ssl的模块,支持 SSL证书 。# openssl genrsa -des3 -out example.com.key 1024 # openssl req -new -key example.com.key -out exmaple.csr # openssl x509 -req -days 365 -in example.com.com.csr -signkey example.com.com.key -out example.com.com.crt一旦您的证书已创建并签名。现在你需要在Apache配置中添加。使用vim编辑器打开主配置文件,并添加以下行并重新启动服务。
<VirtualHost 172.16.25.125:443> SSLEngine on SSLCertificateFile /etc/pki/tls/certs/example.com.crt SSLCertificateKeyFile /etc/pki/tls/certs/example.com.key SSLCertificateChainFile /etc/pki/tls/certs/sf_bundle.crt ServerAdmin ravi.saive@example.com ServerName example.com DocumentRoot /var/www/html/example/ ErrorLog /var/log/httpd/example.com-error_log CustomLog /var/log/httpd/example.com-access_log common </VirtualHost>打开你的浏览器中键入 https://example.com,你将能看到新 的自签名证书 。 这些是您可以用它来 保护您的Apache Web服务器安装一些安全提示。 欲了解更多有用的安全技巧和想法,请参阅官方在线文档 Apache HTTP服务器 。