Apache服务器的简单配置与安全策略
在之前讲的关于weevely后门分析中,有说到利用Apache的配置文件.htaccess来隐藏php后门.关于.htaccess文件的用途,在此结合Apache服务器的具体配置作一详解,也算是自己的学习笔记了…
一 Apache服务器的搭建
详见之前的博文:CentOS 6.0下phpvod搭建教程(LAMP+phpvod)
二 httpd.conf文件的全局配置
1. ServerRoot 设置服务器目录的绝对路径,即Apache服务器的安装及配置文件.一般在/etc/httpd目录下,也有在/usr/local/apache下(具体看安装的方式)
2. Listen 指定要绑定的IP和端口,一般为80端口:Listen 192.168.1.100::80,也可以同时监听多个IP和端口
3. User和Group 设置用户ID和组ID,服务器将使用他们来处理请求,通常默认为:daemon,daemon,(也有叫www-data或者apache的),这些都是系统帐号,具体可以在/etc/passwd文件里查看,可以发现这些帐号都是不可登录的,而且权限都相对较低,之所以这样设置,也是处于安全的考虑,这也正体现Linux系统权限限制的严格.虽然,启动Apache需要root权限(当然,这个也不一定,可以配置/etc/sudoers文件修改),但是当Apache服务器启动后,会将其进程转移到这个指定的一般用户权限下运行,这样就降低了服务器的危险性.
4. ServerAdmin 设置服务器管理员的地址,一般为email或者别名.有时候在访问页面出错时,会看到一段英文的说明,仔细看就有这个地址,这是便于联系网站管理员的.
5. ServerName 即主机名,应该是一个完全限制的域名.在一个域名网络系统(DNS)中,可以通过这种添加别名的方式方便管理自己的服务器.
6. DocumentRoot 设置网站的虚拟目录(即网站的根目录),一般在/var/www/html/下.当访问http://127.0.0.1/index.php时,实际上访问的是/var/www/html/下的index.php文件.
7. UserDir 定义用户目录
8. DirectoryIndex 指定目录索引的文件名,这个很重要,很多网站设置不当,就会出现爆目录的问题,原因就是因为没有设置(或者设置不当)该索引.具体意思就是:当请求的URL是目录类型(例如:http://www.server.com/includes/)时,服务器默认会返回的一个文件,一般为index.php,index.html,index.jsp等等索引文件.一个设置样例是:DirectoryIndex index index.html index.cgi
9. TimeOut 设置网络超时时间,单位为秒.
10.KeepAlive和KeepAliveTimeout 设置每次会话的持续时间,这样可以使很多请求通过同一个TCP连接来发送,节省网络资源,例:
KeepAlive on
KeepAliveTimeout 5
11.MaxKeepAliveRequests 每个连接的最大请求数,当同时请求的数目达到设定值时,就不再响应新的请求,即”拒绝服务请求”.从整个服务器的角度来分析,服务器的响应连接的数目也是有限的,当请求过多时,就会不再响应新的请求,而强悍的DDOS攻击就是这一基本原理实现的,通过伪造大量的虚假请求,使服务器拒绝正常的客户请求,使服务器瘫痪.
12. StartServers 设置Apache启动后等待接受请求的空闲子进程数.
13. MaxSpareServers 设置Apache的最大空闲的进程数,当超过指定数目时,Apache就会杀掉多余的进程已节省系统资源
14. MaxClients 设置Apache的最大连接数
15. include 文件包含,Apache服务器的一大亮点是其简单而强大的配置.在httpd.conf文件里,还可以通过这个简单的文件包含来扩展其相关的配置选项.这样也便于管理.
三 访问限制策略
1.Apache服务器的配置指令
order指令:用于指定执行允许访问控制规则或者拒绝访问控制规则的顺序.由Allow或者Deny的先后排序来设置针对客户机的域名或者IP地址的访问权限,后者对前者有覆盖效果.下面举例说明:
Example1: //ppp.org域中的所有主机都允许访问本网站,后面的Allow语句覆盖了Deny语句 Order Deny,Allow Deny from all Allow from ppp.org Example2: Order Deny,Allow Deny from all Allow from 192.168.1. Allow from 127. Allow from ppp.org
2.使用.htaccess文件进行访问控制
关于.htaccess文件:http://www.cnblogs.com/adforce/archive/2012/11/23/2784664.html
任何在http.conf配置文件中的配置指令都可能应用到.htaccess文件中.该文件用于针对单一目录进行访问控制.可以在httpd.conf文件中的AccessFileName指令设置.AccessFileName .htaccess
"^\.htaccess"> Order allow,deny Deny from all
要限制.htaccess文件能覆盖的内容,需要使用AllowOverride指令.该指令可以进行全局设置或者对单个文件进行配置.要配置默认的选项,可以使用Options指令.以下是对/var/www/icons目录的访问控制:
"/var/www/icons"> Options Indexs MultiViews AllowOverride None Order allow,deny Allow from all
AllowOverride指令可以指定.htaccess文件覆盖的选项.可以对每一个目录进行设置.其设置选项可以是:All,None,Option,FileInfo,AuthConfig,Indexes以及Limit选项,具体功能:
Option //文件可以为该目录没有在Option指令中列出的选项 FileInfo //.htaccess文件包含修改文档类型信息的指令 AuthConfig //.htaccess文件可能包含的验证指令 Limit //.htaccess文件可能包含的Allow,Deny,Order指令 Indexes //控制目录列表方式 None //禁止处理.htaccess文件 All //表示读取以上所有指令内容
.htaccess文件是用于对单一目录进行的配置,放在web网页目录下,用于控制该目录及其子目录的访问控制策略.启动该控制策略需要将Apache的主配置文件里的AllowOverride设置为All.最后说一句,虽然.htaccess文件加强了Apache服务器的安全性,但是.htaccess文件也是不安全的,在前面的博文(http://www.cnblogs.com/lingerhk/p/4009073.html)中讲了针对.htaccess文件的木马后门.所以,没有绝对的安全!
四 使用认证和授权访问
用户认证在网络安全是非常重要的手段.在启用用户认证后,用户第一次访问时浏览器会弹出一个用户认证框,只有正确的用户名和密码时,才能进入.
常见的认证类型有两种:基本认证(Basic,使用用户名和密码认证)和摘要认证(Digest,使用了一个针对客户端的challenge信息认证).这个设置可以写在httpd.conf文件中,也可以但是写在单独的.htaccess文件里,其相关指令有:
AuthName 用于定义受保护区域的名称
AuthType 用户指定使用的认证方式,包括上面讲的两种模式
AuthGroupFiles 用于指定认证组文件的位置
AuthUserFiles 用户指定认证口令文件的位置
对于用户的授权也有三种方式:
(1)授权给指定的一个或多个用户
(2)授权给指定的一个或多个用户
(3)授权给指定口令文件中的所有用户
创建认证文件(注意:创建的口令文件必须放到web目录之外,以避免泄漏):例如/etc/httpd/passwd_auth
~# htpassswd -c /etc/httpd/passwd_auth linger //-c表示,删除原有文件的内容并重新写入,如果是添加,则可以不用该选项
使用主配置文件配置用户认证及授权,形式如下:
"/var/www/html/test"> AllowOverride None //禁用.htaccess文件 AuthType Basic //使用Basic认证模式 AuthName "test" //显示领域内容 AuthUserFile /etc/httpd/passwd_auth //读取口令文件的地址 Require user linger //允许访问的用户名,多个用户使用空格分开
当然,除了使用主配置文件来进行用户认证之外,还可以使用.htaccess文件:
(1)开启用户认证支持:
"/var/www/html/test"> AllowOverride AuthCOnfig
(2)在.htaccess文件中加入如下语句:
AuthType Basic AuthName "Please Login:" AuthUserFiles /etc/httpd/passwd_auth Require user linger
五 虚拟目录的设置
虚拟目录是相对于Apache主目录的相对路径或绝对路径的别名.虚拟目录的设置在一定程度上增加了Web服务器的安全性,在通过数据库备份的方法产生webshell时,是需要知道web目录的绝对路径的,这样才能正常访问到产生的webshell,但是在某些时候,由于配置错误,或者是网页源码错误,导致暴露出web服务器的绝对路径,这就需要时常对自己的网站进行测试.这里还要说一点,一般在linux下web服务器,都有默认的web目录地址,这样无疑会留下安全隐患,所以建议更改其绝对路径,即更改httpd.conf配置文件的DocumentRoot项.以下是一个简单的虚拟目录的相关配置:
//httpd.conf Alias /phpmyadmin "/home/linger/phpmyadmindir" ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/" "/usr/local/apache /cgi-bin/"> //设置cgi-bin目录属性 AllowOverride NOne Options ExecCGI Reguire all granted
六 设置虚拟主机
Apache服务器是最早实现虚拟主机的web服务器,设置虚拟主机的好处是可以使一台物理服务器可以同时运行多个web服务,现在多数虚拟主机租用商就是通个这个功能来实现多域名访问的.虚拟主机可以分为两种,基于IP的和基于域名的虚拟主:基于IP的就是一台物理服务器上有多个网卡(可以是硬件的,也可以是通过软件实现的),当访问这些不同的IP时,虽然数据包到达同一台物理服务器,但是跟据客户请求的IP不同,Apache服务器会返回客户不同的数据.基于域名的虚拟主机,就是Apache服务器根据客户端不同的域名请求(这些在http-headers里有的),查找不同的web目录,再返回给客户端.由于当前IPv4短缺,而且域名比较好记,所以基于域名的虚拟主机比较流行,以下是一个基于域名的虚拟主机的配置:
//设置第一个虚拟主机 80> ServerAdmin webmaster@linger.com DocumentRoot "/usr/local/apache/server1" ServerName server1.com ServerAlias www.server1.com ErrorLog "logs/server1_error_log" CustomLog "logs/server1_access_log" common //设置第二个虚拟主机 80> ServerAdmin webmaster@linger.com DocumentRoot "/usr/local/apache/server2" ServerName server2.com ServerAlias www.server2.com ErrorLog "logs/server2_error_log" CustomLog "logs/server2_access_log" common //common表示使用普通日志格式
七 设置Apache服务器的日志管理
日志文件是用户管理和监控Apache服务器安全运行的非常好的材料.无疑,大数据时代,基于web日志的用户上网习惯分析以及各种数据挖掘与分析,使得相关服务慢慢流行.另外,在安全管理方面的,日志的作用是很重要的,尤其是排查Apache服务错误以及查找入侵源.Apache服务器运行时会产生2个标准日志文件:错误日志(access_log),访问日志(error_log).另外,需要补充的是,Apache服务器运行时,会产生大量(以GB计算)的日志文件,如果不需要保存的话,可以适当删除,以节省硬盘空间,如果服务器的硬盘比较小的话,这一点显得比较重要了.
Apache中有几条与日志相关的配置指令:
1. ErrorLog 指定错误日志的存放路径 例: ErrorLog “logs/error_log”
2. LogLevel 指定错误日志的错误登记 例: LogLevel warn
3. LogFormat 日志记录格式的命名,其使用很多变量,便于个性化定制 例: LogFormat “%h %l %u %t \”%r\” %>s %b” common
4. CustomLog 指定访问日志存放的路径和记录格式 例: CustomLog “logs/access_log” common
变 量 | 含 义 |
---|---|
%b | 发送字节,不包括 HTTP 标题 |
%f | 文件名 |
%{VARIABLE}e | 环境变量 VARIABLE 的内容 |
%h | 远程主机 |
%a | 远程 IP 地址 |
%{HEADER}i | HEADER 内容;发送到服务器的请求的标题行 |
%l | 远程登录名(如果提供该值,则从 identd 获得) |
%{NOTE}n | 来自另一个模块的 NOTE 通知的内容 |
%{HEADER}o | HEADER 的内容,回复中的标题行 |
%p | 服务器服务于请求的规范端口 |
%P | 服务于请求的子进程的 ID |
%r | 请求的第一行 |
%s | 状态。对于内部重定向的请求,该状态为初始请求—最后是 %>s |
%t | 时间,格式为 common 日志格式中的时间格式 |
%{format}t | 时间,格式由 format 给出。可以是 strftime(3)格式 |
%T | 服务请求花费的时间,以秒计 |
%u | 来自 auth 的远程用户;如果返回的状态(%s)为 401 则可能是假的 |
%U | 请求的 URL 路径 |
%v | 服务于该请求的服务器的规范 ServerName |
在每个变量中,可以在前面设置一个条件,决定是否显示该变量。如果不显示,则显示 -。这些条件是数值返回值列表的形式。另外,还可以使用 CustomLog 指令指定日志文件的位置和格式。如果没有指定日志文件的绝对路径,则日志文件的位置假定为相对于 ServerRoot。下面是 httpd.conf 文件中指定日志文件的语句:
CustomLog logs/access_log common ErrorLog logs/error_log Apache 中的错误日志记录等级:
紧急性 | 等级 | 说明 |
---|---|---|
1 | Emerg | 出现紧急状况使得系统不可用 |
2 | Alert | 需要立即引起注意的状况 |
3 | Crit | 危险情况的警告 |
4 | Error | 除上述 3 种情况之外的其他错误 |
5 | Warn | 警告信息 |
6 | Notice | 需要引起注意的情况,不如第 4 和第 5 类重要 |
7 | Info | 需要报告的一般消息 |
8 | Debug | 运行于 debug 模式的程序产生的消息 |
Apache服务器中的访问日志分为4类:
- 普通日志格式(common log format,CLF):大多数日志分析软件都支持这种格式,其在 LogFormat 指定中定义的昵称为 common;
- 参考日志格式(referer log format):记录客户访问站点的用户身份,其在 LogFormat 指定中定义的昵称为 referer;
- 代理日志格式(agent log format):记录请求的用户代理,其在 LogFormat 指定中定义的昵称为 agent;
- 综合日志格式(combined log format):即结合上述三种格式的日志信息,其在 LogFormat 指定中定义的昵称为 combined。
由于综合日志格式有效地结合了其他 3 种日志格式和信息,所以在在实际的使用过程中,配制访问日志可以使用 3 个文件进行分别记录,配置如下:
LogFormat “%h %l %u %t \ “%r\” %>s %b” common LogFormat “%{Referer}i->%U” referer LogFormat “%{Apache User-agent}i” agent CustomLog logs/access_log common CustomLog logs/referer_log referer CustomLog logs/agent_log agent
也可以使用一个综合文件进行记录,相应配置示例如下:
LogFormat “%h %l %u %t \ “%r\” %>s %b \”%{Referer}i\” \ “%{Apache User-Agent}i\””combined CustomLog logs/access_log combined
以下是在httpd.conf文件里的配置:
//httpd.conf文件 ErrorLog "Logs/error_log" logLevel warn LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%h %l %u %t \"%r" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio CustomLog "logs/access_log" common CustomLog "logs/access_log" combined