Chinaunix首页 | 论坛 | 博客
  • 博客访问: 79763
  • 博文数量: 17
  • 博客积分: 679
  • 博客等级: 上士
  • 技术积分: 178
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-15 12:31
文章分类
文章存档

2012年(3)

2011年(12)

2010年(2)

分类:

2010-04-15 16:55:07

 

apache是一个很重要的服务,它可以和mysql  php 组成LAMP的黄金组合。

Apache

 

目标:

1、掌握apache工作模式配置

2、掌握apache的别名配置

3、掌握apache的cgi配置

4、掌握apache的访问控制、认证授权、虚拟主机

5、掌握apache的压力测试

 

 

 

1、掌握apache的 工作模式的配置

apache有三种工作模式,其中两种比较常用,prefork.c预生派工作模式这是进程工作模式,work.c这是线程工作模式,它们的启动配置是不一样的如下;

  StartServers       8  启动时开启8个是程   ps -aux | grep httpd

  MinSpareServers    5  最小的空闲进程数

  MaxSpareServers   20  最大的空闲进程数

  ServerLimit      256 

  MaxClients       256  最大的并发客户端数

  MaxRequestsPerChild  4000   每个进程的最大请求是4000,受理4000个请求后重新开启一个进程

 

 

      线程工作模式

 StartServers         2  启动时开启2个进程

 MaxClients         150  最大的并发客户端数

 MinSpareThreads     25  最小空闲线程数

 MaxSpareThreads     75  最大空闲线程数

 ThreadsPerChild     25  每个进程的线程数

 MaxRequestsPerChild  0  每个进程的最大请求不做限制

默认情况下我们使用的是prefork.c工作模式,如果我们想换用work.c则可以更改/etc/sysconfig/httpd,更改之前先停止服务service httpd stop

vi /etc/sysconfig/httpd

#HTTPD=/usr/sbin/httpd.worker 把之行前面的#号去掉

service httpd restart

ps aux | grep httpd

 

[root@stu26 conf]# ps aux | grep httpd    过滤出所有httpd的程序

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ

root      7287  0.0  0.3  10740  3152 ?        Ss   17:23   0:00 /usr/sbin/httpd.worker  这是启动是的进程是由root来启动apache的,是下面两个进程的父进程

apache    7288  0.0  0.3 287416  3388 ?        Sl   17:23   0:00 /usr/sbin/httpd.worker  这是运行时的进程是由apache来运行的,也是启动开启的进程

apache    7290  0.0  0.2 287416  2844 ?        Sl   17:23   0:00 /usr/sbin/httpd.worker  同上,正好2个进程

 

 

2、apache的别名配置

 

apache的别名能起到一定的安全作用,因为我们在访问页面的时候是由文件系统映射的,即然是文件系统就有绝对路径和相对路径,为了避免我们在访问的时候输入文件系统的路径我们可以给一个文件系统的目录起个别名,这样只要输入一个简短的别名就可以访问到文件系统的真实路径。

 

 

针对一个目录来做别名,在主配文件中

alias /tong "/www/html"新建/www/html目录并在此目录下建index.html,这样就要可以用。

 

3、掌握cgi的配置

cgi  common gateway interface 通用网关接口,动态内容编辑器

 

(1)、查看是否支持cgi

LoadModule cgi_module modules/mod_cgi.so有这一条语句说明支持

 

(2)、#AddHandler cgi-script .cgi  找到这一行去注释,意思是说把.cgi扩展名结尾的文件交由cgi-script处理器处理。

                  AddHandler在文件扩展名与特定的处理器之间建立映射(详看apache手册)

 

(3)、对要支持cgi功能的目录进行编辑

<Directory "/www/cgi">

     AllowOverride None  定义不使用.htaccess文件

     Options execcgi     这里定义可以执行cgi脚本

 

(4)、编辑cgi文件

cd /www/

mkdir cgi;cd cgi

cat index.html

#!/bin/bash

echo "content-type: text/html"  cgi的固定格式

echo ""                         换行

date                            执行这个命令

 

chmod +x index.cgi

 

(5)、定义别名

scriptalias /cgi/  "/www/cgi"

 

(6)、测试

在firefox地址栏里输入192.168.1.26/cgi/index.cgi查看效果如果能正常显示时间并刷新的时候会改变时间则说明设置成功。

 

4、掌握apache的访问控制、认证授权、虚拟主机

apache的访问控制可以分为基于主机和基于用户的。认证授权可以写在主配文件中或对要认证的目录生成.htaccess文件。虚拟主机是可以在一台apache服务器上生成多个web站点,并且每个web站点可以是独立的。

(1)修改主配文件

#NameVirtualHost *:80    这必须得开启去掉注释      也可以改成IP地址

 

<VirtualHost  192.168.1.26:80>  如果上面的定义成IP:80的格式,这里也得保持一致

serveradmin web@google.com              管理员的邮箱

servername                使用域名

documentroot "/www/html"                根文档的路径

                 对这个目录做访问控制及认证授权

  allowoverride  AuthConfig             开启认证授权

  authtype   basic                      认证类型

  authname   "tong"                     领域名称

  authuserfile  "/etc/httpd/htpasswd"   用户文件保存的路径

  rquire valid-user                     允许用户文件中的所有用户使用

  order allow,deny                      开启访问控制

  allow from all                        允许所有用户的访问没有明确允许的将全部拒绝

  </Directory>                        

 

(2)、生成认证用户文件

     htpasswd -c /etc/httpd/htpasswd user1                 htpasswd /etc/httpd/htpasswd  user2   生成uesr1  user2用户

 

(3)、重新启动服务及测试

httpd -t                               查看语法是否正确

service httpd restart                  重启服务

   

测试  打开firefox      出现要求输入用户名和密码的窗口,user1   user2都可以登陆      

 

Order allow,deny     这里很让人晕,说下我的理解,其实很简单它不像防火墙的策略匹配到就不往下检查了,一定要紧记不要防火墙策略弄混,order定义了先执行allow or deny,这顺序很重要;如果先是allow那么默认的操作是没有被明确拒绝的都将被允许,如果先是deny 那么没有被明确允许的都将被拒绝。

 

 

5、掌握apache的压力测试

apache提供了一个ab的压力测试工具,我们可以在prefork.c  和 work.c工作模式之前进行测试

 

-c 是客户端的数量

-n 执行请求的数量

ab -c 500 -n 1000 http:  500并发用户发送1000个请求

 

 

 

二:隐藏和伪装Apache的版本

通常,软件的漏洞信息和特定版本是相关的,因此,版本号对黑客来说是最有价值的。

默认情况下,系统会把Apache版本模块都显示出来(http返回头)。如果列举目录的话,会显示域名信息(文件列表正文),去除Apache版本号的方法是修改配置文件/etc/httpd.conf。找到关键字ServerSignature,将其设定为:

ServerSignature Off

ServerTokens Prod   

然后重新启动Apache服务器,用下面的命令查看

[root@node1 conf]# curl --head

HTTP/1.1 403 Forbidden

Date: Fri, 16 Apr 2010 00:47:19 GMT

Server: Apache     注只有Apache了没有版本号了。

Accept-Ranges: bytes

Content-Length: 3985

Connection: close

Content-Type: text/html; charset=UTF-8

 

通过分析Web服务器的类型,大致可以推测出操作系统的类型,比如,Windows使用IIS来提供HTTP服务,而Linux中最常见的是Apache。

默认的Apache配置里没有任何信息保护机制,并且允许目录浏览。通过目录浏览,通常可以获得类似“Apache/1.3.27 Server at apache.linuxforum.net Port 80”或“Apache/2.0.49 (Unix) PHP/4.3.8”的信息。

通过修改配置文件中的ServerTokens参数,可以将Apache的相关信息隐藏起来。但是,Red Hat Linux运行的Apache是编译好的程序,提示信息被编译在程序里,要隐藏这些信息需要修改Apache的源代码,然后,重新编译安装程序,以替换里面的提示内容。

以Apache 2.0.50为例,编辑ap_release.h文件,修改“#define AP_SERVER_BASEPRODUCT \"Apache\"”为“#define AP_SERVER_BASEPRODUCT \"Microsoft-IIS/5.0\"”。

编辑os/unix/os.h文件,修改“#define PLATFORM \"Unix\"”为“#define PLATFORM \"Win32\"”。

修改完毕后,重新编译、安装Apache。

Apache安装完成后,修改httpd.conf配置文件,将“ServerTokens Full”改为“ServerTokens Prod”;将“ServerSignature On”改为“ServerSignature Off”,然后存盘退出。重新启动Apache后,用工具进行扫描,发现提示信息中已经显示操作系统为Windows。

如ubuntu中文论坛

Apache/2.2.8 (Ubuntu) DAV/2 SVN/1.4.6 mod_ssl/2.2.8 OpenSSL/0.9.8g Server at forum.ubuntu.org.cn Port 80

这个等于告诉恶意用户很多有用信息,虽然说不算开了门,但等于被告诉了门在那里,还是相当危险的

三:建立安全的目录结构apache服务器包括四个目录结构

ServerRoot #保存配置文件,二进制文件与其他服务器配置文件

DocumentRoot #保存web站点内容,包括HTML文件和图片等

ScripAlias #保存CGI脚本

Customlog 和 Errorlog #保存日志和错误日志

建议的目录结构为,以上四种目录相互独立并且不存在父子逻辑关系

注:

ServerRoot目录只能为root用户访问

DocumentRoot目录应该能够被管理web站点内容的用户访问和使用apache服务器的apache用户与组访问

ScripAlias目录应该只能被CGI开发人员和apache用户访问

Customlog 和 Errorlog只能被root访问

下边是一个安全目录结构的事例

+——-/etc/

|

| +—-/http (ServerRoot)

| +—-/logs (Customlog 和 Errorlog)

|

+——-var/www

|

| +—/cgi-bin (ScripAlias)

| +—/html(DocumentRoot)

这样的目录结构是比较安全的,因为目录之间独立,某个目录权限错误不会影响到其他目录

四:为apache使用专门的用户与组

按照最小特权的原则,需要给apache分配一个合适的权限,让其能够完成web服务

注:

最小特权原则是系统安全中最基本的原则之一,限制使用者对系统及数据进行存取所需要的最小权限,保证用户可以完成任务,同时也确保被窃取或异常操作所造成的损失

必须保证apache使用一个专门的用户与组,不要使用系统预定的帐户,比如nobody用户与nogroup组

因为只有root用户可以运行apache,DocumentRoot应该能够被管理web站点内容的用户访问和使用apache服务器的 apache用户与组访问,例如,希望“test”用户在web站点发布内容,并且可以以httpd身份运行apache服务器,可以这样设定

groupadd webteam

usermod -G webteam test

chown -R httpd.webteam /www/html

chmod -R 2570 /www/htdocs

只有root能访问日志,推荐这样的权限

chown -R [...]

隐藏php头部版本输出 Hide PHP version (X-Powered-By)

php默认会输出header信息:

Date: Tue, 15 Apr 2008 13:58:46 GMT

Server: Apache/2.2.8

X-Powered-By: PHP/5.2.3

这样一下子php信息就全曝光了。怎样解决呢。

作者:admin 发布时间:April 15, 2008 分类:

php默认会输出header信息:

Date: Tue, 15 Apr 2008 13:58:46 GMT

Server: Apache/2.2.8

X-Powered-By: PHP/5.2.3

这样一下子php信息就全曝光了。怎样解决呢。

网上一搜中文,还真找不到相关信息。用英文一搜搜到了(下面是原文)

If you have read my previous tip, ““, you have seen how you can configure apache to provide only a minimal amount of information about the installed software versions in its banner. But if you are using the PHP module in your web server (as most of us are), then there is one additional step that need to be completed, and this is what I will show you in this tip.

After implementing the apache directives ServerTokens and ServerSignature as shown in ““, we test its functionality against a regular html file and we get the following response:

HEAD
200 OK
Connection: close
Date: Fri, 16 Jun 2006 01:13:23 GMT
Server: Apache
Content-Type: text/html; charset=UTF-8
Client-Date: Fri, 16 Jun 2006 21:42:53 GMT
Client-Peer: 192.168.0.102:80
Client-Response-Num: 1

This looks good. But if we do the same thing against an URL that is a PHP file:

HEAD 200 OK Connection: close Date: Fri, 16 Jun 2006 01:16:30 GMT Server: Apache Content-Type: text/html; charset=UTF-8 Client-Date: Fri, 16 Jun 2006 21:48:13 GMT Client-Peer: 192.168.0.102:80 Client-Response-Num: 1 X-Powered-By: PHP/5.1.2-1+b1

Ups… As we can see PHP adds its own banner:

 

X-Powered-By: PHP/5.1.2-1+b1

Let’s see how we can disable it. In order to prevent PHP from exposing the fact that it is installed on the server, by adding its signature to the web server header we need to locate in php.ini the variable expose_php and turn it off.

 

By default expose_php is set to On.

 

In your php.ini (based on your Linux distribution this can be found in various places, like /etc/php.ini, /etc/php5/apache2/php.ini, etc.) locate the line containing “expose_php On” and set it to Off:

expose_php = Off

After making this change PHP will no longer add it’s signature to the web server header. Doing this, will not make your server more secure… it will just prevent remote hosts to easily see that you have PHP installed on the system and what version you are running.

结果简单的让人吃惊,只是需要修改php.ini 的 expose_php 把默认的 On改成 Off 就行了。

 

源文档 <http://hi.baidu.com/tianhuimin/blog/item/a701a864fba6d0fbf6365485.html>

 

 

阅读(2115) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:看到一篇好贴转一下

给主人留下些什么吧!~~