21.6. 在 chroot jail 中运行 ISC BIND/DNS

chroot jail 的主要优点是,它可以将 DNS 守护程序能够访问的文件系统部分限制在 jail 的根目录中。 此外,由于 jail 只需要支持 DNS,因此 jail 中可用的与 ISC BIND/DNS 相关的程序可以非常有限。 最重要的是,不需要 setuid-root 程序,这些程序可能被用来获取 root 访问权限并逃脱 jail。

Important: named 二进制程序必须位于您的PATH环境变量中列出的目录中,这样才能工作。 在本文档的其余部分,我将假设您的原始 named 程序的路径是/usr/sbin/named.

以下是在 chroot jail 中运行 ISC BIND/DNS 软件的必要步骤

我们必须找到 named 的共享库依赖项,named 是 DNS 守护程序。 这些稍后需要复制到 chroot jail 中。

  1. 要查找 named 的共享库依赖项,请执行以下命令
     [root@deep] /# ldd /usr/sbin/named
     libc.so.6 => /lib/libc.so.6 (0x40017000)
     /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 
     

  2. 记下上面列出的文件; 在我们后面的步骤中您将需要它们。

现在我们必须设置 chroot 环境,并创建 jail 的根目录。 我们选择了/chroot/named因为我们想将其放在其自身独立的文件系统上,以防止文件系统攻击。 在我们 Linux 安装过程的早期,我们创建了一个特殊的分区/chroot用于此目的。

  1.      [root@deep] /# /etc/rc.d/init.d/named stop (1) 
     

    (1)
    仅当现有 named 守护程序正在运行时才需要。
    
     Shutting down named:                              [  OK  ]
     
     [root@deep] /# mkdir -p /chroot/named
     

  2. 接下来,按如下方式创建其余目录
     [root@deep] /# mkdir /chroot/named/dev
     [root@deep] /# mkdir /chroot/named/lib
     [root@deep] /# mkdir /chroot/named/etc
     [root@deep] /# mkdir -p /chroot/named/usr/sbin
     [root@deep] /# mkdir -p /chroot/named/var/run
     [root@deep] /# mkdir /chroot/named/var/named
     

  3. 现在将主配置文件、区域文件、named 和 named-xfer 程序复制到 chroot jail 目录中的适当位置
     [root@deep] /# cp /etc/named.conf /chroot/named/etc/
     [root@deep] /# cd /var/named ; cp -a . /chroot/named/var/named/
     [root@deep] /# mknod /chroot/named/dev/null c 1 3
     [root@deep] /# chmod 666 /chroot/named/dev/null
     [root@deep] /# cp /usr/sbin/named /chroot/named/usr/sbin/
     [root@deep] /# cp /usr/sbin/named-xfer /chroot/named/usr/sbin/
     

    Important: 的所有者/chroot/named/var/named目录和此目录中的所有文件必须是 named 进程名称在服务器下,并且只有服务器,否则您将无法进行区域传输。

  4. 为了使named目录及其所有文件归 named 进程名称在服务器下所有,请使用命令
     [root@deep] /# chown -R named.named /chroot/named/var/named/
     

将上面标识的共享库复制到 chrooted lib 目录
 [root@deep] /# cp /lib/libc.so.6 /chroot/named/lib/
 [root@deep] /# cp /lib/ld-linux.so.2 /chroot/named/lib/
 

复制localtimensswitch.conf文件到 chrootedetc目录,以便日志条目能够正确地针对您的本地时区进行调整
 [root@deep] /# cp /etc/localtime /chroot/named/etc/
 [root@deep] /# cp /etc/nsswitch.conf /chroot/named/etc/
 

我们必须设置一些文件在/chroot/named/etc目录下,并启用 immutable bit 以获得更好的安全性

  1. 设置 immutable bit 在nsswitch.conf文件
     [root@deep] /# cd /chroot/named/etc/
     [root@deep etc]# chattr  +i nsswitch.conf
     

  2. 设置 immutable bit 在named.conf文件
     [root@deep] /# cd /chroot/named/etc/
     [root@deep etc]# chattr  +i named.conf
     
    具有 +i 属性的文件无法修改、删除或重命名; 无法创建指向此文件的链接,也无法向其写入数据。 只有超级用户才能设置或清除此属性。

添加新的 UID 和新的 GID 以运行守护程序named如果尚未设置。 这很重要,因为以 root 身份运行它会破坏 jail 的目的,并且使用系统上已存在的不同用户 ID 可能会允许您的服务访问彼此的资源。 检查/etc/passwd/etc/group文件以查找可用的空闲 UID/GID 号码。 在我们的示例中,我们将使用数字 53 和名称 named
 [root@deep] /#useradd -c DNS Server -u 53 -s /bin/false -r -d /chroot/named named 2>/dev/null || :