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出去, 你须要更加细微的控制。如果你是一个从 Linux 转入 FreeBSD 的使用者, 你会发现 Linux 是把任何东西都往 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的访问、禁示非法的网段访问等。通过网络路由器进行正确的存取过滤是限制外部访问简单而有效的手段。
有条件的地方还可设置网关机,将本网和其他网隔离,网关机上不存放任何业务数据,删除除系统正常运行所必须的用户外所用的用户,也能增强网络的安全性。

发表评论

邮箱地址不会被公开。 必填项已用*标注

click to changeSecurity Code