joewu692
|
分享:
▼
x0
|
[FreeBSD][转载] FreeBSD 系统安全
确保 root 用户和所有用户帐户的安全 首先,如果没有确保 root 帐户的安全,请不要为确保所有用户的安全而烦恼。绝大 多数系统都会指派一个密码给 root 用户帐户。第一件事是假定密码总是不方便。这并不意 味着要把密码删掉。密码通常对用控制台访问机器是必须的。也就是说,不应当让所有用户轻易 到控制台访问机器,即使是使用 su 命令。例如,确信 pty's 作为不安全的因素已经被 记录在 /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 机制要什么都没有要好得多,但它也不是最安全的选择。
员工帐号和 root 帐号的密码档案存在 /etc/master.passwd , 而一般没有设定密码会出现 * 可以 man vipw 查看这个部份的资料。 使用 vipw 可以修改更新所有相关权限和使用者的资料库。
一般员工帐号:
foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh 可以修改为:
foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh 确保超级用户帐户安全的间接方法是通过使用一个有选择性的登入访问方法确保 用户帐户的安全。这样做,入侵者可能会偷窃到密码档,但不会侵入任何用户帐户。用户 成员通过使用一对私有或公共密匙(如 kerberos 或 ssh)的安全机制来进入。当 使用kerberos 时,必须确保使用 kerberos 的伺服器或工作站的安全。当使用一对ssh 的公共/私有密匙系统,必须确保所登入的那台机器的安全,但当用 ssh-keygen 创建 时,可以添加一个额外的保护层到钥匙对中。可以强制所有的用户成员使用加密 的方法连接活动,这样就可以关闭可能会被入侵者使用的一个重要漏洞:将一个毫无 关系,很不安全的机器与网路隔离。
更多间接的安全机制能够被实现。可以从一个带有限制性的伺服器到一个毫无限制性 的伺服器进行登入。例如,如果主邮箱运行在所有种类的伺服器上,那工作站就无 法运行任何东西。为了确保工作站的安全,尽可能少运行伺服器,直到根本就没有伺服器 运行,然后运行一个受密码保护。当然,一个入侵者强行访问工作站,就会把 所设置的所有安全特性都破坏掉。有一个问题必须明确,必须考虑到这样一个事实,绝 大多数入侵是从那些没有物理访问工作站或伺服器许可权的人那里,通过一个网路来侵入的。 使用象 kerberos 这样的技术,也会无法使用系统,或者改变用户帐户的密码,从而影响 到拥有一个帐户的所有用户成员。如果一个用户成员的帐户已经失去安全,应当改变它在所 有机器上的密码。对于不连续的密码,在 n 台机器上改变一个密码可能是很乱的。可能要 用 kerberos 重建密码的限制:一张 kerberos 的许可证可能一段时间后会过期,但 kerberos 系 统可能要求用户在一段时间以后选择一个新密码(一般是一个月)。
确保以 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 程式,入侵者就可以 读到 /dev/kmem,因而可以读到 crypted 密码档,从而危及到受密码保护的帐户的安全。 另外,一个侵入组 kmem 的入侵者可以通过 pty's 来监测到击键的情况,包括通过安全方 法登陆的用户的情况。一个侵入 tty 组的入侵者可以写入几乎任何用户的 tty。如果用户正 在运行一个终端程式或带有键盘类比特性的模拟器,入侵者可以偷偷地发送一个资料流程来 使用户的终端显示一个命令,然后就以那个用户的身份来运行。
确保用户帐户的安全 用户的帐户通常是很难确保安全的。当用严格的访问限制来约束用户时,不 可以使用普通用户帐户来这样做。如果有充分的控制,那可以确保用户帐户的 安全。如果没有,必须时刻警惕地监视那些帐户。为用户的帐户使用 ssh 和 kerberos 可 能会有问题,需要额外的管理和技术支援,但与 crypted 密码档相比仍是一个比较好解决 方案。
确保密码档的安全 唯一的确保安全的方法是用 * 号来代替输入的密码,使用 ssh 或 kerberos 来访问那些帐 户。即使 crypted 密码档(/etc/spwd.db)只能被 root 读取,入侵者可能无法获得 root 写 的许可权,但也可能会获得读的许可权。
安全脚本必须经常检查和报告密码档的修改情况。(看Checking file integrity这里).
确保内核核心,Raw 设备和档系统的安全 如果一个入侵者攻破 root,就可以做任何事情。例如,绝大多数现代内核都有一个 包来探测内建的设备启动器。在 FreeBSD 下,它被叫做 bpf 设备。一个入侵者通常会试图 在一台不安全的机器上运行一个包探测器。所以,绝大多数系统都不把 bpf 设备编译进内 核。
但即使关闭了bpf 设备,仍然可能会对 /dev/mem 和 /dev/kmem 担心。因为,入侵 者仍可以写到 raw 磁片设备。另外,还有另一个叫做 module loader 的内核特性,kldload。 一个入侵者可以在运行内核时使用一个 KLD module 来安装它自己的 bpf 设备,或其他检测设备。 要避免这些问题,必须在更高安全级别上运行内核,至少在 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 程式和系统分区上新增或删除的档。
当使用 ssh 而不是 NFS 时,写入安全脚本是很困难的。为了运行,必须 scp 脚 本到客户机上,使看得见,为了安全也必须 scp 那些脚本使用的程式。在客户机上 的 ssh 程式已经有安全问题了。总的来讲,当通过不安全的连接运行时,使用 ssh 可能是 必须的,但也比较难处理。
一个好的安全脚本将通过访问配置档来检查用户的变 化:.rhosts, .shosts, .ssh/authorized_keys。已经超出了 MD5 检查的范围。 如果有一个巨大的磁碟空间,可能需要花很长时间来检查每个档。在这种情况 下,设置挂载标记来不接受 suid 程式和设备在那些分区上是一个好主意。nodev 选项 nosuid 选项正是所看到的。可以扫描一下,至少一个星期一次。
处理帐户是作业系统的一个相关特性,可以作为一个 post-break-in 的评价机制。 在跟踪入侵者是如何侵入系统的时候特别有用.
最后,安全脚本应当处理日志档。一个入侵者设法掩盖自己的踪迹,日志档可以 指示系统管理员设法追踪到最初侵入的时间和方法。确保日志档持久记录的日志档的 一个方法是运行系统控制台到一个串列口,通过持续不断地检测控制台来收集资讯。
偏执狂 带点偏执可能不会有伤害。作为一个惯例,一个系统管理员需要添加许多安全特性, 并且尽可能地不影响到使用的便利性。更重要的是一个安全系统管理员应当经常修复漏洞。
拒绝式服务攻击(DoS) 这节将介绍拒绝式服务攻击。一个 DoS 攻击通常是一个包攻击,它可以使网路瘫 痪。应当做一些限制,让攻击不会瘫痪伺服器。
限制伺服器的forks.
限制跳板springboard 攻击(ICMP response attacks, ping broadcast, etc.)。
内核通道的缓存。
一个普通的 DoS 攻击通常试图让伺服器吃掉所有进程,档描述和记忆体,直到机器死 当。inetd 有好几个选项可以来限制这种攻击。需要注意的是当无法阻止一个服务被攻击所 打断时,可以阻止一台机器当机。阅读一下 inetd 的手册,特别需要注意 -c, -C, 和 -R 选项。注意,哄骗式的 IP 攻击可以饶过 inetd 的-C 选项。所以,最好一起使用这些选项。
Sendmail 有一个 -OMaxDaemonChildren 选项,往往要比 sendmail 的负载限制选项工 作得好。必须指定一个 MaxDaemonChildren 参数,当启动 sendmail 时,可能期望有 很高的负载,但电脑无法处理这么高的负载。在伫列模式运行 sendmail 时要非常谨慎 (-ODeliveryMode=queued)。如果在一个很短的时间间隔内即时分发运行的伫列,如 -q1m,一定要为 sendmail 指定一个合适的 MaxDaemonChildren 选项以免发生错误。 Syslogd 可能会被直接攻击,强烈建议使用 -s 选项,或 -a 选项。也应当注意象 tcpwrapper 的 reverse-identd 这样的后台连接服务,可以被直接攻击。因为这个原因, 通常不要使用tcpwrappers 的reverse-ident 特性。
在路由器上设置一道防火墙来隔离内部网路与外部网路之间的连接是非常好的安 全方法。这样可以阻止内部网路受到来自外部网路的攻击。 这个方法可以阻断除了指定的如 named, ntalkd, sendmail 这样的服务以外的低级 埠。如果设法使用另外方法来配置防火墙,可能会忘记关闭一对服务,或添加了 一个新的内部服务而忘记了升级防火墙。
也可以在防火墙上打开比较高的埠范围,允许有许可性质的操作,而不会危及 低级埠的安全。FreeBSD 允许控制用来动态绑定的埠号码的范围,通过不同的 net.inet.ip.portrange sysctl's(sysctl -a | fgrep portrange),将会减轻防火墙 配置的复杂性。例如,可以使用普通的4000 到5000 埠范围,以及更高的49152 到 65535 埠范围,然后隔断4000 以下的埠。
另一个普通的 DoS 攻击叫做 springboard 攻击-会让伺服器不断产生回应,最终导 致伺服器,本地网路或另外机器超载。最普通的攻击是 ICMP ping broadcast attack。 攻击者欺骗性地用源 IP 位址向 LAN 广播位址发送 ping 资料包到希望攻击的 实际机器。如果路由器无法阻止 ping 广播地址, LAN 就会对每个欺骗性的请 求产生回应,从而侵占大量的网路资源,特别是当攻击者使用同样的欺骗手段用几十个广 播位址从几十个不同的网路进攻时。
超过120MB 的广播攻击是常用的。另外一个普通的攻击是针对 ICMP 错误报告系统的。 通过产生资料包来形成 ICMP 错误请求,一个攻击者可以侵占一个个伺服器的输入网路,使 得伺服器用 ICMP 请求占满输出网路。如果伺服器不能很快地处理 ICMP 请求的话,这 种类型的攻击也可以使伺服器瘫痪。FreeBSD 内核有一个叫做 ICMP_BANDLIM 的新的内核选 项,可以限制这些埠攻击的效率。这种跳板类的攻击是与象这样的 udp echo 服务的某 个内部 inetd 服务有关的。
一个攻击者只要简单地用成为伺服器 A 的 echo 埠的源位址和成为伺服器 B 的 echo 埠的目的地址来哄骗一个 UDP 资料包。两个伺服器就来回地弹发资料包。攻击者只要发 送几个这种类型的资料包就可以使伺服器和内部网瘫痪。类似的问题也存在于内部 chargen 埠。一个熟练的系统管理员会关闭所有这些内部的 inetd 测试服务。 哄骗式资料包攻击也可以被用来是内核路由缓存超载。可以参考一下 net.inet.ip.rtexpire, rtminexpire, 和 rtmaxcache sysctl 参数。随意使用一个源 IP 进行的哄骗式的资料包攻击将使内核在路由表中产生一个临时的高速缓冲路由,可以用 netstat -rna | fgrep W3 检查一下。这些路由大约会超时1600 秒。如果内核检测到缓冲 路由表太大,它将动态地减少 rtexpire,但不会小于 rtminexpire。有两个问题:
当一个负载量很小的伺服器突然受到攻击时,内核没有很快地回应。
由于 rtminexpire 太小而无法抵抗住一个持续不断的攻击。
如果你的伺服器通过 T3 或更高速度的线路连接到 internet,可能需要通过使用 sysctl 来手动地调整 rtexpire 和 rtminexpire。千万不要把参数设为0(除非想要摧毁机器)。 把参数设为 2 秒对于保护路由表免受攻击是非常好的。
使用 Kerberos 和 SSH 登入问题 如果打算使用的话,在 kerberos 和 ssh 之间有好几个问题需要记住。Kerberos V 是一个非常卓越的验证协议,但在加密 telnet 和 rlogin 应用程式时会有一些错误,可能 会不太适合处理二进位资料流。另外,默认的 kerberos 也无法加密一个会话,除非 使用-x 选项。ssh 默认能加密任何东西。
建议无论用户什么时候登入系统,都可以结合 kerberos 来使用 ssh。ssh 可以在 编译时加入对 kerberos 的支持。也建议在 ssh 配置中关闭 key-forwarding,或者在 authorized_keys 档中使用 from=IP/DOMAIN 选项使得只有用作实体的密匙可以从特殊 机器登陆进系统。
|