和其它大型软件相同,BIND(DNS服务器)也因其体积庞大和功用冗杂而存在许多问题。因而针对BIND安全漏洞的体系侵略数量也在大幅度上升,最严峻的乃至可获取方针主机的一切长途操控权。因为DNS服务器主机对网络体系有着很大的影响,怎么防止这些体系侵略也变得至关重要了。
这篇短文的宗旨是叙述怎么运用chroot()环境在RedHat Linux(或相似体系)中树立安全的BIND 8.x服务器。本文内容首要来自于Adam Shostack和他在这方面的文章(Solaris版别)。
过程一:软件获取和装置
请到ISC FTP站点下载BIND的最新版别(本文内容在BIND 8.x版别中经过测验)。
到Obtuse System FTP站点下载本文必需的免费软件:holelogd(及其它有用的东西)。该软件用于在chroot环境中树立/dev/log套接字(socket),从而使syslogd可以记载named进程的日志。OpenBSD体系的syslogd已内建了这一功用(syslogd -a /chroot/dev/log),但Linux体系没有完成这一功用。Holelogd软件便是用来仿照OpenBSD的这个功用。
依照软件文档装置holelogd(通常被装置到/usr/local/sbin)。
过程二:结构静态(static)的named和named-xfer二进制文件
在编译和装置后,你需求结构可履行文件的静态链接版别。只要对%BIND%/src/port/linux目录下的Makefile.set文件稍加修正后即可。
修正文件内容:
‘CDEBUG= -O2 -g’
替换为:
‘CDEBUG= -O2 -static’
切换到BIND的源代码途径,履行make clean和make指令。鄙人面的过程中将会把这些文件仿制到chroot()目录下。
本过程结构的静态链接履行文件在运转时无需装载动态链接库。在chroot()环境中,这种“独立”可履行文件可防止呈现短少链接库文件问题。它在chroot()环境中无需任何静态链接库,可使服务装备简单化。其它一切的网络看护进程也可以编译和运用这种静态链接版别。
过程三:结构BIND目录
为chroot()环境结构BIND目录。这个目录将在chroot()环境中被BIND当作体系根目录。
/dev
/etc
/namedb
/usr
/sbin
/var
/run
需求仿制以下文件到其下的相应子目录中,和进行一些必要的处理:
/
无
/etc
仿制体系/etc目录下的named.conf文件
仿制体系/etc目录下的localtime文件(为syslog供给正确的named日志记载时刻)
创立仅包括named GID的/etc/group文件
/etc/namedb
仿制体系/etc/namedb目录下的一切“区(zone)”数据库和文件
/dev
mknod ./null c 1 3; chmod 666 null(请参阅相应版别的mknod指令)
/usr/sbin
仿制体系%BIND%/src/bin/named目录和体系%BIND%/src/bin/named-xfer目录下的named和named-xfer二进制文件(静态链接版别)
/var/run
无
别的还可根据需求指定日志记载目录(如/var/log)。
过程四:增加named用户和组
在/etc/passwd和/etc/group文件中增加named用户和组。它们是DNS服务器运转时的UID/GID。
此刻,你可以到chroot环境中履行chown -R named.named /etc/namedb指令。这样当你向体系发送中止信号(kill -INT )时,named进程可以保存服务器缓存和计算信息。假如该目录为root一切则named进程无法将输出写到目录中,但不会影响named服务器功用。另一个挑选是仅改动目录权限(使named用户具有写权限),而属主仍然是root。这种办法也是可行的,但有必要当心设置,保证其它用户不会修正named记载!
*** 重要正告***
不要用一个已存在的UID/GID(如nobody)运转named。记住,以chroot环境中运用任何已存在的UID/GID都可能会影响到服务的安全性。有必要养成在chroot环境中为每一个看护进程供给独立的UID/GID的习气。
过程五:修正发动脚本
Linux运用SYS V风格的init文件,所以有几个当地都可以放置运转named的指令。(大多数情况下)最好将named初始化脚本放置到/etc/rc.d/init.d/named中。在其间你会找到有关named发动的那一节内容。咱们需求增加和修正其间的某些行。
1、在运转named前刺进一行以发动holelogd。需求向holelogd供给长途套接字
方位的参数,它应该是在上面过程中创立的chroot named dev目录。指令行
内容如下:
# Start daemons.
echo -n Staring holelogd:
daemon /usr/local/sbin/holelogd /chroot/named/dev/log
echo
echo -n Starting named:
daemon named
echo
touch /var/lock/subsys/named
;;
2、别的还需求修正BIND的发动参数。BIND 8.x版别答应指定运转用户ID和组ID,
它也应该是在上面过程中特别创立的UID/GID:
# Start daemons.
echo -n Staring holelogd:
daemon /usr/local/sbin/holelogd /chroot/named/dev/log
echo
echo -n Starting named:
daemon /chroot/named/usr/sbin/named -u named -g named -t /chroot/named
echo
touch /var/lock/subsys/named
;;
3、named顺便的ndc脚本可用于操控named的作业。需求修正这个文件以将PID
文件方位从/var/run/named.pid修正为/chroot/named/var/run/named.pid。
过程六:服务器测验
输入如下指令发动holelogd进程
/usr/local/sbin/holelogd /chroot/named/dev/log
进入/chroot/named/dev/目录并输入ls -al。应该得到与下面相似的输出:
srw-rw-rw- 1 root wheel 0 Jan 01 12:00 log
设定的s位指示这是一个套接字(socket)文件。chroot()环境中的named进程将经过该套接字与syslog通讯。
现在输入:
/chroot/named/usr/sbin/named -u named -g named -t /chroot/named
假如一切正常,named进程将发动,日志文件将记载named服务器Ready to answer queries.。