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

<Files ~ "^\.htaccess">
  Order allow,deny
  Deny from all
</Files>

  要限制.htaccess文件能覆盖的内容,需要使用AllowOverride指令.该指令可以进行全局设置或者对单个文件进行配置.要配置默认的选项,可以使用Options指令.以下是对/var/www/icons目录的访问控制:

<Directory "/var/www/icons">
    Options Indexs MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

  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表示,删除原有文件的内容并重新写入,如果是添加,则可以不用该选项

  使用主配置文件配置用户认证及授权,形式如下:

<Directory "/var/www/html/test">
  AllowOverride None //禁用.htaccess文件
  AuthType Basic //使用Basic认证模式
  AuthName "test" //显示领域内容
AuthUserFiles /etc/httpd/passwd_auth //读取口令文件的地址
Require user linger //允许访问的用户名,多个用户使用空格分开
</Directory>

   当然,除了使用主配置文件来进行用户认证之外,还可以使用.htaccess文件:

         (1)开启用户认证支持:

<Directory "/var/www/html/test">
AllowOverride AuthCOnfig
<Directory>

  (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
<IfMode alias_module>
  Alias /phpmyadmin "/home/linger/phpmyadmindir"
  ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"
</IfModule>
<Directory "/usr/local/apache /cgi-bin/"> //设置cgi-bin目录属性
  AllowOverride NOne
  Options ExecCGI
  Reguire all granted
</Directory>

  六 设置虚拟主机

  Apache服务器是最早实现虚拟主机的web服务器,设置虚拟主机的好处是可以使一台物理服务器可以同时运行多个web服务,现在多数虚拟主机租用商就是通个这个功能来实现多域名访问的.虚拟主机可以分为两种,基于IP的和基于域名的虚拟主:基于IP的就是一台物理服务器上有多个网卡(可以是硬件的,也可以是通过软件实现的),当访问这些不同的IP时,虽然数据包到达同一台物理服务器,但是跟据客户请求的IP不同,Apache服务器会返回客户不同的数据.基于域名的虚拟主机,就是Apache服务器根据客户端不同的域名请求(这些在http-headers里有的),查找不同的web目录,再返回给客户端.由于当前IPv4短缺,而且域名比较好记,所以基于域名的虚拟主机比较流行,以下是一个基于域名的虚拟主机的配置:

//设置第一个虚拟主机
<VirtualHost *:80>
  ServerAdmin [email protected]
  DocumentRoot "/usr/local/apache/server1"
  ServerName server1.com
  ServerAlias www.server1.com
  ErrorLog "logs/server1_error_log"
  CustomLog "logs/server1_access_log" common
</VirtualHost>
//设置第二个虚拟主机
<VirtualHost *:80>
  ServerAdmin [email protected]
  DocumentRoot "/usr/local/apache/server2"
  ServerName server2.com
  ServerAlias www.server2.com
  ErrorLog "logs/server2_error_log"
  CustomLog "logs/server2_access_log" common //common表示使用普通日志格式
</VirtualHost>

  七  设置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
<IfMode log_config_module>
  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
  LogFormat "%h %l %u %t \"%r\" %>s %b" common
  
  <IfModule login_module>
  LogFormat "%h %l %u %t \"%r" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
  </IfModule>
  
  CustomLog "logs/access_log" common
  CustomLog "logs/access_log" combined
</IfModule>

  

  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。