• 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"  //显示领域内容
       AuthUserFile /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 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
    </VirtualHost>
    //设置第二个虚拟主机
    <VirtualHost *: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表示使用普通日志格式
    </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>  
  • 相关阅读:
    济南学习 Day5 T3 晚
    Codevs 1043 ==洛谷 P1004 方格取数
    济南学习 Day 5 T2 晚
    济南学习 Day 5 T1 晚
    济南学习 Day 5 T3 am
    济南学习 Day 5 T2 am
    LeetCode Weekly Contest 8
    poj-1410 Intersection
    leetcode-Warm Up Contest-Aug.21
    poj-1384 Piggy-Bank
  • 原文地址:https://www.cnblogs.com/lingerhk/p/4039075.html
Copyright © 2020-2023  润新知