第七章 系统安全

系统安全是每个管理者都必须注重的课题。 有人说:「没有不安全的系统,只有懒惰的管理者。」每个系统都有可能会出现漏洞,而有安全性的漏洞产生时,发行的单位都会立即发布通告及修补的方式,而系统管理者的职责便是要随时注意是否需要更新漏洞、随时注意系统是否有异常的讯息。

本章将针对 FreeBSD 系统安全做详细的说明,读完本章后,您将可以了解下列主题:

7.1 概论

FreeBSD 相对而言虽然是比较安全的操作系统,但是有时候问题不是在操作系统本身,而是所安装的软件。在 FreeBSD 中常见的情形是安装非 FreeBSD 内定的软件,但该软件被收录在 ports 中,FreeBSD 也会提出警告。因此,我们必须到 FreeBSD 的网站上查看是否有系统安全的消息,网址是 http://www.freebsd.org/security/index.html 。当发现问题时,可以依照发布的文件中所提供的修正方式来进行修补。

基本上只要计算机电源打开,系统就没有安全的一天,更何况要连上网络提供服务。系统安全的范围很广,从硬设备的保全、人员管理、网络规划、到系统本身的管理,我们并不打算说明如何制定一个安全性政策 ,也无法在这里说明所有系统安全的相关议题,我们所提及的只是笔者在 FreeBSD 使用上的建议。如果想要更多 FreeBSD Security 的信息,可以参考 FreeBSD Handbook,我们在安装 FreeBSD 时己经将 doc 安装在 /usr/share/doc 中,你可以使用 lynx 来观看 FreeBSD 的文件。例如:

# lynx /usr/share/doc/en_US.ISO8859-1/books/handbook/security.html
小提示

lynx 并非 FreeBSD 内附的软件,您必须先到 /usr/ports/www/lynx 中进行安装后才可以使用喔。

系统安全并不局限在如何防止他人入侵,对于防止系统内部问题的产生一样重要。主要的概念就是要让我们的系统能正常的提供服务,并且对于我们不想让他人取得的信息加以保护。然而,为了系统安全往往必须限制某些功能的使用,而牺牲了便利性。身为系统管理者往往因为对于系统限制太多而受到来自使用者的抱怨,在取舍上本来就不是件容易的事。正因为如此,一个尽责的管理者在行事上必须具有高度的抗压性及对安全性的偏执。

由于系统安全十分重要,我们在开始说明各种软件安装、服务器架设之前,先说明系统安全应注意的事项,希望读者在读完本章之后,能对系统安全更有概念。

7.2 系统管理

7.2.1 执行程序的路径

有没有注意到当我们要执行所在目录中的某一个程序时,例如,在执行所在目录中的 myscript.sh,我们必须要打 ./myscript.sh。预设的 PATH 中,并没有将所在目录 "." 加入路径中。如果把 "." 加入 PATH 的设定中,可能会产生安全性的问题。例如,如果使用者在 /tmp 中加入一个名为 ls 的 shell script,内容为 rm -rf /usr,而我们又将 "." 加入路径中,当以 root 在 /tmp 中执行 ls 指令时,后果可想而知。因此,我们在执行指令时,最好能指定路径名称,如 /bin/ls,并检查在 shell 设定中是否有将 "." 加入路径中:

# echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin

为了避免 /bin/sbin 等重要执行档遭到修改,我们可以为这些档案设定禁止修改的 schg flag:

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

当然,设定了 schg 之后,我们要将 Kernel Security Level 调高到 1 以上,这样连 root 都不可以移除 flags。不过设了 schg 之后,我们可能不能执行一些指令,如 make world 等。

7.2.2 降低安装软件的风险

我们可以在网络上找到许多免费的软件,这些软件固然可以让我们在系统的使用上更加便利,但却难保它们不会对系统安全造成任何危害。有的软件可能存在某些漏洞,即使在我们安装前尚无任何安全性的问题,日后还是有可能会被人发现软件的缺陷。因此,我们应该尽可能不要安装一些杂七杂八的软件,而安装之后,一发现有安全性问题也要随时更新。 基本上,要下载软件时,最好到该软件的官方网站下载,以确保安全。

并非所有软件都是正确无误的,请不要直接在重要的服务器上安装一套新的软件,最好先在较不重要的计算机上测试,没问题后再安装。另外,在安装软件时,应注意软件取得来源是否可靠。如果软件提供 MD5 或 PGP 的检查,最好下载后先检查,再解压缩。而安装软件时,最好取得软件的原始码来编译 (或使用 port 安装),我们可以浏览程序代码,以了解其架构。阅读 Makefile 的内容,了解软件将安装的确认位置,先确保程序不会在不该出现的地方产生。

7.2.3 kernel Security Level

FreeBSD 中有所谓的 Security Level,它掌控了系统核心的行为运作。只有超级使用者可以使用指令提高 Secruity Level,但不能降低它。如果要降低它必须在 rc.conf 中设定,并重开机。以下为各 Secruity Level 的意义:

我们可以使用 sysctl 来显示或设定 Security Level:

# sysctl kern.securelevel

如果要将 Security Level 设为 1:

# sysctl -w kernel.securelevel=1

当我们将 Security Level 设为 1 以上时,我们会发现没有办法安装新的 kernel (因为不能移除 schg flag),也没有办法使用 big5con 、X Window 等软件。如果我们的 FreeBSD 只作为服务器,而不使用 big5con 或 X Window 的话,可以将 Security Level 的值调高一点。

如果要在开机时设定 Security Level,可以在 /etc/rc.conf 中以下面二行来设定:

kern_securelevel_enable="YES" # 是否启动 Security Level
kern_securelevel="1" # level 从 -1 到 3

7.2.4 检视系统记录

/var/log 中,记录了许多系统的信息,我们应该要时常检视它们。这些档案如下表:

档案 用途
adduser 使用 adduser 的记录。
cron 定时排程的记录。
maillog 邮件记录。
messages 系统讯息记录。
security 安全性记录,如防火墙。

除了系统的记录外,如果有提供其它服务,会有更多的 log 数据。

如果我们有其它程序为留下 log 文件,最好在 /etc/newsyslog.conf 中设定定时备份压缩,以免档案过大。另外,这些备份的 log 档在 newsyslog.conf 中设定权限 (mode) 时,最好设为 600,以避免其它使用者可以读取。

FreeBSD 预设每天定时执行一些分析的工作,并将结果寄给 root,建议你最好每天阅读它们。我们可以在 /etc/mail/aliases 的开头中加入下面这一行:

root: me@my.domain.com

将 me@my.domain 改成你的 email,设定完后,请执行 newaliases 来让设定生效。如此一来,所有寄给 root 的信件,都会自动转给所设定的信箱。root 每天会收到 "daily run output" 及 "security check output" 这二封信,这是依照我们在 /etc/defaults/periodic.conf 中所设定的定时执行工作输出的结果。在 daily 执行的任务中,预设并没有设定定期清除 /tmp,原则上,在开机时系统会清理 /tmp。如果我们不常重开机,可以在 periodic.conf 中设定每天清理 /tmp

7.2.5 数据的保全

UNIX 系统的安全防护中,第一道防线是计算机实体的安全防护,防止不相干的人接触计算机及周边设施。如果很不幸的,外人可接近系统时,第二道防线是系统密码保护,我们将在下一章说明账号的防护。然而,如果密码泄露或被破解,还有第三道防线,就是在 UNIX 系统中的使用者权限及档案权限控制。如果某一个使用者账号遭到入侵,我们能限制其活动范围及资源的存取。而第四道防线就是将重要的数据加以编码保护,即使数据被使用者窃取,至少还多一道防护措施。而最后一首防线就是数据备份了,我们平时应该有完善的备份计划,一旦系统发生错误或是被摧毁,至少还可以复原。

我们先来谈谈数据编码加密的方法,我们可以使用 crypt 这个指令来为我们的档案加密。例如,有一个档名为 myfile.txt 的档案,我们使用的金钥 (key)是 mykey 这个字符串,加密后的文件名为 myfile.cyp,可以使用下列指令:

# crypt mykey < myfile.txt > myfile.cyp

加密后,就可以将 myfile.txt 删除。如果日后要解密,只要执行下列指令:

# crypt mykey < myfile.cyp > myfile.out

crypt 是一个历史悠久的编码软件,实际上并非十分安全,不过我们可以多加密几次,让档案加密后再加密,只要记得所使用的 key 就好了:

# crypt mykey1< myfile.txt | crypt mykey2 | crypt mykey3 > myfile.cyp

如果要解密,只要再反过来即可:

# crypt mykey3 < myfile.cyp | crypt mykey2 | crypt mykey1 > myfile.out

除了 crypt 外,我们也可以使用其它比较好的编码程序,例如 pgp。pgp 并非 FreeBSD 内附的软件,但我们可以使用 ports 来安装它:

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

安装完 pgp 之后,我们必须先产生 key pair。请执行 pgpk -g

首先请在自己的家目录中建立一个存放 pgp 金钥的目录。
$ mkdir ~/.pgp
$ pgp -kg
Pretty Good Privacy(tm) 2.6.3ia - Public-key encryption for the masses.
(c) 1990-96 Philip Zimmermann, Phil's Pretty Good Software. 1996-03-04
International version - not for use in the USA. Does not use RSAREF.
Current time: 2004/04/27 18:05 GMT

Pick your RSA key size:
1) 512 bits- Low commercial grade, fast but less secure
2) 768 bits- High commercial grade, medium speed, good security
3) 1024 bits- "Military" grade, slow, highest security
Choose 1, 2, or 3, or enter desired number of bits: 3 (输入金钥的长度)

Generating an RSA key with a 1024-bit modulus.

You need a user ID for your public key. The desired form for this
user ID is your name, followed by your E-mail address enclosed in
<angle brackets>, if you have an E-mail address.
For example: John Q. Smith <12345.6789@compuserve.com>
Enter a user ID for your public key: (输入使用者名称)
John Chung <john@mydomain.com>

You need a pass phrase to protect your RSA secret key.
Your pass phrase can be any sentence or phrase and may have many
words, spaces, punctuation, or any other printable characters.

Enter pass phrase: (输入密码)
Enter same pass phrase again: (再输入一次密码,以确认无误)
Note that key generation is a lengthy process.

We need to generate 944 random bits. This is done by measuring the
time intervals between your keystrokes. Please enter some random text
on your keyboard until you hear the beep:
(随机在键盘上输入一些字,直到数字为零)
0 * -Enough, thank you.
..........................**** ..****
Pass phrase is good. Just a moment....
Key signature certificate added.
Key generation completed.

产生了 pgp key 之后,我们就可以使用 pgp 来编码了。

指令 用途
pgp -kx user -o outfile 取出 user 的公开金钥至outfile 中
pgp -ka keyfile 将公开钥匙 keyfile 加入钥匙环中
pgp -kvc user 印出 user 的公开金钥
pgp -e textfile -o outfile user 加密 txtfile 至 outfile
pgp -s textfile -o outfile user 加签 txtfile 至 outfile
pgp -d cypfile -o outfile 解密 cypfile 至 outfile

例如,我们要将 myfile.txt 加密,输出档为 myfile.cyp

# pgp -e myfile.txt -o myfile.cyp john

这里的使用者是 john,他的全名是 John Chung <john@mydomain.com>,我们只要输入名字的部份关键词即可。而解密可以使用:

# pgp -d myfile.cyp -o myfile.out

上面的指令会问你通行码,输入后即完成解密。目前 PGP 的主要应用是在于网络传输文件的加密,我们可以使用它来为 E-mail 加密,PGP 的用法很多,请自行 man pgp

不过,即使加密也无法对抗数据的损毁,对于放在计算机中的重要数据,必须维持完整的备份。就算系统都没有问题,我们永远不知道哪天会因为我们自己失手删除重要数据,或是数据遭到破坏。需要备份的不只是程序所产生的数据,自己开发的程序也应该备份。否则即便有了数据可以复原,而没有程序可以执行。

举例而言,一个 BBS 站应该要备份的除了使用者数据、精华区及看版文章外,BBS 本身运作的程序也要备份,毕竟那是我们精心撰写或修改的结晶。备份的数据不应该和运作的系统放在一起,不仅不应放在同一台计算机中,最好不要放在同一个房间、同一栋大楼、同一个城市,甚至同一个国家。

7.3 账号管理

7.3.1 慎选合宜的密码

对于系统安全的维护,密码可以说是最基础的防线,因此慎选密码绝对是必要的。不管是超级使用者或是一般的使用者,在设定密码时,都应该注意一些原则:

一个好的密码应该是容易记忆,不必另外以纸笔记下的。例如,Gohiy!m (Get out here if you aren't me),或 ru4@xj4# (以注音输入法输入「记录」)。总之就是要让别人意想不到,这里提到的密码也不要使用。

我们可以使用一些工具来找出系统中密码太简单的使用者,例如位于 /usr/ports/security/crack 这套软件。

7.3.2 控制 root 的使用

在 FreeBSD 中,如果要使用指令 su 来取得 root 的权限,必须将该使用者加入 wheel 群组中。但是 su 并未对使用者执行过的指令留下记录,如果系统中有许多使用者,我们要针对不同使用者给予不同的权限,也不是 su 所能做到的,因此我们可以使用 sudo。关于 sudo 的使用,请参考第「使用者管理」一章中的「控制 root 的使用」。

root 账号不应该可以使用 telnet、ssh、或 ftp 的方式登入,在 /etc/ftpuser 中应该有 root 的账号来限制 root 使用 ftp 登入。而在 /etc/ssh/sshd_config 中,应该有 PermitRootLogin no 的字样来限制 root 使用 ssh 登入。我们注意的就是避免 root 能从网络上直接登入,以减少安全性的问题。在 /etc/ttys 中,预设了 root 只能有某些 tty 登入系统,这种允许 root 直接登入的 tty 设定中有 secure 的字样。例如,ttyv0 指的是 console,该行设定最后有 secure,表示 root 可以从该 tty 登入。而 ttyp* 等是远程登入的 tty,所以禁止 root 直接登入。

7.3.3 限制系统资源的使用

如果使用者登入系统后,执行大量消耗 CPU、内存或磁盘的程序,我们的系统将无法正常提供服务,因此,限制使用者对于系统资源的存取是必要的。针对系统所提供的服务,来限制系统的资源,并避免提供不必要的服务。例如,以一台单纯的网页服务器、DNS 服务器而言,并不需要开放使用者远程登入的服务。远程登入提供使用者对系统有直接的操作,而往往也是漏洞开放的起点。一般使用者对于安全的要求不一定和系统管理者的期望相符,他可能会将密码写在自己办公桌上、或是登入系统执行一些不必要的程序。如果迫不得已一定要为使用者在系统上开一个账号,也应该视情况限制其使用远程登入。如果只要为使用者开一个 FTP 账号或是邮件账号,只要设定使用者所用的 shell 为 /sbin/nologin 即可。例如,在 /etc/master.passwd 中,使用者 jack 的账号数据如下:

jack:Bk5AI4MiRKDJ4:1000:1000::0:0:Tom Chang:/home/tom:/sbin/nologin

就算使用者不能登入,但能使用磁盘空间,所以还是要为使用者设定磁盘配额。虽说现在硬件价格便宜,但若每个使用者都有数百 MB 的邮件,集合起来也十分惊人。关于磁盘配额的设定,请参考「使用者管理」一章中的「磁盘配额」。在限制使用者邮件容量方面,最简单的方式就是将使用者的邮件从 /var/mail 中搬移到使用者的目录中,再对使用者目录做磁盘配额的限制。例如,使用者 jack 的家目录位于 /home/jack,我们可以:

# cd /var/mail
# mkdir /home/jack/mail
# mv /var/mail/jack /home/jack/mail/
# ln -s /home/jack/mail/jack

如此就可以将使用者原本的邮件放在其家目录下,我们只要将该档案再链接到 /var/mail 中,如此就可以不必更动邮件软件的设定,而达到限制空间的效果了。

如果你坚持要让使用者登入的话,除了磁盘配额外,应该要再为他们设定其它系统资源的使用限制,例名 CPU 的使用量、内存等。我们可以经由设定 /etc/login.conf 来做到。而 login.conf 的设定,请参考「使用者管理」一章中的说明。。

7.3.4 限制 crontab 及 at 的使用

使用者可以用 crontab 和 at 指令来安排自己定时执行的工作。一般的使用者并不需要拥有 crontab 或 at 的执行权,我们可以为这个指令设限,只允许必要的使用者执行。如果要限制使用 crontab,只需要在 /var/cron 目录中,加入 allow 或是 deny 这个档即可。例如,我们只允许少数几个使用者执行 crontab,我们可以新增 /var/cron/allow 这个档,内容为该使用者的名称。相对的,如果我们要限制少数几个使用者执行 crontab,只要编辑 /var/cron/deny 这个档即可。而指令 at 的限制也是一样,不同的只是允许执行 at 指令的名单是 /var/at/at.allow,而拒绝的名单是 /var/at/at.deny

7.4 网络管理

7.4.1 关闭不必要的服务

一台计算机可以提供的服务很多,我们要做的是在许可的范围内,尽量减少所提供的服务。许多安全性的问题来自于非第三者 (Third Party) 所提供的软件,如果没有必要就停止这些服务吧。

我们先来看一下目前系统提供哪些服务:

# netstat -a|grep LISTEN
tcp4       0      0  *.http                 *.*                    LISTEN
tcp4       0      0  *.https                *.*                    LISTEN
tcp6       0      0  *.telnet               *.*                    LISTEN
tcp4       0      0  *.telnet               *.*                    LISTEN
tcp6       0      0  *.ftp                  *.*                    LISTEN
tcp4       0      0  *.ftp                  *.*                    LISTEN
tcp4       0      0  *.imaps                *.*                    LISTEN
tcp4       0      0  *.pop3s                *.*                    LISTEN
tcp4       0      0  *.imap                 *.*                    LISTEN
tcp4       0      0  *.pop3                 *.*                    LISTEN
tcp4       0      0  *.smtp                 *.*                    LISTEN
tcp4       0      0  *.ssh                  *.*                    LISTEN
tcp6       0      0  *.ssh                  *.*                    LISTEN

这里所看到的就是目前系统中所提供的服务。我们可以检视一下有没有不必要的服务,并将它移除。最明显的例子是 sendmail,如果我们的系统不提供邮件处理,就将它停掉吧。即使我们要提供邮件服务,也应该限制寄信者的身份或来源地址。一台没有设限的邮件服务器,最后的结果是恶名昭彰,再也没有机器会愿意转送我们发送的信件。如果我们要停止 sendmail,只要在 /etc/rc.conf 中加入下面这一行:

sendmail_enable="NONE"

我们可以使用 sysctl 来设定当外部机器要使用我们没有提供的服务时便记录下来,例如有人尝试扫我们的 port,或者我们没有开放 telnet,却有人尝试从 port 23 连接,在 /var/log/messages 中便会留下记录。这个设定只要执行下列指令:

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

如果要在开机时就启动这个设定,可以将上面二行指令加到 /etc/rc.local 或是在 /etc/sysctl.conf 中加入下面二行:

net.inet.tcp.log_in_vain=1
net.inet.udp.log_in_vain=1

另外,FreeBSD 自从 4.4-Release 起,预设将 telnet 及 ftp 的服务也停止了。原因除了 telnet 本身有漏洞外(己修补),就是这些以明码方式在网络上传送使者账号及密码的服务其实是系统安全的另一个潜在危险。我们可以检视一下 /etc/inetd.conf,发现每一行前面都有批注符号 "#",也就是说目前根本没有任何经由 inetd 启动的服务,我们可以经由 /etc/rc.conf 加入下列这一行来停止 inetd 服务:

inetd_enable="NO"

如果我们必须使用远程登入来管理系统,不要使用 telnet,请使用 ssh。ssh 对于在网络上流动的数据有加密保护,比起 telnet 安全多了。如果真的有必要使用 inetd 来启动某些服务,例如 ftp,建议将使用情形记录下来 。

FreeBSD 安装后,预设会将所有登入成功及失败的记录都写在 /var/log/xferlog 中。因为我们在 /etc/syslog.conf 有下列这一行:

ftp.info                                     /var/log/xferlog

如果您使用的是 FreeBSD 之 4.x 版,您可能要自行编辑 /etc/syslog.conf 并在该档案的最后加入下面这二行:

!ftpd
*.*                                /var/log/xferlog

这个设定会让所有登入成功及失败的记录都写在 /var/log/xferlog 这个档案中,我们必需先手动建立 xferlog 这个档案:

# touch /var/log/xferlog

因为我们已经修改了 /etc/syslog.conf ,所以必须重新启动 syslogd。syslogd 是 FreeBSD 专门记录系统信息的 daemon,您可以使用下列指令重跑 syslogd:

# kill -1 `cat /var/run/syslog.pid`

由于每次使用 ftp 的情形都会被记录下来,为了避免 log 档肥大,我们在 newsyslog.conf 中加入 ftpd.log 的备份移转:

/var/log/xferlog       600  7  100  *  J

另外,对于 ftpd 还有一个小建议,为了避免使用者 ftp 登入后可以到系统所有数据夹,我们最好将使用者的活动范围限制在自己的家目录中,这就叫做 chroot。方法很简单,只要建立一个档案 /etc/ftpchroot,内容为使用 chroot 的使用者名称即可 ,我们会在「FTP 服务器」一章中做更详细的说明。

其它的 inetd 服务,能不用就不要用,尤其是 telnet。如果要管理计算机,我们可以使用 ssh。

除此之外,为了防止一些 DoS (Deny of Service),建议最好把 ICMP 重导向 (redirect) 的封包丢弃,我们可以在 /etc/rc.conf 中加入以下的设定:

icmp_drop_redirect="YES"  # YES 表示丢弃 ICMP REDIRECT 封包
icmp_log_redirect="YES"    # YES 表示将丢弃的封包记录下来

7.4.2 使用 ssh

ssh 是一个好用的软件,FreeBSD 安装预设启动 sshd。我们可以检查一下它是否己启动:

# netstat -a | grep ssh

如果没有,请在 /etc/rc.conf 中加入下面这一行:

sshd_enable="YES"

sshd 预设并未将使用者登入的数据记录下来,不过我们可以修改 /etc/syslog.conf 来记录,请找到 security 的项目,并将它修改成下面这样:

security.*;auth.info                /var/log/security

如此一来,当使用者利用 ssh 登入时,便会记录在 /var/log/security 中。

我们知道 ssh 类似一个加密的 telnet,使用 ssh 以取代 telnet 是一定要的。然而 ssh 还有一个比较少人知道的功能,就是提供加密的 ftp 联机,称为 sftp。

当您启动 ssh 时,预设就已经有提供 sftp 的功能。如果您要在 FreeBSD 中使用 sftp 连到另一台开于 ssh 的机器,可以使用下列指令:

# sftp alex@192.168.0.1

接下来的所有操作就好像一般的 ftp client 一样,您可以任意上传下载档案,而且都是以加密传输喔。如果您要在 Windows 中使用 sftp,您可以下载 Filezilla (http://filezilla.sourceforge.net/)。

7.4.3 TCP Wrapper

对于 inetd 所提供的服务,我们可以使用 TCP Wrapper 来限制 TCP 协议联机来源。让我们来检视一下 /etc/hosts.allow 这个档案:

ALL : ALL : allow

ftpd : localhost : allow
ftpd : .nice.guy.example.com : allow
ftpd : .evil.cracker.example.com : deny
ftpd : ALL : allow

语法:

daemon_list : client_list : option

其中 daemon_list 是我们在 /etc/services 中定义的服务名称,client_list 是来源地址,option 则是我们要给的权限,简单的设定如 allow(允许)、deny(拒绝)。ALL 可以代表所有服务或来源。这个档案的设定是以先入为主 (first match wins) 的方式,也就是以先设定的项目为优先。

在档案开头的地方有一行是 ALL : ALL : allow,表示预设所有服务允许所有来源使用。如果我们要使用 TCP Wrapped,必须先将该行批注,再针对每一个服务来设定开放的权限。以 ftpd 为例,假设除了 bad.cracker.com 以外,其它人都可以使用 ftpd 服务,我们可以这样设定:

ftpd : bad.cracker.com : deny
ftpd : ALL : allow

又如,假设我们的 telnet 只要让 192.168.0.1 及 mydomain.com 网域下的计算机可以使用:

telnetd : 192.168.0.1 .mydomain.com : allow
telnetd : ALL : deny

TCP Wrapped 只针对 TCP 服务,如果我们要功能更强大的防火墙,可以使用 ipfw。

7.4.4 ipfw

ipfw 是 FreeBSD 内附的防火墙软件,它直接针对 IP Layer 来做网络控制,因此可以说是最有效的方法。在使用 ipfw 之前,我们必须先重编核心。关于防火墙的设定,请参考「NAT 及防火墙」一章的说明。

7.5 漏洞修补

FreeBSD 总部会不定期公布己知的安全漏洞,并提供修补方式,我们必须时常到 FreeBSD 的网站注意关于安全性的消息,该网站的位置是 http://www.freebsd.org/security/index.html

连到上述页面后,我们可以看到在 FreeBSD Security Advisories 区段中,有下列项目:

Advisories are always signed using the FreeBSD Security Officer PGP key and are archived, along with their associated patches, at our FTP CERT repository. At the time of this writing, the following advisories are currently available (note that this list may be a few days out of date - for the very latest advisories please check the FTP site):

  • FreeBSD-SA-05:17.devfs.asc
  • FreeBSD-SA-05:16.zlib.asc
  • FreeBSD-SA-05:15.tcp.asc
  • FreeBSD-SA-05:14.bzip2.asc
  • FreeBSD-SA-05:13.ipfw.asc
  • FreeBSD-SA-05:12.bind9.asc
  • FreeBSD-SA-05:11.gzip.asc
  • FreeBSD-SA-05:10.tcpdump.asc
  • FreeBSD-SA-05:09.htt.asc

FreeBSD 5.4-RELEASE released.

  • FreeBSD-SA-05:08.kmem.asc
  • FreeBSD-SA-05:07.ldt.asc
  • FreeBSD-SA-05:06.iir.asc
  • FreeBSD-SA-05:05.cvs.asc
  • FreeBSD-SA-05:04.ifconf.asc

我们可以看到自从 FreeBSD 5.4 release 之后,FreeBSD 公布了 9 个安全性修补,我们可以打开这些连结,并了解这些修补的用途。例如 FreeBSD-SA-05:17.devfs.asc,顾名思义是用来修补 FreeBSD devfs 装置虚拟的档案系统。

我们现在以 FreeBSD-SA-05:17.devfs.asc 来做修补的范例。首先看到这个公告一开头的部份:

FreeBSD-SA-05:17.devfs                              Security Advisory
                                                    The FreeBSD Project

Topic:          devfs ruleset bypass

Category:       core
Module:         devfs
Announced:      2005-07-20
Credits:        Robert Watson
Affects:        All FreeBSD 5.x releases
Corrected:      2005-07-20 13:35:44 UTC (RELENG_5, 5.4-STABLE)
                2005-07-20 13:36:32 UTC (RELENG_5_4, 5.4-RELEASE-p5)
                2005-07-20 13:37:27 UTC (RELENG_5_3, 5.3-RELEASE-p19)
CVE Name:       CAN-2005-2218

For general information regarding FreeBSD Security Advisories,
including descriptions of the fields above, security branches, and the
following sections, please visit
<URL:http://www.freebsd.org/security/>.

这里的信息包含了主旨 (Topic)、分类 (Category)、影响的模块名称 (Module)、公布时间 (Announced)、发现者(Credits)、受到影响的版本(Affects)、已修正的版本(Corrected)、漏洞编号(CVE Name, Common Vulnerabilities and Exposures)。

如果我们的系统是受影响的版本之一,我们必须进行漏洞修补。在上述开头信息之后,会有一些说明,包含这个模块的背景(Background)、问题描述(Problem Description)、所产生的影响(Impact)。我们可以先读一下这个部份,以了解这个漏实际上所带来的影响。

接下来会有避免发生的方法(Workaround)、及解决之道(Solution)。Workaround 的意思是如果不进行修补,我们是否有方法可以避掉这个问题。例如当 CVS 服务器有漏洞时,可能的 workaround 方式是停止 CVS 的运作,而 Solution 是告诉我们下载修补程序的方式及修补方式。以下我们就以这个范例来说明如何进行漏洞修补:

V.   Solution

Perform one of the following:

1) Upgrade your vulnerable system to 5-STABLE, or to the RELENG_5_4,
or RELENG_5_3 security branch dated after the correction date.

2) To patch your present system:

The following patches have been verified to apply to FreeBSD 5.3, and
5.4 systems.

a) Download the relevant patch from the location below, and verify the
detached PGP signature using your PGP utility.

# fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-05:17/devfs.patch
# fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-05:17/devfs.patch.asc

b) Apply the patch.

# cd /usr/src
# patch < /path/to/patch

c) Recompile your kernel as described in
<URL:http://www.freebsd.org/handbook/kernelconfig.html> and reboot the
system.


我们可以选择下列二种方式其中之一来进行修补,第一种方式是将您的 FreeBSD 升级至 5-STABLE、RELENG_5_4、或 RELENG_5_3。第二种方式是我们最常用的方法,也就是下载修补的原始码。通常我们必须依照所使用的 FreeBSD 系统来下载不同版本所使用的补丁。上述范例中,其修补文件分别供 FreeBSD 5.3 及 5.4 使用。

我们以 FreeBSD 5.4 为例,首先,我们必须下载更新档,请使用下列指令下载:

# cd /usr/src
# fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-05:17/devfs.patch

我们将档案下载到 /usr/src 目录下,这个档案是修补的档案,而 devfs.patch.asc 是用来检查 pgp 签名的签名档,如果您不使用 pgp 检查所下载的档案是否正确,您可以忽略这个档案。

我们所下载的 patch 档是将漏洞修补前及修补后的原始码差异存成一个档案,接下来我们必须将这个差异和我们系统中的原始码合并。因此,我们系统中一定要安装 FreeBSD 的原始码,也就是 /usr/src 这个目录下有原始码的数据,如果您在安装 FreeBSD 时并未安装原始码,您可以使用 sysinstall 来安装原始码套件。接下来我们就可以将所下载的档案合并到系统中:

# cd /usr/src
# patch < /usr/src/devfs.patch

最后,依照这个修补档的说明,我们必须重新编译系统核心,请参考「编译核心」一章,并于安装新核心之后重新开机即可。并非所有修补都必须重新编译系统核心,有的修补可能要重新编译其它非核心程序,甚至整个系统,我们必须按照 Solution 的说明执行适当的步骤。

小提示

常常进行漏洞修补是系统管理者一定一定一定要做的事。所以您一定要常常上 FreeBSD 网站看是否有新的 patch 喔。