分类:
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>