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条建议