如您需要技术咨询、解决方案定制、故障排除、运维监控等服务,可联系ericwcn#at#163.com。

Apache Web服务器安全加固的13条建议

WEB安全 立杰 407℃

Apache HTTP是目前流行的WEB Server执行,被应用在众多的WEB服务器上。Apache Web Server默认的配置会泄露操作系统和WEB服务器的敏感信息,造成安全隐患。本文将基于Linux操作系统, 对Apache Httpd的默认配置进行修改和安全加固,提高系统的安全性。

首先先介绍一下HTTPD默认配置的基础信息:

Document Root Directory: /var/www/html 或 /var/www
主配置文件路径: /etc/httpd/conf/httpd.conf (RHEL/CentOS/Fedora) 或 /etc/apache2/apache2.conf (Debian/Ubuntu).
默认 HTTP 端口: 80 TCP
默认 HTTPS 端口: 443 TCP
测试配置文件是否正常的命令: httpd -t
Access Log文件路径: /var/log/httpd/access_log
Error Log 文件路径: /var/log/httpd/error_log

1.隐藏Apache HTTPD和操作系统版本

当您访问的资源出现错误时,Apache默认会给出一些错误提示信息,包括HTTP Code,版本信息和操作系统平台。

隐藏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)

2.禁用目录列表

当目录没有Index Page时,默认Apache会列出该目录下的所有文件。你需要httpd.conf 或 apache2.conf的Directory标签内的Options选项。

<Directory /var/www/html>
  Options -Indexes
</Directory>

3.升级Apache到最新版本
最新版本的Apache往往修复了一些Bug和安全漏洞,因此你需要始终保持你的WEB 服务器为最新版本。

# 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.禁用不需要的模块

安装不必要的模块会引来更多的安全风险,所以应该禁用一些没有使用的模块来降低风险。

# 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
....

5.以单独的用户和组运行Apache

默认安装Apache使用nobody用户或守护程序运行其进程。出于安全考虑,建议使用单独的非特权帐户运行Apache。例如:http-web/www。

创建Apache用户和组

# groupadd http-web
# useradd -d /var/www/ -g http-web -s /bin/nologin http-web

同时,需要修改httpd.conf,搜索User和Group并修改成http-web。

User http-web
Group http-web

6.使用Allow和Deny控制目录的访问权限

<Directory />
Options None
Order deny,allow
Deny from all
</Directory>

Options “None” – 不允许用户启用任何选项
Order deny, allow – 指定 “Deny” and “Allow” 的执行顺序。
Deny from all – 拒绝所有用户访问根目录

7.使用mod_security和mod_evasive模块来保护Apache

Apache的“mod_security”和“mod_evasive”模块是普遍使用的安全模块。

7.1Mod_security

mod_security作为我们的Web应用程序的防火墙,并允许我们实时监控流量,帮助Web服务器免受暴力破解攻击。

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

Apache模块mod_evasive利用Hash表储存相应的HTTP请求,利用设定规则判断是否拒绝对方的请求。并能够有效的防护DDOS攻击的。

次模块有三种方法检测攻击:

在一段时间内每秒请求同一个页面很多次。

任何子线程尝试创建超过50个并发请求。

禁止黑名单的IP发起任何请求

8.禁用Apache的FollowSymLinks

FollowSymLinks

如果用户需要使用FollowSymLinks,那么就在该站点的“.htaccess”文件中开启

# Enable symbolic links
Options +FollowSymLinks

注意:如果要启用“.htaccess”的rewrite规则,需要现在配置文件中开启AllowOverride All

9.关闭服务器全局Includes和CGI扩展

如果您不需要,可以关闭服务器全局的includes(mod_include)和CGI扩展

Options -Includes
Options -ExecCGI

我们也可以为单独的站点禁用CGI和Includes

<Directory "/var/www/html/web1">
Options -Includes -ExecCGI
</Directory>

这里还有一些其他可以打开或关闭的选项。

Options All –
Options IncludesNOEXEC –
Options MultiViews –
Options SymLinksIfOwnerMatch –

10.限制请求的大小

Apache默认对HTTP请求的大小没有任何限制。当web服务器对请求没有任何限制是,容易引发拒绝服务攻击。我们可以通过LimitRequestBody为每个目录单独配置请求大小限制。

我们可以将http请求的大小限制在 0(不受限制)~2147483647 (2GB)之间。一般建议将LimitRequestBody的值设置在略大于最大上传文件的大小即可。

<Directory "/var/www/myweb1/user_uploads">
   LimitRequestBody 512000
</Directory>

11.DDOS攻击防范,避免僵尸请求

我们可以调整Apache的参数,将DDOS攻击的影响降到最低。

Timeout:指令允许您设置服务器在失败之前等待某些事件完成的时间。默认300 secs。当收到DDOS攻击时,可以将该值设置到最低。

MaxClients:允许您设置将同时提供的并发连接数的限制。默认值为256,超过的连接请求将会被放在队列中等待执行。它可用于Prefork和Worker两者MPM。

KeepAliveTimeout:服务器在关闭连接之前等待后续请求的时间。默认为5secs

LimitRequestFields:帮助我们设置从客户端接受的HTTP请求的头字段数量的限制,默认值为100.建议适当降低该值。

LimitRequestFieldSize:配置HTTP Request header大小。

12.启用Apache日志

Apache允许您独立于操作系统日志记录进行日志记录。启用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.为站点启用HTTPS SSL加密

你可以使用Let’s Encryption或阿里云签发免费的SSL证书,也可以使用openssl签发自签名证书来加密站点。

# 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

在虚拟主机中,配置SSL证书,启用HTTPS。

<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测试使用启用SSL加密。由于采用自签名证书,浏览器会出现证书不受信任的证书警告。

转载请注明:知识库 » Apache Web服务器安全加固的13条建议

喜欢 (0)