系统安全是每个管理者都必须注重的课题。有人说:「没有不安全的系统,只有懒惰的管理者。」每个系统都有可能会出现漏洞,而有安全性的漏洞产生时,发行的单位都会立即发布通告及修补的方式,而系统管理者的职责便是要随时注意是否需要更新漏洞、随时注意
系统安全是每个管理者都必须注重的课题。 有人说:「没有不安全的系统,只有懒惰的管理者。」每个系统都有可能会出现漏洞,而有安全性的漏洞产生时,发行的单位都会立即发布通告及修补的方式,而系 统管理者的职责便是要随时注意是否需要更新漏洞、随时注意系统是否有异常的讯息。
本章将针对 FreeBSD 系统安全做详细的说明,读完本章后,您将可以了解下列主题:
•基本系统管理应注重的安全项目。
•如果安全的管理账号。
•网络安全管理。
•如何进行漏洞修补。
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 中进行安装后才可以使用喔。
系统安全并不局限在如何防止他人入侵,对于防止系统内部问题的产生一样重要。主要的概念就是要让我们的系统能正常的提供服务,并且对于我们不想让他人取得 的信息加以保护。然而,为了系统安全往往必须限制某些功能的使用,而牺牲了便利性。身为系统管理者往往因为对于系统限制太多而受到来自使用者的抱怨,在取 舍上本来就不是件容易的事。正因为如此,一个尽责的管理者在行事上必须具有高度的抗压性及对安全性的偏执。
由于系统安全十分重要,我们在开始说明各种软件安装、服务器架设之前,先说明系统安全应注意的事项,希望读者在读完本章之后,能对系统安全更有概念。
2 系统管理
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 等。
2.2 降低安装软件的风险
我们可以在网络上找到许多免费的软件,这些软件固然可以让我们在系统的使用上更加便利,但却难保它们不会对系统安全造成任何危害。有的软件可能存在某些漏 洞,即使在我们安装前尚无任何安全性的问题,日后还是有可能会被人发现软件的缺陷。因此,我们应该尽可能不要安装一些杂七杂八的软件,而安装之后,一发现 有安全性问题也要随时更新。 基本上,要下载软件时,最好到该软件的官方网站下载,以确保安全。
并非所有软件都是正确无误的,请不要直接在重要的服务器上安装一套新的软件,最好先在较不重要的计算机上测试,没问题后再安装。另外,在安装软件 时,应注意软件取得来源是否可靠。如果软件提供 MD5 或 PGP 的检查,最好下载后先检查,再解压缩。而安装软件时,最好取得软件的原始码来编译 (或使用 port 安装),我们可以浏览程序代码,以了解其架构。阅读 Makefile 的内容,了解软件将安装的确认位置,先确保程序不会在不该出现的地方产生。
2.3 kernel Security Level
FreeBSD 中有所谓的 Security Level,它掌控了系统核心的行为运作。只有超级使用者可以使用指令提高 Secruity Level,但不能降低它。如果要降低它必须在 rc.conf 中设定,并重开机。以下为各 Secruity Level 的意义:
•-1:永远不安全模式。这是默认值,如果设为 -1,它将永远以 level 0 的模式执行。
•0:不安全模式。使用者或 root 可以使用 chflags 来移除「不可更动 ( immutable)」及 「只能附加 (append-only)」的 flags。所有的装置只能依其权限来存取。
•1:安全模式。不可以移除「不可更动 ( immutable)」及 「只能附加 (append-only)」的 flags。不可以手动加载或移除 LKM,使用, /dev/mem, and /dev/kmem 只能为只读,且不能 newfs 已挂上的档案系统。
•2:高度安全模式。除了和安全模式同样的限制外,不管硬盘是否挂上,都不可以 newfs。另外,kernel time 的改变限制在一秒内,如果超过,会记录 “Time adjustment clamped to +1 second”。
•3:网络安全模式。除了和安全模式同样的限制外,还有 IP 封包过滤的规则 (参考 ipfw 及 ipfirewall),而且不可以调整 dummynet 的设定。
我们可以使用 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
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。
2.5 数据的保全
UNIX 系统的安全防护中,第一道防线是计算机实体的安全防护,防止不相干的人接触计算机及周边设施。如果很不幸的,外人可接近系统时,第二道防线是系统密码保 护,我们将在下一章说明账号的防护。然而,如果密码泄露或被破解,还有第三道防线,就是在 UNIX 系统中的使用者权限及档案权限控制。如果某一个使用者账号遭到入侵,我们能限制其活动范围及资源的存取。而第四道防线就是将重要的数据加以编码保护,即使 数据被使用者窃取,至少还多一道防护措施。而最后一首防线就是数据备份了,我们平时应该有完善的备份计划,一旦系统发生错误或是被摧毁,至少还可以复原。
我们先来谈谈数据编码加密的方法,我们可以使用 crypt 这个指令来为我们的档案加密。例如,有一个档名为 myfile.txt 的档案,我们使用的金钥 (key)是 mykey 这个字符串,加密后的文件名为 myfile.cyp,可以使用下列指 令:
# crypt mykey myfile.cyp加密后,就可以将 myfile.txt 删除。如果日后要解密,只要执行下列指令:
# crypt mykey myfile.outcrypt 是一个历史悠久的编码软件,实际上并非十分安全,不过我们可以多加密几次,让档案加密后再加密,只要记得所使用的 key 就好了:
# crypt mykey1 myfile.cyp如果要解密,只要再反过来即可:
# crypt mykey3 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
, 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
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.