76 FreeBSD连载:设置基本系统( 七 )


改变程序的根文件系统
当不得不提供一些服务的时候,为了增加安全性,可以考虑提供chroot的服务 。chroot意味着改变运行程序的根文件系统,当一个程序运行在chroot的环境下时,它所了解的文件系统只是chroot设置给它的某级目录开始,它就不能访问这个目录之外文件系统中的内容,使得即使这个程序出现安全问题,也不会影响文件系统中的其他重要数据的安全性 。显然不是每种服务都适合这种形式,有的服务提供访问的文件资源不固定在某个目录下,就不能使用这个形式 。
由于设置一个服务程序使用chroot的时候,它就以为给它指定的目录就是它的根目录,因此它无论访问哪个文件,都将在相对的目录中查找,包括它要访问的重要系统文件 。这样就必须为这个chroot程序建立一个小的,但完全满足其要求的系统目录结构,这个目录将和系统目录结构类似,也具有/etc/、/usr/、/var/、/dev/、/tmp/、/usr/lib/等等,并具备应用程序要访问的相应文件 。
如果程序是动态连接的,就需要/usr/lib目录中存在动态连接库,应用程序还可能会访问/etc目录下的配置文件,/dev目录下的设备文件,以及其他可能的文件 。必须在应用程序的新的根目录下设置所有必须的目录结构和复制需要访问的文件 。当然文件内容可以是系统原来文件的一个子集,而非原有的整个文件,以尽可能的保障安全 。例如服务程序要访问的passwd文件只是系统passwd文件的一部分,等等 。
当chroot的程序需要访问某个用户的口令数据时,就需要将/etc/passwd文件中有关这个用户的内容复制到用户chroot目录下etc子目录下,然而口令文件并不止passwd一个文件,将包括master.passwd,pwd.db及spwd.db 。由于pwd.db和spwd.db使用了数据库形式,就使得复制部分用户数据变得比较困难 。
改变根文件系统的服务程序有两种类型,一种为本身不具备改变根文件系统的能力,但由于不访问过多的文件,能使用系统的chroot命令来启动程序,使其运行在某个目录下 。另一种类型为程序本身就支持这个能力,这样就不需要使用手工使用chroot命令,系统在特定条件下或使用一定参数启动时就自动进行chroot操作 。然而这些类型进行目录设置时需要进行的操作是相同的 。而要设置网络服务所使用的文件环境,就要对该服务程序有详细的了解,这才是最为困难的问题 。
这里以配置改变根文件系统的namd为例,简介设置改变根文件系统的网络服务的步骤,这个设置步骤的原始文档为http://www.psionic.com/papers/dns.HTML(这个适用于OpenBSD和FreeBSD,没有使用Ports Collection,但给了较详细的解释),和http://www.antisocial.net/~modred/papers/named.html(使用了FreeBSD的Ports Collection,给出了详细的步骤) 。以下只着重介绍操作过程,并没有详细给出操作步骤,需要设置chroot named的使用者可以参阅这些相关网页的内容 。
编译静态连接的named和namd-xfer,这需要增加编译连接标志-static,重新编译bind8软件 。这个过程也可以使用Ports Collecion来完成,然而要注意的是使用Ports Collection编译的named和直接编译的named对目录结构的处理有所不同,这将影响后面建立目录结构的处理过程 。使用静态连接的执行程序的好处是不必考虑为chroot环境复制对应的动态连接库,简化了chroot文件系统设置 。
建立chroot目录结构,首先在根目录下建立/chroot/named目录,作为这个服务的根目录,然后在这个目录中建立dev,etc,etc/namedb,usr,usr/libexec,var, var/run等目录,注意这些目录结构是与应用软件中的设置相关的,如果使用Ports Collection定制的named和named-xfer,它使用目录结构是与Bind8的缺省设置不同的,需要建立/usr/local/libexec而非/usr/libexec目录 。

推荐阅读