第四部分 总结
没有绝对安全的网络系统,网络信息对抗是一个长期的研究课题,安全问题是多种多样,且随着时间技术的变化而变化,而黑客的侵入手段也随之不断变化,所以安全防护也是非常重要的,保持清醒正确的认识,同时掌握最新的安全问题情况,再加上完善有效的安全策略,是可以阻止大部分的网络入侵,从而保持最小程度的经济损失。
第五部分 附录
5.1 Free BSD系列
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 o
f Service)。某个坏心的人可以简单的用一个 shell script 同时搞出超过 256 个 connec
tions, 这么一来你的 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, 或是 n
fs server, 那么就没有必要在你的机器上再跑其它的services。但是你一定会问,"我要怎么
控制我的机器啊!?" 嗯嗯, 所以现在要介绍 SSH。你可以透过 SSH (SecureShell) 来登入你
的机器。Secure Shell 当初便是设计来取代 rsh, rlogin 等其它的Berkeley r* 命令。相
信你很快就会了解 SSH 是如何有用,而且开始使用它,来代替其它的程序像是 telnet 和 ft
p。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) 纪录下来的。你还要在 s
yslogd(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