Apache是一个很受欢迎的web服务器软件,其安全性对于网站的安全运营可谓生死攸关。下面介绍一些可帮助管理员在Linux上配置Apache确保其安全的方法和技巧。php
本文假设你知道这些基本知识:html
文档的根目录: /var/www/html or /var/wwwweb
主配置文件: /etc/httpd/conf/httpd.conf (RHEL/CentOS/Fedora等系统) 或/etc/apache/apache2.conf (Debian/Ubuntu).shell
默认HTTP 端口: 80 TCPapache
默认 HTTPS 端口: 443 TCPubuntu
测试配置文件设置及语法: httpd -tvim
对Web服务器的日志文件的访问: /var/log/httpd/access_log浏览器
Web服务器错误日志文件: /var/log/httpd/error_log安全
一、避免在错误中显示Apache版本和操做系统的ID服务器
通常状况下,在用源代码安装或用yum等包安装程序安装Apache时,Apache服务器的版本号和服务器操做系统的名称均可以在错误消息中显示,并且还会显示安装在服务器上的Apache模块信息。
在上图中,能够看出错误页面显示了Apache的版本以及服务器所安装的操做系统版本。这有可能成为Web服务器和Linux系统的一个重要威胁。为防止Apache把这些信息泄露出来,咱们须要在Apache的主要配置文件中进行更改:
用vim编辑器打开配置文件,查找“ServerSignature”,默认状况下它是打开状态。咱们须要关闭服务器签名。ServerTokens Prod告诉Apache只在每个请求网页的服务器响应的头部,仅返回Apache产品名称。
# vim /etc/httpd/conf/httpd.conf (RHEL/CentOS/Fedora) # vim /etc/apache/apache2.conf (Debian/Ubuntu) ServerSignature Off ServerTokens Prod # service httpd restart (RHEL/CentOS/Fedora) # service apache2 restart (Debian/Ubuntu)
二、禁用目录列表
默认状况下,在缺乏index文件时,Apache会列示root目录的全部内容。以下图所示:
对于某个特定目录,咱们能够在配置文件中用“Options directive”关闭目录列示。能够在httpd.conf或apache2.conf文件中加入以下项目:
Options -Indexes
其效果相似于下图:
三、常常更新Apache
Apache的开发社区一直在不断地改善安全问题,并常常发布带有新的安全特性的最新版本。因此咱们建议你使用最新的Apache做为本身的web服务器。为检查Apache的版本,咱们能够用httpd –v命令来检查最新的版本。
# httpd -v Server version: Apache/2.2.15 (Unix) Server built: Aug 13 2013 17:29:28
能够用下面的命令更新Apache版本。
# yum update httpd # apt-get install apache2
若是你并非在特定操做系统或内核上运行某个特别的软件,建议你保持内核和Linux操做系统为最新版本。
四、禁用没必要要的模块
为了尽可能减小网站遭受Web攻击的机会,管理员最好禁用目前不用的全部模块。你可使用下面的命令,列示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。要禁用特定的模块,能够在该模块所在行的开头插入“#”注释,并从新启动服务。
五、用独立的用户和组运行Apache
在默认的安装方式中,运行Apache进程时的用户是“nobody”或daemon。为安全起见,咱们建议用非特权帐户运行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”,而后将后面的用户名和组名改成http-web:
User http-web Group http-web
六、对用户的容许和禁止,限制对目录的访问
咱们能够用httpd.conf文件中的“Allow” 和“Deny”限制对目录的访问。在本例中,咱们要保证root目录的安全,在httpd.conf文件中进行以下的设置:
Options None Order deny,allow Deny from all
其中,Options “None”表示不容许用户启用任何可选特性。
Order deny, allow---在这里处理“Deny” 和 “Allow”指令,首先禁用,而后才是容许。
Deny from all,禁用全部人对root目录的请求,任何人都不能访问根(root)目录。
七、使用mod_security和mod_evasive来保障Apache的安全
“mod_security”和“mod_evasive”是Apache在安全方面很是流行的两个模块。mod_security做为防火墙而运 行,它容许咱们适时地监视通讯,还能够有助于咱们保护网站或Web服务器免受暴力破解攻击。借助默认的包安装程序,咱们能够轻松地把 mod_security安装在服务器上。下例说明如何在Ubuntu或Debian系统上安装mod_security:
$ sudo apt-get install libapache2-mod-security $ 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的工做效率很高,它只采用一个请求就能够很好地工做,能够防止DDoS攻击形成巨大危害。mod_evasive 能够应对http暴力破解攻击和DoS(或DDoS)攻击。该模块能够在三种状况下检测攻击:一是在每秒钟内有太多请求到达同一个页面时,二是在任何子进 程试图发出超过50个并发请求时,三是在任何地址已经被临时列入黑名单时它仍试图尝试新的请求。
八、禁用Apache遵循符号连接
默认状况下,Apache遵循符号连接,咱们能够用options指令的FollowSymLinks来关闭这个特性。为此,咱们须要在主配置文件中加入一条:
Options –FollowSymLinks
若是有一个特定的用户或网站须要遵循符号链接,咱们能够在那个网站的.htaccess文件中增长规则:
# Enable symbolic links Options +FollowSymLinks
注意:为将规则从新写入到.htaccess文件中,在主配置文件中,应当全局防止“AllowOverride All”
九、关闭服务器端包含和CGI执行
若是咱们不须要,就能够关闭服务器端包含(mod_include)和CGI执行。为此,咱们须要修改主配置文件:
Options -Includes Options –ExecCGI
咱们还能够用Directior标记对特定目录执行这种操做。在本例中,咱们关闭了/var/www/html/web1这个目录的Includes和Cgi文件执行:
Options -Includes -ExecCGI
下面列示的是其它一些能够用Options指令打开或关闭的值:
Options All:当即启用全部选项。若是你不想在Apache配置文件或.htaccess中明确地指定任何值,那么它就是默认值。 Options IncludesNOEXEC:该选项容许服务器端包含文件但不执行命令或CGI。 Options MultiViews:容许内容协商多重视图(使用mod_negotiation) Options SymLinksIfOwnerMatch:跟FollowSymLinks相似。可是要当符号链接和被链接的原始目录是同一全部者时才被容许。
十、限制请求的大小
Apache在默认状况下对HTTP请求的总大小是没有限制的。在你容许Web服务器能够接受大量请求时,你就有可能成为DoS攻击的受害者。咱们能够用directiory标签来限制 LimitRequestBody指令的请求大小。
你能够用字节来设置这个值(从0到2147483647,0表示无限制)。你能够根据本身的须要限制这个值。假设你要限制user_uploads这个目录所包含的用户上传文件量,而且限制为500K,就应当:
LimitRequestBody 512000
十一、DDoS攻击的防护和强化
你不可能彻底阻止企业网站免受DdoS攻击。下面这些命令便于你进行控制。
TimeOut指令用于设置在特定事件失效以前,服务器等待事件完成的时间长度。其默认值是300秒。对于容易遭受DDoS攻击的网站,把这个值下降颇有好处。这个值的大小取决于网站上的请求种类。注意,对于某些CGI脚本,这个设置可能会产生问题。
MaxClients:此指令容许用户设置服务器可同时服务的链接限制。每个新链接都要根据这个限制进行排队。它适用于Prefork和Worker。其默认值为256。 KeepAliveTimeout:在关闭链接以前,服务器随后的等待时间长度。默认值是5秒。 LimitRequestFields:这个设置能够帮助咱们限制能够接受的HTTP请求的头部字段数量。其默认值为100。 有时,因为http的请求头部过多而致使发生DDoS攻击,用户不妨下降这个值。 LimitRequestFieldSize:帮助咱们设置HTTP请求头部的大小。
十二、启用Apache日志功能
Apache容许你独立记录操做系统的日志。例如,在用户与Web服务器进行交互时所输入的命令信息就很是有用。
为此,你须要包含mod_log_config模块。Apache有三个主要的与日志相关的指令:
TransferLog:建立日志文件 LogFormat :设置定制格式 CustomLog :建立并格式化一个日志文件
咱们还能够在虚拟主机部分设置这些命令。例如,下面的例子是启用了日志功能的一个网站的虚拟主机配置:
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
1三、用ssl证书保障Apache的安全
你还能够用SSL证书用加密的方式保障信息传输的安全。在电子商务网站中,消费者为了买东西,有时须要提供帐户或信用卡的细节,默认状况下,Web服务器用明文发送这些信息。配置服务器使其借助于SSL证书就能够为用户进行加密传输。
企业能够从不一样的SSL供应商购买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编辑器打开主配置文件,并增长下面的内容,而后重启服务:
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
此时,打开浏览器,并输入https://example.com,就能够看到自签名的证书。
DDOS攻击防范:
$sudo apt-get install libapache2-mod-evasive
安装后ubuntu自动会启动,咱们自行建立一个配置文件:
$sudo vi /etc/apache2/conf.d/evasive,写入以下内容:
<IfModule mod_evasive20.c> DOSHashTableSize 3097 #哈希表大小,增大能够提升查找速度 DOSPageCount 2 #容许客户机访问同一页面的时间间隔,一旦小于该间隔,该客户机ip地址将被写入黑名单 DOSSiteCount 2 #容许客户机对全站同时进行的并发访问请求数目 DOSPageInterval 1 #定义网页访问计数的时间间隔 DOSSiteInterval 1 #定义全站访问计数的时间间隔 DOSBlockingPeriod 10 #定义了阻止客户机的时间长短,在该时间内,不容许加入黑名单的客户机访问,若是访问,阻止时间则再次刷新,默认10 DOSEmailNotify 277531070@qq.com DOSSystemCommand “su – someuser –C ‘/sbin/… %s …’” DOSLogDir “var/lock/mod_evasive” DOSWhitelist 127.0.0.1 #白名单 DOSWhitelist 127.0.0.* </IfModule>
或者在httpd.conf文件中加入:
LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so <IfModule mod_evasive20.c> DOSHashTableSize 3097 DOSPageCount 2 DOSSiteCount 50 DOSPageInterval 1 DOSSiteInterval 1 DOSBlockingPeriod 10 </IfModule>