<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>shanghuo.net(上火网)</title>
		<link>http://www.shanghuo.net/</link>
		<description>人间五十年，万事如梦幻。一度生存者，岂有长不灭？</description>
		<copyright>Copyright (C) 2004 Security Angel Team [S4T] All Rights Reserved.</copyright>
		<generator>shanghuo Version 1.6 Build 20071004</generator>
		<lastBuildDate>Fri, 10 Sep 2010 00:17:41 +0000</lastBuildDate>
		<ttl></ttl>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=316</guid>
			<title>百万级PHP网站架构工具箱</title>
			<author>jiashixiang</author>
			<description><![CDATA[<p>在了解过世界最大的PHP站点，Facebook的后台技术后，今天我们来了解一个百万级PHP站点的网站架构：Poppen.de。Poppen.de是德国的一个社交网站，相对Facebook、Flickr来说是一个很小的网站，但它有一个很好的架构，融合了很多技术，如 Nigix、MySql、CouchDB、Erlang、Memcached、RabbitMQ、PHP、Graphite、Red5以及Tsung。</p>
<p>　　51CTO推荐阅读：大型B2C网站高性能可伸缩架构技术探秘</p>
<p>　　Poppen.de目前有200万注册用户数、2万并发用户数、每天20万条私有消息、每天25万登录次数。而项目团队有11个开发人员，两个设计，两个系统管理员。该站点的商业模式采用免费增值模式，用户可以使用搜索用户、给好友发送消息、上载图片和视频等功能。</p>
<p>　　如果用户想享受不受限制发送消息和上载图片，那么就得根据需要支付不同类型的会员服务，视频聊天及网站其他服务也采用同样的策略。</p>
<p>　　Nginx</p>
<p>　　Poppen.de 所有的服务都是基于Nginx服务上的。前端有两台Nginx服务器在高峰期提供每分钟15万次请求的负载，每个机器已经有四年寿命，并且只有一个CPU 和3GB RAM。Poppen.de拥有三台独立的图像服务器，由三台Nginx服务器为*.bilder.poppen.de提供每分钟8万次请求服务。</p>
<p>　　Nginx 架构中一个很酷的设计就是有很多请求是由Memcached处理的，因此请求从缓存中获取内容而不需要直接访问PHP机器。比如，用户信息页(user profile)是网站需要密集处理的内容，如果把用户信息页全部缓存到Memcached上，那么请求直接从Memcached上获取内容。 Poppen.de的Memcached每分钟可以处理8000次请求。</p>
<p>　　架构中有三个Nginx图像服务器提供本地图像缓存，用户上载图 像到一个中央文件服务器。当向这三个Nginx之一中请求图像时，如果服务器本地中没有存在该图像，则从中央文件服务器下载到该服务器上作缓存并提供服 务。这种负载均衡的分布式图像服务器架构设计可以减轻主要存储设备的负载。</p>
<p>　　PHP-FPM</p>
<p>　　该网站运行在PHP- FPM上。共有28台双CPU、6GB内存的PHP机器，每个机器上运行100个PHP-FPM的工作线程。使用启用了APC的PHP5.3.x。 PHP5.3可以降低CPU和内存使用率的30%以上。</p>
<p>　　51CTO推荐阅读：Nginx + PHP-FPM + APC=绝妙的组合</p>
<p>　　程序代码是基于Symfony1.2框架之上开发的。一是可以使用外部资源，二是 能够提高项目开发进度，同时在一个著名的框架上可以让新开发人员更容易加入到团队中来。虽然没有任何事情都是十全十美的，但可以从Symfony框架中得 到很多好处，让团队可以更多的精力放在Poppen.de的业务开发上去。</p>
<p>　　网站性能优化使用XHProf，这是Facebook开源出来的一个类库。这个框架非常容易个性化和配置，能够可以缓存大部分高代价的服务器计算。</p>
<p>　　MySQL</p>
<p>　　MySQL是网站主要的RDBMS。网站又几个MySql服务器：一台4CPU、32GB的服务器存储用户相关信息，如基本信息、照片描述信息等。这台机器已经使用了4 年，下一步计划会使用共享集群来替换它。目前仍基于这个系统上进行设计，以简化数据访问代码。根据用户ID进行数据分区，因为网站中大部分信息都是以用户 为中心的，如照片、视频、消息等。</p>
<p>　　推荐专题：MySQL数据库入门与精通教程</p>
<p>　　有三台服务器按主-从-从配置架构提供用户论坛服务。一台从服务器负责网站自定义消息存储，到现在有 2.5亿条消息。另外四台机器为主-从配置关系。另外由4台机器配置成NDB族群专门服务于密集型写操作数据，如用户访问统计信息。</p>
<p>　　数据表设计尽量避免关联操作，尽可能缓存最多的数据。当然，数据库的结构化规范已经完全被破坏掉了。因此，为了更容易搜索，数据库设计创建了数据挖掘表。大部分表是MyISAM型表，可以提供快速查找。现在的问题是越来越多的表已经全表锁住了。Poppen.de正考虑往XtraDB存储引擎上迁移。</p>
<p>　　Memcached</p>
<p>　　网站架构中Memcached应用相当多，超过45GB的高速缓存和51个节点。缓存了Session会话、视图缓存以及函数执行缓存等。架构中有一个系统 当记录被修改时可以自动地把数据更新到缓存中去。未来改善缓存更新的可能方案是使用新的Redis Hash API或者MongoDB。</p>
<p>　　RabbitMQ</p>
<p>　　在 2009年中开始在架构中使用RabbitMQ。这是一个很好的消息解决方案，便于部署和集中到这个架构中去，在LVS后运行了两台RabbitMQ服务 器。在上个月，已经把更多的东西集成到该队列中，意味着同一时刻有28台PHP服务器每天要处理50万次请求。发送日志、邮件通知、系统消息、图像上载等 更多的东西到这个队列中。</p>
<p>　　应用PHP-FPM中的fastcgi_finish_request()函数集成队列消息，可以把消息异步发 送到队列中。当系统需要给用户发送HTML或JSON格式响应时，就调用这个函数，这样用户就没有必要等到PHP脚本清理。</p>
<p>　　这个系统可以改善架构资源管理。例如，在高峰期服务每分钟可以处理1000次登录请求。这表示有1000并发更新用户表保存用户的登录时间。由于使用了队列机制，可以 按相反的顺序来运行这些查询。如果需要提高处理速度，只需要增加更多的队列处理者即可，甚至可以增加更多的服务器到这集群中去，而不需要修改任何配置和部 署新节点。</p>
<p>　　CouchDB</p>
<p>　　日志存储CouchDB运行在一台机器上。在这台机器上可以根据模块/行为进行日志查询 /分组，或者根据错误类型等等。这对定位问题非常有用。在使用日志聚合服务CouchDB之前，不得不逐台登录到PHP服务器上设法日志分析定位问题，这 是非常麻烦的。而现在把所有的日志集中到队列中保存到CouchDB中，可以集中进行问题检查和分析。</p>
<p>　　Graphite</p>
<p>　　网站使用Graphite采集网站实时信息并统计。从请求每个模块/行为到Memcached的命中和未命中、RabbitMQ状态监控以及Unix负载等等。Graphite服务平均每分钟有4800次更新操作。实践已经证实要监测网站发发生什么是非常有用的，它的简单文本协议和绘图功能可以方便地即插即 用的方式用于任何需要监控的系统上。</p>
<p>　　一件很酷的事情是使用Graphite同时监控了网站的两个版本。一月份部署了Symfony框架新 版本，以前代码作为一个备份部署。这就意味着网站可能会面临性能问题。因此可以使用Graphite来对两个版本在线进行对比。</p>
<p>　　发现新版本上的Unix负载表较高，于是使用XHProf对两个版本进行性能分析，找出问题所在。</p>
<p>　　Red5</p>
<p>　　网站为用户也提供了两种类型的视频服务，一种是用户自己上载的视频，另外一种是视频聊天，用户视频互动和分享。到2009年年中，每月为用户提供17TB的流量服务。</p>
<p>　　Tsung</p>
<p>　　Tsung 是一个Erlang编写的分布式基准分析工具。在Poppen.de网站中主要用于HTTP基准分析、MySQL与其他存储系统(XtraDB)的对比分 析。用一个系统记录了主要的MySQL服务器的流量，再转换成Tsung的基准会话。然后对该流量进行回放，由Tsung产生数以千计的并发用户访问实验 室的服务器。这样就可以在实验环境中与真实场景非常接近。</p>]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=316</link>
			<category domain="http://www.shanghuo.net/?cid=16">sever</category>
			<pubDate>2010-07-24 22:15</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=312</guid>
			<title>linux下ps命令</title>
			<author>jiashixiang</author>
			<description><![CDATA[<p>1. ps简介</p>
<p>要对进程进行监测和控制，首先必须要了解当前进程的情况，也就是需要查看当前进程，而ps命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。</p>
<p>2. ps命令及其参数</p>
<p>　 ps命令最常用的还是用于监控后台进程的工作情况，因为后台进程是不和屏幕键盘这些标准输入/输出设备进行通信的，所以如果需要检测其情况，便可以使用ps命令了。</p>
<p>　　该命令语法格式如下：</p>
<p>　　ps [选项]</p>
<p>　　下面对命令选项进行说明：</p>
<p>　　-e 显示所有进程。</p>
<p>　　-f 全格式。</p>
<p>　　-h 不显示标题。</p>
<p>　　-l 长格式。</p>
<p>　　-w 宽输出。</p>
<p>　　a 显示终端上的所有进程，包括其他用户的进程。</p>
<p>　　r 只显示正在运行的进程。</p>
<p>　　x 显示没有控制终端的进程。</p>
<p>　　O[+|-] k1 [，[+|-] k2 [，&hellip;]] 根据SHORT KEYS、k1、k2中快捷键指定的多级排序顺序显示进程列表。对于ps的不同格式都存在着默认的顺序指定。这些默认顺序可以被用户的指定所覆盖。其中&ldquo;+&rdquo;字符是可选的，&ldquo;-&rdquo;字符是倒转指定键的方向。</p>
<p>　　以下介绍长命令行选项，这些选项都使用&ldquo;--&rdquo;开头：</p>
<p>　　--sort X[+|-] key [，[+|-] key [，&hellip;]] 从SORT KEYS段中选一个多字母键。&ldquo;+&rdquo;字符是可选的，因为默认的方向就是按数字升序或者词典顺序。<br />
比如： ps -jax -sort=uid，-ppid，+pid。</p>
<p>　　--help 显示帮助信息。</p>
<p>　　--version 显示该命令的版本信息。</p>
<p>　　在前面的选项说明中提到了排序键，接下来对排序键作进一步说明。需要注意的是排序中使用的值是ps使用的内部值，并非仅用于某些输出格式的伪值。排序键列表见表4-3。</p>
<p>　　表4-3　排序键列表</p>
<p>　　短格式 <br />
　　长格式 <br />
　　说 明</p>
<p>　　c <br />
　　cmd <br />
　　可执行的简单名称</p>
<p>　　C <br />
　　cmdline <br />
　　完整命令行</p>
<p>　　f <br />
　　flags <br />
　　长模式标志</p>
<p>　　g <br />
　　pgrp <br />
　　进程的组ID</p>
<p>　　G <br />
　　tpgid <br />
　　控制tty进程组ID</p>
<p>　　j <br />
　　cutime <br />
　　累计用户时间</p>
<p>　　J <br />
　　cstime <br />
　　累计系统时间</p>
<p>　　k <br />
　　utime <br />
　　用户时间</p>
<p>　　K <br />
　　stime <br />
　　系统时间</p>
<p>　　m <br />
　　min_flt <br />
　　次要页错误的数量</p>
<p>　　M <br />
　　maj_flt <br />
　　主要页错误的数量</p>
<p>　　n <br />
　　cmin_flt <br />
　　累计次要页错误</p>
<p>　　N <br />
　　cmaj_flt <br />
　　累计主要页错误</p>
<p>　　o <br />
　　session <br />
　　对话ID</p>
<p>　　p <br />
　　pid <br />
　　进程ID</p>
<p>　　P <br />
　　ppid <br />
　　父进程ID</p>
<p>　　r <br />
　　rss <br />
　　驻留大小</p>
<p>　　R <br />
　　resident <br />
　　驻留页</p>
<p>　　s <br />
　　size <br />
　　内存大小（千字节）</p>
<p>　　S <br />
　　share <br />
　　共享页的数量</p>
<p>　　t <br />
　　tty <br />
　　tty次要设备号</p>
<p>　　T <br />
　　start_time <br />
　　进程启动的时间</p>
<p>　　U <br />
　　uid <br />
　　UID</p>
<p>　　u <br />
　　user <br />
　　用户名</p>
<p>　　v <br />
　　vsize <br />
　　总的虚拟内存数量（字节）</p>
<p>　　y <br />
　　priority <br />
　　内核调度优先级</p>
<p>　　3. 常用ps命令参数</p>
<p>　　前面两节介绍的参数可能让读者觉得有些可怕，实际上这是一个非常容易使用的命令，一般的用户只需掌握一些最常用的命令参数就可以了。</p>
<p>　　最常用的三个参数是u、a、x，下面将通过例子来说明其具体用法。</p>
<p>　　[例] 以root身份登录系统，查看当前进程状况</p>
<p>　　$ ps</p>
<p>　　PID TTY TIME COMMAND</p>
<p>　　5800 ttyp0 00:00:00 bash</p>
<p>　　5835 ttyp0 00:00:00 ps</p>
<p>　　可以看到，显示的项目共分为四项，依次为PID（进程ID）、TTY（终端名称）、TIME（进程执行时间）、COMMAND（该进程的命令行输入）。</p>
<p>　　可以使用u选项来查看进程所有者及其他一些详细信息，如下所示：</p>
<p>　　$ ps u</p>
<p>　　USER PID %CPU %MEM USZ RSS TTY STAT START TIME COMMAND</p>
<p>　　test 5800 0.0 0.4 1892 1040 ttyp0 S Nov27 0:00 -bash</p>
<p>　　test 5836 0.0 0.3 2528 856 ttyp0 R Nov27 0:00 ps u</p>
<p>　　在bash进程前面有条横线，意味着该进程便是用户的登录shell，所以对于一个登录用户来说带短横线的进程只有一个。还可以看到%CPU、%MEM两个选项，前者指该进程占用的CPU时间和总时间的百分比；后者指该进程占用的内存和总内存的百分比。在这种情况下看到了所有控制终端的进程；但是对于其他那些没有控制终端的进程还是没有观察到，所以这时就需要使用x选项。使用x选项可以观察到所有的进程情况。</p>]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=312</link>
			<category domain="http://www.shanghuo.net/?cid=16">sever</category>
			<pubDate>2009-05-07 18:45</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=304</guid>
			<title>在linux下定时执行PHP脚本（定时执行crontab使用方法详解）</title>
			<author>jiashixiang</author>
			<description><![CDATA[<p style="text-indent: 2em">定时执行crontab使用方法详解</p>
<p style="text-indent: 2em">　　使用方式:</p>
<p style="text-indent: 2em">　　crontab [ -u user ] filecrontab [ -u user ] { -l | -r | -e }</p>
<p style="text-indent: 2em">　　说明:</p>
<p style="text-indent: 2em">　　crontab 是用来让使用者在固定时间或固定间隔执行程式之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。</p>
<p style="text-indent: 2em">　　参数:</p>
<p style="text-indent: 2em">　　-e:执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)</p>
<p style="text-indent: 2em">　　-r:删除目前的时程表</p>
<p style="text-indent: 2em">　　-l:列出目前的时程表</p>
<p style="text-indent: 2em">　　时程表的格式如下:</p>
<p style="text-indent: 2em">　　f1 f2 f3 f4 f5 program</p>
<p style="text-indent: 2em">　　其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程式。</p>
<p style="text-indent: 2em">　　当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程式,其余类推</p>
<p style="text-indent: 2em">　　当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推</p>
<p style="text-indent: 2em">　　当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其余类推</p>
<p style="text-indent: 2em">　　当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其余类推</p>
<p style="text-indent: 2em">　　使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。</p>
<p style="text-indent: 2em">　　例子:</p>
<p style="text-indent: 2em">　　每月每天每小时的第 0 分钟执行一次 /bin/ls:</p>
<p style="text-indent: 2em">　　0 7 * * * /bin/ls</p>
<p style="text-indent: 2em">　　在 12 月内, 每天的早上 6 点到 12 点中,每隔 20 分钟执行一次 /usr/bin/backup:</p>
<p style="text-indent: 2em">　　0 6-12/3 * 12 * /usr/bin/backup</p>
<p style="text-indent: 2em">　　周一到周五每天下午 5:00 寄一封信给 admin<a href="mailto:a@domain.name"><font color="#206b9f">@domain.name</font></a>:</p>
<p style="text-indent: 2em">　　0 17 * * 1-5 mail -s \&quot;hi\&quot; <a href="mailto:admin@domain.name"><font color="#206b9f">admin@domain.name</font></a> &lt; /tmp/maildata</p>
<p style="text-indent: 2em">　　每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo \&quot;haha\&quot;</p>
<p style="text-indent: 2em">　　20 0-23/2 * * * echo \&quot;haha\&quot;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">　　注意:</p>
<p style="text-indent: 2em">　　当程式在你所指定的时间执行后,系统会寄一封信给你,显示该程式执行的内容,若是你不希望收到这样的信,请在每一行空一格之后加上 &gt; /dev/null 2&gt;&amp;1 即可。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">crontab 基本上有兩种建立例行性命令的方式：</p>
<p style="text-indent: 2em">一种是针对所有使用者，可以藉由 crontab -e 的指令来下达工作排程；</p>
<p style="text-indent: 2em">另一种是针对系统管理员，你可以直接修改 /etc/crontab 这个文件，来直接定时执行。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">假如你需要在每天的正午 12:00 发一封信给你自己，</p>
<p style="text-indent: 2em">#crontab -e</p>
<p style="text-indent: 2em">进入&nbsp;vi 的编辑画面来编辑你的例行性命令，输入如下语句</p>
<p style="text-indent: 2em">0 12 * * * mail xxx<a href="mailto:xxx@163.com"><font color="#206b9f">@163.com</font></a> &lt; /home/cheney/test.txt</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">以上有5个数字，分别代表的意思是：</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; 分（0-59）</p>
<p style="text-indent: 2em">　　小时（0-23）</p>
<p style="text-indent: 2em">　　日期（1-31）</p>
<p style="text-indent: 2em">　　月份（1-12）</p>
<p style="text-indent: 2em">　　周（0-6）</p>
<p style="text-indent: 2em">另外，如果是[ * ]的时候，代表所有数字都适用的意思。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">所以，以上的语句就是不论何月、何日、星期几的 12 点 0 分时，执行 mail <a href="mailto:xxx@163.com"><font color="#206b9f">xxx@163.com</font></a> &lt; /home/cheney/test.txt 这个命令。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">例1：</p>
<p style="text-indent: 2em">给你朋友发邮件，5月1号23：59时发送，使用：</p>
<p style="text-indent: 2em"># crontab -e 59 23 1 5 * mail <a href="mailto:xxx@163.com"><font color="#206b9f">xxx@163.com</font></a> &lt; /home/cheney/lover.txt</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">例2：</p>
<p style="text-indent: 2em">每隔6分钟检查相关文件，使用：</p>
<p style="text-indent: 2em"># crontab -e */6 * * * * /home/cheney/test.sh</p>
<p style="text-indent: 2em">删除例行性命令：</p>
<p style="text-indent: 2em"># crontab -r 就删除了</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">cron</p>
<p style="text-indent: 2em">在 Linux 中，任务可以被配置在指定的时间段、指定的日期、或系统平均载量低于指定的数量时自动运行。红帽企业 Linux 预配置了对重要系统任务的运行，以便使系统能够时时被更新。譬如，被 <tt>locate</tt> 命令使用的 slocate 数据库每日都被更新。系统管理员可使用自动化的任务来执行定期备份、监控系统、运行定制脚本等等。</p>
<p style="text-indent: 2em">红帽企业 Linux 随带几个自动化任务的工具：<tt>cron</tt>、<tt>at</tt>、和 <tt>batch</tt>。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">cron 是一个可以用来根据时间、日期、月份、星期的组合来调度对重复任务的执行的守护进程。</p>
<p style="text-indent: 2em">cron 假定系统持续运行。如果当某任务被调度时系统不在运行，该任务就不会被执行。</p>
<p style="text-indent: 2em">要使用 cron 服务，你必须安装了 <tt>vixie-cron</tt> RPM 软件包，而且必须在运行 <tt>crond</tt> 服务。要判定该软件包是否已安装，使用 <tt>rpm -q vixie-cron</tt> 命令。要判定该服务是否在运行，使用 <tt>/sbin/service crond status</tt> 命令。</p>
<p style="text-indent: 2em">配置 cron 任务</p>
<p style="text-indent: 2em">cron 的主配置文件是 <tt>/etc/crontab</tt>，它包括下面几行：</p>
<p style="text-indent: 2em">
<table width="100%" bgcolor="#dcdcdc">
    <tbody>
        <tr>
            <td>
            <p>&nbsp;</p>
            <p style="text-indent: 2em"><tt>SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly</tt></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="text-indent: 2em">前四行是用来配置 cron 任务运行环境的变量。<tt>SHELL</tt> 变量的值告诉系统要使用哪个 shell 环境（在这个例子里是 bash shell）；<tt>PATH</tt> 变量定义用来执行命令的路径。cron 任务的输出被邮寄给 <tt>MAILTO</tt> 变量定义的用户名。如果 <tt>MAILTO</tt> 变量被定义为空白字符串（<tt>MAILTO=&quot;&quot;</tt>），电子邮件就不会被寄出。<tt>HOME</tt> 变量可以用来设置在执行命令或脚本时使用的主目录。</p>
<p style="text-indent: 2em"><tt>/etc/crontab</tt> 文件中的每一行都代表一项任务，它的格式是：
<table width="100%" bgcolor="#dcdcdc">
    <tbody>
        <tr>
            <td>
            <p>&nbsp;</p>
            <p style="text-indent: 2em"><tt>minute hour day month dayofweek command</tt></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="text-indent: 2em">&nbsp;</p>
<ul>
    <li>
    <p>&nbsp;</p>
    <p style="text-indent: 2em"><tt>minute</tt> &mdash; 分钟，从 0 到 59 之间的任何整数</p>
    </li>
    <li>
    <p>&nbsp;</p>
    <p style="text-indent: 2em"><tt>hour</tt> &mdash; 小时，从 0 到 23 之间的任何整数</p>
    </li>
    <li>
    <p>&nbsp;</p>
    <p style="text-indent: 2em"><tt>day</tt> &mdash; 日期，从 1 到 31 之间的任何整数（如果指定了月份，必须是该月份的有效日期）</p>
    </li>
    <li>
    <p>&nbsp;</p>
    <p style="text-indent: 2em"><tt>month</tt> &mdash; 月份，从 1 到 12 之间的任何整数（或使用月份的英文简写如 jan、feb 等等）</p>
    </li>
    <li>
    <p>&nbsp;</p>
    <p style="text-indent: 2em"><tt>dayofweek</tt> &mdash; 星期，从 0 到 7 之间的任何整数，这里的 0 或 7 代表星期日（或使用星期的英文简写如 sun、mon 等等）</p>
    </li>
    <li>
    <p>&nbsp;</p>
    <p style="text-indent: 2em"><tt>command</tt> &mdash; 要执行的命令（命令可以是 <tt>ls /proc &gt;&gt; /tmp/proc</tt> 之类的命令，也可以是执行你自行编写的脚本的命令。）</p>
    </li>
</ul>
<p>&nbsp;</p>
<p style="text-indent: 2em">在以上任何值中，星号（*）可以用来代表所有有效的值。譬如，月份值中的星号意味着在满足其它制约条件后每月都执行该命令。</p>
<p style="text-indent: 2em">整数间的短线（-）指定一个整数范围。譬如，<tt>1-4</tt> 意味着整数 1、2、3、4。</p>
<p style="text-indent: 2em">用逗号（,）隔开的一系列值指定一个列表。譬如，<tt>3, 4, 6, 8</tt> 标明这四个指定的整数。</p>
<p style="text-indent: 2em">正斜线（/）可以用来指定间隔频率。在范围后加上 <tt>/&lt;<tt>integer</tt>&gt;</tt> 意味着在范围内可以跳过 integer。譬如，<tt>0-59/2</tt> 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如，<tt>*/3</tt> 的值可以用在月份字段中表示每三个月运行一次任务。</p>
<p style="text-indent: 2em">开头为井号（#）的行是注释，不会被处理。</p>
<p style="text-indent: 2em">如你在 <tt>/etc/crontab</tt> 文件中所见，它使用 <tt>run-parts</tt> 脚本来执行 <tt>/etc/cron.hourly</tt>、<tt>/etc/cron.daily</tt>、<tt>/etc/cron.weekly</tt> 和 <tt>/etc/cron.monthly</tt> 目录中的脚本，这些脚本被相应地每小时、每日、每周、或每月执行。这些目录中的文件应该是 shell 脚本。</p>
<p style="text-indent: 2em">如果某 cron 任务需要根据调度来执行，而不是每小时、每日、每周、或每月地执行，它可以被添加到 <tt>/etc/cron.d</tt> 目录中。该目录中的所有文件使用和 <tt>/etc/crontab</tt> 中一样的语法。</p>
<p style="text-indent: 2em">
<table width="100%" bgcolor="#dcdcdc">
    <tbody>
        <tr>
            <td>
            <p>&nbsp;</p>
            <p style="text-indent: 2em"><tt># record the memory usage of the system every monday # at 3:30AM in the file /tmp/meminfo 30 3 * * mon cat /proc/meminfo &gt;&gt; /tmp/meminfo # run custom script the first day of every month at 4:10AM 10 4 1 * * /root/scripts/backup.sh</tt></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="text-indent: 2em">例 37-1. crontab 的例子</p>
<p style="text-indent: 2em">根用户以外的用户可以使用 <tt>crontab</tt> 工具来配置 cron 任务。所有用户定义的 crontab 都被保存在 <tt>/var/spool/cron</tt> 目录中，并使用创建它们的用户身份来执行。要以某用户身份创建一个 crontab 项目，登录为该用户，然后键入 <tt>crontab -e</tt> 命令，使用由 <tt>VISUAL</tt> 或 <tt>EDITOR</tt> 环境变量指定的编辑器来编辑该用户的 crontab。该文件使用的格式和 <tt>/etc/crontab</tt> 相同。当对 crontab 所做的改变被保存后，该 crontab 文件就会根据该用户名被保存，并写入文件 <tt>/var/spool/cron/<tt>username</tt></tt> 中。</p>
<p style="text-indent: 2em">cron 守护进程每分钟都检查 <tt>/etc/crontab</tt> 文件、<tt>etc/cron.d/</tt> 目录、以及 <tt>/var/spool/cron</tt> 目录中的改变。如果发现了改变，它们就会被载入内存。这样，当某个 crontab 文件改变后就不必重新启动守护进程了。</p>
<p style="text-indent: 2em">控制对 cron 的使用</p>
<p style="text-indent: 2em"><tt>/etc/cron.allow</tt> 和 <tt>/etc/cron.deny</tt> 文件被用来限制对 cron 的使用。这两个使用控制文件的格式都是每行一个用户。两个文件都不允许空格。如果使用控制文件被修改了，cron 守护进程（<tt>crond</tt>）不必被重启。使用控制文件在每次用户添加或删除一项 cron 任务时都会被读取。</p>
<p style="text-indent: 2em">无论使用控制文件中的规定如何，根用户都总是可以使用 cron。</p>
<p style="text-indent: 2em">如果 <tt>cron.allow</tt> 文件存在，只有其中列出的用户才被允许使用 cron，并且 <tt>cron.deny</tt> 文件会被忽略。</p>
<p style="text-indent: 2em">如果 <tt>cron.allow</tt> 文件不存在，所有在 <tt>cron.deny</tt> 中列出的用户都被禁止使用 cron。</p>
<p style="text-indent: 2em">启动和停止服务</p>
<p style="text-indent: 2em">要启动 cron 服务，使用 <tt>/sbin/service crond start</tt> 命令。要停止该服务，使用 <tt>/sbin/service crond stop</tt> 命令。推荐你在引导时启动该服务。</p>]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=304</link>
			<category domain="http://www.shanghuo.net/?cid=16">sever</category>
			<pubDate>2008-10-29 10:19</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=282</guid>
			<title>FreeBSD下构建安全的Web服务器</title>
			<author>jiashixiang</author>
			<description><![CDATA[<p>::目录::<br />
<br />
序言<br />
<br />
一、系统和服务程序的安装<br />
1. 系统安装<br />
2. 服务程序安装<br />
<br />
二、系统安全设置<br />
1. 用户控制<br />
2. 文件访问控制<br />
3. 系统服务和端口控制<br />
4. 日志管理和控制<br />
5. 文件指纹检测<br />
6. 系统指纹泄露和防范<br />
7. 系统内核安全<br />
8. 系统安全优化<a name="entrymore"></a><br />
<br />
三、服务程序的安全设置<br />
1. Apache安全设置<br />
2. PHP安全设置<br />
3. Mysql安全设置<br />
4. vsFTPd安全设置<br />
5. SSH的安全设置<br />
<br />
四、防火墙的安装和设置<br />
1. 安装ipfw<br />
2. 配置ipfw<br />
<br />
五、Unix/Linux上的后门技术和防范<br />
1. 帐号后门<br />
2. shell后门<br />
3. cron服务后门<br />
4. rhosts后门<br />
5. Login后门<br />
6. Bind后门<br />
7. 服务后门<br />
8. rootkit后门<br />
9. 内核后门<br />
10. 其他后门<br />
<br />
六、结束语<br />
<br />
附录<br />
<br />
<br />
序言<br />
<br />
在我们跑Web服务器的时候，大家可能都会一致认为使用Linux＋Mysql＋Apache＋PHP整个开源的系统是比较好的选择，但是我个人认为这是不合理的，首先要根据你的应用来觉得你使用什么服务。假如你需要跑Oracle等大型应用的话，而且Oracle在Linux下是支持的比较好的，那么使用Linux是个好的选择，因为在FreeBSD下安装Oracle是个非常麻烦的事情。那么如果是跑普通的网站应用的话，我觉得使用FreeBSD＋ Mysql＋Apache＋PHP是个好的选择，因为对于一个网站来讲，稳定安全是第一位的，否则你的网站什么时候被人修改了都不知道怎么回事，或者被黑客入侵，把数据修改或者删除，那就糟糕了，毕竟现在什么红客、黑客的一堆，不能不防。当然，不是说Linux不安全，但是在Linux下集成了很多不安全的程序，导致了它的不安全，但如果设置的好，Linux一样可以很安全。在中国网络应急响应中心（<a href="http://www.cert.org.cn/" target="_blank">http://www.cert.org.cn</a>）这几个月的数据来看，每个月被入侵成功最高的是Linux系统，占百分之六十多，然后过来是Windows系统，占百分之三十多，而FreeBSD的入侵比例是百分之几。<br />
<br />
任何系统都可以很安全，也可以很不安全，关键是管理员怎么做的，世界上没有最安全的系统，只有更安全的系统。下面的文章就是<br />
在FreeBSD平台上构建一个比较安全的Web服务器，希望对网管和网络安全爱好者能有一些启发，权当抛砖引玉，希望能够有更好阐述的文章。<br />
<br />
<br />
一、系统和服务程序的安装<br />
<br />
<br />
1. 系统安装<br />
<br />
为了保证系统的安全，我们系统准备采用最新的FreeBSD版本，首先是安全，系统兼容性也比较好，这个主要是个人习惯和需求，为了简单起见，这里我们选用了最新的FreeBSd5.3版本进行安装。整个安装过程我就不讲了，如果不清楚的朋友可以参考FreeBSD中文手册（<a href="http://www.freebsd.org.cn/" target="_blank">http://www.freebsd.org.cn</a>），整个过程不是很复杂，虽然没有Windows/Linux的系统安全简单，但是比起有些Unix的安装来讲是人性许多的。安装中必须把基本包和内核源代码都装上，为了以后编译内核方便，如果另外，如果喜欢使用ports安装软件的话，还要把ports装上，但是尽量一些没有必要的程序不要装。如果要安装 Webmin等，还要把perl等包装上。系统文件拷贝完以后，会要求配置一些设置，比如把IP地址、名字服务器等设好，不要打开IPv6，不需要 DHCP等服务，不要系统默认的FTP服务，配置 /etc/inetd.conf 时把SSH服务打开，方便我们进行远程管理，如果不想使用inetd这个超级服务来管理的话，可以关闭它，在/etc/rc.conf中添加 inetd_enable=&quot;NO&quot;，然后设置sshd_enable=&quot;YES&quot;一样可以打开SSH服务，后面我们会详细谈到SSH的设置。<br />
<br />
系统装完后，在 /etc/inetd.conf 中把除了ssh之外的服务全部关闭，特别是telnet和rlogin等服务，一定要慎重，否则很可能每几天系统就被入侵了。安装完系统后，建议对系统进行升级，比如使用 make world 或 cvsup 把系统内核和ports进行升级。这个步骤和Windows装完后打补丁差不多。<br />
<br />
<br />
2. 服务程序安装<br />
<br />
系统装完以后，就开始安装我们的应用软件，我们的方针还是最新的软件是最安全的，比如能够防止一些老版本中的溢出等等。我们基本就是要让我们的系统有数据库，同时能够处理Web服务，同时能够远程对网站进行文件管理的FTP服务。我们基本选择的程序都是比较通常的程序。另外，为了有个可视化的管理工具，我们同时也可以安装一个基于浏览器的管理工具Webmin，方便没有ssh客户端等等的时候进行管理。<br />
<br />
首先我们选用的Web服务是Apache httpd 2.0.53，这是目前的最新版本，当然你也可以考虑1.3的版本，主要是看个人习惯。我们网站是PHP程序编写，所以要安装PHP，版本是 4.3.11，也是最新的版本，如果你的网站程序需要PHP5的支持，那么可以下载php5.0.4。数据库还是最快速的Mysql，选择的版本是最新的 4.0.23，如果你需要外键、事务、子查询、存储过程等的支持，那么你可以考虑4.1和5.0的版本。最后我们的FTP选择最安全的vsFTPd，因为它是最安全快速的，我在局域网中测试它的最高创数速率能够达到10MB/S,proFTPd只有8MB/S，vsFTPd针对小型FTP服务器支持非常好，毕竟我用户不多，几个更新网站而已，当然，如果你喜欢简单方便，也可以考虑使用FreeBSD自带的FTPd，功能和易用性也是不错的。如果你用户比较多，并且功能要求比较高，建议使用proFTPd、pure-FTPd、wu-FTPd等，但有些FTPd不是非常安全，选择时候一定要慎重考虑。<br />
<br />
服务器程序列表：<br />
Apache 2.0.53 下载地址：<a href="http://httpd.apache.org/" target="_blank">http://httpd.apache.org</a><br />
PHP 4.3.11 下载地址：<a href="http://www.php.net/" target="_blank">http://www.php.net</a><br />
Mysql 4.0.23 下载地址：<a href="http://dev.mysql.com/" target="_blank">http://dev.mysql.com</a><br />
vsFTPd 2.0.2 下载地址：<a href="http://vsftpd.beasts.org/" target="_blank">http://vsftpd.beasts.org</a><br />
<br />
反正最少的服务+最少的端口+安全的设置 = 最大的安全，尽量能够不需要使用的服务就不要安装，比如telnetd、rlogind等，那么相反会对服务器安全构成威胁。<br />
<br />
安装以上程序你可以采用手工编译安装，也可以采用FreeBSD的ports 来进行安装，这看个人爱好，我个人比较喜欢使用手工安装，如果不明白具体安装的朋友可以参考我的Blog上关于安装Apache+PHP+Mysql的方法。<br />
<br />
<br />
<br />
二、系统安全设置<br />
<br />
<br />
1. 用户控制<br />
<br />
尽量少的用户，我们的FTP帐户是和系统帐户绑定在一起的，所以我们添加用户的时候先建立一个目录，然后把新建的用户主目录指向到该目录下。假设我需要一个用户能够管理我的网站，而我网站的目录是在 /usr/www 目录下，那么我们新建立的用户 www_user 的主目录就指向 /usr/www 目录，同时它的shell是没有的：/usr/sbin/nologin ，主要是为了防止它通过ssh登陆到系统。同时FTP的密码也要设置的非常复杂，防止黑客通过暴力破解获得FTP权限。另外还要说道我们的root用户的密码，我想最少应该不要少于10位的数字＋字母＋字符的密码（我的密码是18位），否则是非常不安全的，如果密码简单，那么黑客通过短时间的暴力破解 SSH中的root帐户，不用几天，系统就可能被攻破了，同时也建议最少一个月更改一次root用户的密码。（强烈建议一般帐户不要有登陆系统的权限，就是把shell设为/usr/sbin/nologin）<br />
一般如果要使用root权限建议建立一个属于wheel组的小用户，然后登陆后通过su命令提升为root用户进行管理，如果黑客通过破解了我们普通用户的权限后登陆系统，也不能直接通过root权限进行管理，这是一种安全防范的简单方法。<br />
<br />
<br />
2. 文件访问控制<br />
<br />
有时候被黑客入侵后拿到了小权限用户，比如传了一个WebShell到系统中，那么对方很可能会把 /etc/passwd 等内容直接读取出来，同时查看/etc/master.passwd中对加密后的root用户的密码hash进行破解，最后拿到密码进行登陆系统。那么我们就要控制部分文件只有root能够访问，其他用户无权访问。比如uname，gcc等，如果黑客拿到小权限用户后就会查看系统版本，然后找到该版本系统对应的溢出程序，使用gcc来进行编译，如果我们能够限制黑客访问uname和gcc等程序，能在一定程度上减缓黑客入侵的脚步。<br />
使用chmod来改变某个文件的权限信息，比如我要 /etc/passwd 和 /etc/master.passwd 文件只能允许root访问：<br />
使用八进制数字来设置<br />
# chmod 700 /etc/passwd<br />
# chmod 700 /etc/master.passwd<br />
使用字符标记来进行设置<br />
# chmod u+w+r+x,go-w-r-x /etc/passwd<br />
# chmod u+w+r+x,go-w-r-x /etc/master.passwd<br />
系统中有多个重要文件需要设置控制访问权限，一定要控制好，否则将会构成重要威胁。<br />
<br />
<br />
3. 系统服务和端口控制 <br />
<br />
端口开的越多就越给黑客多一个入侵的机会，服务越多，危险越大，因为你不知道那些服务是不是有潜在的漏洞或者又发现了新的漏洞，所以尽量少的服务，比如sendmail默认是打开的，那么些建议你把sendmail关闭，关闭防范是在 /etc/rc.conf中加上：<br />
sendmail_enable = &quot;NONE&quot;，如果设为&quot;NO&quot;那么只能够关闭掉pop3服务，不能关闭smtp的服务，所以要设置为&quot;NONE&quot;。<br />
系统中最好除了我们能够看到的Apache、Mysql、vsFTPd、SSH之外不要打开其他任何端口和服务。基本的方式是使用netstat -a 查看打开的端口，然后从对应的端口来找相关的服务，比如我们这里应该只允许开的端口有 21, 22, 80, 3306等，如果有其他端口，那么一定要仔细检查，很可能是黑客的后门或者是会对系统安全构成威胁的服务。同时有些服务不需要监听网络连接的话，只是需要本地的连接，比如Mysql，那么就可以关闭Socket监听，这个将在Mysql安全设置中讲解，另外，可以通过防火墙来控制部分端口访问和连接状况，比如Mysql的3306端口只允许192.168.0.1访问，那么我们就在ipfw里添加规则：<br />
ipfw add 10001 allow tcp from 192.168.0.1 to 10.10.10.1 80 in<br />
这样就能够防止黑客来访问服务器上的Mysql服务。具体防火墙的设置将在下面&ldquo;防火墙设置&rdquo;中详细讲解。<br />
<br />
<br />
4. 日志管理和控制 (未完)<br />
<br />
<br />
5. 文件指纹检测<br />
<br />
文件指纹就是我们文件的基本信息，比如文件权限、文件所属用户/组、文件最后修改日期、文件大小等等，这些都是重要信息，一般黑客入侵后都可能修改文件，那么文件指纹就不一样了。另外，文件的md5校验值也属于文件的指纹的一种。<br />
为了防止黑客篡改系统中的部分核心文件，比如 /etc/passwd, /etc/shadow, /etc/inetd.conf 等等，那么我们就可以考虑把部分重要文件进行备份，同时做一份目前有的文件的一个指纹保留，比如把 /etc，/bin, /usr/bin 目录下的文件进行指纹保留：<br />
# ls -l /etc &gt; /var/back/etc.txt<br />
# ls -l /bin &gt; /var/back/bin.txt<br />
# ls -l /bin &gt; /var/back/usrbin.txt<br />
当然，还有就是给每个重要的文件加上md5校验值，如果觉得不对劲的时候就进行匹配，保证文件的安全。<br />
你可以给你觉得需要做指纹备份的目录进行备份，一般这是为了以后被黑客入侵后的系统检测和系统恢复。比如可以通过文件被修改的时间来确定是不是被入侵，比如可以对比看 /etc/inetc.conf文件和备份的文件有什么不同来确定是不是安装了服务型后门等。<br />
<br />
<br />
6. 系统指纹泄漏和防范 (未完)<br />
<br />
一般黑客为了入侵某个系统，一定会先进行扫描等工作，扫描包括目标系统的端口开放情况和服务器使用服务程序和操作系统情况。比如很简单的手工检测Web服务的指纹：<br />
# telnet target.com 80<br />
那么就很可能返回Apache和PHP的版本信息，那么同时也可能使用扫描工具对Mysql、vsFTPd、SSH等服务的端口进行扫描，获取这些服务的指纹。多暴露一份系统信息，那么系统就多一份危险。那么解决办法就是把服务器上服务程序的Banner全部修改掉，从而能够迷惑黑客。<br />
<br />
下面简单的说一些修改那些服务Banner的方法。<br />
<br />
* Apache<br />
修改httpd.conf文件,设置以下选项:<br />
ServerSignature Off <br />
ServerTokens Prod <br />
上面的适用apache1***, apache 2.0这些都是默认 , 不过还是有server=Apache字样, 若要完全去掉需重新編译。<br />
彻底地去掉banner, 修改httpd.h:<br />
Include/httpd.h <br />
Define SERVER_BASEVENDOR &quot;Apache Group&quot; <br />
Define SERVER_PRODUCTVENDOR &quot;Apache&quot; <br />
Define SERVER_BASEVERSION &quot;1.3.27&quot;<br />
后从新编译Apache就能够完全去掉了。<br />
<br />
<br />
* PHP<br />
在php.ini中设置 expose_php = Off ，那么将无法在 http头信息中看到php的版本信息。<br />
<br />
* Mysql<br />
<br />
<br />
* vsFTPd<br />
vsFTPd基本上是无法获取到一些关于vsFTPd的banner信息的，不过因为vsFTPd默认的banner信息是&quot;Welcome to FTP Server!&quot;对于高手来说，还是能够猜测到一点，所以我们要彻底改掉。修改vsFTPd的配置文件 vsftpd.conf 中的下面选项：<br />
Ftpd_banner=xxxxx <br />
把后面的xxxxx改为你想要的banner信息。<br />
<br />
<br />
* SSH<br />
好象FreeBSD下默认安装的SSH被telnet target.com 22 的时候会显示SSH和FreeBSD的信息，简直是个大祸害，什么都告诉别人了，但是目前为止我还不知道怎么修改，知道的高手请指点。<br />
<br />
<br />
7. 系统内核安全<br />
<br />
FreeBSD有个比较强的功能，就是能够定义系统内核的安全等级，主要是为了防止内核后门专门定制的，能通过不同的等级限制对内核的访问和对防火墙等的修改。我们首先要开启系统的安全等级，然后设定安全等级，我们打开 /etc/rc.conf：<br />
# ee /etc/rc.conf<br />
加入下面的内容：<br />
kern_securelevel_enable=&quot;YES&quot;<br />
kern_securelevel=&quot;-1&quot;<br />
第一句是打开安全等级，第二句是定义等级。它一共五个等级，下面说说不同之处。<br />
* kern_securelevel -1：这是系统默认级别，没有提供任何内核的保护错误；<br />
* kern_securelevel 0：基本上作用不多，当你的系统刚启动就是0级别的，当进入多用户模式的时候就自动变成1级了。<br />
* kern_securelevel 1：在这个级别上，有如下几个限制：<br />
a. 不能通过kldload或者kldunload加载或者卸载可加载内核模块；<br />
b. 应用程序不能通过/dev/mem或者/dev/kmem直接写内存；<br />
c. 不能直接往已经装在(mounted)的磁盘写东西，也就是不能格式化磁盘，但是可以通过标准的内核接口执行写操作；<br />
d. 不能启动X-windows，同时不能使用chflags来修改文件属性；<br />
* kern_securelevel 2：在 1 级别的基础上还不能写没装载的磁盘，而且不能在1秒之内制造多次警告，这个是防止DoS控制台的；<br />
* kern_securelevel 3：在 2 级别的级别上不允许修改IPFW防火墙的规则。<br />
如果你已经装了防火墙，并且把规则设好了，不轻易改动，那么建议使用3级别，如果你没有装防火墙，而且还准备装防火墙的话，不建议使用。我们这里推荐使用 2 级别，能够避免比较多对内核攻击。<br />
<br />
<br />
8. 系统安全优化<br />
<br />
一般优化系统主要是重新编译内核，去掉一些不要的驱动等等，你可以参考我在我Blog上写的关于编译内核的文章。我们这里对网络和内核一些选项进行优化和安全设置。编辑 /etc/sysctl.conf 文件，在里面加入如下内容：(有注释)<br />
<br />
#最大的待发送TCP数据缓冲区空间<br />
net.inet.tcp.sendspace=65536<br />
<br />
#最大的接受TCP缓冲区空间<br />
net.inet.tcp.recvspace=65536<br />
<br />
#最大的接受UDP缓冲区大小 <br />
net.inet.udp.sendspace=65535<br />
<br />
#最大的发送UDP数据缓冲区大小 <br />
net.inet.udp.maxdgram=65535<br />
<br />
#本地套接字连接的数据发送空间 <br />
net.local.stream.sendspace=65535<br />
<br />
#加快网络性能的协议<br />
net.inet.tcp.rfc1323=1<br />
net.inet.tcp.rfc1644=1<br />
net.inet.tcp.rfc3042=1<br />
net.inet.tcp.rfc3390=1<br />
<br />
#最大的套接字缓冲区<br />
kern.ipc.maxsockbuf=2097152<br />
<br />
#系统中允许的最多文件数量<br />
kern.maxfiles=65536<br />
<br />
#每个进程能够同时打开的最大文件数量 <br />
kern.maxfilesperproc=32768<br />
<br />
#当一台计算机发起TCP连接请求时，系统会回应ACK应答数据包。该选项设置是否延迟ACK应答数据包，把它和包含数据的数据包一起发送，在高速网络和低负载的情况下会略微提高性能，但在网络连接较差的时候，对方计算机得不到应答会持续发起连接请求，反而会降低性能。 <br />
net.inet.tcp.delayed_ack=0<br />
<br />
#屏蔽ICMP重定向功能<br />
net.inet.icmp.drop_redirect=1<br />
net.inet.icmp.log_redirect=1<br />
net.inet.ip.redirect=0<br />
net.inet6.ip6.redirect=0<br />
<br />
#防止ICMP广播风暴<br />
net.inet.icmp.bmcastecho=0<br />
net.inet.icmp.maskrepl=0<br />
<br />
#限制系统发送ICMP速率 <br />
net.inet.icmp.icmplim=100<br />
<br />
#安全参数，编译内核的时候加了options TCP_DROP_SYNFIN才可以用<br />
net.inet.icmp.icmplim_output=0 <br />
net.inet.tcp.drop_synfin=1 <br />
<br />
#设置为1会帮助系统清除没有正常断开的TCP连接，这增加了一些网络带宽的使用，但是一些死掉的连接最终能被识别并清除。死的TCP连接是被拨号用户存取的系统的一个特别的问题，因为用户经常断开modem而不正确的关闭活动的连接<br />
net.inet.tcp.always_keepalive=1 <br />
<br />
#若看到net.inet.ip.intr_queue_drops这个在增加，就要调大net.inet.ip.intr_queue_maxlen，为0最好 <br />
net.inet.ip.intr_queue_maxlen=1000 <br />
<br />
#防止DOS攻击，默认为30000<br />
net.inet.tcp.msl=7500<br />
<br />
#接收到一个已经关闭的端口发来的所有包，直接drop，如果设置为1则是只针对TCP包<br />
net.inet.tcp.blackhole=2<br />
<br />
#接收到一个已经关闭的端口发来的所有UDP包直接drop<br />
net.inet.udp.blackhole=1<br />
<br />
#为网络数据连接时提供缓冲<br />
net.inet.tcp.inflight.enable=1<br />
<br />
#如果打开的话每个目标地址一次转发成功以后它的数据都将被记录进路由表和arp数据表，节约路由的计算时间,但会需要大量的内核内存空间来保存路由表<br />
net.inet.ip.fastforwarding=0<br />
<br />
#kernel编译打开options POLLING功能，高负载情况下使用低负载不推荐SMP不能和polling一起用<br />
#kern.polling.enable=1<br />
<br />
#并发连接数，默认为128，推荐在1024-4096之间，数字越大占用内存也越大<br />
kern.ipc.somaxconn=32768<br />
<br />
#禁止用户查看其他用户的进程<br />
security.bsd.see_other_uids=0<br />
<br />
#设置kernel安全级别<br />
kern.securelevel=0<br />
<br />
#记录下任何TCP连接<br />
net.inet.tcp.log_in_vain=1<br />
<br />
#记录下任何UDP连接<br />
net.inet.udp.log_in_vain=1 <br />
<br />
#防止不正确的udp包的攻击<br />
net.inet.udp.checksum=1 <br />
<br />
#防止DOS攻击<br />
net.inet.tcp.syncookies=1<br />
<br />
#仅为线程提供物理内存支持，需要256兆以上内存<br />
kern.ipc.shm_use_phys=1<br />
<br />
# 线程可使用的最大共享内存<br />
kern.ipc.shmmax=67108864<br />
<br />
# 最大线程数量<br />
kern.ipc.shmall=32768<br />
<br />
# 程序崩溃时不记录<br />
kern.coredump=0<br />
<br />
# lo本地数据流接收和发送空间<br />
net.local.stream.recvspace=65536<br />
net.local.dgram.maxdgram=16384<br />
net.local.dgram.recvspace=65536<br />
<br />
# 数据包数据段大小，ADSL为1452。<br />
net.inet.tcp.mssdflt=1460<br />
<br />
# 为网络数据连接时提供缓冲<br />
net.inet.tcp.inflight_enable=1<br />
<br />
# 数据包数据段最小值，ADSL为1452<br />
net.inet.tcp.minmss=1460<br />
<br />
# 本地数据最大数量<br />
net.inet.raw.maxdgram=65536<br />
<br />
# 本地数据流接收空间<br />
net.inet.raw.recvspace=65536<br />
<br />
#ipfw防火墙动态规则数量，默认为4096，增大该值可以防止某些病毒发送大量TCP连接，导致不能建立正常连接<br />
net.inet.ip.fw.dyn_max=65535<br />
<br />
#设置ipf防火墙TCP连接空闲保留时间，默认8640000（120小时）<br />
net.inet.ipf.fr_tcpidletimeout=864000<br />
<br />
<br />
<br />
三、 服务程序的安全设置<br />
<br />
到这里就是本文的重点所在了，我们将花费比较多的文字进行描述，当然，所以描述不一定是非常正确的，也希望能够对你有一些帮助。我们系统默认是运行了包括Apache、Mysql、vsFTPd，SSH等服务，我们以下进行一一讲解。<br />
<br />
<br />
1. Apache的安全设置<br />
<br />
Apache的核心设置就是在 httpd.conf 里面，我们安装的Apache的目录是在 /usr/local/apache2/ 下，那么我们的配置文件就是在 /usr/local/apache2/conf/httpd.conf ，如果你是使用ports等安装的，配置文件应该是在/etc或/usr/local/etc目录下。使用ee或者vi打开配置文件：<br />
# ee /usr/local/apache2/conf/httpd.conf<br />
下面我们就要进行比较多的安全设置了，基本的服务、端口、主目录等等设置就不说了，只讲与安全有关的设置。<br />
<br />
(1)指定运行Apache服务的用户和组<br />
这是比较重要的，因为权限是继承的，如果运行Apache服务的用户权限太高，那么很可能使得入侵者通过WebShell等就会对系统构成严重威胁。一般我们运行Apache的是nobody用户和nobody组。在httpd.conf的250-275行之间找到User和Group选项，比如我们默认设置如下(去掉了注释信息)：<br />
<ifmodule></ifmodule><br />
<ifmodule></ifmodule><br />
User nobody<br />
Group #-1<br />
<br />
<br />
<br />
(2) Apache的日志文件<br />
Apache的日志文件是非常重要的，可以发现apache的运行状况和访问情况，对于判断入侵等有重要帮助。它的默认选项是：<br />
# 错误日志存放目录，默认是存放在apache安装目录的logs下<br />
ErrorLog logs/error_log<br />
# 日志记录的级别，级别有debug, info, notice, warn, error, crit等，默认是&ldquo;warn&rdquo;级别<br />
LogLevel warn<br />
# 访问日志记录的格式，每一种格式都有不同的内容，根据你的需要进行定制，以获取最多访问信息<br />
LogFormat &quot;%h %l %u %t \&quot;%r\&quot; %&gt;s %b \&quot;%{Referer}i\&quot; \&quot;%{User-Agent}i\&quot;&quot; combined<br />
LogFormat &quot;%h %l %u %t \&quot;%r\&quot; %&gt;s %b&quot; common<br />
LogFormat &quot;%{Referer}i -&gt; %U&quot; referer<br />
LogFormat &quot;%{User-agent}i&quot; agent<br />
# 使用上面格式的那一种，默认是使用common<br />
CustomLog logs/access_log common<br />
<br />
文件格式预定义的格式内容：<br />
%a 远程用户IP<br />
%A 本地httpd服务器的ip<br />
%f 传送的文件名<br />
%h 远程主机<br />
%m 请求方式<br />
%l identd给出的远程名<br />
%p 连接的httpd端口号<br />
%P 请求的httpd进程<br />
%t 时间<br />
%T 服务请求时间<br />
你可以定制自己的日志格式，然后通过CustomLog logs/access_log common来进行调用。<br />
<br />
注意，日志文件是由运行Apache的用户进行打开的，要注意该文件的安全，防止被黑客改写或者删除。<br />
<br />
(3) Apache服务信息显示控制<br />
在配置文件中有个选项是控制是否显示apache版本信息、主机名称、端口、支持的cgi等信息的：<br />
ServerSignature On<br />
默认为On，那么将显示所有信息：<br />
我故意访问一个不存在的文件：<a href="http://www.target.com/404.html" target="_blank">http://www.target.com/404.html</a><br />
那么就会在给的错误提示中显示如下信息：<br />
Apache/2.0.53 (Unix) PHP/4.3.11 Server at target.com Port 80<br />
<br />
所有Apache和PHP的信息暴露无遗，这是很不安全的。当然同时还有Off和EMail选项，Off将不显示任何信息，EMail将显示管理员的邮箱地址，建议设为Off或者EMail，这样能够避免泄漏Apache服务器的信息给黑客。<br />
<br />
(4) 目录浏览<br />
在httpd.conf中可以设置apache能够对一些没有索引文件的网页目录进行目录浏览：<br />
<directory></directory><br />
&nbsp;Options Indexes FollowSymLinks<br />
&nbsp;AllowOverride None<br />
<br />
这是不合适也不安全的，建议不需要目录浏览：<br />
<directory></directory><br />
&nbsp;Options FollowSymLinks<br />
&nbsp;AllowOverride None<br />
<br />
<br />
(5) 用户主页<br />
设置httpd.conf中的:<br />
UserDir public_html<br />
能够使得每个使用系统的用户在自己的主目录下建立 public_html 目录后就能够把自己的网页放进该目录，然后通过:<br />
<a href="http://www.target.com/~" target="_blank">http://www.target.com/~</a>用户名/网页 就能够显示自己的网页，这是不安全的，而且对于我们服务器来讲，这没有必要，所以我们直接关闭该功能：<br />
UserDir disabled<br />
或者把该内容改名，改成 一个黑客比较不容易猜到的文件名，比如：<br />
UserDir webserver_public_htmlpath<br />
也可以只允许部分用户具有该功能：<br />
UserDir enabled user1 user2 user3<br />
<br />
(6) CGI执行目录<br />
如果你的apache要执行一些perl等cgi程序，那么就要设置一下选项：<br />
ScriptAlias /cgi-bin/ &quot;/usr/local/apache/cgi-bin/&quot;<br />
但是这也给了黑客利用一些不安全的cgi程序来进行破坏，所以如果你不需要cgi的话，建议关闭该选项：<br />
#ScriptAlias /cgi-bin/ &quot;/usr/local/apache/cgi-bin/&quot;<br />
<br />
(7) 控制PHP脚本只能访问指定目录<br />
在httpd.conf添加如下内容：<br />
php_admin_value open_basedir /usr/www<br />
后面的路径是你需要PHP脚本能够访问的目录，如果PHP脚本想要访问其他目录将出项错误提示。<br />
<br />
(8) 目录访问控制 (未完)<br />
这项内容最复杂，同时涉及的东西也比较多，我只能简单说一下，不清楚请参考其他文章。<br />
比如下面的内容：<br />
<directory></directory><br />
&nbsp;Options FollowSymLinks<br />
&nbsp;AllowOverride None<br />
<br />
就是允许访问每一个目录，里面设置的是允许执行的动作，一般包含的动作有：Options、AllowOverride、Order、Allow、Deny。<br />
Options是只对指定目录及其子目录能够执行的操作，Indexes、Includes、FollowSymLinks、ExecCGI、MultiViews、None、All等操作。<br />
AllowOverride是指定目录访问的权限，当然也可以通过 AccessFileName文件指定的 .htaccess 来控制。它的操作有：None、All、Options、FileInfo、AuthConfit、Limit等。<br />
Order、Allow、Deny三个指令必须配合来控制目录访问权限。Order指定检查次序的规则，比如Order Allow， Deny，表示先按Allow检查，如果不匹配再按Deny进行检查。Order Deny, Allow ，表示先按Deny规则检查，如果不满足条件，再按Allow进行检查。<br />
<br />
控制目录访问权限的文件<br />
默认在Unix平台下能够使用 .htaccess 来对目录权限进行规则定义，但是这是不安全的，建议关闭，默认的选项：<br />
AccessFileName .htaccess<br />
建议设成：<br />
#AccessFileName .htaccess<br />
全部目录权限定义使用httpd.conf中的定义，不使用 .htaccess。<br />
<br />
(9) 用户访问认证<br />
这个技术非常重要，能够控制一些非法用户访问本内容。假设我们的网站: <a href="http://www.target.com/admin" target="_blank">http://www.target.com/admin</a> 是我们的后台管理目录，我不允许一些非法用户进行访问，那么我就必须设定对该目录访问是需要验证的。<br />
先在httpd.conf中加入要进行访问认证的目录：<br />
<directory usr="" www=""></directory><br />
authtype basic<br />
authname &quot;Private&quot;<br />
authuserfile /usr/local/apache/bin/admin.dat<br />
require user login_user<br />
Options Indexes FollowSymlinks MultiViews<br />
AllowOverride None<br />
<br />
上面我们就设置了我们的 /usr/www/admin目录是必须进行认证才能访问的，接着我们设置访问密码：<br />
# /usr/local/apahche/bin/htpasswd -c /usr/local/apache/bin/admin.dat login_name<br />
New password: *****<br />
Re-type new password: *****<br />
Adding password for user login_name<br />
<br />
那么下次任何用户访问<a href="http://www.target.com/admin" target="_blank">http://www.target.com/admin</a>目录的时候就需要输入用户名login_name和你设置的密码。<br />
<br />
<br />
2. PHP安全设置<br />
<br />
PHP本身再老版本有一些问题，比如在 php4.3.10和php5.0.3以前有一些比较严重的bug，所以推荐使用新版。另外，目前闹的轰轰烈烈的SQL Injection也是在PHP上有很多利用方式，所以要保证安全，PHP代码编写是一方面，PHP的配置更是非常关键。<br />
我们php手手工安装的，php的默认配置文件在 /usr/local/apache2/conf/php.ini，我们最主要就是要配置php.ini中的内容，让我们执行php能够更安全。<br />
整个PHP中的安全设置主要是为了防止phpshell和SQL Injection的攻击，一下我们慢慢探讨。我们先使用任何编辑工具打开/etc/local/apache2/conf/php.ini，如果你是采用其他方式安装，配置文件可能不在该目录。<br />
<br />
(1) 打开php的安全模式<br />
php的安全模式是个非常重要的内嵌的安全机制，能够控制一些php中的函数，比如system()，同时把很多文件操作函数进行了权限控制，也不允许对某些关键文件的文件，比如/etc/passwd，但是默认的php.ini是没有打开安全模式的，我们把它打开：<br />
safe_mode = on<br />
<br />
(2) 用户组安全<br />
当safe_mode打开时，safe_mode_gid被关闭，那么php脚本能够对文件进行访问，而且相同组的用户也能够对文件进行访问。<br />
建议设置为：<br />
safe_mode_gid = off<br />
如果不进行设置，可能我们无法对我们服务器网站目录下的文件进行操作了，比如我们需要对文件进行操作的时候。<br />
<br />
(3) 安全模式下执行程序主目录<br />
如果安全模式打开了，但是却是要执行某些程序的时候，可以指定要执行程序的主目录：<br />
safe_mode_exec_dir = /usr/bin<br />
一般情况下是不需要执行什么程序的，所以推荐不要执行系统程序目录，可以指向一个目录，然后把需要执行的程序拷贝过去，比如：<br />
safe_mode_exec_dir = /tmp/cmd<br />
但是，我更推荐不要执行任何程序，那么就可以指向我们网页目录：<br />
safe_mode_exec_dir = /usr/www<br />
<br />
(4) 安全模式下包含文件<br />
如果要在安全模式下包含某些公共文件，那么就修改一下选项：<br />
safe_mode_include_dir = /usr/www/include/<br />
其实一般php脚本中包含文件都是在程序自己已经写好了，这个可以根据具体需要设置。<br />
<br />
(5) 控制php脚本能访问的目录<br />
使用open_basedir选项能够控制PHP脚本只能访问指定的目录，这样能够避免PHP脚本访问/etc/passwd等文件，一定程度上限制了phpshell的危害，我们一般可以设置为只能访问网站目录：<br />
open_basedir = /usr/www<br />
<br />
(6) 关闭危险函数<br />
如果打开了安全模式，那么函数禁止是可以不需要的，但是我们为了安全还是考虑进去。比如，我们觉得不希望执行包括system()等在那的能够执行命令的php函数，或者能够查看php信息的phpinfo()等函数，那么我们就可以禁止它们：<br />
disable_functions = system,passthru,exec,shell_exec,popen,phpinfo<br />
如果你要禁止任何文件和目录的操作，那么可以关闭很多文件操作<br />
disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir,rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown<br />
以上只是列了部分不叫常用的文件处理函数，你也可以把上面执行命令函数和这个函数结合，就能够抵制大部分的phpshell了。<br />
<br />
(7) 关闭PHP版本信息在http头中的泄漏<br />
我们为了防止黑客获取服务器中php版本的信息，可以关闭该信息斜路在http头中：<br />
expose_php = Off<br />
比如黑客在 telnet <a href="http://www.target.com/" target="_blank">www.target.com</a> 80 的时候，那么将无法看到PHP的信息。<br />
<br />
(8) 关闭注册全局变量<br />
在PHP中提交的变量，包括使用POST或者GET提交的变量，都将自动注册为全局变量，能够直接访问，这是对服务器非常不安全的，所以我们不能让它注册为全局变量，就把注册全局变量选项关闭：<br />
register_globals = Off<br />
当然，如果这样设置了，那么获取对应变量的时候就要采用合理方式，比如获取GET提交的变量var，那么就要用$_GET['var']来进行获取，这个php程序员要注意。<br />
<br />
(9) 打开magic_quotes_gpc来防止SQL注入<br />
SQL注入是非常危险的问题，小则网站后台被入侵，重则整个服务器沦陷，所以一定要小心。php.ini中有一个设置：<br />
magic_quotes_gpc = Off<br />
这个默认是关闭的，如果它打开后将自动把用户提交对sql的查询进行转换，比如把 ' 转为 \'等，这对防止sql注射有重大作用。所以我们推荐设置为：<br />
magic_quotes_gpc = On<br />
<br />
(10) 错误信息控制<br />
一般php在没有连接到数据库或者其他情况下会有提示错误，一般错误信息中会包含php脚本当前的路径信息或者查询的SQL语句等信息，这类信息提供给黑客后，是不安全的，所以一般服务器建议禁止错误提示：<br />
display_errors = Off<br />
如果你却是是要显示错误信息，一定要设置显示错误的级别，比如只显示警告以上的信息：<br />
error_reporting = E_WARNING &amp; E_ERROR<br />
当然，我还是建议关闭错误提示。<br />
<br />
(11) 错误日志<br />
建议在关闭display_errors后能够把错误信息记录下来，便于查找服务器运行的原因：<br />
log_errors = On<br />
同时也要设置错误日志存放的目录，建议根apache的日志存在一起：<br />
error_log = /usr/local/apache2/logs/php_error.log<br />
注意：给文件必须允许apache用户的和组具有写的权限。<br />
<br />
<br />
3. Mysql的安全设置<br />
<br />
我们把Mysql安装在 /usr/local/mysql目录下，我们必须建立一个用户名为mysql，组为mysql的用户来运行我们的mysql，同时我们把它的配置文件拷贝到 /etc目录下：<br />
# cp suport-files/my-medium.cnf /etc/my.cnf<br />
chown root:sys /etc/my.cnf<br />
chmod 644 /etc/my.cnf<br />
<br />
使用用户mysql来启动我们的mysql:<br />
# /usr/local/mysql/bin/mysqld_safe -user=mysql &amp;<br />
<br />
(1) 修改root用户的的口令<br />
缺省安装的mysql是没有密码的，所以我们要修改，以防万一。下面采用三种方式来修改root的口令。<br />
<br />
* 用mysqladmin命令来改root用户口令<br />
＃ mysqladmin -uroot password test<br />
这样，MySQL数据库root用户的口令就被改成test了。（test只是举例，我们实际使用的口令一定不能使用这种易猜的弱口令）<br />
<br />
* 用set password修改口令：<br />
mysql&gt; set password for root@localhost=password('test');<br />
这时root用户的口令就被改成test了。<br />
<br />
* 直接修改user表的root用户口令 &nbsp; <br />
mysql&gt; use mysql;<br />
mysql&gt; update user set password=password('test') where user='root';<br />
mysql&gt; flush privileges;<br />
<br />
这样，MySQL数据库root用户的口令也被改成test了。其中最后一句命令flush privileges的意思是强制刷新内存授权表，否则用的还是缓冲中的口令，这时非法用户还可以用root用户及空口令登陆，直到重启MySQL服务器。<br />
<br />
(2) 删除默认的数据库和用户<br />
我们的数据库是在本地，并且也只需要本地的php脚本对mysql进行读取，所以很多用户不需要。mysql初始化后会自动生成空用户和test库，这会对数据库构成威胁，我们全部删除。<br />
我们使用mysql客户端程序连接到本地的mysql服务器后出现如下提示：<br />
mysql&gt; drop database test;<br />
mysql&gt; use mysql;<br />
mysql&gt; delete from db;<br />
mysql&gt; delete from user where not(host=&quot;localhost&quot; and user=&quot;root&quot;);<br />
mysql&gt; flush privileges;<br />
<br />
(3) 改变默认mysql管理员的名称<br />
这个工作是可以选择的，根据个人习惯，因为默认的mysql的管理员名称是root，所以如果能够修改的话，能够防止一些脚本小子对系统的穷举。我们可以直接修改数据库，把root用户改为&quot;admin&quot;<br />
mysql&gt; use mysql;<br />
mysql&gt; update user set user=&quot;admin&quot; where user=&quot;root&quot;;<br />
mysql&gt; flush privileges;<br />
<br />
(4) 提高本地安全性<br />
提高本地安全性，主要是防止mysql对本地文件的存取，比如黑客通过mysql把/etc/passwd获取了，会对系统构成威胁。mysql对本地文件的存取是通过SQL语句来实现，主要是通过Load DATA LOCAL INFILE来实现，我们能够通过禁用该功能来防止黑客通过SQL注射等获取系统核心文件。<br />
禁用该功能必须在 my.cnf 的[mysqld]部分加上一个参数：<br />
set-variable=local-infile=0<br />
<br />
(5) 禁止远程连接mysql<br />
因为我们的mysql只需要本地的php脚本进行连接，所以我们无需开socket进行监听，那么我们完全可以关闭监听的功能。<br />
有两个方法实现：<br />
* 配置my.cnf文件，在[mysqld]部分添加 skip-networking 参数<br />
* mysqld服务器中参数中添加 --skip-networking 启动参数来使mysql不监听任何TCP/IP连接，增加安全性。如果要进行mysql的管理的话,可以在服务器本地安装一个phpMyadmin来进行管理。<br />
<br />
(6) 控制数据库访问权限<br />
对于使用php脚本来进行交互，最好建立一个用户只针对某个库有 update、select、delete、insert、drop table、create table等权限，这样就很好避免了数据库用户名和密码被黑客查看后最小损失。<br />
比如下面我们创建一个数据库为db1，同时建立一个用户test1能够访问该数据库。<br />
mysql&gt; create database db1;<br />
mysql&gt; grant select,insert,update,delete,create,drop privileges on db1.* to test1@localhost identified by 'admindb';<br />
以上SQL是创建一个数据库db1，同时增加了一个test1用户，口令是admindb，但是它只能从本地连接mysql，对db1库有select,insert,update,delete,create,drop操作权限。<br />
<br />
(7) 限制一般用户浏览其他用户数据库<br />
如果有多个数据库，每个数据库有一个用户，那么必须限制用户浏览其他数据库内容，可以在启动MySQL服务器时加--skip-show-database 启动参数就能够达到目的。<br />
<br />
(8) 忘记mysql密码的解决办法<br />
如果不慎忘记了MySQL的root密码，我们可以在启动MySQL服务器时加上参数--skip-grant-tables来跳过授权表的验证 (./safe_mysqld --skip-grant-tables &amp;)，这样我们就可以直接登陆MySQL服务器，然后再修改root用户的口令，重启MySQL就可以用新口令登陆了。<br />
<br />
(9) 数据库文件的安全<br />
我们默认的mysql是安装在/usr/local/mysql目录下的，那么对应的数据库文件就是在/usr/local/mysql/var目录下，那么我们要保证该目录不能让未经授权的用户访问后把数据库打包拷贝走了，所以要限制对该目录的访问。<br />
我们修改该目录的所属用户和组是mysql，同时改变访问权限：<br />
# chown -R mysql.mysql /usr/local/mysql/var<br />
# chmod -R go-rwx /usr/local/mysql/var<br />
<br />
(10) 删除历史记录<br />
执行以上的命令会被shell记录在历史文件里，比如bash会写入用户目录的.bash_history文件，如果这些文件不慎被读，那么数据库的密码就会泄漏。用户登陆数据库后执行的SQL命令也会被MySQL记录在用户目录的.mysql_history文件里。如果数据库用户用SQL语句修改了数据库密码，也会因.mysql_history文件而泄漏。所以我们在shell登陆及备份的时候不要在-p后直接加密码，而是在提示后再输入数据库密码。<br />
另外这两个文件我们也应该不让它记录我们的操作，以防万一。<br />
# rm .bash_history .mysql_history<br />
# ln -s /dev/null .bash_history<br />
# ln -s /dev/null .mysql_history<br />
<br />
(11) 其他<br />
另外还可以考虑使用chroot等方式来控制mysql的运行目录，更好的控制权限，具体可以参考相关文章。<br />
<br />
<br />
4. vsFTPd安全设置 <br />
<br />
vsFTPd是一款非常著名的ftp daemon程序，目前包括Redhat.com在内很多大公司都在使用，它是一款非常安全的程序，因为它的名字就叫：Very Secure FTP Daemon (非常安全的FTP服务器)。<br />
vsftpd设置选项比较多，涉及方方面面，我们下面主要是针对安全方面进行设置。<br />
目前我们的需求就是使用系统帐户同时也作为是我们的FTP帐户来进行我们文件的管理，目前假设我只需要一个帐户来更新我的网站，并且我不希望该帐户能够登陆我们的系统，比如我们的网站的目录是在/usr/www下面，那么我们新建一个用户ftp，它的主目录是/usr/www，并且它的shell是 /usr/sbin/nologin，就是没有shell，防止该用户通过ssh等登陆到系统。<br />
<br />
下面在进行系统详尽的设置，主要就是针对vsftpd的配置文件vsftpd.conf文件的配置。<br />
<br />
(1) 禁止匿名用户访问, 我们不需要什么匿名用户，直接禁止掉：<br />
anonymous_enable=NO <br />
<br />
(2) 允许本地用户登陆，因为我们需要使用ftp用户来对我们网站进行管理:<br />
local_enable=YES<br />
<br />
(3) 只允许系统中的ftp用户或者某些指定的用户访问ftp，因为系统中帐户众多，不可能让谁都访问。<br />
打开用户文件列表功能：<br />
userlist_enable=YES<br />
只允许用户文件列表中的用户访问ftp:<br />
userlist_deny=NO <br />
用户名文件列表路径：<br />
userlist_file=/etc/vsftpd.user_list <br />
<br />
然后在/etc下建立文件 vsftpd.user_list 文件，一行一个，把用户ftp加进去，同时也可以加上你允许访问的系统帐户名。<br />
<br />
(4) 禁止某些用户登陆ftp:<br />
pam_service_name=vsftpd <br />
指出VSFTPD进行PAM认证时所使用的PAM配置文件名，默认值是vsftpd，默认PAM配置文件是/etc/pam.d/vsftpd。 <br />
<br />
/etc/vsftpd.ftpusers <br />
VSFTPD禁止列在此文件中的用户登录FTP服务器，用户名是一行一个。这个机制是在/etc/pam.d/vsftpd中默认设置的。<br />
<br />
这个功能和(3)里的功能有点类似，他们俩能结合使用，那样就最好了。<br />
<br />
(5) 把本地用户锁定在自己的主目录，防止转到其他目录，比如把/etc/passwd给下载了:<br />
chroot_local_users=NO<br />
chroot_list_enable=YES <br />
chroot_list_file=/etc/vsftpd.chroot_list<br />
然后在/etc下建立vsftpd.chroot_list文件，里面把我们要限制的本地帐户加进去，一行一个，我们加上ftp，防止它登陆到系统。<br />
<br />
(6) 隐藏文件真实的所有用户和组信息，防止黑客拿下ftp后查看更多系统用户信息：<br />
hide_ids=YES<br />
<br />
(7) 取消ls -R命令，节省资源，因为使用该命令，在文件列表很多的时候将浪费大量系统资源：<br />
ls_recurse_enable=NO <br />
<br />
(8) 上传文件的默认权限，设置为022：<br />
local_umask=022<br />
如果要覆盖删除等，还要打开：<br />
write_enable=YES<br />
<br />
(9) ftp的banner信息，为了防止黑客获取更多服务器的信息，设置该项：<br />
ftpd_banner=banner string<br />
把后面的banner string设为你需要的banner提示信息，为了安全，建议不要暴露关于vsFTPd的任何信息。<br />
另外，如果你的信息比较多的话，可以设置为提示信息是读取一个文件中的信息：<br />
banner_file=/directory/vsftpd_banner_file <br />
<br />
(10) 打开日志功能：<br />
xferlog_enable=YES<br />
同时设置日志的目录：<br />
xferlog_file=/var/log/vsftpd.log<br />
启用详细的日志记录格式：<br />
xferlog_enable=YES <br />
<br />
(11) 如果打开虚用户功能等，那么建议关闭本地用户登陆：<br />
local_enable=NO <br />
<br />
<br />
vsFTPd还有很多安全设置，毕竟人家的名字就是：Very Secure FTP Daemon，反正它的溢出漏洞什么的是很少的，如果要更安全，建议按照自己的需要设置vsftpd，设置的好，它绝对是最安全的。<br />
<br />
<br />
5. SSH安全设置<br />
<br />
SSH是一个基于SSL的安全连接远程管理的服务程序,主要出现就是为了解决telnet、rlogin、rsh等程序在程序交互过程中存在明文传输易被监听的问题而产生的，目前基本上是推荐使用ssh来代替telnet、rlogin、rsh等远程管理服务。<br />
ssh能够直接在windows平台下通过Secure SSH Client等客户端工具进行连接管理，目前最流行的服务器端就是OpenSSH程序，目前最新版本是OpenSSH4.0版，详细可以参考<a href="http://www.openssh.com/" target="_blank">www.openssh.com</a>网站。<br />
OpenSSH在FreeBSD下已经集成安装了，FreeBSD5.3下的OpenSSH版本是3.8.1，建议ports升级到4.0。<br />
<br />
<br />
主要的安全配置文件是/etc/ssh/sshd_config文件，我们编辑该文件。<br />
<br />
(1) 使用protocol 2代替protocol 1，SSH2更加安全，可以防止攻击者通过修改携带的版本banner来劫持（hijacking）启动会话进程并降低到protocol 1。注释掉protocol 2,1 改用下面语句代替：<br />
protocol 2 <br />
<br />
(2) 合理设置最大连接数量， 防止DOS攻击 <br />
<br />
　　MaxStartups 5:50:10 <br />
<br />
(3)关闭X11forwording ，防止会话劫持<br />
<br />
　　X11Forwarding no <br />
<br />
(4)建议不使用静态密码，而使用DSA 或RSA KEY，修改如下内容可以关闭使用密码认证： <br />
<br />
　　PasswordAuthentication no <br />
<br />
(5)可以限制某个组或光是单个用户访问shell <br />
<br />
　　AllowGroups wheel <br />
或者<br />
　　AllowUsers heiyeluren <br />
<br />
(6) 限制root用户登陆，主要是为了防止暴力破解<br />
<br />
&nbsp;PermitRootLogin no<br />
<br />
(7) 不允许口令为空的用户登陆<br />
&nbsp;<br />
&nbsp;PermitEmptyPasswords no<br />
<br />
(8)使用TCP wrappers来限制一些访问，修改/etc/hosts.allow文件，注释掉&quot;ALL : ALL : allow&quot;，增加如下内容： <br />
<br />
　　sshd:localhost:allow <br />
　　sshd:friendlcomputer:allow <br />
　　sshd:all : deny <br />
<br />
　　#相关命令： <br />
　　#chsh -s /sbin/nologin user <br />
<br />
<br />
四、防火墙的安装和设置<br />
<br />
FreeBSD自带有一个基于包过滤的防火墙--ipfw，虽然功能没有专业防火墙那么强大，但是应付一个Web站点的安全还是足够的，所以我们决定选用该防火墙来保护我们的Web服务器。<br />
<br />
<br />
1. 安装ipfw<br />
<br />
IPFW 的主要部分是在内核中运行的， 因此会需要在FreeBSD内核配置文件中添加部分选项。（注意，如果你没有安装FreeBSD核心源代码，是无法进入以下目录的，所以运行之前一定要先安装内核源代码）我们先进入内核配置文件：<br />
# cd /sys/i386/conf <br />
# cp GENERIC ./kernel_fw<br />
<br />
打开内核配置文件：<br />
# ee ./kernel_fw<br />
<br />
添加四个选项，不需要后面的注释信息：<br />
options IPFIREWALL # 将包过滤部分的代码编译进内核。<br />
options IPFIREWALL_VERBOSE <br />
# 启用通过syslogd记录的日志。如果没有指定这个选项，即使您在过滤规则中指定记录包， 也不会真的记录它们<br />
options IPFIREWALL_VERBOSE_LIMIT=10 <br />
# 限制通过 syslogd(8) 记录的每项包规则的记录条数。在恶劣的环境中如果您想记录防火墙的活动， 而又不想由于 syslog 洪水一般的记录而导致拒绝服务攻击， 那么这个选项将会很有用。<br />
options IPFIREWALL_DEFAULT_TO_ACCEPT <br />
# 这将把默认的规则动作从 ``deny'' 改为 ``allow''。这可以防止在没有配置防火墙之前使用启用过 IPFIREWALL 支持的内核重启时把自己锁在外面。 另外， 如果您经常使用 ipfw(8) 来解决一些问题时它也非常有用。 尽管如此，在使用时应该小心，因为这将使防火墙敞开， 并改变它的行为。<br />
<br />
<br />
编译内核：<br />
# /usr/sbin/config kernel_fw<br />
# cd ../compile/kernel_fw (注意你的版本，如果是低于5.0的版本用../../compile/kernel_fw)<br />
# make depend <br />
# make <br />
# make install <br />
<br />
重启系统。注意，我们没有选择options IPFIREWALL_DEFAULT_TO_ACCEPT该选项，就是说默认系统启动后是打开防火墙的，并且防火墙默认是不允许任何连接的(deny from any to any)，所以一定要在本地操作，否则你将被&ldquo;锁在门外&rdquo;，如果你选择了该选项则可以使用ssh等连接不受影响，不过这相对不安全。<br />
<br />
<br />
2. 配置ipfw<br />
<br />
如果配置普通情况下的规则，使用命令配置的模式：<br />
ipfw的配置命令：ipfw [-N] 命令 [编号] 动作 [log(日志)] 协议 地址 [其它选项]<br />
例如：<br />
# ipfw add allow tcp from any to 10.10.10.1 80 #允许外界访问我的web服务<br />
# ipfw add allow tcp from any to 10.10.10.1 21 #允许外面访问我的ftp服务<br />
# ipfw add allow tcp from any to 10.10.10.1 22 #允许外界访问我的ssh服务<br />
<br />
如果使用规则包的形式，那么查看下面内容。<br />
系统启动后，我们还要配置rc.conf文件来运行我们的防火墙：<br />
# ee /etc/rc.conf<br />
<br />
加入如下内容：<br />
gateway_enable=&quot;YES&quot; # 启动网关 <br />
firewall_enable=&quot;YES&quot; # 激活firewall防火墙 <br />
firewall_script=&quot;/etc/rc.firewall&quot; # firewall防火墙的默认脚本 <br />
firewall_type=&quot;/etc/ipfw.conf&quot; # firewall自定义脚本 <br />
firewall_quiet=&quot;NO&quot; # 起用脚本时，是否显示规则信息。现在为&ldquo;NO&rdquo;假如你的防火墙脚本已经定型，那么就可以把这里设置成&ldquo;YES&rdquo;了。 <br />
firewall_logging_enable=&quot;YES&quot; # 启用firewall的log记录。 <br />
<br />
设置完成后我们再编辑/etc/syslog.conf文件：<br />
# ee /etc/syslog.conf<br />
加入以下行： <br />
!ipfw <br />
*.* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /var/log/ipfw.log <br />
<br />
现在到了最重要的编辑规则包了：<br />
# ee /etc/ipfw.conf<br />
我们添加一下规则：(注意 10.10.10.1是我们服务器的IP)<br />
<br />
######### TCP ##########<br />
add 00001 deny log ip from any to any ipopt rr <br />
add 00002 deny log ip from any to any ipopt ts <br />
add 00003 deny log ip from any to any ipopt ssrr <br />
add 00004 deny log ip from any to any ipopt lsrr <br />
add 00005 deny tcp from any to any in tcpflags syn,fin <br />
# 这5行是过滤各种扫描包 <br />
<br />
add 10001 allow tcp from any to 10.10.10.1 80 in # 向整个Internet开放http服务。 <br />
add 10002 allow tcp from any to 10.10.10.1 21 in # 向整个Internet开放ftp服务。 <br />
add 10000 allow tcp from 1.2.3.4 to 10.10.10.1 22 in <br />
# 向Internet的xx.xx.xx.xx这个IP开放SSH服务。也就是只信任这个IP的SSH登陆。<br />
# 如果你登陆服务器的IP不固定，那么就要设为：add 10000 allow tcp from any to 10.10.10.1 22 in<br />
<br />
add 19997 check-state <br />
add 19998 allow tcp from any to any out keep-state setup <br />
add 19999 allow tcp from any to any out #这三个组合起来是允许内部网络访问出去，如果想服务器自己不和Internet进行tcp连接出去，可以把19997和19998去掉。（不影响Internet对服务器的访问） <br />
<br />
########## UDP ##########<br />
add 20001 allow udp from any 53 to 10.10.10.1 # 允许其他DNS服务器的信息进入该服务器，因为自己要进行DNS解析嘛~ <br />
add 29999 allow udp from any to any out # 允许自己的UDP包往外发送。 <br />
<br />
########## ICMP #########<br />
add 30000 allow icmp from any to any icmptypes 3 <br />
add 30001 allow icmp from any to any icmptypes 4 <br />
add 30002 allow icmp from any to any icmptypes 8 out <br />
add 30003 allow icmp from any to any icmptypes 0 in <br />
add 30004 allow icmp from any to any icmptypes 11 in<br />
#允许自己ping别人的服务器。也允许内部网络用router命令进行路由跟踪。 <br />
<br />
<br />
<br />
五、Unix/Linux上的后门技术和防范<br />
<br />
对黑客来讲，入侵一个系统只是万里长征的开始，最主要的是长期占有一个肉鸡（傀儡机），所以，后门技术往往非常重要。对于我们来讲，总是处于被动的地位，百密一疏，总有没有做到位的地方，谁都不能保证自己的系统是绝对安全的，所以不能避免我们可能会被入侵。黑客入侵后肯定会留后门，当然，除了那些高手，境界非常高，入侵只是为了测试或者技术挑战，对于一般黑客来讲，入侵之后留个后门是很重要的，我们要防范，当然就要了解常用的后门技术，下面就简单的讲将在 Unix/Linux系统中比较常见的后门技术。<br />
<br />
1. 帐号后门<br />
<br />
最普通和原始的后门技术，一般就是在系统中添加一个管理员帐户。<br />
# echo &quot;heiyeluren:*:0:0::/root:/bin/sh&quot; &gt;&gt; /etc/passwd <br />
# echo &quot;heiyeluren::0:0::0:0::/root:/bin/sh&quot; &gt;&gt; /etc/shadow<br />
给系统增加一个 uid和gid都为0（root)的帐号，无口令。<br />
FreeBSD的密码是存储在 /etc/master.passwd里面的，那么后面的命令就应该改成:<br />
# echo &quot;heiyeluren:::::::::&quot; &gt;&gt; /etc/master.passwd<br />
也可以使用程序来实现:<br />
/* Add super user */<br />
#include &quot;stdio.h&quot;<br />
#define PASSWD_PATH &quot;/etc/passwd&quot;<br />
#define SHADOW_PATH &quot;/etc/master.passwd&quot;<br />
main()<br />
{<br />
FILE *fd;<br />
fd = fopen(PASSWD_PATH, &quot;a+&quot;);<br />
fprintf(fd, &quot;heiyeluren:*:0:0::/root:/bin/sh\n&quot;);<br />
fclose(fd);<br />
fd = fopen(SHADOW_PATH, &quot;a+&quot;);<br />
fprintf(fd, &quot;heiyeluren::0:0::0:0::/root:/bin/sh\n&quot;);<br />
fclose(fd);<br />
}<br />
# gcc -o adduser adduser.c<br />
# ./adduser<br />
这种方法比较傻，一般比较容易发现，特别是系统帐户不多的时候。也有的用户名起的比较迷惑人，比如起个r00t的用户名，uid和gid都是0，这样如果不注意，可能就会被蒙混过关了。<br />
<br />
* 防范方法：<br />
这种方法虽然比较容易发现，但是我们还是要防范，要多注意观察系统的帐户情况，本来我们系统帐户就不多，检查起来比较方便，另外也要注意那些比较少使用的帐户是不是被更改过，比如默认的帐户有bind，它的shell是 /usr/sbin/nologin，就是不能登陆的，但是黑客入侵后把它改了，比如改为/bin/csh，那么对方就能登陆了，但是你确不知道。所以最好办法是把/etc/passwd另外备份一份，不定期的检查，同时把/etc/passwd和/etc/master.passwd设为只有root才能查看。<br />
<br />
<br />
2. shell后门<br />
<br />
这个比较常用，也比较流行。一般就是把root执行的shell程序通过setuid的形式把shell程序拷贝到其他能够执行的地方，然后只要用小权限用户执行该shell就能够直接获取root权限。<br />
比如：<br />
# cp /bin/sh /tmp/.backdoor<br />
# chown root:root /tmp/.backdoor<br />
# chmod +s /tmp/.backdoor<br />
这样只是把sh复制了，如果你喜欢其他shell，比如ksh、csh也可以，具体你看各个不同的操作系统而定。你就可以把那个加了s标记的shell程序放到任何目录，最好是深一点，不容易被人发现的地方，比如/usr/local/share/man之类的目录，然后你使用小权限用户登陆后执行该 shell就可以了，比如我们上面复制的shell，我们只要用小权限用户登陆后执行：<br />
$ /tmp/.backdoor<br />
# <br />
就可以了，当然，如何获得小权限用户，你可以使用暴力破解一些帐户，或者自己创建一个小权限的帐户。<br />
<br />
* 防范方法：<br />
首先给各个主要目录加上我们上面说的文件指纹校验，知道某个目录下有什么文件，如果多出了可疑文件可以仔细检查。还有使用find命令来查找有没有危险的root suid程序：<br />
find / -type f (-perm -4000 -o -perm -2000 ) -print<br />
<br />
<br />
3. Crontab服务后门<br />
<br />
crontab命令就相当于windows下的at命令，定期执行某些任务。对黑客来讲，比如定期建立一个帐户，然后过多久就删除，这样管理员永远看不到系统中有后门，这样是非常保险的。。<br />
<br />
* 防范方法：<br />
cron的服务默认是存储在 /var/spool/crontab/root目录下，定期检查cron服务，看是否有异常的任务在执行，或者如果你不使用cron的话，直接关闭掉它。<br />
<br />
<br />
4. rhosts后门<br />
<br />
Rhosts文件常常被黑客利用来制作后门，如果系统开了rlogin、rexec等r的服务，因为象rlogin这样的服务是基于rhosts文件里的主机名使用简单的认证方法，所以黑客只要将.rhosts文件设置成&quot;++&quot;，那么就允许任何人从任何地方使用该用户名，无须口令登陆513端口的 rlogin服务就行。而且r之类的服务没有日志能力，不容易被发现。<br />
实现方法：<br />
# echo &quot;++&quot; &gt; /usr/heiyeluren/.rhosts<br />
# rlogin -l heiyeluren localhost<br />
这样就不需要任何密码，直接输入用户名heiyeluren就登陆到了系统。<br />
<br />
* 防范办法：<br />
不要使用rlogin等服务，同时也不推荐使用telnet等服务，因为telnetd等守护进程溢出漏洞一堆，而且在数据传输过程中是没有加密的，很容易被嗅探，建议使用ssh等经过安全加密的服务来替代。<br />
<br />
<br />
5. Login后门<br />
<br />
login程序通常用来对telnet来的用户进行口令验证. 入侵者获取login的原代码并修改使它在比较输入口令与存储口令时先检查后门口令. 如果用户敲入后门口令,它将忽视管理员设置的口令让你长驱直入。<br />
<br />
* 防范方法：<br />
一般针对这类后门，一般都是使用&quot;string&quot;命令搜索login程序中是否有中是否有密码等字符串来进行检查。如果密码经过加密，那么就对login文件进行指纹记录和MD5值的记录，觉得异常时进行检测。<br />
<br />
<br />
6. Bind后门<br />
<br />
就是通过常用的网络连接协议 TCP/UDP/ICMP 来建立连接的后门，这个在Windows下可是轰轰烈烈。<br />
比较普遍的有TCP协议的后门都是写一段程序开一个指定的端口进行监听，然后从客户端进行连接后登陆系统。也有黑客为了隐蔽使用UDP协议来连接。 icmp后门也常见，一般是。有时候可能bind后门跟服务后门结合，黑客通过自己写的bind后门来替换inetd中的服务。<br />
<br />
* 防范方法：<br />
经常使用netstat命令检查有没有非法的端口打开，最好直接用防火墙屏蔽除了正常访问的端口之外的端口。对于ping后门的话，直接在防火墙上禁止ping服务器<br />
<br />
<br />
7. 服务后门<br />
<br />
一般是替换或者添加服务来实现后门。比如在 /etc/inetd.conf 中添加或者替换某个服务来运行自己的后门程序，或者在某些服务中加入自己的后门代码。如果是替换服务的话，该服务必须不被使用，而且不容易发现。如果是自己添加的服务，那么必须在/etc/services中设置对应的服务和端口才能使用。<br />
<br />
* 防范方法：<br />
经常检查服务，最好备份 /etc/inetd.conf 、/etc/services等文件，同时在FreeBSD下也要时常检查 /usr/loca/etc/rc.d 下面的脚本是否是合法的并且是否那些脚本里面有没有启动非法程序。如果是在服务程序中添加自己的代码，那么就要对文件的指纹进行校验，比如md5值看是否匹配。<br />
<br />
<br />
8. rootkit后门<br />
<br />
rootkit后门一般是替换管理员使用的工具，比如ls、ps、netstat、who等常用文件，把那些程序替换成被黑客加了特殊代码的程序，那样就能达到控制的效果。而且现在已经有很多现成能下载使用的rootkit。<br />
<br />
* 防范方法：<br />
按照我们前面的方法，给每个文件建立系统指纹档案和md5校验值，如果觉得不对劲的时候查看文件指纹是否匹配，有没有别修改过，就知道是否着了rootkit的道。<br />
<br />
<br />
9. 内核后门<br />
<br />
通过加载内核模块的方式来加载后门，比较复杂。一般内核后门都是针对操作系统而言的，不同的操作系统内核模块设置编写方法都不一样，一般不通用。内核后门一般无法通过md5校验等来判断，所有基本比较难发现，目前针对内核后门比较多的是Linux和Solaris下。<br />
<br />
* 防范方法：<br />
FreeBSD下通过我们上面讲的设置内核安全等级来控制加载内核模块。<br />
<br />
<br />
10. 其他后门<br />
还有包括.forward等其他各类后门，另外很多后门可能是结合多种技术，比如把rootkit和内核后门结合在一起，实际过程中，黑克是会更难对付的。当然还有许多我们没有发现高手独门秘诀，这需要灵活检查，不过只要勤劳一点，安全会提升很多。<br />
<br />
<br />
<br />
六、结束语<br />
<br />
安全是一个整体，即使那么服务你设置的非常安全，但是不能保证永远安全，安全是动态的，必须不断的充实自己的知识，发现新漏洞、新技术。如果你需要更安全的系统，一定要自己有时常能够手工作入侵检测或者使用部分工具帮助你进行入侵检测。同时推荐你安装一些网络入侵检测系统（NIDS），比如Snort。<br />
我想这个题目真的有点大了，开始写的时候没有那种感觉，越做到后来越觉得想要说的很多，最后只能泛泛而谈了一下，虽然如此，也希望能够给在使用FreeBSD的网管和网络安全爱好者一点点的帮助，那就足够了。<br />
<br />
感谢所有致力于开源世界安全研究和管理并且愿意共享自己学习心得的朋友!</p>]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=282</link>
			<category domain="http://www.shanghuo.net/?cid=16">sever</category>
			<pubDate>2008-03-24 13:33</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=281</guid>
			<title>freebsd 软件安装相关命令集</title>
			<author>jiashixiang</author>
			<description><![CDATA[<p>&nbsp;&nbsp;&nbsp; Package文件是以.tgz的格式分发的<br />
　　# pkg_add &ndash;r xchat-1.7.1<br />
　　# pkg_delete xchat-1.7.1<br />
　　# pkg_info<br />
　　# pkg_version<br />
　　下载地址<br />
　　<a href="ftp://ftp.freebsd.org/pub/FreeB">ftp://ftp.freebsd.org/pub/FreeB</a> SD /ports/packages/</p>
<p>　　ports<br />
　　安装ports collection<br />
　　1 使用root用户运行sysinstall程序<br />
　　# /stand/sysinstall<br />
　　2 向下选择C onfigure 按Enter<br />
　　3 向下选择D istributions 按Enter<br />
　　4 向下选择Ports 按空格键<br />
　　</p>
<p>　　C V Sup 方法<br />
　　使用CVSup 是一种快速获取Port 集合的方法假如想保持Port 树最新或者学习更多的<br />
　　CVSuP 请参考前一节提到的方法<br />
　　1 安装net/cvsup 软件包<br />
　　2 作为root用户把/usr/share/exam ples/cvsup/ports-supfile 复制到新的位置比如/root目录<br />
　　或者用户主目录下<br />
　　3 编辑ports-supfile<br />
　　4 把C H A N G E _TH IS.FreeB SD .org修改为离你近的C V Sup 站点查看附件A .6.7 了解C V Sup<br />
　　镜像站点的信息<br />
　　5 运行cvsup<br />
　　# cvsup -g -L 2 /root/ports-supfile<br />
　　6 经常运行可以保证portscollection 的内容都是最新的<br />
　　</p>
<p>　　port skeleton<br />
　　是让一个程序在FreeB SD 上简洁地编译并安装的所需文件的最小组合每个port skeleton 包含<br />
　　一个m akefile m akefile 包括好几个部分指出应用程序是如何编译的和它将被安装在系<br />
　　一个distinfo 文件这个文件包括这些信息安装前必须下载的文件检验文件正确与否<br />
　　的校验和checksum s 用以确保在下载过程中文件没有损坏一个files 目录这个目录包括在FreeB SD 系统上编译和安装程序需要用到的补丁这些补丁基本上都是些小文件指出特定文件作了哪些修正它们是一些纯文本的格式基本上是&ldquo;R em ove line 10&rdquo;或&ldquo;C hange line 26 to this&rdquo; 这些补丁以&ldquo;diffs&rdquo;出名因为它们是用diff程序来产生的这个目录也包含了在建立port时要用到的其他文件<br />
　　一个pkg-com m ent文件这是程序的一行描述<br />
　　一个pkg-descr文件这是一个提供更多细节关于该程序多行描述文件<br />
　　一个pkg-plist 文件这是即将被安装的所有文件的列表它同时指出ports 系统在重新安装时什么文件需要被删除<br />
　　</p>
<p>　　查找PORTS<br />
　　WHERSIS 程序名<br />
　　Make serch key=程序名</p>
<p>　　安装PORT<br />
　　make<br />
　　make install</p>
<p>　　删除PORT<br />
　　make deinstall</p>
<p>　　查看软件安装的位置<br />
　　# pkg_info &ndash;L foopackage-1.0.0 | less</p>
<p>　　查看软件安装的版本<br />
　　# pkg_info | grep foopackage</p>
<p>　　查看这个软件的具体信息<br />
　　# pkg_info foopackage-1.0.0</p>
<p>　　通过PORT下载软件<br />
　　下载所有PORT软件<br />
　　# cd /usr/ports<br />
　　# make fetch</p>
<p>　　下载特定的PORT软件<br />
　　# cd /usr/ports/directory<br />
　　# make fetch</p>
<p>　　想知道make要下载哪些文件<br />
　　m ake fetch-list</p>
<p>　　安装所有PORT<br />
　　# cd /usr/ports<br />
　　# make install</p>
<p>　　安装所有PORT而不要输入任何信息<br />
　　# cd /usr/ports # make -DINTERACTIVE install<br />
　　了解PORT的工作工程<br />
　　你只要看看/usr/ports/M k 目录bsd.port.m k 和bsd.port.subdir.m k 的文件</p>
<p>　　清除以安装过的源代码<br />
　　# cd /usr/ports<br />
　　# make clean</p>
<p>　　修改PORT的下载站点<br />
　　假如<a href="ftp://ftp.FreeB">ftp.FreeB</a> SD .org 比M A STE R _SITE S 上面列的任何站都近<br />
　　# cd /usr/ports/directory<br />
　　# make MASTER_SITE_OVERRIDE=\<br />
　　<a href="ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/">ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/</a> fetch</p>
<p>　　注重:<br />
　　1.PORT安装过程中有些可能是交互式</p>
<p>　　2.通过光盘安装PORT可能有时会存版权问题,而无法从光盘上进行安装,但从网络安装不会有任何问题</p>
<p>　　3 PORT在安装软件时,假如碰到依靠关系,会先装那些有依靠关系的软件</p>]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=281</link>
			<category domain="http://www.shanghuo.net/?cid=16">sever</category>
			<pubDate>2008-03-18 14:00</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=271</guid>
			<title>关于Apache的性能优化</title>
			<author>jiashixiang</author>
			<description><![CDATA[<div class="t_msgfont">关于Apache服务器，我看了一些文档，有一些提高性能的想法。 <font style="font-size: 0px; color: #ffffff">7l#h.K p5}.i.l$w&quot;V</font><br />
<font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛9^6{5q&quot;?*g1w(g)I)~'p(X</font><br />
<strong>1.重新编译Apache。 <font style="font-size: 0px; color: #ffffff">TechWeb-技术社区 L9Q,}*i5T1C2~&quot;l</font><br />
</strong><font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛6J0g%W/~4F-I3k*?</font><br />
&nbsp; &nbsp; Apache的默认配置不是为了最大化性能而设置的，而是考虑到向后兼容性和平台兼容性的问题。因此很多2.x的新特性没有能够体现出来。在编译的时候，需要加入一些参数，增加的这些模块应该会大幅的提高性能。 <br />
<font style="font-size: 0px; color: #ffffff">TechWeb-技术社区8g&quot;A4P3E {.M%C5q</font><br />
&nbsp; &nbsp; 既然重新编译，建议使用最新的2.2版，里面有些部分对性能有不少加强。 <br />
<font style="font-size: 0px; color: #ffffff">%]1{&quot;m:q/M%j1L!N4X</font><br />
<strong>2.编译的时候建议加入下面的参数</strong> <font style="font-size: 0px; color: #ffffff">9i,B*X)r1N,~4q9O8{;S</font><br />
<font color="#000000">.</font><font color="#000000">/</font><font color="#000000">buildconf<font style="font-size: 0px; color: #ffffff">;z)@;W,}3T%T0] B)}.{</font><br />
.</font><font color="#000000">/</font><font color="#000000">configure \<font style="font-size: 0px; color: #ffffff">TechWeb-技术社区*T#a't)m [(E(J!Q</font><br />
</font><font color="#000000">--</font><font color="#000000">with</font><font color="#000000">-</font><font color="#000000">mpm</font><font color="#000000">=</font><font color="#000000">worker \<font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛7N$}+G-J6W0Y&quot;~/Q([</font><br />
</font><font color="#000000">--</font><font color="#000000">enable</font><font color="#000000">-</font><font color="#000000">cache </font><font color="#000000">--</font><font color="#000000">enable</font><font color="#000000">-</font><font color="#000000">disk</font><font color="#000000">-</font><font color="#000000">cache </font><font color="#000000">--</font><font color="#000000">enable</font><font color="#000000">-</font><font color="#000000">mem</font><font color="#000000">-</font><font color="#000000">cache </font><font color="#000000">--</font><font color="#000000">enable</font><font color="#000000">-</font><font color="#000000">file</font><font color="#000000">-</font><font color="#000000">cache \<font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛!?9q3I!G/j</font><br />
</font><font color="#000000">--</font><font color="#000000">enable</font><font color="#000000">-</font><font color="#000000">nonportable</font><font color="#000000">-</font><font color="#000000">atomics \<br />
</font><font color="#000000">--</font><font color="#000000">enable</font><font color="#000000">-</font><font color="#000000">mods</font><font color="#000000">-</font><font color="#000000">shared</font><font color="#000000">=</font><font color="#000000">most </font><font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛9b,w&quot;E+o3d:U6\+S</font><br />
<br />
<font style="font-size: 0px; color: #ffffff">-技术社区'C$D0g.l&quot;c&amp;_</font><br />
2.1 Multi-Processing Modules (MPM) <br />
<font color="#000000">--</font><font color="#000000">with</font><font color="#000000">-</font><font color="#000000">mpm</font><font color="#000000">=</font><font color="#000000">{prefork,worker}</font><font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn*S:Y#D5f1G7p!g</font><br />
<br />
<font style="font-size: 0px; color: #ffffff">.techweb.com.cn!X:D.u-t)B9R9r3J6S</font><br />
&nbsp; &nbsp; 这个是设置Apache的多任务处理的。prefork是指每个连接一个进程，也就是多进程并行处理；而worker是多线程并行处理。支持多线程处理，本来是Apache 2的一大改进，可是为了和以前的兼容，所以对于Unix默认的都是prefork，这个改进并没有体现出来。而这个设置只能在编译的时候进行优化，这也是为什么一定要重新编译一下apache的原因。 <font style="font-size: 0px; color: #ffffff">TechWeb-技术社区5[ @4x8W-{4B*p</font><br />
<br />
<strong>apache文档这么说：</strong> <font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛2n;r)I$T!r8j.Q8g,]</font><br />
<br />
&nbsp;&nbsp;&nbsp; worker MPM 使用多进程，每个进程包含多线程的方式。每个线程一次处理一个连接。worker对于高流量的服务器通常是一个好的选择，因为它比prefork MPM占用更少的内存。 <br />
&middot;prefork MPM 使用多进程，每个进程只包含1个线程的方式。每个进程一次处理一个连接。在许多系统上，prefork具有与worker相媲美的速度，但是它会占用更多的内存。prefork的无线程设计在某些情况下将比worker更有优势：它可以使用那些没有处理好线程安全的第三方模块，并且对于那些线程调试困难的平台而言，它也更容易调试一些。&rdquo; <font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn&amp;S)D;{,M t5s)j x*H</font><br />
<br />
&nbsp;&nbsp; 这么说确实没有什么必要用prefork，刚才看了一下FC5，也是用的prefork模式。所以重新编译apache是肯定的了。我还不知道哪个Linux发布版本的apache默认是worker的呢。 <br />
<font style="font-size: 0px; color: #ffffff">-技术社区(o+V5w-u%B</font><br />
&nbsp; &nbsp; 为了设置MPM为worker需要设置： <font style="font-size: 0px; color: #ffffff">TechWeb-技术社区.y9c4F(D ].](H#g(R1H</font><br />
<font color="#000000">--</font><font color="#000000">with</font><font color="#000000">-</font><font color="#000000">mpm</font><font color="#000000">=</font><font color="#000000">worker </font></div>
<div class="t_msgfont">&nbsp;</div>
<div class="t_msgfont">
<div class="t_msgfont" id="message642570">2.2 Caching <font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn$U&quot;u%H!r d0U:p!N S</font><br />
<font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛#H6a4a9g3I+]7m5o</font><br />
&nbsp; &nbsp; mod_cache是从mod_proxy分离出来的。在以前apache 1.3的时候，就已经在mod_proxy中支持缓冲技术了。现在是为了加强缓冲能力，从mod_proxy中独立出来，而mod_proxy被完全重写了，更强调代理的作用了。 <font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛.z(~#a4H/?</font><br />
<font style="font-size: 0px; color: #ffffff">1y6]/}:n4C4I9K</font><br />
&nbsp; &nbsp; 从Apache 2.2开始，mod_cache将不再是实验模块而作为稳定模块发布了。为了能够支持cache，需要在编译的时候，启用它，因为默认caching是禁用的。我估计是因为以前还是实验模块，所以还是为了向后兼容的问题，暂时是默认禁用的。 <br />
<font style="font-size: 0px; color: #ffffff">%g3r7w4e1D Y u</font><br />
&nbsp; &nbsp; mod_cache一共有三种mod_mem_cache,mod_disk_cache和mod_file_cache。具体怎么用可以看apache的文档，虽然是英文，不过不是很难懂：&nbsp;<br />
&nbsp;&nbsp;&nbsp; <a href="http://httpd.apache.org/docs/2.2/caching.html" target="_blank">http://httpd.apache.org/docs/2.2/caching.html</a> <br />
<font style="font-size: 0px; color: #ffffff">开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛8t.Y N ['r.H:S0I</font><br />
&nbsp; &nbsp; 网上也有一些关于mod_cache的中文配置文章可以参考。&nbsp;<br />
&nbsp;&nbsp;&nbsp; 总值为了能够用cache，需要在编译的时候设置： <br />
--enable-cache --enable-disk-cache --enable-mem-cache --enable-file-cache <br />
2.3 原子操作 <font style="font-size: 0px; color: #ffffff">TechWeb-技术社区2e1F%U0T'A&amp;K+r,U$^7w</font><br />
&nbsp;&nbsp;&nbsp; 有些模块中，如mod_cache中使用了一些原子操作，多任务中的互斥量操作之类的。为了可移植性，一般都是用互斥量环绕条件语句来判断来实现。比如： <br />
<span style="display: none">-a</span>acquire_lock(mutex);<font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn;U%I#g+Q!E/u&quot;F0x</font><br />
if( a == 0 ){<br />
a = 3;<font style="font-size: 0px; color: #ffffff">TechWeb-技术社区)n/?6]1\9|6C/L9[3f</font><br />
}<font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛4t:h)n.y2N</font><br />
release_lock(mutex);<font style="font-size: 0px; color: #ffffff">)H,K;|$`/K8u#x1|%p4Y</font><br />
&nbsp; &nbsp; 加锁的目的是确保if和赋值不会被其他线程中断。可是有些cpu中提供了一条指令来做判断赋值，不需要这么复杂的操作，比如486加入的指令：&nbsp;<br />
<span style="display: none"> A</span>cmpxchg [edx], eax</div>
<div class="t_msgfont">&nbsp;</div>
<div class="t_msgfont">
<div class="t_msgfont" id="message642571">先测试[edx]是否为0，如果为0，就让[edx]=eax。&nbsp;<br />
&nbsp;&nbsp;&nbsp; 通过硬件保证了中间不会被中断。要知道一旦用到了互斥量，那么线程切换的等待就避免不了，这对于线程太多并且有公用数据的程序来说，影响性能的因素之一。因此一旦得到了硬件的直接支持。在多线程程序的处理上，就少了很多的锁，也就提高了一定的性能。但是，不是所有的cpu都有这样的指令，因此默认情况下还是使用锁的老办法。除非编译时明确声明： <font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn*y6Q2x4x.l;?.Z*h</font><br />
--enable-nonportable-atomics=yes&nbsp;<br />
&nbsp;&nbsp;&nbsp; 需要注意的是，这样编译后，只能用在486及其以上的计算机中。我估计一般的服务器不是跑在386上吧。呵呵，对了，也尽量不要是64位的系统。 <br />
2.4 允许后期动态加载模块 <br />
--enable-mods-shared=most&nbsp;<br />
&nbsp;&nbsp;&nbsp; 这将编译大部分的模块为动态模块，这样后期可以动态的调入。默认情况竟然是不允许，太令我诧异了。呵呵。我感觉对于典型的多进程应用，模块就应该是动态加载，这样比较节省内存空间，反正大家用得都差不多的模块。</div>
<div class="t_msgfont">&nbsp;</div>
<div class="t_msgfont">
<div class="t_msgfont" id="message642572">3. 检查 <font style="font-size: 0px; color: #ffffff">TechWeb-技术社区8P5t#L)d/Q.J.j3Q$T</font><br />
<font style="font-size: 0px; color: #ffffff">TechWeb-技术社区$w&amp;[3l&amp;z$x$D</font><br />
&nbsp; &nbsp; 至于是否还想加其他的模块你就看着办吧，一般来说这就够了。 <font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn+F+p;W-[&amp;R7k</font><br />
<font style="font-size: 0px; color: #ffffff">'r$u9L*L7i/E L/N/@</font><br />
&nbsp; &nbsp; 需要提一下的是，现在apache在2.2种引入了一种新的MPM来提高性能，叫做event。可惜还在实验状态，未能稳定。event是worker的变种，和线程类似，也是多线程模型，不同的是，它将做数据处理的线程和等待连接的线程分开，以此试图解决KeepAlive大了也不是，小了也不是的性能调整问题。 <font style="font-size: 0px; color: #ffffff">+Y9_6m+b W.~0x</font><br />
<font style="font-size: 0px; color: #ffffff">TechWeb-技术社区-a*X,[&amp;l,a,C7E7T4\</font><br />
&nbsp; &nbsp; event是使用一个比较小的线程来等待所有的socket，包括等候连接的socket和那些KeepAlive的连接。一旦这些socket有任何发送HTTP请求了，这个等候的线程，就会这个socket交给真正做数据处理的线程进行处理，那个线程处理完成后，会将这个socket交还给这个守候线程。&nbsp;<br />
&nbsp;&nbsp;&nbsp; 这样，即使有大量的KeepAlive连接，也不用担心性能损耗，因为只有一个简单的线程来负责维护这些KeepAlive的连接，而那些真正做任务处理的线程则在一个HTTP响应处理完成后就退回到可用线程池或者被释放了，因此很省资源。这个思路很好，现在还在实验，如果试验成功，估计会成为2.4或者2.6的稳定MPM。 <br />
<font style="font-size: 0px; color: #ffffff">e'i.^</font><br />
3.1 httpd -l <font style="font-size: 0px; color: #ffffff">TechWeb-技术社区#g'K;J+I&quot;i0K9x:a)k!K9B</font><br />
<font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn2]6J-M6n l)}</font><br />
&nbsp; &nbsp; 通过这条命令可以检查mpm是prefork还是worker。很不幸默认是prefork，FC5显示如下： <br />
Compiled in modules:<br />
core.c<br />
prefork.c<font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛0s7q&amp;r2E-I7^,A-R:k#j</font><br />
http_core.c<br />
_so.c <br />
.2 apachectl -l&nbsp;<br />
&nbsp;&nbsp;&nbsp; 通过这条指令可以检查cache模块的加载情况，很不幸，默认是啥都没有。 <font style="font-size: 0px; color: #ffffff">%E&quot;]&amp;c8S0c-`</font><br />
<br />
4. KeepAlive <font style="font-size: 0px; color: #ffffff">TechWeb-技术社区%W(d,_3V9Z</font><br />
<br />
&nbsp;&nbsp;&nbsp; 我看到KeepAlive默认设置为On，KeepAliveTimeout默认是5秒。这个设置的含义时说，对于HTTP/1.1的客户端来说，将会尽量的保持客户的HTTP连接，通过一个连接传送多份HTTP请求&lt;-&gt;响应。这样对于客户端来说，可以提高50%左右的响应时间，而对于服务端来说则降低了更多个连接的开销。不过这个依赖于客户端是否想保持连接。我知道IE默认是保持连接的，当你打开100个图片的网站时，IE好像只开2个连接，通过这两个连接传送数据，而不是开100个连接。KeepAliveTimeout时说这次连接结束后开始计时，如果5秒内没有重新发送HTTP请求，就断掉连接。这个值可以稍微大一点，但是不可太大，否则会出现同时等候过多的连接，导致过多限制资源，而使服务器性能下降。可以调调看。</div>
</div>
</div>
</div>]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=271</link>
			<category domain="http://www.shanghuo.net/?cid=16">sever</category>
			<pubDate>2007-12-21 15:51</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=269</guid>
			<title>用SSL技术保护Apache服务器通信</title>
			<author>jiashixiang</author>
			<description><![CDATA[<div class="t_msgfont" id="message642545">由于Apache在全球的应用范围相当广泛，因此其安全性就显得举足轻重，本文将对在Linux环境中使用SSL技术保护Apache服务器通信的方法进行详细介绍。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; Apache是世界排名第一的Web服务器，世界上60%以上的Web服务器是使用的Apache。Apache是一个免费的软件，用户可以免费从Apache的官方网站下载。任何人都可以参加其组成部分的开发。Apache允许世界各地的人对其提供新特性。当新代码提交到Apache Group后，Apache Group对其具体内容进行审查并进行测试和质量检查。如果他们满意，该代码就会被集成到Apache的主要发行版本中。 <font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn%x2S8t3c1z4M-{6n7L</font><br />
<font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn'E3F.Q3N5v9X&quot;F;x6p</font><br />
&nbsp; &nbsp; 但是，Apache服务器与客户端的通信是明文方式，很多通过HTTP协议传送数据的应用将受到黑客的威胁，信息的安全性难以得到保障。因此，本文就将对在Linux中，使用SSL技术保护Apache服务器通信做详细介绍。 <font style="font-size: 0px; color: #ffffff">&quot;E-L4[+[*K)j:d'|6s;l;C</font><br />
<font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn%b!A:O*B;o&quot;j/O/g0X</font><br />
<strong>Apache的安装和启动</strong> <font style="font-size: 0px; color: #ffffff">&amp;x;j;{3[:};w;n&amp;W8g&amp;U</font><br />
<font style="font-size: 0px; color: #ffffff">%|#Q/D;m!r7l#u&quot;A!H(F2m</font><br />
&nbsp; &nbsp; Apache的RPM软件包既可以在Red Hat Linux 9安装光盘中找到，也可以在Red Hat的FTP服务器上找到。同任何其他RPM软件包安装一样，Apache的RPM软件包的安装也可以使用命令行形式的RPM工具安装。用户可以到<a href="http://www.redhat.com/" target="_blank">www.redhat.com</a>下载Apache的免费RPM软件包，其文件名为ant-apache-bsf-1.6.1-1jpp_3rh.noarch.rpm，执行如下命令即可完成Apache的安装： <br />
<font color="#000000">#rpm －Uvh ant</font><font color="#000000">-</font><font color="#000000">apache</font><font color="#000000">-</font><font color="#000000">bsf</font><font color="#000000">-</font><font color="#000000">1.6</font><font color="#000000">.</font><font color="#000000">1</font><font color="#000000">-</font><font color="#000000">1jpp_3rh.noarch.rpm </font><font style="font-size: 0px; color: #ffffff">TechWeb-技术社区(F#C*o/Y9{-l%D8Z U&quot;_</font><br />
<br />
ApacheRPM将把文件安装在如下的目录中： <font style="font-size: 0px; color: #ffffff">:W9^9S*V,r'e2v!U k1`</font><br />
<font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛3a!Z3[-]8v</font><br />
●/etc/httpd/conf：这一目录包含Apache的所有配置文件，包括access.conf、httpd.conf和srm.conf。 <br />
<font style="font-size: 0px; color: #ffffff">.techweb.com.cn,J$Z*K%O$W%?&amp;| e&quot;D</font><br />
●/etc/rc.d/：位于这一目录下的目录树包含系统的启动脚本。ApacheRPM在这里安装了Web服务器的整套脚本，这些脚本可用来从命令行启动和停止服务器，并且也可在工作站关闭、启动或重新引导时自动启动或停止服务器。 <br />
<font style="font-size: 0px; color: #ffffff">TechWeb-技术社区)T$V2L'y%`6_</font><br />
●/home/httpd: RPM在这一目录安装默认的服务器图标、CGI脚本和HTML文件。如果想在其他地方保存Web内容，通过在服务器的配置文件适当的地方进行更改可以实现。</div>
<div class="t_msgfont" id="message642545">
<div class="t_msgfont" id="message642546">●/usr/doc和/usr/man: RPM包含手册页和readme文件，它们被放在这些目录中。像大多数RPM软件包一样，readme文件以及其他相关的文档放在/usr/doc下的一个以服务器软件包的版本命名的目录中。 <br />
<br />
<span style="display: none">&amp;m7U-U$U }&quot;v+D</span>●/usr/sbin：可执行程序放在这一目录中。包括服务器程序本身，还有各种工具，如用于创建验证口令文件的htpasswd程序。 <font style="font-size: 0px; color: #ffffff">9d%|)u't$h*m%I4@5G</font><br />
<font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛*B9L4_#R7v!I)_6R6h+k</font><br />
●/var/log/http: 服务器日志文件存放于该目录。在默认情况下，有两个日志文件:access_log和error_log，但是可以定义任意多个包含各种信息的自定义日志文件。 <br />
<font style="font-size: 0px; color: #ffffff">%g0]8F.Z-~</font><br />
Apache服务器的手动启动很简单，假设Apache服务器安装在/usr/sbin/目录下，在Linux终端启动Apache的命令为： <font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn8^&quot;`+L3v9`:j3h*G</font><br />
#.cd /usr/sbin<font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn+A1q+[)W(f;@1G c</font><br />
#./httpd start <font style="font-size: 0px; color: #ffffff">3I%u'b+|8]9x</font><br />
重新启动Apache的命令为： <font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn.]%[8U5z%`/] j5v.t5A</font><br />
<font style="font-size: 0px; color: #ffffff">9~)t+?1x8i5L</font><br />
#.cd /usr/sbin<br />
#./httpd restart <font style="font-size: 0px; color: #ffffff">/B.L&quot;y!]9f.T0{*o</font><br />
停止Apache的命令为： <font style="font-size: 0px; color: #ffffff">.{3w:r!j'n#D R4Z$_</font><br />
<font style="font-size: 0px; color: #ffffff">TechWeb-技术社区8N;o;k9U(@4a;S'B/f</font><br />
#.cd /usr/sbin<font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn;} @%F&quot;|6^</font><br />
#./httpd stop</div>
<div class="t_msgfont">
<div class="t_msgfont" id="message642548">SSL的原理 <font style="font-size: 0px; color: #ffffff">&quot;E7j6|+?0].Z.x</font><br />
<font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛'a3Y*^#k'Z*j0u'@</font><br />
&nbsp; &nbsp; 通常的连接方式中，通信是以非加密的形式在网络上传播的，这就有可能被非法窃听到，尤其是用于认证的口令信息。为了避免这个安全漏洞，就必须对传输过程进行加密。对HTTP传输进行加密的协议为HTTPS，它是通过SSL进行HTTP传输的协议，不但通过公用密钥的算法进行加密保证传输的安全性，而且还可以通过获得认证证书CA，保证客户连接的服务器没有被假冒。&nbsp;<br />
&nbsp;&nbsp;&nbsp; SSL是一种国际标准的加密及身份认证通信协议，用户采用的浏览器就支持此协议。SSL（Secure Sockets Layer）最初是由美国Netscape公司研究出来的，后来成为了Internet网上安全通信与交易的标准。SSL协议使用通信双方的客户证书以及CA根证书，允许客户/服务器应用以一种不能被偷听的方式通信，在通信双方间建立起了一条安全的、可信任的通信通道。它具备以下基本特征：信息保密性、信息完整性、相互鉴定。&nbsp;<br />
&nbsp;&nbsp;&nbsp; 在SSL通信中，首先采用非对称加密交换信息，使得服务器获得浏览器端提供的对称加密的密钥，然后利用该密钥进行通信过程中信息的加密和解密。为了保证消息在传递过程中没有被篡改，可以加密Hash编码来确保信息的完整性。&nbsp;<br />
&nbsp;&nbsp;&nbsp; 服务器数字证书主要颁发给Web站点或其他需要安全鉴别的服务器，证明服务器的身份信息，同样客户端数字证书用于证明客户端的身份。&nbsp;<br />
&nbsp;&nbsp; 使用公用密钥的方式可以保证数据传输没有问题，但如果浏览器客户访问的站点被假冒，这也是一个严重的安全问题。这个问题不属于加密本身，而是要保证密钥本身的正确性问题。要保证所获得的其他站点公用密钥为其正确的密钥，而非假冒站点的密钥，就必须通过一个认证机制，能对站点的密钥进行认证。当然即使没有经过认证，仍然可以保证信息传输安全，只是客户不能确信访问的服务器没有被假冒。如果不是为了提供电子商务等方面对安全性要求很高的服务，一般不需要如此严格的考虑。</div>
<div class="t_msgfont">
<div class="t_msgfont" id="message642549">下面给出使用SSL进行通信的过程： <font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn7i!T7U.r7D</font><br />
<br />
● 客户端向服务器端发起对话，协商传送加密算法。例如:对称加密算法有DES、RC5，密钥交换算法有RSA和DH，摘要算法有MD5和SHA。 <br />
● 服务器向客户端发送服务器数字证书。比如：使用DES－RSA－MD5这对组合进行通信。客户端可以验证服务器的身份，决定是否需要建立通信。 <font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛&amp;i;k%?3]*}0A4I!g8g</font><br />
<br />
● 客户端向服务器传送本次对话的密钥。在检查服务器的数字证书是否正确，通过CA机构颁发的证书验证了服务器证书的真实有效性之后，客户端生成利用服务器的公钥加密的本次对话的密钥发送给服务器。 <font style="font-size: 0px; color: #ffffff">'Y0}![ p:D</font><br />
<font style="font-size: 0px; color: #ffffff">0d&amp;z w,s,~+b*X</font><br />
● 服务器用自己的私钥解密获取本次通信的密钥。 <br />
<font style="font-size: 0px; color: #ffffff">&amp;])R$N7F)S</font><br />
● 双方的通信正式开始。 <br />
<font style="font-size: 0px; color: #ffffff">#P:J!c</font><br />
&nbsp; &nbsp; 在一般情况下，当客户端是保密信息的传递者时，不需要数字证书验证自己身份的真实性，如我们通常使用的网上银行交易活动，客户需要将自己的隐秘信息如账号和密码发送给银行，因此银行的服务器需要安装数字证书来表明自己身份的有效性，否则将会使得信息泄露。当然，在某些安全性要求极高地B2B应用，服务器端也需要对客户端的身份进行验证，这时客户端也需要安装数字证书以保证通信时服务器可以辨别出客户端的身份，验证过程类似于服务器身份的验证过程。而在通常情况下，浏览器都会通过交互的方式来完成上述的通信过程。</div>
<div class="t_msgfont">
<div class="t_msgfont" id="message642550">在Linux中使用Apache+SSL <font style="font-size: 0px; color: #ffffff">6y5x,i;@4S1O1G-i</font><br />
<font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn$E2J8c,X9W!H3f&quot;^</font><br />
&nbsp; &nbsp; 虽然Apache服务器不支持SSL，但Apache服务器有两个可以自由使用的支持SSL的相关计划：一个为Apache-SSL，它集成了Apache服务器和SSL；另一个为Apache+mod_ssl，它是通过可动态加载的模块mod_ssl来支持SSL的。其中后一个是由前一个分化出来的，并由于使用模块，易用性很好，因此使用范围更为广泛。还有一些基于Apache并集成了SSL能力的商业Web服务器，然而使用这些商业Web服务器主要是北美，这是因为在那里SSL使用的公开密钥的算法具备专利权，不能用于商业目的，其他的国家不必考虑这个专利问题，而可以自由使用SSL。 <font style="font-size: 0px; color: #ffffff">7w#W4`#I.M,L'G/[</font><br />
<br />
&nbsp;&nbsp;&nbsp; Apache+mod_ssl依赖于另外一个软件：openssl，它是一个可以自由使用的SSL实现，首先需要安装这个Port。&nbsp;<br />
&nbsp;&nbsp; openssl-0.9.7a-2.i386.rpm下载地址为：<a href="ftp://rpmfind.net/linux/redhat/9/en/os/i386/RedHat/RPMS/openssl-0.9.7a-2.i386.rpm" target="_blank">ftp://rpmfind.net/linux/redhat/9 ... l-0.9.7a-2.i386.rpm</a>，也可以在Red Hat Linux 9或者Fedora Core 4等Linux发行版本的光盘中找到该RPM包。并且，在默认条件下，执行系统安装将会安装该软件包。 <br />
安装命令如下： <br />
<font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn!R$}&amp;u$X4[%`*k</font><br />
#rpm - ivh openssl- 0.9.7a-2.i386.rpm&nbsp;<br />
&nbsp;&nbsp;&nbsp; 安装好openssl之后，就可以安装Apache+mod_ssl了。然而为了安装完全正确，需要清除原先安装的Apache服务器的其他版本，并且还要清除所有的设置文件及其缺省设置文件，以避免出现安装问题。最好也删除 /usr/local/www目录（或更名），以便安装程序能建立正确的初始文档目录。如果是一台没有安装过Apache服务器的新系统，就可以忽略这个步骤，而直接安装Apache+mod_ssl了。 <font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn0a&quot;I:s I+c:B*d(l%n&quot;M</font><br />
<font style="font-size: 0px; color: #ffffff">2B%J%i(x9e$w(L Z2I</font><br />
启动和关闭该服务器的命令如下所示: <br />
●#apachectl start：启动apache <font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛&quot;z*`!w$z0F3T4E%I</font><br />
<font style="font-size: 0px; color: #ffffff">.K:h#P9c#z/B4v</font><br />
●#apachectl startssl：启动apache ssl。注意，此处若使用start参数，则仅仅启动普通Apache的httpd守护进程，而不启动其SSL能力，只有startssl才能启动Apache的SSL能力。如果之前Apache的守护进程正在运行，便需要使用stop参数先停止服务器运行。 <br />
<font style="font-size: 0px; color: #ffffff">9Y:Z&amp;];h6v</font><br />
●#apachectl stop：停止apache。 <font style="font-size: 0px; color: #ffffff">(U&amp;\)E+P6[ @6L$M1s</font><br />
<font style="font-size: 0px; color: #ffffff">TechWeb-技术社区:?0n%\7F.|,N.m'Y</font><br />
●#apachectl restart：重新启动apache。 <br />
<font style="font-size: 0px; color: #ffffff">#X</font><br />
●#apachectl status：显示apache的状态。 <font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛)` e.z+x-B1?&amp;j2N(P.[ y%Y</font><br />
<br />
●#apachectl configtest：测试httpd.conf配置是否正确。&nbsp;<br />
&nbsp;&nbsp;&nbsp; 启动apache ssl后，就可以启动Mozilla、IE或其他支持SSL的浏览器，输入URL为：<a href="https://ssl_server/">https://ssl_server/</a>来查看服务器是否有响应，https使用的缺省端口为443，如果一切正常，服务器将会返回给客户端证书，由客户端进行验证并且判断，是否接受该证书并进行下一步的通信过程。</div>
<div class="t_msgfont">
<div class="t_msgfont" id="message642552">Apache的主要特征 <br />
●支持最新的HTTP协议，是最先支持HTTP1.1的Web服务器之一，与新的HTTP协议完全兼容，同时与HTTP1.0、HTTP1.1向后兼容。 <font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛([/s3u-U%{*n(c:U7w t</font><br />
<font style="font-size: 0px; color: #ffffff">(j&amp;[,{'k1p.z</font><br />
●具有简单而强大的基于文件的配置功能。该服务器没有为管理员提供图形用户界面，提供了三个简单但是功能异常强大的配置文件。 <font style="font-size: 0px; color: #ffffff">$h#{:C2K/U-h</font><br />
<br />
●支持通用网关接口（CGI）。采用mod_cgi模块支持CGI。Apache支持CGI/1.1标准，并且提供了一些扩充。 <br />
●支持虚拟主机。是首批既支持IP虚拟主机又支持命名虚拟主机的Web服务器之一。 <br />
●支持HTTP认证。支持基于Web的基本认证。它还有望支持基于消息摘要的认证。 <font style="font-size: 0px; color: #ffffff">9e5_0M1g%W!c/m8l;m,u&amp;x</font><br />
<br />
●内部集成Perl。Perl是CGI脚本编程的事实标准。Apache对Perl提供了良好的支持，通过使用其mod_perl模块，还可以将Perl的脚本装入内存。 <font style="font-size: 0px; color: #ffffff">*d;U6v2j$C</font><br />
<br />
●集成代理服务器。用户还可以选择Apache作为代理服务器。 <br />
<font style="font-size: 0px; color: #ffffff">-技术社区7p&quot;o7M2i f)h:q1|+k9`(Z</font><br />
●支持SSL。由于版本法和美国法律在进出口方面的限制，Apache本身不支持SSL。但是用户可以通过安装Apache的补丁程序集合（Apache－SSL）使得Apache支持SSL。 <font style="font-size: 0px; color: #ffffff">TechWeb-技术社区9t![ D(U5^ m7i r9]3H</font><br />
<br />
●支持HTTP Cookie。通过支持Cookie，可以对用户浏览Web站点进行跟踪。</div>
</div>
</div>
</div>
</div>
</div>]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=269</link>
			<category domain="http://www.shanghuo.net/?cid=16">sever</category>
			<pubDate>2007-12-21 15:03</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=268</guid>
			<title>浅析Apache服务器中SSI和CGI的设定方法</title>
			<author>jiashixiang</author>
			<description><![CDATA[<div class="t_msgfont">由于Apache具有相当高的可移植性，它支持超过30种操作系统，包括Unix、Windows 及Darwin等系统，所以目前在网络上已注册的网域里大部份是使用Apache网页服务器。目前ApacheSoftware Foundation 正致力于发展现在已进入alpha测试阶段的Apache2.0。在这里，我和大家探讨如何修改服务器选项让服务器能提供简单的动态网页内容，也就是支持CGI程序及 Server-Side Include（SSI）程序。</div>
<div class="t_msgfont"><strong>1、准备工作&nbsp;<br />
</strong>&nbsp; 首先，我假设你已经安装好Apache而且你的Apache能提供静态网页供浏览。Apache的安装会自动附上静态的HTML测试页，也就是说如果能看到那测试页，就代表你的Apache能正常运作了。基本安装下的Apache仅能提供静态的HTML网页。然而，你可以通过使用模块（modules）来提升它的功能。在原始的设定下，Apache的编译会包含mod_include 及 moc_cgi 这两个模块。你可以在bin子目录下执行./httpd -l来查看你的Apache是否装有这两个模块。执行的输出会是一长串Apache现在安装的所有模块。如果mod_include及moc_cgi 这两个模块不在清单里，你必须重新编译服务器。重新编译时，确定依照如何含括 mod_include、moc_cgi 模块的说明。此外你还必需有提供实时网页的Server-Side Includes（相关资料网址：）。有了 server-side includes （SSI）支持，你就能制作出实时的动态网页。接下来，我先从服务器的SSI支持设定开始，然后进入CGI的编写。 <br />
<font style="font-size: 0px; color: #ffffff">,W&amp;j4l4n!H0m-l</font><br />
<strong>2、Apache的设定 <font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn1C4s1F(Y.v2o9h:`7h/|</font><br />
</strong><font style="font-size: 0px; color: #ffffff">p,\!D:`(W,Q&quot;s(_</font><br />
&nbsp; &nbsp; 首先你必须先找到Apache这个设定文件。Apache的原始安装目录在 Unix下是/usr/local/apache，在Windows下则是 c:\Program Files\Apache。接着在conf子目录下你会找到httpd.conf 文件。这就是Apache的设定档。这个设定文件是个纯文字文件，所以你可以使用一般的文字编辑器，如vi或Notepad 等，来编辑。首先要注意的是在这个设定档里有些行的起始文字是#符号，这表示这行的文字全为批注。适当地在你的设定档内做批注是个好习惯，因为那帮你记得你曾做了哪些设定以及为什么。</div>
<div class="t_msgfont">
<div class="t_msgfont" id="message642541">开启设定文件并寻找以下这些文字： <font style="font-size: 0px; color: #ffffff">:k({4I4B2f5h4u*D-I</font><br />
#<br />
#AddType text/html .shtml<br />
#AddHandler server-parsed .shtml <br />
&nbsp;&nbsp; 删除AddType及AddHandler这两行指令前的#符号。AddType指令会要求服务器在传回任何附属档名为.shtml的网页时，以 text或HTML做为传回文件的内容格式。AddHandler 则是用来指示服务器将文件内容送交给mod_include 处理。之后，mod_include 就会判断该如何响应这样的文件。接下来，寻找以下文字： <font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn,c4f8L/Q2j3g1j2[$_</font><br />
<font style="font-size: 0px; color: #ffffff">7Y&quot;z(}2l;L1J</font><br />
&nbsp; &nbsp; 在这行文字及对应的 间会有一行选项行（options line）。原始的设定是： <font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛5C(U4e+O%b%v&amp;~0w&quot;m4g&quot;Q</font><br />
Options Indexes FollowSymLinks MultiViews <font style="font-size: 0px; color: #ffffff">'@4`2e&quot;c(x#\</font><br />
&nbsp; &nbsp; 在这行尾端加上Includes ，结果看起来会是这样： <br />
Options Indexes FollowSymLinks MultiViews Includes <font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛8H&quot;b6D$z8y:R#_</font><br />
&nbsp; &nbsp; 这是要求Apache在htdocs子目录里执行 server-side includes 程序。为了让这些修改生效，我们必须重新启动服务器。在 Unix 下重新激活，执行&quot;kill -HUP `cat /usr/local/apache/logs/httpd.pid`&quot;。在 Windows 下，执行&quot;Apache-k restart&quot;。现在我们来试试刚才的设定结果。在/usr/local/apache/htdocs 目录里新增一个文件 test.shtml。这个文件必须要包含以下程序代码： <font style="font-size: 0px; color: #ffffff">$e5P-x+b7B)Y6q</font><br />
<font style="font-size: 0px; color: #ffffff">-技术社区'a)i1[*]1?&amp;Z</font><br />
&nbsp; &nbsp; 这段 SSI 程序会去读取一个称为 hello.txt 文件，并将该文件的大小以及最近一次的修改日期输出到网页上。显然的，我们还必须在 htdocs 目录下新增这个hello.txt 文件。在我的hello.txt 文件里只有一行文字：HOW ARE YOU!。完成新增这些文件后，打开你惯用的浏览器并开启网页。如果你服务器的安装并不是通过root用户，你可能必须改为开启。之后将得到如下结果： <br />
<span style="display: none">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛</span>&nbsp; &nbsp; 另外一种可以激活支持SSI程序的方法称为XbitHack设定（相关资料网址： ）。这个方法的由来是当你将文本文件的使用者可执行位（user-executable bit）设为可执行状态后，Apache会将那些文件视为 SSI 程序文件。 <font style="font-size: 0px; color: #ffffff">/\6L$S8N5X5_9Y8W$E3x w</font><br />
<br />
&nbsp;&nbsp;&nbsp; 要激活这样的功能必须将以下指令（directive）放在所有目录的 .htaccess 文件里：XbitHack status on (or full) status 的值可以设为on 、off 或是full。on 的设定会强制服务器将所有使用者可执行的文件视为SSI项。Off则使服务器完全忽略使用者可执行的设定状态。若是设定为Full，服务器会视所有使用者可执行档为SSI项，同时也会检查组可执行（group-executable bit）。如果组可执行项设定为可执行时，传回header的last modified time的值就会被设定为该文件最近一次被修改的时间。这样的设定可以让客户端的浏览器及代理服务器（proxy）进行缓存（caching）。不过在使用这样的功能时必须要小心。例如说，如果你的网页有提供轮替式广告看板你就不会想要设定群组可执行位为开启的状态，因为那么做会让第一个下载的广告被快取起来，导致使用者再也看不到其它页的广告。</div>
<div class="t_msgfont" id="message642541">&nbsp;</div>
<div class="t_msgfont" id="message642541">
<div class="t_msgfont" id="message642543">4、执行CGI程序 <font style="font-size: 0px; color: #ffffff">TechWeb-技术社区+J:o-o&quot;T/^5S</font><br />
<font style="font-size: 0px; color: #ffffff">/A#s2J9X,y/G</font><br />
&nbsp; &nbsp; 在Apache原始安装里，cgi-bin子目录下附有两组CGI程序，test-cgi 以及printenv，只不过这两组程序有潜在的安全漏洞。但是由于我们只是要做设定测试，并且我们不会将这样的原始安装设定直接放在主运行服务器（live server），所以我们还是会激活其中一组CGI程序，看看Apache当初是如何被设定来执行这组程序。最后我们会自己撰写一支简单的CGI程序。 <br />
<font style="font-size: 0px; color: #ffffff">.com.cn4]%]1|,t#`9|1^%w</font><br />
&nbsp; &nbsp; 首先，要确定这组程序是能执行的。进入cgi-bin子目录，确定程序文件被设定为使用者（服务器执行时使用者）可执行以及使用组（服务器执行时使用组）可执行。对 Windows系统来说，这一步应该是非必要的。接着，对服务器要求这样的内容： <br />
<font style="font-size: 0px; color: #ffffff">-技术社区+q0b$G-d$A)X&quot;k;M!I:B,{</font><br />
&nbsp; &nbsp; 注意：只有在通过非root使用者进行服务器安装的情况下才需要指定8080端口（port）。这支Apache内建的test-cgi程序会列出CGI程序会存取的变量值。激活CGI支持是设定在httpd.conf设定文件内的ScriptAlias 指令区段。这个指令区段的原始设定值是：&nbsp;<br />
&nbsp;&nbsp;&nbsp; 这行指令是告诉Apache如果要求的网页路径是以cgi-bin为起始，这些文件可在/usr/local/apache/cgi-bin/ 目录下找得到。这行指令同时也告诉Apache要在这个目录下执行文件。在下面我准备了一个会输出&quot;How are you!&quot;的简单CGI程序。我将它命名为 <br />
<font style="font-size: 0px; color: #ffffff">'Y&quot;t7{$N5t$Y4i6p</font><br />
#!/bin/sh<font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛,n5A4p1G+T3q'G2K6K;z7[5m</font><br />
echo &quot;Content-type: text/html&quot;<br />
echo<font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛3b&quot;x8L6j)X</font><br />
echo &quot;How are you!&quot;&nbsp;<br />
&nbsp;&nbsp; 修改这个文件的权限使其成为可执行文件并且向你的服务器提出以下的要求： <font style="font-size: 0px; color: #ffffff">程序开发，操作系统，服务器，源码下载，Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛)M&amp;a3I-Y+S!c+`4D</font><br />
<font style="font-size: 0px; color: #ffffff">TechWeb-技术社区+P2b&quot;g-D%E$Z5O4z-g0U%q</font><br />
&nbsp; &nbsp; 虽然这组CGI是采用shell script来编写，其实它可以用任何适用于该系统的语言来撰写。至于关于CGI程序的撰写如果有机会我会和大家作更深入的探讨。</div>
<div class="t_msgfont" id="message642543">
<div class="t_msgfont" id="message642544">结论： <font style="font-size: 0px; color: #ffffff">4H'b8Y&quot;o2y0M(n:q</font><br />
<font style="font-size: 0px; color: #ffffff">tech.techweb.com.cn#| ^/{&amp;g3~4o9|</font><br />
&nbsp; &nbsp; Apache支持的所有SSI 指令可以在Apachedocumentation 里找到，Apache所有的功能都可以通过设定文件 （config file）进行调试。在这里我所介绍的仅只是设定文件相关知识的皮毛。设定文件的原始设定有着非常详尽的说明文件，而且每一个系统版本都附有核心模块及标准模块的说明文件，如果你花些时间在这些文件里摸索，你会找到任何你想要的功能。</div>
</div>
</div>
</div>]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=268</link>
			<category domain="http://www.shanghuo.net/?cid=16">sever</category>
			<pubDate>2007-12-21 14:52</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=267</guid>
			<title>Java有能力抵挡LAMP的进攻吗？</title>
			<author>jiashixiang</author>
			<description><![CDATA[<p>Java有能力抵挡LAMP的进攻吗？</p><br /><br /><a href="http://www.shanghuo.net/?action=show&amp;id=267" target="_blank">阅读全文</a><br /><br />]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=267</link>
			<category domain="http://www.shanghuo.net/?cid=16">sever</category>
			<pubDate>2007-12-21 14:42</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=264</guid>
			<title>1周学会unix基本命令</title>
			<author>jiashixiang</author>
			<description><![CDATA[这篇东西是关于Unix系统操作的教程。也是Unix 的入门教程。如果你有兴趣学，请看下去，保证你可以学到许多有用的东西。如果你满足于dos,windows的操作，不想对网络服务器，有任何了解的话，可以不看。因为你并不想成为计算机高手。本教程仅仅讲授Unix 系统的常用命令，不涉及 Unix 的历史、安装和编程。如果你想得到更多的知识， 请查找其他的教材。本教程参考了《精通Unix》、《Unix基础》、《Unix系统使用指南 》等书，你可以在那里找到更多的知识。 <br /><br />准备知识： <br /><br />Unix是一个多任务多用户的操作系统。多任务是指可以同时运行几个不同的程序，或命令。在操作系统的术语里叫&ldquo;进程&rdquo;，就象在运行Windows95的时候我们可以一边听CD 一边打字，同时打印机还在工作。多用户是指一台运行Unix系统的机器可以同时具有几个不同的输入输出设备，给几个，几十个用户同时使用。不同的输入输出设备我们称为终端。 Unix 给每个终端设置不同的序号以协调工作，这个序号被称为终端序号。 Unix是一个根本不同于Dos的系统，无论其命令格式，用途都和Dos有很大区别。比如： 目录分割符是&quot;/&quot;,而不是&quot;\&quot;。具体的不同请参考其他书籍。 <br /><br />开始练习之前： <br /><br />在开始教授Unix命令之前，请先记下这个地址:<a href="http://www.cyberspace.org/" target="_blank"><font color="#22229c">http://www.cyberspace.org</font></a>。它是 一台在美国的，连上Internet的Unix主机。之所以告诉大家这个地址是因为它提供免费的帐号供大家使用。是免费的。就是说你可以先去那里申请一个帐号，然后在那里练习 你所学到的Unix命令。因为我相信不是每个朋友都可以轻松地得到Unix帐号的。 在你成功的申请好帐号之后，请在你Windows95的dos窗口里输入&quot;telnet cyberspace.org&quot; 等待连上主机。接下来就是输入你的用户名和密码，不要告诉我这些你都不会，如果你 不会的话，你是怎么连到这个网页的？ 现在假定你连上了主机，系统的提示符应该是&quot;cyberscpae.org%&quot;，对这个就是提示符 就象dos里&quot;c:\&gt;&quot;。接下去我将开始命令篇。 <br /><br />ls <br />你记不记得你学会的第一个Dos命令？反正我学会的第一个命令是dir：列目录和文件的命令。你学会的第一个Unix的命令也是列目录和文件的命令ls. 功能列出当前目录下的文件和目录。 同Dos一样，Unix系统命令也是带参数的。ls的参数有&quot;a&quot;,&quot;l&quot;,&quot;F&quot;。请注意，F是大写。 Unix系统里对命令的大小是严格区分的。（所以我们做网页常常会发生连接错误）同dos 不一样的地方在于，Unix命令的参数是&quot;-&quot;为其前导，而不是&quot;/&quot;。所以完整的ls命令是 <br />ls -l -a -F或ls -laF <br />-l:long的意思，把文件的其他资料，如文件长度，上次修改的日期等等列出来。 <br />-a:all的意思，把本目录下所有的文件，包括隐含的文件也列出来。 <br />-F:显示文件类型。&quot;*&quot;表示可执行文件，&quot;/&quot;表示目录，&quot;@&quot;表示连接。 <br />好，请在你的机器上输入ls -l -a -F，或许这是你一生里第一个Unix命令。记住了吗？ <br /><br />cd <br />变换目录，和Dos相同。如果你在cd后面没有给定目的地，则表示目的地是家目录。 在unix中有三中表示目录的符号&quot;.&quot;,&quot;..&quot;,&quot;~&quot;。 &quot;.&quot;表示当前目录路径的位置 &quot;..&quot;表示当前路径的上一层目录，或称&quot;父目录&quot; &quot;~&quot;表示家目录，所谓家目录指系统管理员分配给你的目录，比如你的用户名是li,那么 你的家目录就是在&quot;~li&quot;，在cd后面加上&quot;~li&quot;就是去你的家目录。 <br /><br />date <br />显示出当前的时间和日期，记住在Unix里你是无法修改系统时间的。输出时间一般是 格林威志时间。 <br /><br />who <br />该命令告诉你现在你使用的系统里有哪些用户。Unix是一个多用户的操作系统，同时在 机器上的可能有数十甚至数百人。who命令可以把他们的名字和终端号都列出来。who命令有 一个比较有趣的用法，&quot;who am I&quot;如其字面上的意思，让Unix显示你的用户名和终端类型 <br /><br />more <br />more命令有点象Dos里的Type命令，就是显示文本文件的内容。比如你要显示文件file1的 内容，可以用： more file1 当要看的文件超过屏幕可以容纳的行数，就会在屏幕的左下角出现一个&quot;--More--&quot;并告诉 你已经看过了整个文件的百分之几。如果要继续看下去，就敲&quot;Space Bar&quot;，可以看下一页， 或用&quot;Enter&quot;，就会读入下一行。 more命令还可以由你指定开始的行数。比如file1文件有1000行，你已经看过100行，那么可以用&quot;more +100 file1&quot;则直接从第100行开始看起。还有可以在命令里指定关键字。ore +/key_word 这样写，more就会从含有&quot;key_word&quot;字样的那一行的前两行开始显示。也许你已经注意到，Unix里对文本文件的操作要比Dos强大的多，实际上的确如此。 <br /><br />cp <br />cp命令同dos里的copy命令是一样的，复制文件。 比如： <br />cp file1 file2 <br />注意，如果你当前目录里已经含有file2这个文件，这个操作将会覆盖原来的file2。也许 在Dos里不会这样，它会要你确认。但你现在在用Unix，在你没有叫它确认之前，它不会那么做。 <br />cp -i file1 file2 <br />当你使用了-i这个选项，再遇到重名的情况系统将要你确认是否继续。 cp命令还有两个比较重要的选项:-r -p <br />cp -r /dir1 /dir_temp 这条命令是将目录dir1完全地复制到目录/dir_temp里，在Dos里着条命令叫xcopy <br />cp -p file1 file2 <br />Unix的系统和dos有一个不同的地方，在dos里copy一个文件是不会改变它的文件修改时间 的，除非你确实那样做了。在Unix里不同，它要改你的时间，或许它认为cp也是一种修改吧。 当你加上-p以后就不会改时间了。 <br />用惯Dos的人或许会对下面的一行命令大惑不解： <br />cp file1 file2 file3 dir_dest 这条命令把file1,file2,file3三个文件一起复制到/dir_dest里去。 <br /><br />***********思考问题，请说出以下命令的作用：******************** <br />cp file1+file2 file3 <br /><br />第二讲 <br />实际上以下命令的意义是这样的： <br />cp file1+file2 file3 <br />表示将一个名字为file1+file2的文件拷贝成file3。而不是在dos里的将file1和file2加在一起拷贝成文件file3。在unix的文件系统里，文件名字可以到255或254个字符，具体要看你到底使用那种类型的Unix。 <br /><br />cat <br />这个命令可不是&ldquo;猫&rdquo;的意思，而是catenate的缩写。顾名思义，是把东西串起来。比如： <br />cat file1 file2 <br />就是把文件file1和file2连在一起，然后输出到屏幕上。注意，输出到屏幕上是cat的自定义目的。如果要改变它的输出方向，就必须使用Unix系统的输出重定向符&ldquo;&gt;&rdquo; <br /><br />&gt; <br />输出重定向符。稍微高级一点的dos用户都知道这个符号。在Unix里的用法同Dos的区别不是很大。但比较不同的地方是，Unix系统将任何的一个外设都认同为一个文件。所以如果你要将输出重定向到打印机之类的地方，只要写上代表打印机的设备文件名。前一将里我们曾讲过终端机器名，它也是一个文件。比方我的设备机器是ttya，而小李的设备机器是ttyb，他想让我把当前目录的内容给他看。那么用这条命令就可以了 <br /><br />ls -a-u-F &gt;ttyb <br />这充分利用了Unix系统多用户的设计思想。同样的使用ls -a-u-F&gt;file1就是将当前目录列表输出到file1中。 <br /><br />又比如： <br />cat file1 file2&gt;file3 <br />就是将文件file1和file2的内容输出到file3中。在Dos里这条命令被写成 <br />copy file1+file2 file3 <br />当你用'&gt;'来输出重定向的时候，系统马上打开一个空文件来准备存放'&gt;'之前那个文件命令的输出结果。比如： <br />cat file1 file2&gt;file3 <br />系统先将file3的内容清空。所以： <br />cat file1 file2&gt;file1 <br />这条命令将产生一个错误提示。也许这条命令的本意是增加file1里的内容，但在系统初始这条命令的时候就把file1里的内容清空了。所以你得到一个错误提示。如果要追加文件内容请使用以下命令： <br />cat file2&gt;&gt;file1 <br />&quot;&gt;&gt;&quot;表示追加，而不是先清空file1中的内容。上面讲的是输出重定向，还有输入重定向。这个留在以后讲。 <br /><br />man <br />是英语&quot;manual&quot;的缩写。这是一条使用频率很高的命令，用来得到系统对一个特定命令的帮助信息。请各位读者一定要掌握这条命令。 <br />格式为：man -k 命令关键字 <br /><br />mv <br />这个命令是move的缩写，就是把一个目录或文件搬来搬去。实际上我常把它当成改文件名字的命令来用。比如：mv file1 ABC就是把文件file1改成ABC。 <br /><br />rm <br />记住rm是remove，是清除文件的意思。在Unix里是没有undelete这会事情的，所以请在使用的时候加上-i这个选项。表示确认。 <br /><br /><br />***********有许多朋友写信告诉我无法使用cyberspace的unix，也许是那里的速度比较慢。如果你实在没地方练习unix命令，我向你推荐一个工具，叫unixdos。它是一个unix环境的dos模拟器，基本上常用的unix命令你都可以使用。***************** <br /><br />第四讲 <br /><br />各位细心学习的朋友，非常感谢你能继续看这个教程。这个星期我们开始学习VI编辑器。从功能上说它是一个同EDIT基本一样的工具，但是它非常难学！以至于在现在我不得不引用一句在unix初学者口中的话来告戒大家&quot;To vi or not to vi,that is a question&quot;! <br />Vi的模式： <br />Vi有两种基本模式：命令模式和编辑模式，他们以<esc></esc>键切换。 <br />OK,我们启动一下vi,看看这么使用这个工具。 <br />%vi <br />启动vi,第一件事先按<esc></esc>，记得你在vi里要常常用它。然后输入&quot;i&quot;。 <br />屏幕上绝对不会出现任何字，因为<esc></esc>后你在命令模式，输入&quot;i&quot;则表示你进入编辑模式，并且现在的状态是insert，就是插入文本。 <br />如果你还没有被搞糊涂，那么继续输入。 <br />I love Unix. <br />是的，屏幕上出字了，你顺利地输入第一行文字。现在我们要保存这个文件。再按一次<esc></esc>，到命令模式，输入&quot;:w&quot;，表示存盘。你也可以输入 &quot;:w Unix.txt&quot;，那么就是以Unix.txt为文件名字存盘。 <br />好了基本vi概念就是如此。我把常用的一些命令都写在下面，你自己试着输入吧。 <br /><br />i &quot;insert&quot;的缩写 在光标之前插入文字 <br />a &quot;append&quot;的缩写 在光标之后插入文字 <br />o &quot;open&quot;的缩写 在光标所在行的下面开始新一行的输入 <br />O &quot;Open&quot;的缩写 在光标所在行的上面开始新一行的输入 <br /><br />第五讲 <br />本周的Unix教程是最后一讲了。在本讲里我们将讲一下unix Shell的基本内容。 我不准备深入地讲解Shell编程。因为要是那样的话，足够写上五十个page. <br />Shell是外层，是用户与Unix之间的层，它们节省命令行的长度，对命令参数执行完整的变换，并且定位和解释用户命令。另一方面，shell也是一个功能强大程序语言，提供制作工具的工厂。用Shell能创建用户自己的命令，甚至创建个完整的新环境。程序员里有一个流行称谓&ldquo;如果你不喜欢Unix界面，就自己写一个&rdquo;。实际上需深入到内核，便可以方便地控制自己的界面。可选的Shell有sh,csh,ksh有大的功能。 <br />正如其名字，Shell Script是一个文本文件。该文件指挥并控制Shell执行一系列特定的操作。一个批处理文件能含有任何命令（Unix的内部和外部命令），还可以包括过去编写的批处理文件。 <br />第一个Shell处理文件： <br />这里使用的Shell是BS，如果你是使用CS可以更改一部分内容。 <br />: <br />#@(#)dw--show data and users-- <br /># <br />date <br />who -u <br />第一个:不是必须的，而是长期的习惯。它告诉系统下面是BShell的内容。 <br />正如你看到的，Unix的Shell文件和Dos的批文件在很多地方是相同的。在写Unix的Shell文件时候，我们一般使用六个步骤： <br />1.计划好命令系列，并在键盘上试用 <br />2.为批处理文件挑一个好的，不会发生重复的文件名 <br />3.用你喜欢的编辑工具生成文件（希望不是VI:-)） <br />4.从冒号开始文件，以增加文件的解释 <br />5.用Chmod命令，将文件的属性设置为可读文件 <br />6.把批处理文件放入适合的目录中。 <br />以上是Unix系统的Shell文件一些基本的内容。这里就不多说了，实际上Shell文件同我们这些写网页的人关系并不大，但知道一些还是好的。]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=264</link>
			<category domain="http://www.shanghuo.net/?cid=16">sever</category>
			<pubDate>2007-12-01 12:53</pubDate>
		</item>
	</channel>
</rss>
