Apache的负载均衡

这要用到apache的mod_proxy等几个模块,mod_proxy提供代理服务器功能,mod_proxy_balancer提供负载均衡功能, mod_proxy_http让代理服务器能支持HTTP协议,也有其他mod_proxy_***支持其他协议,如ajp和ftp。 首先得在编译的时候添加“–enable-proxy”参数,可以通过下面的命令查看apache’的编译参数

# cat /usr/local/apache/build/config.nice
#! /bin/sh
#
# Created by configure

"./configure" \
"--prefix=/usr/local/apache" \
"--enable-so" \
"--enable-auth-digest" \
"--enable-rewrite" \
"--enable-setenvif" \
"--enable-mime" \
"--enable-headers" \
"--enable-ssl" \
"--enable-proxy" \
"--enable-deflate" \
"$@"

如果添加过的话应该是这样的

# /usr/local/apache/bin/httpd -l|grep proxy
  mod_proxy.c
  mod_proxy_connect.c
  mod_proxy_ftp.c
  mod_proxy_http.c
  mod_proxy_scgi.c
  mod_proxy_ajp.c
  mod_proxy_balancer.c

如果没有,可以通过apxs命令添加

# /usr/local/apache/bin/apxs -c -i -a mod_proxy.c proxy_util.c

-c 执行编译操作
-i 安装操作,安装一个或多个动态共享对象到服务器的modules目录
-a 自动增加一个LoadModule行到httpd.conf文件,以激活此模块,若此行存在则启用之
-A 与-a类似,但是它增加的LoadModule行前有井号前缀(#)
-e 需要执行编辑操作,可与-a和-A选项配合使用,与-i操作类似,修改httpd.conf文件,但并不安装此模块

接下来编辑httpd.conf文件,直接贴我的配置

<VirtualHost 0.0.0.0:8060>
ServerName app.abc.com
DocumentRoot /wwwroot/
RewriteEngine On

ProxyRequests Off
<Proxy balancer://appglassfish>
BalancerMember http://192.168.0.1:8010/appserver
BalancerMember http://192.168.0.2:8010/appserver
</Proxy>

<Proxy balancer://iosglassfish>
BalancerMember http://192.168.0.1:8020/iosserver
BalancerMember http://192.168.0.2:8020/iosserver
</Proxy>

ProxyPass /appserver balancer://appglassfish stickysession=JSESSIONID nofailover=On
ProxyPass /iosserver balancer://iosglassfish stickysession=JSESSIONID nofailover=On

ProxySet lbmethod=bytraffic

<Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Allow from all
</Location>

CustomLog "|/usr/local/apache/bin/rotatelogs  /usr/local/apache/logs/accesslog/app.abc.com_%y%m%d.log 86400 480" common env=!image
</VirtualHost>
其实和nginx里的upstream很像,appglassfish和iosglassfish是我自己定义的balancer名称,定义好之后在ProxyPass中调用就行了;在BalancerMember后面添加loadfactor=n(1<n<100)可以定义节点的权值,添加status=+H可以将节点定义为备份节点,只在另一节点故障时使用,nginx下也有类似功能;ProxyPass里按照url结构去转发请求到对应的balancer,stickysession定义了session粘贴,nofailover=on指在节点出现故障时释放session;ProxySet有三个可选参数,bytraffic,byrequests,bybusyness,按照这三种方式去分配请求,但这里不明白和loadfactor的关系是什么。balancer-manager定义了一个监控页面,访问监控页面可以看到负载的详细信息。

Apache安全配置

0x00 测试环境

centos6.5+apache2.2.15+php5.3.3

0x01 php的运行模式介绍


php的运行模式分四种:

1. CGI通用网关接口 
2. fast-cgi常驻型的CGI 
3. cli命令行运行 
4. web模块模式 

一般情况下,apache使用web模块模式运行php

0x02 Apache运行原理介绍


Apache是基于模块化设计的,各个模块在系统启动的时候按需载入。Apache对于php的解析,就是通过众多Module中的php Module来完成的。

2014080322524877722.png

所以,php加载成为了apache的一个模块,可以把apache和php当成一个整体看待。

当浏览器请求一个php文件时,我们可以理解为apache直接处理返回给浏览器结果,服务器上也只会有httpd进程,而不会有php进程。

apache的一些配置主要是通过httpd.conf来实现的,但是可以在httpd.conf中开启对.htaccess的支持,然后在.htaccess中进行配置。不过一般情况下,不应该使用.htaccess文件,除非你对主配置文件没有访问权限。.htaccess文件应该被用在内容提供者需要针对特定目录改变服务器的配置而又没有root权限的情况下。如果服务器管理员不愿意频繁修改配置,则可以允许用户通过.htaccess文件自己修改配置。

0x03 Apache安全配置方案


1. 选择漏洞较少的apache版本,并打上安全补丁

查看apache版本号:httpd -v

然后在sebug上搜索该版本号有什么漏洞,可根据提示提升版本或者打上补丁

2. 关闭一些不使用的模块及功能

可在LoadModule前加#,来注释掉一些不使用的模块

3. 隐藏banner信息

ServerTokens OS  修改为:ServerTokens Prod (在出现错误页的时候不显示服务器操作系统的名称)

ServerSignature On 修改为:ServerSignature Off(不回显apache版本信息)

4. 删除默认网站及页面

删除默认的页面,防止泄露服务器信息

5. 可修改banner信息

6. 配置http.conf禁止目录浏览

将Options Indexes FollowSymLinks改为Options -Indexes FollowSymLinks

7. 配置http.conf设置默认文档

DirectoryIndex index.html

8. 合理配置apache的运行账户

为apache单独建立一个运行账户及账户组,并在httpd.conf配置

User apache
Group apache

9. 合理控制apache运行账户对磁盘的写入,执行权限

取消apache运行账户对网站目录的写入权限,上传目录除外,其他非网站目录尽量不给权限

10. 合理控制apache运行账户对sh等的执行权限

取消掉了运行账户对sh等的执行权限后能够防止webshell通过默认的sh执行命令

11. 配置http.conf取消对上传目录的php执行权限

<Directory "/var/www/html/aaa">     
    <FilesMatch ".(php|php5)$">     
        Deny from all     
    </FilesMatch> 
</Directory> 

12. 配置http.conf限制禁止访问的文件夹,例如后台目录

<Directory "/var/www/html/aaa">     
        Deny from all     
</Directory> 

13. 配置http.conf限制一些特殊目录的特定ip访问,如内部接口等。

<Directory "/var/www/html/aaa">     
    Order Deny,Allow
    Deny from all
    Allow from 192.168.1.111    
</Directory> 

14. 配置http.conf限制一些文件类型的访问,如txt的日志

<Files ~ ".txt$"> 
    Order allow,deny 
    Deny from all 
</Files> 

15.配置http.conf修改修改监听端口来防止一些内部系统被扫描

这样可以防止一些直接扫描80端口的黑客

Listen 12345 

16. 关闭对.htaccess的支持

AllowOverride All 

改为

AllowOverride None 

17. 配置http.conf记录访问日志

0x04 .htaccess常见配置方法参考


首先,不建议使用.htaccess,其次,使用.htaccess需要在httpd.conf中开启,最后,开始.htaccess支持后需要在httpd.conf中配置防止.htaccess文件被下载,下面介绍几个基本配置方法不全,更多的可以参考其他网站专门针对.htaccess 的配置方法。

1. 定制目录的默认文档

DirectoryIndex index.html index.php index.htm 

2. 定制错误页面

ErrorDocument 404 errors/404.html 

3. 控制访问文件和目录的级别

order deny,allow  
deny from all  
allow from 192.168.0.0/24 

4. 防止列目录

Options -Indexes 

0x05 总结


其实一个web服务器的保护是分几个层次的(暂不考虑程序的漏洞):

1. 隐藏自己

要保护一个web服务器首先得学会隐藏自己,对于一些内部系统,如后台,内部接口等,我们可以通过改端口,限制ip等方式来不让黑客发现。

2. 隐藏身份

对于多数web系统来说,都是提供给外面的访问的,所以想隐藏自己其实是很难的。但是我们还是要学会隐藏身份,可以通过改banner,该返回信息来隐藏身份来加大黑客攻击的难度。

3. 选用安全的版本及修补一些已知的漏洞

其实前面两步都是很容易突破,然后获知一个web系统所使用的web服务器版本的,此时我们能做的就是选择一个少漏洞的版本,及打上安全补丁。

4. 做好安全配置

做好基础的安全配置,禁止目录浏览,设定默认文档,上传目录限制php执行等等,来阻挡黑客的入侵。

5. 合理配置web服务进程账户的权限

当黑客已经通过程序漏洞上传了一个webshell并且已经成功执行了,此时,就只能很好的配置服务进程的账户权限,包括磁盘的读取写入,特殊程序如sh的执行,等等,这样可以讲危害降到最低。

6. 记录日志

最后,当黑客已经光顾之后,我们也只能通过日志来分析,看问题出在哪里了。

转自 http://drops.wooyun.org/运维安全/2727

屏蔽某个浏览器对apache的访问

apache 屏蔽某个浏览器访问

屏蔽IE 6、7、8

RewriteEngine on 
RewriteCond %{HTTP_USER_AGENT} (MSIE\ [6-8]) [NC]
RewriteRule ^.*$ 502.html [L]

屏蔽Firefox

RewriteEngine on 
RewriteCond %{HTTP_USER_AGENT} Firefox [NC]
RewriteRule ^.*$ 502.html [L]

示例:

RewriteCond %{HTTP_USER_AGENT}      (Firefox\/[1-3])
RewriteCond %{HTTP:Accept-Language} ^$                             [OR]
RewriteCond %{HTTP_USER_AGENT}      (Firefox\/[1-3])
RewriteCond %{HTTP:Accept-Encoding} !^gzip\,deflate$               [OR]
RewriteCond %{HTTP_USER_AGENT}      (Firefox\/[1-3])
RewriteCond %{HTTP:Accept-Charset}  !(UTF-8|utf-8)                 [OR]
RewriteCond %{HTTP_USER_AGENT}      (Firefox\/[1-3])
RewriteCond %{HTTP:Via}             ^$
RewriteCond %{HTTP:Connection}      !^keep-alive$                  [OR]
RewriteCond %{HTTP_USER_AGENT}      (Firefox\/[1-3])
RewriteCond %{HTTP:Via}             ^$
RewriteCond %{HTTP:Keep-Alive}      !^(300|115)$
RewriteRule (.*) - [F]
 
RewriteCond %{HTTP_USER_AGENT}      (MSIE\ [6-8])
RewriteCond %{REQUEST_URI}          !favicon\.ico
RewriteCond %{HTTP:Accept-Language} ^$                             [OR]
RewriteCond %{HTTP_USER_AGENT}      (MSIE\ [6-8])
RewriteCond %{HTTP:Via}              ^$
RewriteCond %{HTTP:Accept-Encoding} !^gzip\,\ deflate$             [OR]
RewriteCond %{HTTP_USER_AGENT}      (MSIE\ [6-8])
RewriteCond %{HTTP:Accept}          ^$                             [OR]
RewriteCond %{HTTP_USER_AGENT}      (MSIE\ [6-8])
RewriteCond %{HTTP:Via}              ^$
RewriteCond %{HTTP:Connection}      !^Keep-Alive$                  [OR]
RewriteCond %{HTTP_USER_AGENT}      (MSIE\ 7)
RewriteCond %{HTTP:UA-CPU}          ^$
RewriteRule (.*) - [F]
RewriteEngine On 
#RewriteCond %{HTTP_USER_AGENT} ^.*MSIE.*
RewriteCond %{HTTP_USER_AGENT} "^Mozilla/4\.0 \(compatible; MSIE.*"
RewriteCond %{HTTP_USER_AGENT} ".*Windows.*"
RewriteCond %{HTTP_USER_AGENT} "!.*Windows CE.*"
#RewriteCond %{HTTP_USER_AGENT} !^.*Opera.*
RewriteRule ^/ym(.*)$ http://ip/b.html [R,L,QSA]

RewriteEngine On 
RewriteRule ^/ym(.*)$ http://ip/a.html [R,L,QSA]