[ 简介 ]
为什么几乎所有关于Solaris安全的书籍和文章都会非常明确地写到:关闭NFS和NIS服务?虽然如此,但有些系统管理员却无法关闭这些服务,因为已经有些网络应用必需它们。虽然NFS和NIS的安全问题存在于其服务结构中,是与生俱来的,然而仍然可以通过一些方法使其变得相对更安全些。
--[ 什么是NFS ]----------------------------
基于RPC(remote procedure call)协议的网络文件系统是由Sun Microsystems公司最早于1980年实现的,用于在异种UNIX操作系统共享文件。NFS的客户端/服务器实现结构使得远程磁盘对于本地客户端是透明可见的。它通过几个守护进程和配置文件来实现文件共享。缺省地,整个过程没有使用独立的认证方法,从而
造成了NFS的安全问题。(参见图1)
NIS NFS
RPC
XDR- External Data Representation
Internet Protocol
Network Transport (e.g. Ethernet)
图 1-NFS协议栈
它是如何工作的呢?由于NFS运行于面向无连接(不需要对传输数据包进行任何确认)的UDP协议上,NFS则试图强迫对它发送的每一个命令进行确认。如果收到确认,则继续发送数据。如果在特定时间内未收到确认,数据将被重传。
NFS不单包括NFS协议,还包括MOUNT协议。这些协议在NFS中以服务器端守护进程的方式实现:rcp.mountd、nfsd和portmap。 mountd进程通知nfsd进程哪些文件系统可以被安装到本地主机中。portmap负责操纵基于rpc的服务。在客户端,nfs的实现由biod、 rpc.statd和rpc.lockd守护进程完成。boid完成在运行着多实例的客户端的性能优化:read-ahead和write- behind。rpc.statd和rpc.lockd负责文件的加锁和解锁。
NFS的一个关键文件是/etc/exports,它定义了哪些共享和对谁是可用的。另一个文件是/etc/fstab,它包含了在客户端上被安装的文件系统列表。
--[ 什么是NIS ]----------------------------
Network Information Service(网络信息服务),通常还称为Yellow Pages(黄页),是一种集中管理系统通用访问文件(如/etc/passwd、/etc/group或/etc/hosts)的分布式数据库系统。 master服务器存放这些文件,而客户端则通过网络访问其中的信息。
在NIS中被访问的信息存放在被称为maps的多个文件中。对于位于中心的master服务器,必须维护所有的maps,而客户端则访问它们。同时还有 slave服务器也保存有备份,这些slave服务器可以处理客户端的map请求访问,但不允许修改maps信息。所有对于maps的修改只能在 master服务器上进行,然后再由master分发到各个slave服务器上。(参见图2)
-----------------Master-----------------
| | |
Slave | Slave
| | |
Client Client Client
图 2-NIS客户端/服务器结构
当一个'+'号被添加到本地文件中时,客户端知道应该去访问NIS系统。同时,/etc/nsswitch.conf文件指定了查询名字服务信息的次序:DNS(域名服务)、NIS或本地文件。
NIS的实现也是通过几个守护进程。ypserv是服务器守护进程,而ypbind是客户端进程以构造NIS请求。maps可以在更新后手工(使用 yppush)传送到slave服务器,或者通过ypxfrd进程自动(slave服务器检查服务器上的时间戳以进行正确的更新)传送。
--[ NFS和NIS的安全问题 ]----------------------------
为什么这两个服务存在如此多的安全问题?在过去几年里,有关这两个服务的安全问题不断被发现,这似乎与其设计有关。NFS使用AUTH_UNIX的认证方法,即非显式信任NFS客户端在服务器的UID(用户ID)和GID(组ID)。对于文件系统共享输出(export)时被明确地指定了允许root用户访问的权限,任何在NFS客户端获取了root权限的攻击者都可能会轻易控制NFS服务器。另外,攻击者通过编写设置UID和GID值的程序,使其有访问 NFS服务器端任何用户的文件。同时,NFS守护进程服务器还不时被发现存在缓冲区溢出漏洞。
NIS服务常见的安全问题有:DoS攻击(在多台客户端上使用finger服务)、缓冲区溢出攻击(libnasl)、NIS maps查询弱认证和其各个守护进程也存在各自的安全问题,等等。此外NIS或netgroups的错误配置也会产生严重的安全问题。任何人均有可能轻易就可以访问NIS数据库。方法?只要猜测NIS域的名字,绑定其客户端到该域,然后运行ypcat命令来获取所需信息。
NFS和NIS都运行在非特权端口上,这意味着系统中的任何用户都能运行它们。如果原先的守护进程程序被恶意程序替换了,攻击者就可以获得分配给这些守护进程的资源的访问权限。
--[ 保护NFS ]----------------------------
要保护NFS,下面的checklist可对保护NFS服务提供帮助
第一步:你首先需要确定安装了最新的NFS补丁。面对漏洞攻击程序的频繁发布,Sun也较快地提供相应的安全补丁程序。第二步:检查NFS的设置。首先检查/etc/exports文件。其中的所有主机和网络组是否都是最新、最正确的?用户和主机有可能会曾经移动或改变,因此经常检验该文件以保证其内容正确是非常重要的。注意检查网络组的正确性。(提示:这些网络组可在/etc/netgroup文件中找到。)
不过,在离开/etc/exports文件前,还有其它项目需要检查。由于文件系统的访问权限也是在这里定义的,所以需要小心检查它们。如果对于一个文件系统未指定任何的访问权限,则存在问题。这意味该文件系统可被任何人从任何地方访问。对于输出共享的文件系统均应明确指定允许访问的主机或网络组,和访问权限(例如只读)。这样使得攻击者要想入侵系统必须突破更多的安全限制。对于该文件还要注意一点:确保NFS服务器不要存在自引用,和指定主机时要使用全称域名(FQDN)。
第三步是确保所有被共享的文件名不超过256字符。当修改完/etc/exports文件后,要记住运行/etc/exportfs使修改生效。然后运行 showmount -e来校验被共享输出的文件系统访问权限。第四步是确保/etc/exports和/etc/netgroups的访问权限为644,属主为root,组用户为root或sys(或适当的组用户)。
第五步是在被输出文件系统机器上运行fsirand,而且在cron服务中设置其周期性自动运行。安装了fsirand的系统会为文件系统生成随机性的节点数值。虽然在运行fsirand前必须先unmount共享的文件系统,这可能会造成一些不便,但它能使恶意攻击者更难以猜测文件句柄。
最后一步是激活NFS的端口监视。在前面我们曾提到NFS缺省时运行在非特权端口。在Solaris系统中可以通过在/etc/system文件中添加以下内容来修补:
set nfssrv:nfs_portmon = 1
这会使NFS服务器仅接受来自特权端口的客户端请求。不要忘了添加该参数后要
重启机器。
--[ 保护NIS ]----------------------------
要保护NIS安全,checklist的第一步也是确定安装了最新的NFS补丁。第二步是了解NIS的结构是如何设置的。如果是在两个或多个网络上运行 NIS服务器,或许应该考虑使NIS服务仅运行于一个网络。其中的原因是对于基于多网络的服务器需要路由功能支持,这样的话任何人都可能绑定到NIS域并读取所有的NIS maps。如果NIS服务器在路由器后运行,则此建议也是适用的。
检查NIS结构的另一个方面是确保NIS maps是否与本地口令文件是相互独立的。这条策略可以使恶意攻击者更难从NIS主服务器获取口令信息。同时要确保root口令也不包含在NIS map。checklist的第三步是检查用户口令强度,即是否符合安全策略?是否过于简单?等等。不符合口令安全策略的口令会破坏NIS安全性,因为恶意攻击者可能通过猜测用户口令来登录到系统中。所以要密切关注用户口令的安全性。
checklist的第四步是检查空口令。这只要运行以下命令即可:
#!/bin/sh
( cat /etc/passwd; ypcat passwd ) | awk -F':' '{if $2 == ""} print $1)' [2]
第五步是确保口令域中'*'的正确使用。在客户端的口令文件中设置如下内容:
+:*:0:0:::
然后试着登录该客户端。正确的结果应该是不能成功登录。然后把"+"号后面的"*"号去掉,此时如果以"+"帐号能和其它NIS用户一样成功登录,则该NIS服务器版本存在安全问题,应下载安装最新补丁。这是旧版本ypbind的一个安全漏洞。
第六步是检查服务器数据库maps是如何创建的。创建DBM文件时可以有一个特定的关键字是YP_SECURE,它可以使NIS服务器仅回答来自特权端口的客户端请求。另外,被信任的主机或网络可在/var/yp/securenets文件中指定,ypserver和ypxfrd会读取该文件。
--[ Netgroups ]----------------------------
netgroups是包含特定主机的限制组,用于限制到特定主机的NFS访问和定义特定域管理员的用户。netgroups可能也是系统管理的讨论焦点,然后如果你真的需要增加对NFS和NIS的攻击难度,那么或许就需要使用它。通过定义netgroups,能够指定文件可以被企业网内什么用户和哪里访问。netgroups的主要数据库存放在NIS主服务器的/etc/netgroup文件中。
如果使用netgroups,注意确保实施以下策略:
* 禁止本地系统rlogin和rsh的使用,特别是对服务器。如果不能禁止,则尽可能限制这些服务的
使用和.rhosts文件的管理。
* 检查/etc/netgroup文件的语法错误。
* 全面测试netgroups中定义的组的访问权限。
另外,要注意文件中的特殊字符:文件中的空白字符有可能意味任何人都能够安装特定的文件系统。主机或用户名的错误拼写也可能造成安全漏洞。
--[ 高级进阶 ]----------------------------
阅读了以上内容,你是否相信NFS和NIS服务安全配置已经足够?下面再做进一步的讨论。
Secure NFS(安全NFS)是使用了Secure RPC(安全RPC)的服务,它集成了DES加密和指数密钥交换,提供普通NFS所没有的认证功能。
NIS+/LDAP NIS+是NIS的最新替代版本,其内嵌了更多的安全功能(虽然不是最好的)。NIS+具有分级结构,而NIS是平面结构,即NIS+拥有更多的访问控制功能。NIS+正在集成到LDAP中,以实现新的服务器服务:ypldapd。
CFS(Cryptographic File System,加密文件系统)由Matt Blaze开发,它将加密服务置于文件系统层,可以说是NFS的替换版本。除基于公共密钥加密功能外,CFS在操作系统中还有包括密钥管理、透明访问、性能优化、可扩展性和可移植性等多个特点。
--[ 结论 ]----------------------------
NFS和NIS服务的不安全性是其固有的,因此它们仍将是未授权访问者的攻击目标之一。然而,如果实施了本文上面讨论的安全技术,NFS和NIS的安全性将得到一定提高。如果仍不能满足安全策略的要求,可以实施在“高级选项”中讨论的一些技术。
--[ 参考文献 ]----------------------------
[1] Practical UNIX Security, Simson Garfinkel and Gene Spafford, O'Reilly and Associates, Inc., 1991
[2] Managing NFS and NIS, Hal Stern, O'Reilly and Associates, Inc., 1991
[3] "Almost Everything You Ever Wanted to Know About Security" (but were afraid to ask!), http://www.nsi.org/Library/Compsec/faq.htm.Maintained by Alec Muffett.
[4] "Solaris Operating Environment Security", Alex Noordergraaf and Keith Watson, Sun BluePrints OnLine, January 2000
[5] UNIX Computer Security Checklist (Version 1.1), AUSCERT,ftp://ftp.auscert.org.au/pub/auscert/papers/unix_security_checklist
[6] "NIS to LDAP Transition: Exploring" Tom Bialaski, Sun BluePrints OnLine, February 2000.
[7] "A Cryptographic File System for Unix", Matt Blaze, AT&T Bell Laboratories, November 1993.