分类目录归档:技术文章

鼠标移上去图片渐变效果,图片特效JS

<!–完成此效果需要两步

把下面代码放到<head>区域中–>

<script language=”JavaScript”>

nereidFadeObjects = new Object();

nereidFadeTimers = new Object();

function nereidFade(object, destOp, rate, delta){

if (!document.all)

return

    if (object != “[object]”){  //do this so I can take a string too

        setTimeout(“nereidFade(“+object+”,”+destOp+”,”+rate+”,”+delta+”)”,0);

        return;

    }

    clearTimeout(nereidFadeTimers[object.sourceIndex]);

    diff = destOp-object.filters.alpha.opacity;

    direction = 1;

    if (object.filters.alpha.opacity > destOp){

        direction = -1;

    }

    delta=Math.min(direction*diff,delta);

    object.filters.alpha.opacity+=direction*delta;

    if (object.filters.alpha.opacity != destOp){

        nereidFadeObjects[object.sourceIndex]=object;

        nereidFadeTimers[object.sourceIndex]=setTimeout(“nereidFade(nereidFadeObjects[“+object.sourceIndex+”],”+destOp+”,”+rate+”,”+delta+”)”,rate);

    }

}

</script>

<!–把下面代码放到<body>区域中–>

        <div align=”left”>

          <a href=”http://www.maqie.com” target=”_blank”><img border=”0″ src=”http://www.maqie.com/wp-content/uploads/2010/02/2-300×199.jpg” onMouseOut=nereidFade(this,50,10,5) onMouseOver=nereidFade(this,100,10,5)  style=”FILTER: alpha(opacity=55)”></a>

          <br>

          <a href=”http://www.maqie.com” target=”_blank”><img border=”0″ src=”http://www.maqie.com/wp-content/uploads/2010/02/2-300×199.jpg” onMouseOut=nereidFade(this,50,10,5) onMouseOver=nereidFade(this,100,10,5)  style=”FILTER: alpha(opacity=55)”></a>

                  </div>

Microsoft OLE DB Provider for ODBC Drivers 错误 ‘80040e21’

Microsoft Cursor Engine error ‘80040e21’

Multiple-step operation generated errors. Check each status value.

问题在于DB中字段长度不够,插入或更新的数据长度大于了DB中字段的长度。

alter table table_name modify (column_name type(length))

调整字段长度后解决。

Microsoft OLE DB Provider for ODBC Drivers 错误 ‘80040e21’

多步 OLE DB 操作产生错误。如果可能,请检查每个 OLE DB 状态值。没有工作被完成。

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e21’ 的原因是 :

在向数据库写入数据的时候出现了类型不匹配、字段大小超出、锁定模式错误等,或者记录集没有及时关闭。

例如,配置的某一字段长度为15,在sql语句中确试图插入16位的字符;或者试图插入全角半角模式不正确的字段;

或者使用了错误的记录集锁定方式,rs.open sql,conn,x,y,根据某些blog文章显示,修改打开记录集的方式可能会解决这个问题。

此类问题,应该属于程序上的bug,与主机配置没有直接联系。

手机支持FLASH 游戏,FLASH Lite 下载

新增文本功能以下与文本处理相关的功能是 Lite 2.0 的新增功能:
Flash Lite 2.0 中的所有文本都基于 Unicode。
Flash Lite 2.0 提供对 HTML 格式和 TextFormat ActionScript 类的部分支持。 追加键支持 Flash Lite 2.0 提供对设备键的追加支持,包括支持 QWERTY 键盘、最多支持 12 个软键(包括标准左右软键)。 新增系统功能信息 能够控制背照持续时间并设置自定义焦点矩形颜色 XML 处理支持 Flash Player 7 中的以下功能在 Flash Lite 2.0 中不可用:
在 Flash Lite 2.0 中不支持或部分支持 Flash Player 7 中可用的几个 ActionScript 类。
使用 XMLSocket 类的套接字通信
支持与 Macromedia Flash Media Server 进行通信
远程共享对象(部分支持本地共享对象)
本机支持 Flash 视频 (FLV) 回放
支持 Flash 应用程序协议(Flash Remoting 使用的二进制数据通信协议)
文本字段的层叠样式表 (CSS) 格式设置
设备字体遮罩
高质量呈现时的位图平滑处理 软件请安装于E盘,汉化文件请放到E:resource/apps下覆盖原文件!

 

PHP获取随机字符的函数

<?
//获取随机字符 此函数区分字符大小写 如果不区分大小写可加入函数strtolower
function genRandomString($len)
{
    $chars = array(
        "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",  
        "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",  
        "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",  
        "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",  
        "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",  
        "3", "4", "5", "6", "7", "8", "9"
    );
    $charsLen = count($chars) – 1;
    shuffle($chars);// 将数组打乱
    $output = "";
    for ($i=0; $i<$len; $i++)
    {
        $output .= $chars[mt_rand(0, $charsLen)]; //获得一个数组元素
    }  
    return $output;
}
$str = genRandomString(4);
echo $str;
?>
 

修改Windows 2003 远程桌面连接数限

配置终端服务器             

打开【开始】-【程序】-【管理工具】-【终端服务配置】

      (1):配置最大连接数,(选择【网卡】选项卡)  
注意这个数字不是越大越好,设置越大消耗的系统内存越大,所以根据自己的需要留一定的余量就可以了。 
         (2):配置客户端设置     (选择【客户端设置】选项卡)  
需要把禁止windows打印机映射,LPT端口映射的勾去掉。把禁止驱动器映射的勾勾上。
             (3):服务器设置  
A.退出是删除临时文件夹 【是】  

B.进行每个回话时使用临时文件夹 【 是】 

C.授权 【 每用户】 

D.ACTIVE desktop    【 禁止】  

E. 权限兼容性【 完全模式】 

F.限制每用户使用一个会话     【是】

4。启用远程桌面  
在我的电脑上点右键选择【属性】,选择【远程】 将 允许用户远程连接到这台计算机的勾勾上。 

5。建立远程用户 

         在我的电脑上点右键选择【管理】,选择【本地用户和组】 建立若干用户。并给这些用户设置分组为Remote Desktop Users(远程桌面用户)  
到这里远程桌面的服务器端已经配置完成。可以使用WINDOWS自带的远程桌面工具进行连接使用了。

安装uchome后 出现如下错误 解决 Call to undefined function checkclose()

1. Warning: include_once(./common.) [function.include-once]: failed to open stream: No such file or directory in D:\wwwroot\space. on line 7
2.

3. Warning: include_once() [function.include]: Failed opening ‘./common.php’ for inclusion (include_path=’.;C:\php5\pear’) in D:\wwwroot\space.php on line 7
4.

5. Fatal error: Call to undefined function checkclose() in D:\wwwroot\space.php on line 10

复制代码
原因分析:这是因为服务器的权限混乱造成的。
解决办法:
把uchome放在服务器更深一层的目录,比如现在的目录是D:\wwwroot,你现在在wwwroot下再新建一个目录,把uchome程序放在这个目录下,比如D:\wwwroot\home\

IIS的站点重新再深一层目录即可

Freebsd安全设置

FreeBSD 是一个非常安全的操作系统。也正因为它的 source code 是可以免费的取得,这个 OS 长久以来不断的有人改进加强。尽管 FreeBSD 一出厂就非常安全, 但是仍然有更多加强安全性的措施,这份 HOW-TO 会教你一些步骤, 以更加强你机器的整体安全。

5.1.1 网络

5.1.1.1 inetd (Inet Daemon)
网络在系统安全上扮演了一个很重要的角色。FreeBSD 的根基是有着内建网络功能, 且具有最稳最快的 TCP/IP stacks 的 4.4BSD。这个 stack 支持了非常多的协议像是telnet, ftp, talk, rsh 等… 这些 service 的的主设定档便是 /etc/inetd.conf。要编辑这个档, 请输入 \"vi /etc/inetd.conf\" (在这个例子里, 我使用 vi 。你可以使用其它你较为上手的编
辑器。或许你可以试试 pico)。如果你要使用 pico, 请在启动它时加上 -w 选项:

-w 关掉自动断行。(因此可以容许超过 80 字符的行存在)

这选项在编辑 /etc/inetd.conf 时非常有用。

当然了, 你也可以使用 ee – 它随着 FreeBSD 一起 \"出厂\" 的, 而且也是 root 预设的编辑器。不过, 请再 \"echo $EDITOR\" 确认一次。 开启了这个档案后, 你可以看到里面怎么描述每个 service 怎么激活, 要以那位使用者执行等等的信息。(man 5 inetd.conf)既然这个档案是许多 internet service 的主要设定档, 好好的设定它便是一件十分重要的事。你要关掉一个 service的话,只消在那一行前面加个 \"#\" 符号。基本的概念是, 关掉些你不熟悉的 services – 如果你不知道那个 service 是啥, 或者不知道它可以干啥。理想状态下, 你不须要把所有的 service 都打开。例如, 你的器只是要跑 web server。这种情况下, 你只要激活 ssh 和 httpd 便够了。关于啥是ssh, 下面会说明。如果你啥 service 都不想跑,最直接干脆的方法是-关掉 inetd。做法很简单, 只要编辑 /etc/rc.conf 并且把inetd_enable=\"YES\"改成inetd_enable=\"NO\"就可以了。

如此一来没人可以 telnet, rlogin, 或 ftp 到计算机中。如果你决定要激活你的 inetd 的话, 记得激活 log 选项, 并提高一个 service 每分钟激活的上限数目。(默认值是 256, 我建议提高到 1024-自行参照下面解说调整吧!)为什么要这么做呢…? 就 modem user 或是低速专线用户是没什么差别。但高速线路的人, 上限值太低会蹦出一个 DoS attack(Denial of Service)。某个坏心的人可以简单的用一个 shell script 同时搞出超过 256 个 connections, 这么一来你的 inetd会很不幸的阵亡。换句话说, 如果你想让每分钟每个 service可接受的connection 数多点, 记得做如下的设定, 不然来个坏心的人就可以搞垮你的计算机。因此, 在这行inetd_enable=\"YES\"

下面的:
inetd_flags=\"\"
要改成:
inetd_flags=\"-l -R 1024\"

这会将联机的动作都 log 下来(-l 参数)而且将同时最大联机数从预设的 256 增加到1024。你还须要对你的 /etc/syslog.conf 作些修改, 这些等会儿会提到。

5.1.1.2 SSH
在以下提到的案例中, 你完全不须要 run inetd。例如, 如果你只有跑 web, news, 或是 nfs server, 那么就没有必要在你的机器上再跑其它的services。但是你一定会问,\"我要怎么控制我的机器啊!?\" 嗯嗯, 所以现在要介绍 SSH。你可以透过 SSH (SecureShell) 来登入你的机器。Secure Shell 当初便是设计来取代 rsh, rlogin 等其它的Berkeley r* 命令。相信你很快就会了解 SSH 是如何有用,而且开始使用它,来代替其它的程序像是 telnet 和 ftp。SSH 具有很多功能,但是最为人知的是, 它的加密通讯方式, 也就是防止你的密码和资料以明码的方式在网络上传输。如果你使用 telnet,你的通讯内容可能会被\"窃听\": 传输中的资料被改变, 通讯内容被看到。(不是有 S/Key可以解决吗? 很不幸的, 它还是有着插入资料和连接时被破解的问题) 我希望你可以完全的关掉 inetd 而使用 SSH。如果你认为完全不靠
inetd 来激活某些 services,是完完全全不可能的事, 那么希望你至少激活 log 功能, 而且要增加每分钟同一个 servi-ce 可激活的次数。 (原因上面有提到)

你可以从 ftp://ftp.funet.fi/pub/unix/security/login/ssh 下载 SSH。

若你想要更简单的方法:

# cd /usr/ports/security/ssh
# make install

5.1.1.3 inetd (part II)

好吧, 你仍然执意要使用 inetd。那么我们来看看在 inetd.conf 有那些选项, 可以增进你的系统安全。在攻击某系统之前, 攻击者都会先收集该系统的相关信息。就 telnetd 而言, 你可以试试在 telnetd 那行后面加个 -h:

telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h
从 telnetd 的 man page 可以知道:
-h Disable the printing of host-specific information before login
has been completed.

当有很多管道可以获得系统信息的同时, 这招和下面的那招是个不错的解决方案。如果你认为跑 telnet daemon 是没有必要的, 那么只消加个 \"#\" 在该行的最前面就行了:

#telnet stream tcp nowait root /usr/libexec/telnetd telnetd

有个极不错的措施是, 你可以拒绝没有完整 FQDN 的人来联机。要做到这点, 也只要加个 -U 选项到 telnetd 后面:
telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h -U

这是个小动作, 但是对你的系统安全有莫大的助益。

5.1.1.4 ftpd
现在来看看 ftp。 对于 ftp FreeBSD 已经做了一些 log 的动作 。 可以看到在/etc/inetd.conf 里面 ftpd 那一行已经加了 \"-l\"。然而, 你还是要设定你的syslogd, 使它可以接受 ftp daemon 产生的 log。从 man page 可以得知:

每个成功或是失败的 ftp 登入尝试, 都会以 LOG_FTP 机制纪录起来。如果这个选项被指定了两次, 所有的下载 (get), 上载(put), 新增, 删除,建立目录, 及更名的动作和文件名字都会被纪录下来。 又: LOG_FTP 讯息预设是不会被 syslogd(8) 纪录下来的。你还要在 syslogd(8) 的设定文件里面激活这个功能才行。

让我们开启 syslogd 纪录 ftpd log 的功能吧~ 这个档案是 /etc/syslog.conf (别忘了顺便看看 man 5 syslog.conf)。把下面这一行加到这个设定档里:

ftp.* /var/log/ftpd

也不要忘了执行这个指令 \"touch /var/log/ftpdlog\", 因为 syslogd 不能写入到一个没有被开启过的档案。如果你想要你的 ftpd 提供你更多的 log 讯息, 那么就在 ftp那一行多加个 \"-l\" 吧:

ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l

如果你想要确定你的使用者们都用 scp (Secure Copy, 附属在 SSH 里面), 但是又想要提供 anonymous ftp 服务, 也只消加个 \"-A\" 在 ftp 那行后面就行了:

ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -A

你也可以编辑 /etc/ftpwelcome, 说明目前接受 anonymous ftp 登入, 但是系统内的使用者就得使用 rcp 了。如果你有提供 anonymous ftp, 你可以使用 -S 选项来记录传输的情形:

ftp stream tcp nowait root /usr/libexec/ftpd ftpd -A -S

5.1.1.5 fingerd
Finger 服务默认值还算安全: 它不容许不带 user name 的 query。这是一件不错的事(tm)。然而, 就是有些人无论如何也不想 run fingerd。这种情形下, 你只要简单的给它加个 \" #\" 在这行的最前面就可以了。又, 你想要 log 住谁来 finger 的话, 加个\"-l\" 也就行了:

finger stream tcp nowait nobody /usr/libexec/fingerd fingerd -s -l

Fingerd 产生的 log 信息预设是写到 /var/log/messages。如果你想要这些信息写入到特定的档案里去, 那么就在 /etc/syslog.conf 加入这一行:

daemon.notice /var/log/fingerd
/* !fingerd anyone? */
$ man 5 syslog.conf

除了 ftp, telnet 和 finger 之外, 你实在不须要在 /etc/inetd.conf 中再多激活任何东西了。通常我都会关掉 talk 及 comsat等我个人不须要的东西。如同我之前讲的,如果你不知到某个 servcie 是干嘛用的, 而且你也不须要它, 那么就关掉它。一些和网络有关而且很有用的 man page 是: inetd, ftpd, telnetd, fingerd, syslogd,comsat, talkd, rshd, rlogind, inetd.conf。并且记得要看 man page 的\"SEE ALSO\"部份, 以获得更多的相关信息。

5.1.1.6 ipfw (IP FrewWall)
IP FireWall 做的是 packet 过滤的工作。没错, 就是只有这样。然而, 你要考虑的事是,你的 kernel 要有支持 ipfw。 通常在我管的机器上, 我都会重编核心使其支持ipfw。大概看起来是这样:

options IPFIREWALL #finger the net
options IPFIREWALL_VERBOSE #log the net
options IPFIREWALL_DEFAULT_TO_ACCEPT

第一行表示最其本的 IP FireWall 支持。第二行让 ipfw 可以把接受或拒绝 packets的纪录 log 起来。第三行非常重要, 让 ipfw 默认值是接受任何地方来的 packets 。如果你不这样做, 默认值拒绝任何地方来的 packets。我个比比较喜欢后者, 但我又认为在我自己的工作站上, 或一个让人登入的工作站, 预设拒绝任何 packets 不是一件太好的事。如果你搞不清楚自己在做啥事, 那就不要用这个选项。

就设定 firewall 而言, 这是不甚正确的。预设任何东西都该被挡掉才是正确的。如果你是要建置一台高安全性的系统, 或一台 firewall 的话,那就千万不要加入这个选项:

options IPFIREWALL_DEFAULT_TO_ACCEPT

记住一件事: 要预设拒绝任接受任何 packets, 然后再加入 rule 来设定你想要 接受那些 packets。查看 /etc/rc.firewall 以得到更多的信息。再一次提醒你, 不要使用这个 option, 除非你只是想要防止 DoS attacks 或暂时把某些 port/network ban掉。

5.1.1.7 log_in_vain
你也可以透过 sysctl 命令, 来改变一些有用的系统变量:

# sysctl -w net.inet.tcp.log_in_vain=1
# sysctl -w net.inet.udp.log_in_vain=1

这会把尝试向你的机器要求你没有的服务的 connections log 起来。例如, 如果你在你的机器没有跑 DNS server, 而又有个人想要向你的机器要求 DNS 服务, 这时候你就会看到Connection attempt to UDP yourIP:53 from otherIP:X
(X 是某个 high port #) 用 \"dmesg\" 命令就可以看到这一行。Dmesg 秀出的是系统的 kernel messagebuffer。

然而, 这个 buffer 的空间是有限的, 所以系统也会把这些讯息写入到/var/log/messages 里面去:

# tail -1 /var/log/messages
Jun 12 19:36:03 ugh /kernel: Connection attempt to UDP yourIP:53 from otherIP:X

5.1.1.8 final notes
理论上呢, 你的系统现在已经比你装好它时更安全些了。你现在可以做一些事来确定你目前的更动:

$ netstat -na | grep LISTEN

这会告诉你那些 service 在那些 port 跑。越少越好 又, 再跑一些其它的 port scanners (strobe, nmap) 来找出你开了那些 port。

而要确要你的 syslogd 已经开始纪下你刚刚想要 log 的事件, 可以这么做:

# cd /var/log
# tail -10 fingerd ftpd messages
在 log 档里面没看到任何东西的话, 记得重新激活 inetd 和 syslogd:
# kill -HUP `cat /var/run/syslog.pig` `cat /var/run/inetd.pid`

5.1.1.9 Filesystem
既然 Unix 把什么东西都当作档案来看待, 好好的保护你的档案系统便是很重要的事。有件事是在你安装操作系统前便要完成的: 必须要计划并设计好你的 partition 该怎么切割。有几个很重要的原因让你要这么做: 一个是你可以 mount 不同的档案系统以赋与不同的选项(下面有几个例子)。别一个是,如果你想要把你的 filesystem export出去, 你须要更加细微的控制。如果你是一个从 转入 FreeBSD 的使用者, 你会发现 是把任何东西都往 root partition \"/\" 塞, 而 FreeBSD 预设便要 \"/\",\"/usr\", 和 \"/var\"。这也使得要使用如 dump 般的工具较容易。且让我们来讨论 security 吧! 有一件事我通常会做的是, 我会把一般 users 可以写入的 partition 分开来割, 而这些 partitons 便可以用 \"nosuid\" 的方式来 mount。从 mount 的 man page 可以知道:让 suid 或 sgid bit 失效。对于像 suidperl 这些公开使用的程序, 设这个选项便没用。

因此你会有个 partition 给一般使用者使用: /home 或 /usr/home。然后你可以另外开个 partion 给 /var/tmp 然后再把你的 /tmp 指到这里:

# rm -rf /tmp
# ln -s /var/tmp /tmp

你可以参考这个例子:

# cat /etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/sd0s1b none swap sw 0 0
/dev/sd0s1a / ufs rw 1 1
/dev/sd0s1g /usr ufs rw 2 2
/dev/sd0s1h /usr/home ufs rw 2 2
/dev/sd0s1f /var ufs rw 2 2
/dev/sd0s1e /var/tmp ufs rw,nosuid 2 2
proc /proc procfs rw 0 0

现在你可以确定一般 users 可以写入的目录不是以 \"-nosuid\" 的方式被 mount, 就是没有可以写入。现在你还要关心的就是 /var/spool/uucppublic\"。

你可以把 \"/var\" 以 \"-nosuid\" 的方式来 mount , 或下这个命令:

# chmod o-w /var/spool/uucppublic

如果你想要找出你所有的可写入目录, 下这个命令:

# find / -perm -0777 -type d -ls

如同 man page 指出的, 具有 suid/sgid 的程序会让你的 nosuid 失效。找出那些程式是 suid 或 sgid 的吧:

# find / -perm -2000 -ls
# find / -perm -4000 -ls

同时你不止可以用 \"-ls\" 而只是知道有那些程序。你可以把不是很有用的程序 \"chmod 000\"。像是 uustat, uucico 等, 如果你从来不碰 uucp 的话。或是 ppp 和 pppd, 如果你绝不会用到他们。又, 你不会去用到打印机的话, 把 lpr lprd 也 chmod 000 吧!也许改天会有个人写个 shell script 来问你那些东西要 chmod 000 掉。

现在你也许想问, 有什么方式可以防止攻击者重新以非 \"-nosuid\" 的方式 mount 你的filesystem ? Well, 没有, 除非你改变你的 securelevel。

5.1.1.10 securelevel
FreeBSD kernel 有个观念叫 securelevel。当还有人在争论这是不是够完美时,这个机制已经够防止大部份的 \"script kiddiez\"。Securelevel 是指你的 kernel 在执行时的安全等级。每一个等级具有不同的保护和检查机制。这些是 init(8) 的 man page:

Kernel 可以以四种不同的安全等级来执行。任何 superuser process 可以提高安全等级,但是只有 init 可以降低它。

这四种等级分别是:
-1 永远不安全模式 – 切换到 level 0 吧!
0 不安全模式 – \"不可更动\"和\"只能附加\"这两个旗标(flag)可以被改变。所有的devices 可以照着它们的读写权限被读写。
1 安全模式 – \"不可更动\"和\"只能附加\" 的旗标不能被取消; mount 上来的档案系统, /dev/mem, 和 /dev/kmem 不能写入。
2 高安全模式 – 和安全模式一样, 又多加了不管硬盘有没有被 mount 起来,除了mount(2) 之外都不能写入。它防止一个档案系统在 umount 的时候被搞乱。而且在这个等级也禁止在 multi-user 时执行 newfs(8)。

如果安全等级最初是 -1, 那么 init 就会保持原状。否则在 single user mode 时,init 会把安全等级调到 0, 而在 multiuser mode 时会以 1 来跑。如果你希望在multiuser模式是以等级 2 在跑, 你可以先进入 single user mode, 编辑 /etc/rc,使用 sysctl 来更动。

若是你的系统只拿来跑 web server 之类的, 你可以放心的将 securelevel调高到2。但若是你要跑 X server, 把你的 securelevel 调至 1 或更高会导致一些问题。因为X server 必须要写入 /dev/mem 和 /dev/kmem, 而 securelevel 1 不允许你这么做。有一个解决的方法是, 在激活 X server 后再调高 securelevel。但我的意见是, 如果你跑 X server 的
话, 你已经有了其它的安全问题须要考量, 而不止是 securelevel。以下这个指令会显示出你目前的 securelevel 设定值。

# sysctl kern.securelevel
如果要提高你的 securelevel:
# sysctl -w kern.securelevel=X
X 可以是 0, 1 或 2。

又在 securelevel 是 1 的话, 你在 \"make world\" 时也会有些问题。因为 \"make install\" 时会在 kernel 上加上 immutable flag:

# ls -lo /kernel
-r-xr-xr-x 1 root wheel schg 1061679 Jun 3001:27 /kernel
\"schg\" flag 会防止你安装新的 kernel:
nfr# id
uid=0(root) gid=0(wheel) groups=0(wheel), 2(kmem)
nfr# sysctl kern.securelevel
kern.securelevel: 2

nfr# rm -rf /kernel
rm: /kernel: Operation not permitted

nfr# mv /kernel /tmp/
mv: rename /kernel to /tmp//kernel: Operation not permitted

如果你在 securelevel 1 或 2, 那么 schg flag 是不能被改变的。

# chflags noschg /kernel
chflags: /kernel: Operation not permitted
值得留意的是, /boot.config 可以改变你开机时的系统设定,要预防有心人篡改你应该这么做:

# touch /boot.config
# chflags schg /boot.config

你可以看看系统预设还有那些执行档是有 schg flag 的。

# ls -lo /sbin | grep schg
-r-x—— 1 bin bin schg 204800 Jul 19 20:38 init
# ls -lo /bin | grep schg
-r-sr-xr-x 1 root bin schg 192512 Jul 19 20:36 rcp

再回过头来谈谈锁定系统这件事吧! 既然刚刚谈到了 immutable flags, 何不试着把整个 /sbin 和 /bin 都设成 schg flag 呢 !? 这会给想 crack你系统的人一点小挫折。(假设你的系统也正以适当的 securelevel 运作中)

# chflags schg /bin/*
# chflags schg /sbin/*

不过 /sbin 可能被改成别的名字,再重新创造一份新的 /sbin ,所以改变 /sbin 与/bin 的 schg flag 是很合理的想法,我们可以依照以下的方式改变 /sbin 和 /bin 的 schg flag:

# chflags schg /bin/*
# chflags schg /sbin/*

这些 schg flag 的档案会让你在 \"make world\" 时有问题。

(\"make installworld\" 也是)

无论如何 ,最好是以 single user 模式来 \"make world\"。有关 \"makr world\" 的相信息, 还有为什么要这么做, 到下面这个网页来看看:

http://www.nothing-going-on.demo … rld/make-world.html

现在你已经适当的锁定你的系统, 也以只跑必要的的 service, 而档案系统也适当的mount 上来, 且也以适合的 kernel securelevel 运作中。

与以上所述的相关 man pages 有: init(8), chflags(1), sysctl(8)。

5.1.1.11 Logging
系统纪录是很重要的。如果你的统被人攻击, 透过它你可以找到一些蛛丝马迹。Unix的标准 log 动作是透过 syslogd(8) 来达成的。它从 /etc/rc 中被激活, 一直执行到系统关机为止。你可以用以下的方式确定你的系统上是否正在执行 syslogd:

$ ps -axu | grep syslogd

Syslogd 会在激活时读取 /etc/syslogd.conf。这个档案很重要, 因为它告诉 syslogd要纪录那些东西, 而这些东西又该放在那里。你也许想看看 syslod 和 syslod.conf的 man pages:

$ man syslogd ; man 5 syslog.conf

既然 Unix 当初就是设计作为网络操作系统, syslogd 可以而且默认值也接受其它系统的纪录。它自己也是可以把纪录透过网络送到其它的计算机去。想当然耳, 它可以纪录下 自己系统发生的每件事 – 而这也正是默认值。因为 syslogd 使用 UDP – 所以资料是可以被伪造的。你至少可以作一件事: 不要让你的 syslogd 接受来自其它计算机的纪录讯息。在 /etc/rc.conf 加个 \"-s\" 就可以了:

syslogd_flags=\"-s\" # Flags to syslogd (if enabled).

如果你有接受特定机器之纪录的必要 (像是你的 router, 或是 web server), 使用\"-a\" 来指定特定的 hosts, domains, 或 subnets。

下次你重新激活你的系统时, syslogd便会拒绝来自其它地方的纪录讯息。如果有人尝试送资料进来, syslogd 将会加以纪录。

如果你不想重新激活你的系统, 那么只要把 syslogd kill -9, 然后再以 root 的身份激活 syslogd 便可以了。记得加上 \"-s\"这个参数。

如果有人尝试攻击你的系统而且失败了, 你的系统纪录便不会被伪造。但如果你的系统己经被攻陷了, 而且 /var/log 整个被干掉了呢 !?还是有方法可以防止的。 其一便是在你的网络系统中再架一台机器拿来纪录整个网络中发生的事, 而且也不要再干其它的事了。除了 UDP port 514 之外, 其它的也都不用再开了。这样子一来你便可以纪录下所有机器 (routers, firewalls, serves, workstations) 发生的所有事。你可以只送敏感的讯息给它, 或者任何你觉得重要的。这台机器可以是老旧 486, 但有颗大大的硬碟。记得要设定好正确的 \"-a\" 选项, 免得搞出没收到纪录的乌龙事。你也可以接台老旧的点阵打印机给它, 以印出敏感的事件(像是失败的登入尝试)。如果你把系统纪录印到纸上, 一位攻击者要清除它是很困难的。还有其它的方法,例如透过 serial port (cuaaN) 或是 parallel port (lpN) 送
出纪录到别台机器上。

每个人都有不同的记录需求。但是有一件事我通常会做的是在 /etc/syslog.conf 加入这一行:
auth.* /var/log/authlog

FreeBSD 出厂时便包含了 newsyslog。这玩意会定时压缩纪录文件并清除掉旧的纪录。

设定档位于 /etc/newsyslog.conf – 请看一下 man page 以得到更多的信息:
% man newsyslog
不像 syslogd, newsyslog 不是一直都在执行的。它是从 crontab 激活的:
% grep newsyslog /etc/crontab
0 * * * * root /usr/sbin/newsyslog
%

你可以修改 /etc/newsyslog.conf 以符合你的需求。我通常会改变它预设的档案模式, 从 664 改成 660 – 因为没有必要让一般的使用者去查看你的系统纪录。你应该这么做:

# cd /var/log
# chmod g-w,o-r * ; chmod a+r wtmp

这会防止一般使用者读取纪录文件, 除非它们在适当的 group (wheel 或之类的)。还有,记得把记录文件的 group 都改成 wheel — 这纯粹只是为了方便: 如果你是在 wheel 这个 group; 你当然是可以 su(1) 到 root 然后读记录文件。但是这么做以后你便可以直接读记录文件了, 岂不方便乎!?你还要在 /etc /newsyslog.conf 中加入 \"root.wheel\":

/var/log/maillog root.wheel 640 7 100 * Z
/var/log/authlog root.wheel 640 7 100 * Z
/var/log/messages root.wheel 640 7 100 * Z

这会在记录文件达到 100K 时将它压缩并加以编号, 将 mode 改成 640, chown成root.wheel, 并将旧的记录文件干掉 – 这就是我们要的。

当然,标准的 Unix 还有其它不同的 syslog 程序可供选择,其中之一是 CORE EDI 的ssyslog (secure syslog). 可以在以下的地方找到:

http://www.core-sdi.com/ENGLISH/CoreLabs/ssyslog/download.html

另外还有 nsyslog (new syslog),这是写 bpfilter 那一伙人写出来的,你可以在 http://cheops.anu.edu.au/~avalon/nsyslog.html 找到这个程序。

不管你选用那一种程序 (标准的 syslog , ssyslog ,或 nsyslog),你应该也去看看一些帮你分析系统 log 的程序,帮你省下去用 grep 查询 log file 的麻烦。

其中之一是 logcheck , 可以在这个地方下载: http://www.psionic.com/abacus/abacus_logcheck.html

另外一个类似的程序叫做 logsurfer , 你可以从这个网页下载: http://www.cert.dfn.de/eng/team/wl/logsurf/

5.1.2 Misc. hints and tips

5.1.2.1 LKM
在正式提供服务的系统上, 也许该关掉 LKM。为什么? 请看:

Phrack Magazine Volume 7, Issue 51 September 01, 1997, article 09

要关掉 LKMs, 在 kernel 设定档中加入这一行:
options NOLKM

5.1.2.2 Portmap
FreeBSD 出厂的默认值会将 portmap 这项功能打开。如果你不需要它的话,把它关掉。如果你没有跑任何需要呼叫 RPC 的程序的话,你就不需要跑这个程序。如果要关掉portmap这个程序,你可以去修改 /etc/rc.conf , 把

portmap_enable=\"YES\" # Run the portmapper service (or NO).
改成
portmap_enable=\"NO\" # Run the portmapper service (or NO).

5.1.2.3 Sendmail
FreeBSD 出厂的默认值也会执行 sendmail 的功能。从很久以前 sendmail 就以不安全且漏洞百出闻名。最近人们努力的将 sendmail 中的错误清除,但是由于 sendmail是一个很肥大的程序,要将所有的错误都抓出来相当的困难。换句话说:如果你不需要它的话,最好把它关掉。如果你真的需要它的话,最好到 sendmail 的网站去看看有没有新的patches 或是 hacks, sendmail 的网站在 http://www.sendmail.org

此外,如果你的 sendmail 版本是 8.8 以后的版本,请设定好你的系统,以防止 spammer利用你的系统去干坏事。设定 anti-spam 的信息可以在 http://www.sendmail.org/antispam.html 下找到。

如果你决定要把 sendmail 关掉的话,只要去修改 /etc/rc.conf (没错,又是它)中的:
sendmail_enable=\"YES\" # Run the sendmail daemon (or NO).
改成
sendmail_enable=\"NO\" # Run the sendmail daemon (or NO).

5.1.2.4 Ports and Packages
在一台高安全性的系统上, 最好不要使用 ports 或 packakges。 你不会真正知道是不是安装 suid 的程序进你的系统 — 而且你不会想再多这些 suid 的东西了, 相信我。尽管你在 pkg_add 时可以使用不同的选项(如 \"-v\" 或 \"-n\"), 最好还是自己来: 抓回它的 source code, 自己 compile, 再手动安装完成。

5.1.2.5 Filesystem quota
如果你的系统是 \"shell\" type server,你可能希望设定使用者的 quota (可用空间)。

如此一来可以保护你的系统免受 Denial of Service 攻击方式的侵扰(不论是有意或是无意的)。在未设定 quota 的系统上使用者可以随意的灌爆你的硬盘。要把 quota这项功能打开,你可以修改 /etc/rc.conf 中的这项设定:

check_quotas=\"NO\" # Check quotas (or NO).
改成
check_quotas=\"YES\" # Check quotas (or NO).

请先看看以下的 man page,这些文件说明如何使用 quota 的各项设定,并且有一些设定的范例: quotaon, edquota, repquota, quota 请确定在 /etc/fstab 中有加入 \"userquota\" , 详见 man 5 fstab。

5.1.2.6 Crontab
如果你使用了 /etc/crontab 的话,这项功能有可能提供入侵者一些额外的信息。
请确定你做过 \"chmod 640 /etc/crontab\"

5.1.2.7 BPF
BPF 是 berkeley packet filter 的缩写,要使用这项功能前你必须修改 kernel,以达成监听网络的目的。像 tcpdump 和 NFR 这些程序都使用 BPF。然而 BSD的监听程序也都透过 BPF 来达成,如果有人拿到你系统的 root 权限的话,在系统上设定 BPF 功能反而帮助他们更容易的监听你的网络。如果没有必要的话,不要设定 kernel 中 BPF的功能。 FreeBSD 出厂的设定值是将这个功能关闭起来的。

5.1.2.8 CVSup, CVS, 等等
如果你是使用 CD-ROM 安装你的系统的话,很有可能当你拿到你的 CD-ROM时,已经发现某些程序有错误存在了。在大部份的情况下(我们希望如此),这些错误与系统安全无关。然而,我建议你将你的系统升级到最新的 -current (或是 -stable,视你的喜好而定) 版本。如此你可以确定你系统上的的是最新版本的系统原始码。

你需要的信息在这边可以找到:
http://www.freebsd.org/handbook/handbook264.html#508

在更新你操作系统的原始码后你必须去 \"make world\",详细的文件在:
http://www.nothing-going-on.demo … rld/make-world.html

5.1.2.9 SSH
使用 ssh 以代替 telnet, ftp, rlogin, rsh 等的重要性, 再怎么强调都是不够的。对于使用慢速线路的人 (dial-up, 56K frame), ssh 有 -C 选项:
-C 将数据压缩后再传出去, 包括了 stdin, stdout, stderr还有透过 X11 还有TCP/IP。压缩的算法同 gzip, 而且可以指定压缩的 level。对于 moden users 和使用慢速线路的人, 这功能是不错的。 但有高速线路的人, 这么搞只会拖慢速度。在主机对连时可以设默认值, 请再参照文件。

这会让你用起来快一点 总之就是用 SSH 就对了啦! 拜托, 拜托, 使用 ssh。 如果你硬是不信邪, 再也没什么安全措施可以帮助你了 !!

5.1.2.10 Related URLs

1) FreeBSD Hardening Project:
http://www.watson.org/fbsd-hardening/
2) FreeBSD ipfw Configuration Page:
http://www.metronet.com/~pgilley/freebsd/ipfw
3) FreeBSD Security advisories:
ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/
4) FreeBSD Security web page:
http://www.freebsd.org/security/security.html
5) Security tools in FreeBSD:
http://www.samag.com/archive/0705/feature.html

5.2 sco 系列

5.2.1 抓好网内主机的管理是网络安全管理的前提

用户名和密码管理永远是系统安全管理中最重要的环节之一,对网络的任何攻击,都不可能没有合法的用户名和密码(后台网络应用程序开后门例外)。但目前绝大部分系统管理员只注重对特权用户的管理,而忽视对普通用户的管理。主要表现在设置用户时图省事方便,胡乱设置用户的权限(id)、组别(group)和文件权限,为非法用户窃取信息和破坏系统留下了空隙。

金融系统UNIX的用户都是最终用户,他们只需在具体的应用系统中工作,完成某些固定的任务,一般情况下不需执行系统命令(shell)。以农业银行全国电子汇兑为例,用户名为dzhd,它在/etc/passwd文件中描述如下:

dzhd:x:200:50: :/usr/dzhd:/bin/sh
它的.profile内容大致如下:
COBSW=+R+N+Q-10
DD_PRINTER=“1p-s”
PATH=/etc:/bin:/usr/binHOME/bin:/usr/dzhd/obj:
MAIL=/usr/spool/mail/logname
umask 007
eval`test -m ansi:ansi -m:?ansi -c -s -Q`
export PATH MAIL COBSW DD_PRINTER
cd usr/dzhd/obj
runx hdg
exit

用户正常登录后,如果按下中断键“delete”,关掉终端电源,或同时键入“Ctrl”“ ”,那么用户将进入shell命令状态。例如他可以在自己的目录不断创建子目录而耗尽系统的I节点号、或用yes>aa创建一个其大无比的垃圾文件而耗尽硬盘空间等导致系统的崩溃、瘫痪;如果文件系统的权限设置不严密,他可运行、窥视甚至修改它;还可通过su等命令窃取更高的权限;还可登录到其它主机上去捣乱……令你防不胜防,危险性可想而知。这一些问
题都与用户设置有关。所以,尽量不要把用户设置成上述形式。如果必须这样,可根据实际需要,看看能否把用户的sh变成受限sh,如rsh等,变成如下形式:

dzhd:x:200:50: :/usr/dzhd/obj:/bin/rsh
或如下形式:
dzhd:x:200:50: :/usr/dzhd:./main
在main(.porfile)首部增加如下一行:
trap’ ‘ 0 1 2 3 5 15

那么上述一切问题都可避免。

此外定期检查你的/etc/passwd文件,看看是否有来历不明的用户和用户的权限;定期修改用户密码,特别是uucp、bin等不常用的用户的密码,以防有人在此开个活动的天窗–一个可自由进出的用户;删除所有睡眠用户等。

5.2.2设置好自己的网络环境是阻止非法访问的有效途径
网上访问的常用工具有telnet、ftp、rlogin、rcp、rcmd等网络操作命令,对它们的使用必须加以限制。最简单的方法是修改/etc/services中相应的服务端口号。但这样做会使网外的一切访问都被拒绝,即使是否法访问也不例外。这种闭关自守的做法不值得提倡,因为这样会使本网和网外隔绝开,也会给自己带来不便。通过对UNIXt系统的分析,我们认为有可能做到有条件限制(允许)网上访问。

5.2.2.1 建立etc/ftpusers文件(不受欢迎的ftp用户表)。

与之相关的命令是ftp。配置如下:
#用户名
dgxt
dzhd

以上都是本机内的一些用户,侵入者使用以上用户名ftp访问本网会被拒之门外。

5.2.2.2 保存.netrc文件
注意保存好.netrc文件(远程注册数据文件)。与之有关的命令是ftp。.netrc包含注册到网络上用ftp作文件转移的远程主机的数据。通常驻留在用户当前目录中,文件权限必须为0600。格式如下:

machine对方主机名login对方主机内用户名password对方用户密码macdef init ftp的操
作命令集。

5.2.2.3 创建匿名ftp
所谓匿名ftp,是指其他主机的用户能以ftp或anonymous用户进行数据收发而不要任何密码。

建立方法如下:

1) 用sysadmsh创建ftp用户,在passwd文件表示为:
ftp:x:210:50: :/usr/ftp:/bin/sh
.profile中的路径为:
PATH=$HOME/binHOME/etc
2) 在/usr/ftp目录:
#创建匿名ftp所用的目录
#mkdir bin etc dev pub shlib
#改变pub以外所有目录权限
#chmod 0555 bin etc dev shlib
#改变pub目录的所有者和同组者
#chown ftp pub
#chgrp ftp pub
#复制匿名ftp所执行文件
#cp/bin/rsh/bin/pwd/bin/1s bin
#改变所需执行文件权限
#chmod 011 bin/*
#查看所需伪设备的情况
#1/dev/socksys
#1/dev/null
#建立所需伪设备的驱动程度
#cd/usr/ftp/dev
#mkond null c 4 2
#mkond socksys c 26 0
#改变伪设备驱动程序的所有者、同组者
#chown ftp ftp/*
#chgrp ftp ftp/*
#复制共享文件
#cp/shlib/ilbe_s shlib
注意不要复制/etc/passwd、/etc/proup到etc下,这样对安全具有潜在的威胁。此外给ftp用户加上密码,不要告诉其他任何人。

5.2.2.4 限制.rhosts用户等价文件(又叫受托用户文件)

与之有关命令有rlogin、rcp、rcmd等。
所谓用户等价,就是用户不用输入密码,即可以相同的用户信息登录到另一台主机中。用户等价的文件名为.rhosts,存放在根下或用户主目录下。它的形式如下:

#主机名 用户名
ash020000 root
ash020001 dgxt

如果用户名为空,是所有用户均等价。

5.2.2.5 限制hosts.equiv主机等价文件,(又叫受托主机文件)
有关的命令为rlogin、rcp、rcmd等。主机等价类似于用户等价,在两台计算机除根目录外的所有区域有效,主机等价文件为hosts.equiv,存放在/etc下,它的形式如下:

#主机名 用户名
ash020000
ash020001

当远程使用ftp访问本系统时,UNIX系统首先验证用户名和密码,无误后查看ftpusers文件,一旦其中包含登录所用用户名则自动拒绝连接,从而达到限制作用。因此我们只要把本机内除匿名ftp以外的所有用户列入ftpusers文件中,即使入者获得本机内正确的用户信息,无法登录系统。需对外发布的信息,放到/usr/ftp/bub下,让远方通过匿名ftp获取。使用匿名ftp,不需密码,不会对本机系统的安全构成威胁,因为它无法改变目录,也就无法获得本机内的其他信息。使用.netrc配置,需注意保密,防止泄露其他相关主机的信息。

使用用户等价和主机等机这类访问,用户可以不用口令而像其他有效用户一样登录到远程系统,远程用户可使用rlogin直接登录而不需密码,还可使用rcp命令向或从本地主机复制文件,也可使用rcmd远程执行本机的命令等。因此主种访问具有严重的不安全性,必须严格控制或在非常可靠的环境下使用。1998年美国发现的著名的“蠕虫”病毒,由一个叫英尔(morris)的年青人编写的,在Internet网上流传开,造成许多UNIX系统的瘫痪,损失达数亿美元,其重要的传播手段之一就是利用了用户等价和主机等价的配置。慎重使用(最好不用)和经常检查上述文件,会有效加强系统安全。

UNIX系统没有直接提供对telnet的控制。但我们知道,/etc/profile是系统默认shell变量文件,所有用户登录时必须首先执行它。如果我们在该文件首部增加如下几条shell命令:

#设置中断变量
trap’ ‘ 0 1 2 3 4 5 15
umask 022
#获取登录终端名
dc=“’who am i |awk‘[prin $2]’`”
#检查是否受限
grep $de /etc default/aaa >dev/null 2>&1
#如果受限
if [$?=“0”]
then
echo“请输入密码:c”
read abc
#获取正确密码
dd=“grep root /etc/edfault/aaa|awk’[pint $2]’`”
#非法用户发出警告信息到主控台
法[“$abc”!=$dd]
then
echo “非法用户!”
echo“有非法用户试图登录!”>tev/tty01
logname>/dev/tty01
#同时记载日记文件
echo“有非法用户试图登录!c”> >/usr/tmp/err
echo $dc> >/usr/tmp/err
logname > >/usr/tmp/err
exit;
fi;
fi

其中/etc/default/aaa是受限终端名的一个文本文件,root后为密码,它的内容如下:

root qwerty
ttyp0
ttyp1
ttyp2
ttyp3
ttypa
ttypb

这样非法用户即例获得了合法的用户名和密码,也无法远程使用。系统管理员定时阅读日记文件,注意控制台信息,就能获得被非法访问的情况,及时采取措施。如果用c语言实现上述过程,把接受爱变成不可显示,效果更佳。

5.2.3 加强对重要资料的保密
它主要包括hosts表、X.25地址、路由、连接调制解调器的电脑号码及所用的通信软件的种类、网内的用户名等,这些资料都应采取一些保密措施,防止随意扩散。如可向电信部门申请通信专用的电话号码不刊登、不供查询等。由于公共的或普通邮电交换设备的介入,信息通过它们后可能被篡改或泄露。

5.2.4 加强对重要网络设备的管理
路由器在网络安全计划中是很重要的一环。现在大多数路由器已具备防火墙的一些功能,如禁止telnet的访问、禁示非法的网段访问等。通过网络路由器进行正确的存取过滤是限制外部访问简单而有效的手段。
有条件的地方还可设置网关机,将本网和其他网隔离,网关机上不存放任何业务数据,删除除系统正常运行所必须的用户外所用的用户,也能增强网络的安全性。

Unix/Linux上的后门技术和防范

对黑客来讲,入侵一个系统只是万里长征的开始,最主要的是长期占有一个肉鸡(傀儡机),所以,后门技术往往非常重要。对于我们来讲,总是处于被动的地位,百密一疏,总有没有做到位的地方,谁都不能保证自己的系统是绝对安全的,所以不能避免我们可能会被入侵。黑客入侵后肯定会留后门,当然,除了那些高手,境界非常高,入侵只是为了测试或者技术挑战,对于一般黑客来讲,入侵之后留个后门是很重要的,我们要防范,当然就要了解常用的后门技术,下面就简单的讲将在 Unix/Linux系统中比较常见的后门技术。

1. 帐号后门
  最普通和原始的后门技术,一般就是在系统中添加一个管理员帐户。

  # echo "heiyeluren:*:0:0::/root:/bin/sh" >;>; /etc/passwd

  # echo "heiyeluren::0:0::0:0::/root:/bin/sh" >;>; /etc/shadow

  给系统增加一个 uid和gid都为0(root)的帐号,无口令。

  FreeBSD的密码是存储在 /etc/master.passwd里面的,那么后面的命令就应该改成:

  # echo "heiyeluren:::::::::" >;>; /etc/master.passwd

  也可以使用程序来实现:

  /* Add super user */

  #include "stdio.h"

  #define PASSWD_PATH "/etc/passwd"

  #define SHADOW_PATH "/etc/master.passwd"

  main()

  {

  FILE *fd;

  fd = fopen(PASSWD_PATH, "a+";

  fprintf(fd, "heiyeluren:*:0:0::/root:/bin/sh\n";

  fclose(fd);

  fd = fopen(SHADOW_PATH, "a+";

  fprintf(fd, "heiyeluren::0:0::0:0::/root:/bin/sh\n";

  fclose(fd);

  }

  # gcc -o adduser adduser.c

  # ./adduser

  这种方法比较傻,一般比较容易发现,特别是系统帐户不多的时候。也有的用户名起的比较迷惑人,比如起个r00t的用户名,uid和gid都是0,这样如果不注意,可能就会被蒙混过关了。

  * 防范方法:

  这种方法虽然比较容易发现,但是我们还是要防范,要多注意观察系统的帐户情况,本来我们系统帐户就不多,检查起来比较方便,另外也要注意那些比较少使用的帐户是不是被更改过,比如默认的帐户有bind,它的shell是 /usr/sbin/nologin,就是不能登陆的,但是黑客入侵后把它改了,比如改为/bin/csh,那么对方就能登陆了,但是你确不知道。所以最好办法是把/etc/passwd另外备份一份,不定期的检查,同时把/etc/passwd和/etc/master.passwd设为只有root才能查看。

2. shell后门
这个比较常用,也比较流行。一般就是把root执行的shell程序通过setuid的形式把shell程序拷贝到其他能够执行的地方,然后只要用小权限用户执行该shell就能够直接获取root权限。

  比如:

  # cp /bin/sh /tmp/.backdoor

  # chown root:root /tmp/.backdoor

  # chmod +s /tmp/.backdoor

  这样只是把sh复制了,如果你喜欢其他shell,比如ksh、csh也可以,具体你看各个不同的操作系统而定。你就可以把那个加了s标记的shell程序放到任何目录,最好是深一点,不容易被人发现的地方,比如/usr/local/share/man之类的目录,然后你使用小权限用户登陆后执行该 shell就可以了,比如我们上面复制的shell,我们只要用小权限用户登陆后执行:

  $ /tmp/.backdoor

  #

  就可以了,当然,如何获得小权限用户,你可以使用暴力破解一些帐户,或者自己创建一个小权限的帐户。

  * 防范方法:

  首先给各个主要目录加上我们上面说的文件指纹校验,知道某个目录下有什么文件,如果多出了可疑文件可以仔细检查。还有使用find命令来查找有没有危险的root suid程序:

  find / -type f (-perm -4000 -o -perm -2000 ) -print

3. Crontab服务后门
  crontab命令就相当于windows下的at命令,定期执行某些任务。对黑客来讲,比如定期建立一个帐户,然后过多久就删除,这样管理员永远看不到系统中有后门,这样是非常保险的……

  * 防范方法:

  cron的服务默认是存储在 /var/spool/crontab/root目录下,定期检查cron服务,看是否有异常的任务在执行,或者如果你不使用cron的话,直接关闭掉它。

4. rhosts后门
  Rhosts文件常常被黑客利用来制作后门,如果系统开了rlogin、rexec等r的服务,因为象rlogin这样的服务是基于rhosts文件里的主机名使用简单的认证方法,所以黑客只要将。rhosts文件设置成"++",那么就允许任何人从任何地方使用该用户名,无须口令登陆513端口的 rlogin服务就行。而且r之类的服务没有日志能力,不容易被发现。

  实现方法:

  # echo "++" >; /usr/heiyeluren/.rhosts

  # rlogin -l heiyeluren localhost

  这样就不需要任何密码,直接输入用户名heiyeluren就登陆到了系统。

  * 防范办法:

  不要使用rlogin等服务,同时也不推荐使用telnet等服务,因为telnetd等守护进程溢出漏洞一堆,而且在数据传输过程中是没有加密的,很容易被嗅探,建议使用ssh等经过安全加密的服务来替代。

5. Login后门
  login程序通常用来对telnet来的用户进行口令验证。 入侵者获取login的原代码并修改使它在比较输入口令与存储口令时先检查后门口令。 如果用户敲入后门口令,它将忽视管理员设置的口令让你长驱直入。

  * 防范方法:

  一般针对这类后门,一般都是使用"string"命令搜索login程序中是否有中是否有密码等字符串来进行检查。如果密码经过加密,那么就对login文件进行指纹记录和MD5值的记录,觉得异常时进行检测。

6. Bind后门
  就是通过常用的网络连接协议 TCP/UDP/ICMP 来建立连接的后门,这个在Windows下可是轰轰烈烈。

  比较普遍的有TCP协议的后门都是写一段程序开一个指定的端口进行监听,然后从客户端进行连接后登陆系统。也有黑客为了隐蔽使用UDP协议来连接。 icmp后门也常见,一般是。有时候可能bind后门跟服务后门结合,黑客通过自己写的bind后门来替换inetd中的服务。

  * 防范方法:

  经常使用netstat命令检查有没有非法的端口打开,最好直接用防火墙屏蔽除了正常访问的端口之外的端口。对于ping后门的话,直接在防火墙上禁止ping服务器

7. 服务后门
  一般是替换或者添加服务来实现后门。比如在 /etc/inetd.conf 中添加或者替换某个服务来运行自己的后门程序,或者在某些服务中加入自己的后门代码。如果是替换服务的话,该服务必须不被使用,而且不容易发现。如果是自己添加的服务,那么必须在/etc/services中设置对应的服务和端口才能使用。

  * 防范方法:

  经常检查服务,最好备份 /etc/inetd.conf 、/etc/services等文件,同时在FreeBSD下也要时常检查 /usr/loca/etc/rc.d 下面的脚本是否是合法的并且是否那些脚本里面有没有启动非法程序。如果是在服务程序中添加自己的代码,那么就要对文件的指纹进行校验,比如md5值看是否匹配。

8. rootkit后门
  rootkit后门一般是替换管理员使用的工具,比如ls、ps、netstat、who等常用文件,把那些程序替换成被黑客加了特殊代码的程序,那样就能达到控制的效果。而且现在已经有很多现成能下载使用的rootkit.

  * 防范方法:

  按照我们前面的方法,给每个文件建立系统指纹档案和md5校验值,如果觉得不对劲的时候查看文件指纹是否匹配,有没有别修改过,就知道是否着了rootkit的道。

9. 内核后门
  通过加载内核模块的方式来加载后门,比较复杂。一般内核后门都是针对操作系统而言的,不同的操作系统内核模块设置编写方法都不一样,一般不通用。内核后门一般无法通过md5校验等来判断,所有基本比较难发现,目前针对内核后门比较多的是Linux和Solaris下。

  * 防范方法:

  FreeBSD下通过我们上面讲的设置内核安全等级来控制加载内核模块。

10. 其他后门
  还有包括。forward等其他各类后门,另外很多后门可能是结合多种技术,比如把rootkit和内核后门结合在一起,实际过程中,黑克是会更难对付的。当然还有许多我们没有发现高手独门秘诀,这需要灵活检查,不过只要勤劳一点,安全会提升很多。

 

FreeBSD防火墙的安装和设置

FreeBSD自带有一个基于包过滤的防火墙——ipfw,虽然功能没有专业防火墙那么强大,但是应付一个Web站点的安全还是足够的,所以我们决定选用该防火墙来保护我们的Web服务器。

1. 安装ipfw
IPFW 的主要部分是在内核中运行的, 因此会需要在FreeBSD内核配置文件中添加部分选项。(注意,如果你没有安装FreeBSD核心源代码,是无法进入以下目录的,所以运行之前一定要先安装内核源代码)我们先进入内核配置文件:

  # cd /sys/i386/conf

  # cp GENERIC ./kernel_fw

  打开内核配置文件:

  # ee ./kernel_fw

  添加四个选项,不需要后面的注释信息:

  options IPFIREWALL # 将包过滤部分的代码编译进内核。

  options IPFIREWALL_VERBOSE

  # 启用通过syslogd记录的日志。如果没有指定这个选项,即使您在过滤规则中指定记录包, 也不会真的记录它们

  options IPFIREWALL_VERBOSE_LIMIT=10

  # 限制通过 syslogd( 记录的每项包规则的记录条数。在恶劣的环境中如果您想记录防火墙的活动, 而又不想由于 syslog 洪水一般的记录而导致拒绝服务攻击, 那么这个选项将会很有用。

  options IPFIREWALL_DEFAULT_TO_ACCEPT

  # 这将把默认的规则动作从 “deny 改为 “allow.这可以防止在没有配置防火墙之前使用启用过 IPFIREWALL 支持的内核重启时把自己锁在外面。 另外, 如果您经常使用 ipfw( 来解决一些问题时它也非常有用。 尽管如此,在使用时应该小心,因为这将使防火墙敞开, 并改变它的行为。

  编译内核:

  # /usr/sbin/config kernel_fw

  # cd ……/compile/kernel_fw (注意你的版本,如果是低于5.0的版本用……/……/compile/kernel_fw)

  # make depend

  # make

  # make install

重启系统。注意,我们没有选择options IPFIREWALL_DEFAULT_TO_ACCEPT该选项,就是说默认系统启动后是打开防火墙的,并且防火墙默认是不允许任何连接的(deny from any to any),所以一定要在本地操作,否则你将被“锁在门外”,如果你选择了该选项则可以使用ssh等连接不受影响,不过这相对不安全。

2. 配置ipfw
如果配置普通情况下的规则,使用命令配置的模式:

  ipfw的配置命令:ipfw [-N] 命令 [编号] 动作 [log(日志)] 协议 地址 [其它选项]

  例如:

  # ipfw add allow tcp from any to 10.10.10.1 80 #允许外界访问我的web服务

  # ipfw add allow tcp from any to 10.10.10.1 21 #允许外面访问我的ftp服务

  # ipfw add allow tcp from any to 10.10.10.1 22 #允许外界访问我的ssh服务

  如果使用规则包的形式,那么查看下面内容。

  系统启动后,我们还要配置rc.conf文件来运行我们的防火墙:

  # ee /etc/rc.conf

  加入如下内容:

  gateway_enable="YES" # 启动网关

  firewall_enable="YES" # 激活firewall防火墙

  firewall_script="/etc/rc.firewall" # firewall防火墙的默认脚本

  firewall_type="/etc/ipfw.conf" # firewall自定义脚本

  firewall_quiet="NO" # 起用脚本时,是否显示规则信息。现在为“NO”假如你的防火墙脚本已经定型,那么就可以把这里设置成“YES”了。

  firewall_logging_enable="YES" # 启用firewall的log记录。

  设置完成后我们再编辑/etc/syslog.conf文件:

  # ee /etc/syslog.conf

  加入以下行:

  !ipfw

  *.* /var/log/ipfw.log

  现在到了最重要的编辑规则包了:

  # ee /etc/ipfw.conf

  我们添加一下规则:(注意 10.10.10.1是我们服务器的IP)

  ######### TCP ##########

  add 00001 deny log ip from any to any ipopt rr

  add 00002 deny log ip from any to any ipopt ts

  add 00003 deny log ip from any to any ipopt ssrr

  add 00004 deny log ip from any to any ipopt lsrr

  add 00005 deny tcp from any to any in tcpflags syn,fin

  # 这5行是过滤各种扫描包

  add 10001 allow tcp from any to 10.10.10.1 80 in # 向整个Internet开放http服务。

  add 10002 allow tcp from any to 10.10.10.1 21 in # 向整个Internet开放ftp服务。

  add 10000 allow tcp from 1.2.3.4 to 10.10.10.1 22 in

  # 向Internet的xx.xx.xx.xx这个IP开放SSH服务。也就是只信任这个IP的SSH登陆。

  # 如果你登陆服务器的IP不固定,那么就要设为:add 10000 allow tcp from any to 10.10.10.1 22 in

  add 19997 check-state

  add 19998 allow tcp from any to any out keep-state setup

  add 19999 allow tcp from any to any out #这三个组合起来是允许内部网络访问出去,如果想服务器自己不和Internet进行tcp连接出去,可以把19997和19998去掉。(不影响Internet对服务器的访问)

  ########## UDP ##########

  add 20001 allow udp from any 53 to 10.10.10.1 # 允许其他DNS服务器的信息进入该服务器,因为自己要进行DNS解析嘛~

  add 29999 allow udp from any to any out # 允许自己的UDP包往外发送。

  ########## ICMP #########

  add 30000 allow icmp from any to any icmptypes 3

  add 30001 allow icmp from any to any icmptypes 4

  add 30002 allow icmp from any to any icmptypes 8 out

  add 30003 allow icmp from any to any icmptypes 0 in

  add 30004 allow icmp from any to any icmptypes 11 in

  #允许自己ping别人的服务器。也允许内部网络用router命令进行路由跟踪。