记录生活点滴.

保证Linux Apache Web服务器安全的10个建议

如果你是一个系统管理员,你应该按照以下的10点建议来保证Apache web服务器的安全。

1、禁用不必要的模块

如果你打算源码编译安装apache,你应该禁用以下的模块。如果你运行./configure -help,你将会看到所有可用的你可以禁用/开启的模块。

userdir –用户特定用户的请求映射。例如:带用户名的URL会转化成服务器的一个目录。

autoindex – 当没有默认首页(如index.html)时显示目录列表。

status –显示服务器统计

env – 清除或修改环境变量

setenvif –根据客户端请求头字段设置环境变量

cgi –CGI脚本

actions – 根据特定的媒体类型或请求方法,激活特定的CGI脚本

negotiation –提供内容协商支持

alias – 提供从文件系统的不同部分到文档树的映射和URL重定向

include –实现服务端包含文档(SSI)处理

filter –根据上下文实际情况对输出过滤器进行动态配置

version –提供基于版本的配置段支持

asis – 发送自己包含HTTP头内容的文件

当你执行./configure按照下面禁用以上的所有模块。

./configure \

–enable-ssl \

–enable-so \

–disable-userdir \

–disable-autoindex \

–disable-status \

–disable-env \

–disable-setenvif \

–disable-cgi \

–disable-actions \

–disable-negotiation \

–disable-alias \

–disable-include \

–disable-filter \

–disable-version \

–disable-asis

如果激活ssl且禁用mod_setenv,你将会得到以下错误。

错误: Syntax error on line 223 of /usr/local/2/conf/extra/httpd-ssl.conf: Invalid command ‘BrowserMatch’, perhaps misspelled or defined by a module not included in the server configuration

解决方案:如果你使用ssl,不要禁用setenvif模块。或者你禁用setenvif模块,可以在httpd-ssl.conf注释BrowserMatch。

安装完成全,执行httpd -l,会列出所有已安装的模块。

# /usr/local/apache2/bin/httpd -l

Compiled in modules:

core.c

mod_authn_file.c

mod_authn_default.c

mod_authz_host.c

mod_authz_groupfile.c

mod_authz_user.c

mod_authz_default.c

mod_auth_basic.c

mod_log_config.c

mod_ssl.c

prefork.c

http_core.c

mod_mime.c

mod_dir.c

mod_so.c

在这个例子里,我们安装了如下apache模块:

core.c –Apache核心模块

mod_auth* –各种身份验证模块

mod_log_config.c –允许记录日志和定制日志文件格式

mod_ssl.c – SSL

prefork.c – 一个非线程型的、预派生的MPM

httpd_core.c – Apache核心模块

mod_mime.c – 根据文件扩展名决定应答的行为(处理器/过滤器)和内容(MIME类型/语言/字符集/编码)

mod_dir.c – 指定目录索引文件以及为目录提供”尾斜杠”重定向

mod_so.c – 允许运行时加载DSO模块

2、以单独的用户和用户组运行Apache

Apache可能默认地以nobody或daemon运行。让Apache运行在自己没有特权的帐户比较好。例如:用户apache。

创建apache用户组和用户。

groupadd apache

useradd -d /usr/local/apache2/htdocs -g apache -s /bin/false apache

更改httpd.conf,正确地设置User和Group。

# vi httpd.conf

User apache

Group apache

之后重启apache,执行ps -ef命令你会看到apache以“apache”用户运行(除了第一个都是以root运行之外)。

# ps -ef | grep -i http | awk ‘{print $1}’

root

apache

apache

apache

apache

apache

3、限制访问根目录(使用Allow和Deny)

在httpd.conf文件按如下设置来增强根目录的安全。

 

Options None

Order deny,allow

Deny from all

 

在上面的:

Options None –设置这个为None,是指不激活其它可有可无的功能。

Order deny,allow – 这个是指定处理Deny和Allow的顺序。

Deny from all –阻止所有请求。Deny的后面没有Allow指令,所以没人能允许访问。

4、为conf和bin目录设置适当的权限

bin和conf目录应该只允许授权用户查看。创建一个组和把所有允许查看/修改apache配置文件的用户增加到这个组是一个不错的授权方法。

下面我们设置这个组为:apacheadmin

创建组:

groupadd apacheadmin

允许这个组访问bin目录。

chown -R root:apacheadmin /usr/local/apache2/bin

chmod -R 770 /usr/local/apache2/bin

允许这个组访问conf目录。

chown -R root:apacheadmin /usr/local/apache2/conf

chmod -R 770 /usr/local/apache2/conf

增加合适的用户到这个组。

# vi /etc/group

apacheadmin:x:1121:user1,user2

5、禁止目录浏览

如果你不关闭目录浏览,用户就能看到你的根目录(或任何子目录)所有的文件(目录)。

比如,当他们浏览http://{your-ip}/images/而images下没有默认首页,那么他们就会在浏览器中看到所有的images文件(就像ls -l输出)。从这里他们通过点击就能看到私人的图片文件,或点点击子目录看到里面的内容。

为了禁止目录浏览,你可以设置Opitons指令为“None“或者是“-Indexes”。在选项名前加“-”会强制性地在该目录删除这个特性。

Indexes选项会在浏览器显示可用文件的列表和子目录(当没有默认首页在这个目录)。所以Indexes应该禁用。

 

Options None

Order allow,deny

Allow from all

(or)

Options -Indexes

Order allow,deny

Allow from all

 

6、禁用.htaccess

在htdocs目录下的特定子目录下使用.htaccess文件,用户能覆盖默认apache指令。在一些情况下,这样不好,应该禁用这个功能。

我们可以在配置文件中按如下设置禁用.htaccess文件来不允许覆盖apache默认配置。

 

Options None

AllowOverride None

Order allow,deny

Allow from all

7、禁用其它选项

下面是一些Options指令的可用值。

Options All –所有的选项被激活(除了MultiViews)。如果你不指定Options指令,这个是默认值。

Options ExecCGI –执行CGI脚本(使用mod_cgi)。

Options FollowSymLinks –如果在当前目录有符号链接,它将会被跟随。

Options Includes –允许服务器端包含文件(使用mod_include)。

Options IncludesNOEXEC –允许服务器端包含文件但不执行命令或cgi。

Options Indexes –允许目录列表。

Options MultiViews -允许内容协商多重视图(使用mod_negotiation)

Options SymLinksIfOwnerMatch – 跟FollowSymLinks类似。但是要当符号连接和被连接的原始目录是同一所有者是才被允许。

绝不要指定“Options All”,通常指定上面的一个或多个的选项。你可以按下面代码把多个选项连接。

Options Includes FollowSymLinks

当你要嵌入多个Directory指令时,“+”和“-”是有用处的。也有可能会覆盖上面的Directory指令。

如下面,/site目录,允许Includes和Indexes。

 

Options Includes Indexes

AllowOverride None

Order allow,deny

Allow from all

 

对于/site/en目录,如果你需要继承/site目录的Indexes(不允许Includes),而且只在这个目录允许FollowSymLinks,如下:

 

Options -Includes +FollowSymLink

AllowOverride None

Order allow,deny

Allow from all

 

/site目录允许IncludesIndexes

/site/en目录允许Indexes和FollowSymLink

8、删除不需要的DSO模块

如果你加载了动态共享对象模块到apache,他们应该在httpd.conf文件在“LoadModule”指令下。

请注意静态编译的Apache模块是不在“LoadModule”指令里的。

在httpd.conf注释任何不需要的“LoadModules”指令。

grep LoadModule /usr/local/apache2/conf/httpd.conf

9、限制访问特定网络(或IP地址)

如果你需要只允许特定IP地址或网络访问你的网站,按如下操作:

只允许特定网络访问你的网站,在Allow指令下给出网络地址。

 

Options None

AllowOverride None

Order deny,allow

Deny from all

Allow from 10.10.0.0/24

 

只允许特定IP地址访问你的网站,在Allow指令下给出IP地址。

 

Options None

AllowOverride None

Order deny,allow

Deny from all

Allow from 10.10.1.21

 

10、禁止显示或发送Apache版本号(设置ServerTokens)

默认地,服务器HTTP响应头会包含apache和php版本号。像下面的,这是有危害的,因为这会让黑客通过知道详细的版本号而发起已知该版本的漏洞攻击。

Server:Apache/2.2.17 (Unix) PHP/5.3.5

为了阻止这个,需要在httpd.conf设置ServerTokens为Prod,这会在响应头中显示“Server:Apache”而不包含任何的版本信息。

# vi httpd.conf

ServerTokens Prod

下面是ServerTokens的一些可能的赋值:

ServerTokens Prod 显示“Server:Apache”

ServerTokens Major 显示 “Server:Apache/2″

ServerTokens Minor 显示“Server:Apache/2.2″

ServerTokens Min d显示“Server:Apache/2.2.17″

ServerTokens OS 显示 “Server:Apache/2.2.17 (Unix)”

ServerTokens Full 显示 “Server:Apache/2.2.17 (Unix) PHP/5.3.5″ (如果你这指定任何的值,这个是默认的返回信息)

除了上面10个apache的安全建议,你还必要确保你的UNIX/Linux操作系统的安全。如果你的操作系统不安全,那么只是确保apache 的安全就没有任何意义了。通常的我们要保持apache版本的更新,最新的apahce版本会修复所有已知的安全问题。还有就是要确保时常查看 apache日志文件。

Popularity: 3%

2011-07-29相关转载

没有评论
258 views

想谈一场永不分手的恋爱

想谈一场永不分手的恋爱,就算吵架,就算生气,就算分开,也会再在一起.我想谈一场永不分手的恋爱,就算我们很忙,就算我们很累,只要见到彼此就会温馨一笑.我们会一直走下去。我想谈一场永不分手的恋爱.蹒跚漫步,夕阳西下,白头到老,相濡以沫.然后轻抚着你的脸庞轻声说句:对你的感觉一直都在。

Popularity: 2%

jQuery Lightbox By Group 图片分组

的lightbox插件图片分组,baidu不到,这里给出实例

html:

<div>
<div>Details here</div>
<div id=”tour--images-1″>
<a href=”/images/pic1.jpg”><img src=”/images/pic1.jpg” /></a>
<a href=”/images/pic2.jpg”><img src=”/images/pic2.jpg” /></a>
<a href=”/images/pic3.jpg”><img src=”/images/pic3.jpg” /></a>
</div>
</div>

<div>
<div>Details 2 here</div>
<div id=”tour-lightbox-images-2″>
<a href=”/images/pic4.jpg”><img src=”/images/pic4.jpg” /></a>
</div>
</div>

<div>
<div>Details 3 here</div>
<div id=”tour-lightbox-images-3″>
<a href=”/images/pic5.jpg”><img src=”/images/pic5.jpg” /></a>
<a href=”/images/pic6.jpg”><img src=”/images/pic6.jpg” /></a>
<a href=”/images/pic7.jpg”><img src=”/images/pic7.jpg” /></a>
<a href=”/images/pic8.jpg”><img src=”/images/pic8.jpg” /></a>
<a href=”/images/pic.9jpg”><img src=”/images/pic8.jpg” /></a>
</div>
</div>

JAVASCRIPT:

$(function() {
$(“div.tour-lightbox-images”).each(function(){
$(“#” + this.id + ” a”).lightBox({
imageLoading: “/images/lightbox-ico-loading.gif”,
imageBtnClose: “/images/lightbox-btn-close.gif”,
imageBtnPrev: “‘/images/lightbox-btn-prev.gif”,
imageBtnNext: “/images/lightbox-btn-next.gif”,
imageBlank: “/images/lightbox-blank.gif”
});
});
});

Popularity: 12%

Linux VPS下简单解决CC攻击

一,准备工作

1,登录进VPS控制面板,准备好随时重启VPS。

2,关闭Web Server先,过高的负载会导致后面的操作很难进行,甚至直接无法登录SSH。

3,以防万一,把设置的Web Server系统启动后自动运行去掉。

(如果已经无法登录进系统,并且重启后负载过高导致刚刚开机就已经无法登录,可联系管理员在母机上封掉VPS的IP或80端口,在母机上用虚拟控制台登录进系统,然后进行2&3的操作,之后解封)

二,找出攻击者IP

1,在网站根目录建立文件ip.php,写入下面的内容。

 

<?php 

$real_ip = getenv(‘HTTP_X_FORWARDED_FOR’);

if(isset($real_ip)){

shell_exec(“echo $real_ip > real_ip.txt”);

shell_exec(“echo $_SERVER['REMOTE_ADDR']> proxy.txt”);

}else{

shell_exec(“echo $_SERVER['REMOTE_ADDR'] > ips.txt”)”

}

echo’服务器受到攻击,正在收集攻击源,请在5分钟后访问本站,5分钟内多次访问本站有可能会被当作攻击源封掉IP。谢谢合作!’;

?>

2,设置伪静态,将网站下的所有访问都rewrite到ip.php。

 

Nginx规则: 

rewrite (.*) /ip.php;

Lighttpd规则:

url.rewrite = (

“^/(.+)/?$” => “/ip.php”

)

3,启动Web Server开始收集IP

进行完1和2的设置后,启动Web Server,开始记录IP信息。

收集时间建议为3到5分钟,然后再次关闭Web Server。

real_ip.txt,这个文件中保存的IP有80%以上都相同的,这个IP就是攻击者实施攻击的平台的IP。

proxy.txt,这个文件中保存的是攻击者调用的代理服务器的IP,需要封掉。

ips.txt,这里记录的是未表现出代理服务器特征的IP,根据访问次数判断是否为攻击源。

三,对上一段的补充

如果VPS上启用了WEB日志,可以查看日志文件的增长速度来判断是哪个站点被攻击。

如果没有启用日志,并且站点数量很少,临时启用日志也很方便 。

如果没有启用日志,并且站点数量过多,可以使用临时的Web Server配置文件,不绑定虚拟主机,设置一个默认的站点。然后在ip.php里加入下面一行

 

shell_exec(“echo $_SERVER['HTTP_HOST’]>> domain.txt”);

domain.txt里将保存被访问过的域名,被CC攻击的站点将在里面占绝大多数。

四,开始封堵IP

建立文件ban.php

 

<? 

$threshold = 10;

$ips = array_count_values(file(‘ips.txt’));

$ban_num = 0;

foreach($ips as $ip=>$num){

if($num > $threshold){

$ip = trim($ip);

$cmd = “iptables -I INPUT -p tcp –dport 80 -s $ip -j DROP”;

shell_exec($cmd);

echo “$ip baned! ”;

$ban_num ++;

}

}

$proxy_arr = array_unique(file(‘ips.txt’))’

foreach($proxy_arr as $proxy){

$proxy = trim($proxy);

$cmd = “iptables -I INPUT -p tcp –dport 80 -s $ip -j DROP”;

shell_exec($cmd);

echo “$ip baned! ”;

$ban_num ++;

}

echo “total: $ban_num ips ”;

?>

用下面的命令执行脚本(确保php命令在PATH中)

php ban.php

这个脚本依赖于第二段中ips.txt里保存的结果,当其中记录的IP访问次数超过10次,就被当作攻击源给屏蔽掉。如果是代理服务器,则不判断次数直接 封掉。

封完IP之后,把所有的网站设置恢复正常,站点可以继续正常运行了。

五,一些细节

为保持对操作过程的描述尽量简洁,没有在上面的内容中加入过多的解释,留在这段统一讲述。

1,关于“代理服务器”的一些本质

两个与TCP&HTTP协议相关的值,REMOTE_ADDR和HTTP_X_FORWARDED_FOR。

(1)REMOTE_ADDR总是取离Web服务器最接近的一台主机的IP,如果没有使用代理,这个值就是访问者本身的IP,如果使用了代理,这个值就是 代理服务器的IP,如果通过多个代理服务器进行的连接,这个值就是到达Web服务器前最后一台代理服务器的IP。

REMOTE_ADDR是由TCP/IP层决定的,不能修改不能伪造。

(2)HTTP_X_FORWARDED_FOR,因为这个值是属于HTTP部分,而不是TCP/IP,所以这个值不管是什么,都不影响数据的传 输。事实 上,一般情况下,如果是访问者直接访问Web服务器,这个值为空;通过透明代理的时候,这个值会被代理服务器设置为访问者的IP;通过匿名代理连接时,这 个值可能为代理服务器的IP也可能是空的也有可能是随机的。

HTTP_X_FORWARDED_FOR可以被任意修改。大多数代理服务器都是透明代理,也就是说,会把这个值设置为最原始访问者的IP。

2,关于解决CC攻击的层面问题

按处理效率从高到低排列。

(由于本文是针对VPS服务器所写,而VPS简单来说就是服务器的低端替代品,内存和CPU等资源普遍偏低,当然是处理效率越高越好。)

(1)网络传输层。也就是本文所用的iptables,这个工具本身是工作于系统内核,在建立网络连接时直接把攻击者的连接给否了。在这一层面上将攻击源处理掉后,消耗掉的资源几乎可以忽略不计。

(2)Web Server层,大多数Web Server都可以设置禁止访问的IP。在这一层上解决的意义和上面的差不多,但是效率要差些。

(3)脚本层,从脚本程序上制定适合于本身的策略过滤掉攻击源。网络上有很多流传的在这一层面的解决方案,但是不太适用于VPS,而且设置难度可能要增加几倍或者几十倍。

3,为什么不是从日志收集IP?

主要是考虑两点,一是大多数VPS使用者都因为硬盘空间过小,经常清除日志很麻烦,而直接禁止了日志。

二是如果从日志收集IP,脚本复杂程度要高很多,而且可能要根据情况做些调整,考虑到将要读到本文的人大多数都未必掌握更多的技术,本文的目的就是按部就班的依本文进行操作,即可解决问题。

Popularity: 3%

jQuery li hover 不执行下一个方法 break next function

的li hover添加背景,如果默认被选中不执行下一个break next function,晚上找了很多方法最后终于找到了

使用.unbind方法停止执行下一个,代码示例如下:

HTML:

<ul>
< class=’on’><span><a href=”profile.html” class=’on’>Profile</a></span></>
<li><span><a href=”news.html”>News</a></span></li>
<li><span><a href=”collection.html”>Collection</a></span></li>
<li><span><a href=”store.html”>Store</a></span></li>
<li><span><a href=”color.html”>Color-色</a></span></li>
<li><span><a href=”member.html”>Member</a></span></li>
<li><span><a href=”contact.html”>Contact</a></span></li>
</ul>

jQuery代码如下:

$(document).ready(function(){

/*Sider Menu*/
$(‘ul.nav li’).(
function(e){
$(this).addClass(‘on’);
if($(this).find(‘a’).attr(‘class’) == ‘on’)$(this).();//原先被选中的不执行下一个function
$(this).find(‘a’).addClass(‘on’);
},function(){
$(this).removeClass(‘on’);
$(this).find(‘a’).removeClass(‘on’);
}
);

});

Popularity: 4%

2011-07-27相关转载

没有评论
242 views

沙僧掏出四张动车车票给师父

唐僧师徒四人又要到西天取经,唐僧欲走捷径,于是问悟空,悟空回答:“听说飞机比白龙马快多了。”八戒建议:“师父,听说神六更快。”这时沙僧掏出四张动车车票,指着唐僧,说:“师父,听说坐这玩意能马上送你上西天!”

Popularity: 1%

2011-07-27相关转载

没有评论
233 views

至于你信不信,反正我信了

至于你信不信,反正我信了

Popularity: 1%

2011-07-26相关转载

没有评论
266 views

珍爱生命,远离雷击!

珍爱生命,远离雷击!

Popularity: 2%

Thinkphp 模板 格式化Unix时间戳

在Smarty模板引擎格式化时间戳

常量输出:

{$smarty.now|date_format:”%Y-%m-%d %H:%M:%S”}

Thinkphp模板引擎格式化方法:

{$create_time|date=”Y-m-d”,###}

Popularity: 4%

因为动车,赖昌星只火了半天

因为达芬奇,郭美美只火了两个星期;因为赖昌星,达芬奇只火了一个星期;因为动车,赖昌星只火了半天。

Popularity: 2%

返回顶部