目录
10 安全
10.1 概要
10.2 介绍
10.3 确保FreeBSD 的安全特性
10.4 DES, MD5 和Crypt
10.5 S/Key
10.6 Kerberos
10.7 防火墙
10.8 OpenSSL
10.9 IPsec
10.10 openSSH
=============================================================
第10 章安全
=============================================================
(翻译中出现的任何问题或错误,请广大读者及时反馈给我:freebsdhandbook@163.com)
10.1 概要
这章将对系统安全概念作一个的基本介绍,还有一些通用的好的规则,和一些在
FreeBSD 下的高级主题。这儿提到的许多主题已经很好地应用于系统和Internet 的安全。
确保你的系统安全将保护你的数据,不至于被黑客所窃取。
FreeBSD 提供了许多工具和机制来确保你的系统和网络的安全。
读完这章,你将了解到这些:
. FreeBSD 的基本系统安全概念。
. FreeBSD 中可用的如DES 和MD5 这样的加密(crypt)机制。
. 如何设置S/Key,一种一次性的密码验证机制。
. 如何设置Kerberos,另一种密码验证机制。
. 如何使用IPFW 来创建防火墙。
. 如何配置IPSec。
. 如何配置和使用OpenSSH,FreeBSD 的SSH 执行方式。
在阅读这章之前,你必须了解:
. 了解基本的FreeBSD 和internet 概念。
10.2 介绍
安全是系统管理至始至终最基本的要求。所有的BSD UNIX 系统都有它自身内在的安
全性,建构和维护额外的安全机制,确保用户的“诚实”大概是系统管理最艰巨的工作之一。
机器仅保持着建构时最原始的安全性,而安全性必须要考虑到用户使用的便利性。通常
UNIX 系统能够支持巨大的并发用户处理,而这些处理中绝大部分是以服务器形式处理的----
这意味着外部的实体能够连接和互相交谈。昨天的小型电脑和主机变成了今天的桌面机,电
脑已连到局域网和互联网,安全就成了一个非常严峻的问题。
第1 页FreeBSD 使用手册
通过一个分层的方法,安全能够很好地实现。你所要做的就是创建很多的安全层,然后
仔细地监视系统以防入侵。你不要过多地创建安全层,否则你将会影响检测面。检测是许多
安全机制中最重要的方法。例如,在每一个二进制程序中,很难判断schg 标记,因为这样
会临时地保护二进制,它会妨碍对一个已经侵入的攻击者作一个很容易的检测,以至最终你
的安全机制根本检测不到攻击者。
系统安全也涉及到攻击的许多方面,包括试图摧毁或使一个系统无法使用。安全问题主
要被分成几类:
1, 拒绝服务的攻击;
2, 窃取用户的帐户;
3, 通过最近的服务器窃取root 帐户;
4, 通过用户帐户窃取root 帐户;
5, 创建后门;
拒绝式服务攻击是侵占机器所需资源的一种方法。有代表性的,D.O.S 攻击,是非常残
忍的攻击机制,它通过压倒性的流量来破坏服务器和网络堆栈,试图摧毁机器或使机器无法
使用。一些D.O.S 攻击利用在网络堆栈中的错误,仅用一个简单的信息包就可以摧毁一台机
器。这可以向内核添加一个错误补丁来修复。在一些不利的条件下,对服务器的攻击能够被
修复,只要适当地修改一下系统的选项来限制系统对服务器的负荷。顽强的网络攻击是很难
对付的。例如,一个欺骗性信息包的攻击,无法阻止入侵者切断你的系统与internet 的连接。
它不会使你的机器死掉,但它会把internet 管道塞满。
窃取用户帐户要比D.O.S 攻击更加普遍。许多系统管理员仍然在它们的服务器上运行着
基本的telnetd,rlogind,rshd,ftpd 服务。这些服务器默认情况下,不会通过加密连接来操作。
结果是如果你的系统有中等规模大小的用户,在通过远程登陆的方式登陆到你系统的用户
中,一些人的密码会被人窃取。仔细的系统管理员会从那些成功登陆系统的远程访问日志中
寻找可疑的资源地址。
假定,一个入侵者已经访问到了一个用户的帐户,入侵者就会使超级用户失效。然而,
事实是在一个安全的系统中,访问用户的帐户不应该给入侵者访问root 的权限。这个区别
是很重要的,因为没有访问root 的权限,入侵者是无法隐藏它的轨迹的,但可能不需要做
什么,就可以把用户的文件弄乱或使机器崩溃。窃取用户帐户是很普遍的事情,因为用户往
第2 页FreeBSD 使用手册
往不会对系统管理员的警告采取措施。
系统管理员应该牢牢记住,可能有许多潜在的方法会使root 失效。入侵者可能知道root
的密码,可以在一个以root 权限运行的服务器上找到一个错误(bug),就可以通过网络连
接到那台服务器上使root 失效,或者一旦入侵者已经侵入了一个用户的帐户,可以在自己
的机器上运行一个程序来发现服务器的漏洞,从而让他侵入到服务器使root 失效。如果入
侵者已经找到了方法使root 失效,入侵者就不需要安装一个后门。许多root 漏洞被找到之
后,入侵者会想尽办法去删除日期来清除自己的访问痕迹,所以很多入侵者会安装后门。后
门能给入侵者提供一个简单的重新获取访问系统的root 权限,但它也会给聪明的系统管理
员一个探测入侵的简便方法。认为入侵者不可能安装了后门,这种思想事实上对你的系统安
全是有害的,因为这样他就不会隔离从一开始就侵入系统的黑客发现的漏洞。
安全的管理方法应当使用象剥洋葱皮一样多层次,层层逼近的方法来实现,可以按下面
的方式进行分类:
1, 确保root 用户和其它用户帐户的安全;
2, 确保root 用户---以root 用户权限运行的服务器和suid/sgid 二进制程序的安全;
3, 确保用户帐户的安全;
4, 确保密码文件的安全;
5, 确保内核中内核设备和文件系统的安全;
6, 快速检测系统中发生的不适当的变化;
7, 偏执狂;
这一章的下一节将比较深入地讲述上面提到的每一个条目。
10.3 确保FreeBSD 的安全
下面这节将讲述确保系统安全的方法。
10.3.1 确保root 用户和其它用户帐户的安全
首先,如果你没有确保root 帐户的安全,请不要为确保其它用户的安全而烦恼。绝大
多数系统都会指派一个密码给root 用户帐户。第一件事是假定密码总是不安全。这并不意
味着你要把密码删掉。密码通常对用控制台访问机器是必须的。也就是说,你不应当让它用
到控制台以外的密码,即使是使用su 命令。例如,确信你的pty's 作为不安全的因素已经被
第3 页FreeBSD 使用手册
记录在/etc/ttys 文件中,以至直接通过telnet 或rlogin 登陆root 会不被接受。如果使用(如sshd)
其它的登陆服务,确认直接登陆root 根本不行。考虑到每一种访问方法--(如FTP 服务)通
过cracks 经常失败。直接登陆root 应当只有通过系统控制台被允许。
当然,作为一个系统管理员,你应当获得root 权限,所以我们公开几个漏洞。但我们
确信这些漏洞需要额外的密码确认才能操作。一种成为root 访问的是增加适当用户的帐户
到wheel 组(在/etc/group 中)。Wheel 组中的用户可以使用su 命令来访问root。在它们的密
码登陆口,通过把它们放置在wheel 组中,你就永远不会给用户成员访问本地wheel 的权限。
用户帐户应当被放置在staff 组中,然后通过/etc/group 文件加入到wheel 组。事实上,那些
需要访问root 的用户成员将会被放置在wheel 组中。当然也会有可能,用一个如kerberos
的认证方法。在root 帐户中使用kerberos 的.k5login 文件,可以不需要把任何人放置在wheel
组中就允许ksu 访问root.如果入侵者已经获得了密码文件,或者已侵入了一个用户帐户,这
可能是一个比较好的解决方法,因为wheel 机制仍然可能会使入侵者break root。虽然wheel
机制要什么都没有要好得多,但它也不是最安全的选择。
确保超级用户帐户安全的间接方法是通过使用一个有选择性的登陆访问方法确保你的
用户帐户的安全。这样做,入侵者可能会偷窃到密码文件,但不会侵入任何用户帐户。用户
成员通过使用一对私有或公共密匙(如kerberos 或ssh)的安全机制来进入它们的帐户。当
你使用kerberos 时,你必须确保使用kerberos 的服务器或工作站的安全。当你使用一对ssh
的公共/私有密匙系统,你必须确保你所登陆的那台机器的安全,但当你用ssh-keygen 创建
它时,你可以添加一个额外的保护层到你的钥匙对中。你可以强制所有的用户成员使用加密
的方法连接它们的活动,这样就可以关闭可能会被入侵者使用的一个重要漏洞:将一个毫无
关系,很不安全的机器与网络隔离。
更多间接的安全机制能够被实现。你可以从一个带有限制性的服务器到一个毫无限制性
的服务器进行登陆。例如,如果你的主邮箱运行在所有种类的服务器上,那你的工作站就无
法运行任何东西。为了确保你工作站的安全,尽可能少运行服务器,直到根本就没有服务器
运行,然后运行一个受密码保护的屏保。当然,一个入侵者强行访问你的工作站,它就会把
你所设置的所有安全特性都破坏掉。有一个问题必须明确,你必须考虑到这样一个事实,绝
大多数入侵是从那些没有物理访问工作站或服务器权限的人那里,通过一个网络来侵入的。
使用象kerberos 这样的技术,也会让你无法使用系统,或者改变用户帐户的密码,从而影响
到拥有一个帐户的所有用户成员。如果一个用户成员的帐户已经失去安全,应当改变它在所
有机器上的密码。对于不连续的密码,在n 台机器上改变一个密码可能是很乱的。你可能要
第4 页FreeBSD 使用手册
用kerberos 重建密码的限制:一张kerberos 的许可证可能一段时间后会过期,但kerberos 系
统可能要求用户在一段时间以后选择一个新密码(一般是一个月)。
10.3.2 确保以root 权限运行的服务器和suid/sgid 二进制程序的安全
谨慎的系统管理员只运行他需要的服务器,不多也不少。要清醒地认识到第三方的服
务器经常有很多的错误。例如,运行一个老版本的imapd 或popper,就象是给出了一个通用
的root 帐号来访问外部世界。运行每一个服务器,你都要仔细地检查。许多服务器不一定
需要用root 来运行。例如,ntalk, comsat, 和finger 守护程序可能运行在一个特殊的用
户sandboxes 上。一个sandbox 是不完全的,除非你遇到了许多问题,但安全的层级模式
仍然支持:如果能够通过运行在一个sandbox 上的一个服务器侵入,他们仍然必须要攻破
sandbox。攻击者必须通过很多的安全层,这样他侵入的可能性就很小了。过去已经找到了
很多root 的安全漏洞,包括基本的系统服务器。如果你运行着用户通过sshd 来登陆而从
不用telnetd 或rshd 或rlogind 来登陆的服务器,你最好把这些服务器关掉。
现在,FreeBSD 默认在sandbox 中运行ntalkd, comsat,和finger。还有一个叫做named
的程序。/etc/defaults/rc.conf中包含了运行named 的选项,但被注意掉了。无论你是在
安装一个新的系统,还是升级一个已存在的系统,被这些sandboxes 使用的特殊用户帐号
可能没有被安装。谨慎的系统管理员无论何时都要认真研究和执行sandboxes。
有许多其他的服务器通常不能运行在sandboxes 中:sendmail, popper, imapd, ftpd,
和其他一些。你可以选一些,但安装它们可能需要你做很多工作。你可能必须以root 来运
行这些服务器,然后依靠其他的机制来检测可能通过他们进行的侵入活动。
其他比较大的潜在的root 漏洞是安装在系统中的suid-root 和sgid 程序。这些程序,
象rlogin,都放在/bin, /sbin, /usr/bin,或/usr/sbin 中。当然,世上没有100%的安全,
系统默认的suid 和sgid 程序可能认为是比较安全的。
另外,root 漏洞有时候能在这些程序中找到。在1998 年在xterm 的Xlib 中的一个root
漏洞被发现。谨慎的系统管理员需要限制suid 的程序,只有指定的人可以运行,指定人所
在的特殊组可以访问,其他人都不能使用。一台没有显示器的服务器通常不需要一个xterm
程序。
Sgid 程序可能也会有危险。如果一个入侵者能够攻破sgid-kmem 程序,入侵者就可以
第5 页FreeBSD 使用手册
读到/dev/kmem,因而可以读到crypted 密码文件,从而危及到受密码保护的帐户的安全。
另外,一个侵入组kmem 的入侵者可以通过pty's 来监测到击键的情况,包括通过安全方
法登陆的用户的情况。一个侵入tty 组的入侵者可以写入几乎任何用户的tty。如果用户正
在运行一个终端程序或带有键盘模拟特性的模拟器,入侵者可以偷偷地发送一个数据流来
使用户的终端显示一个命令,然后就以那个用户的身份来运行。
10.3.3 确保用户帐户的安全
用户的帐户通常是很难确保安全的。当你用严格的访问限制来约束你的用户时,你不
可以使用你有的普通用户帐户来这样做。如果你有充分的控制,那你可以确保用户帐户的
安全。如果没有,你必须时刻警惕地监视那些帐户。为用户的帐户使用ssh 和kerberos 可
能会有问题,需要额外的管理和技术支持,但与crypted 密码文件相比仍是一个比较好解决
方案。
10.3.4 确保密码文件的安全
唯一的确保安全的方法是用*号来代替输入的密码,使用ssh 或kerberos 来访问那些帐
户。即使crypted 密码文件(/etc/spwd.db)只能被root 读取,入侵者可能无法获得root 写
的权限,但也可能会获得读的权限。
你的安全脚本必须经常检查和报告密码文件的修改情况。
10.3.5 确保内核核心,Raw 设备和文件系统的安全
如果一个入侵者攻破root,他就可以做任何事情。例如,绝大多数现代内核都有一个
包来探测内建的设备启动器。在FreeBSD 下,它被叫做bpf 设备。一个入侵者通常会试图
在一台不安全的机器上运行一个包探测器。所以,绝大多数系统都不把bpf 设备编译进内
核。
但即使你关闭了bpf 设备,你仍然可能会对/dev/mem 和/dev/kmem 担心。因为,入侵
者仍可以写到raw 磁盘设备。另外,还有另一个叫做module loader 的内核特性,kldload。
一个入侵者可以在运行内核时使用一个KLD module 来安装它自己的bpf 设备,或其他检测
设备。
第6 页FreeBSD 使用手册
要避免这些问题,你必须在更高安全级别上运行内核,至少在securelevel 1 上。
Securelevel 可以在kern.securelevel 变量上用sysctl 来设置。一旦你把securelevel 设
置成1,对raw 设备的写入操作将被拒绝,特殊的chflags 标记如schg 将被强迫执行。你
必须保证schg 标记被设置在特定的启动程序,目录和脚本文件上。这样做可能有点夸大了。
当你在一个安全性比较高的水平上操作时,升级系统可能比较困难。
你可以折中一下,将系统运行在一个安全性更高的水平上,但不对每个系统文件和目
录设置schg 标记。另外一个方法是简单地将/ 和/usr 设为只读。这样就可以阻止所有重要
的侵入检测了。
10.3.6 检查文件的完整性:程序,配置文件等
你需要保护你的核心系统配置和控制文件。例如,在/和/usr 中的绝大多数文件上使用
chflag 来设置schg 位可能达不到预期的目标,因为当它保护文件的时候,它也会关闭一个
检测窗口。你安全层的最后一层也许是最重要的检测层。如果你不能检测到潜在的入侵,
你安全层的其余部分可能就没有用了。你的工作是要让入侵者慢下来,而不是阻止它,以
便寻找时机抓住它。
检测入侵的最好方法是寻找有没有修改,丢失或不需要的文件。寻找修改文件的最好
方法是来自另一个访问受限制的系统。在一个特别的访问受到限制的系统上写上你的安全
脚本使得入侵者不可见,这一点很重要。为了集中优势,你通常必须使用有限访问的机器
来访问其他机器,通常是执行一个其他机器的只读NFS 输出到有限访问的机器,或通过设
置ssh 钥匙对来允许有限访问的机器ssh 到其他机器。除了它的网络传输,NFS 是很少用的
方法---允许你监视每个客户机的文件系统。
如果你的有限访问服务器通过一个switch 来连接到客户机,NFS 方法是比较好的选择。
如果你的有限访问服务器是通过一个hub 或通过几层的路由连接到客户机,NFS 方法可能很
不安全,使用ssh 可能是更好的选择。
一旦你使用一个访问受限制的机器,至少需要能读取客户系统,你必须写一些脚本来
执行实时的检测。挂上NFS 之后,你可以用find 和md5 这样的工具。至少每天一次物理地
md5 客户机文件。当发现匹配错误时,会发出“尖叫声”提示系统管理员去检查。一个安全
脚本也会检查不适当的suid 程序和系统分区上新增或删除的文件。
第7 页FreeBSD 使用手册
当使用ssh 而不是NFS 时,写入安全脚本是很困难的。为了运行它们,你必须scp 脚
本到客户机上,使它们看得见,为了安全你也必须scp 那些脚本使用的程序。在客户机上
的ssh 程序已经有安全问题了。总的来讲,当通过不安全的连接运行时,使用ssh 可能是
必须的,但它也比较难处理。
一个好的安全脚本将通过访问配置文件来检查用户的变
化:.rhosts, .shosts, .ssh/authorized_keys。它已经超出了MD5 检查的范围。
如果你有一个巨大的磁盘空间,它可能需要花很长时间来检查每个文件。在这种情况
下,设置挂载标记来不接受suid 程序和设备在那些分区上是一个好主意。nodev 选项nosuid
选项正是你所看到的。你可以把它们扫描一下,至少一个星期一次。
处理帐户是操作系统的一个相关特性,它可以作为一个post-break-in 的评价机制。
它在跟踪入侵者是如何侵入系统的时候特别有用.
最后,安全脚本应当处理日志文件。一个入侵者设法掩盖自己的踪迹,日志文件可以
指示系统管理员设法追踪到最初侵入的时间和方法。确保日志文件持久记录的日志文件的
一个方法是运行系统控制台到一个串行口,通过持续不断地检测控制台来收集信息。
10.3.7 偏执狂
带点偏执可能不会有伤害。作为一个惯例,一个系统管理员需要添加许多安全特性,
并且尽可能地不影响到使用的便利性。更重要的是一个安全系统管理员应当经常修复漏洞。
10.3.8 拒绝式服务攻击(DoS)
这节将介绍拒绝式服务攻击。一个DoS 攻击通常是一个包攻击,它可以使你的网络瘫
痪。你应当做一些限制,让攻击不会瘫痪你的服务器。
1. 限制服务器的forks.
2. 限制跳板springboard 攻击(ICMP response attacks, ping broadcast, etc.)。
3. 内核通道的缓存。
一个普通的DoS 攻击通常试图让服务器吃掉所有进程,文件描述和内存,直到机器死
机。inetd 有好几个选项可以来限制这种攻击。需要注意的是当无法阻止一个服务被攻击所
打断时,可以阻止一台机器当机。阅读一下inetd 的联机手册,特别需要注意-c, -C, 和
第8 页FreeBSD 使用手册
-R 选项。注意,哄骗式的IP 攻击可以饶过[1] [url=http://www.chinamx.com.cn/Article/os/FreeBSD/200605/20060530181859_31918_2.html][2] [3] [4] 下一页