全部博文(293)
分类: LINUX
2008-03-20 16:42:57
配置一个安全的chroot DNS(1) |
|
|
|
|
|
1、安装Bind 9 虽然我所用的Red Hat AS3 中有rpm包,但是为了方便其他的朋友,我们还是从源代码包方式安装。首先从ISC公司的主页()下Bind 9 软件包。 wget ftp://ftp.isc.org/isc/bind9/ (我没下最新的,下的是稳定版,您可以根据自己的需要选取) 接着开始解压缩(为描述简单,以下操作如无特殊声明,都是以root权限进行) 卸载Red Hat 中原有的Bind,一共有三个rpm包 进入该目录开始编译安装 #因为ipv6和线程方式我用不到就去掉了,把Bind 9安装到/usr/local下 到此Bind 9已经安装完成了,普通的 DNS Server 到此就安装结束了,而对我们的chroot 而言才刚开始呢。 2、构建chroot 目录环境 a.创建Bind 工作目录/chroot/named及下属工作目录 rm -rf /chroot/named #删除原来的旧目录,之所以加这句是我写shell的时候调试方便 mkdir -p /chroot/named b.建立Bind的组和用户named groupadd named c.创建虚拟设备(dev),日志记录的时候有的选项可能用到它们。在默认情况下,是使用/dev目录下的文件,但是由于我们需要把DNS限制到一个目录,所以必须完全把/dev下用到的文件(或者说设备)模拟过来才可以。 ls -lL /dev/zero /dev/null /dev/random 看到类似 crw-rw-rw- 1 root root 1, 3 这样的,将其中的1,3这样的数字记录下来,这表示主设备号和次设备号(一般来说主设备号用来区分设备的种类;次设备号则是为了作唯一性区分,标明不同属性——注意,在unix系统中是把设备也当作文件来对待的),在redhat 9下,ls加不加-L参数都无所谓,但是在Solaris下则一定要加上才可以显示。 mknod dev/null c 1 3 d.复制时钟文件到我们chroot的etc下,Linux 的时钟设置文件为:/etc/localtime ,实际上这个文件是 /usr/share/zoneinfo 目录下对应文件的符号连接。(假设我们所处的地区位于上海,那么只要运行以下的命令就可以设置时区了。 ln -sf /usr/share/zoneinfo/ASia/Shanghai /etc/localtime;注意在天缘用的solaris 2.6中并没有此文件,而是该用/usr/share/lib/zoneinfo/GB) cp /etc/localtime etc/ 3、创建和设置BIND 9配置文件 默认情形下,bind以/etc/named.conf文件为配置文件。但由于我们这里是要做chroot的DNS,因此需要把named.conf放到/chroot/named/conf下去,然后再做一个符号连接到/etc/named.conf。首先创建并编辑named.conf文件(由于介绍DNS的文章大多对named.conf的配置解释得相当详细,因此我就不一句句解释了,大家结合注释,参考其他文章看看,很容易理解的)
之后进行符号连接到/etc目录下 好了,接下来,当然就是设置named.root、named.local、named.127.0.0三个文件了,注意,这三个文件的真实位置是在/chroot/named/conf下哦。 |
配置一个安全的chroot DNS(3) |
|
| |
| |
| |
|
首先是named.root的建立 dig @a.root-servers.net . ns > /chroot/named/conf/named.root #这是在redhat下的用法,因为天缘所用的solaris默认(我用的2.6)没有dig命令,所以在solaris下我们用
4、设置权限 其实这一步,才是我们作任何chroot 服务真正精华的地方。如何把权限划分得准确,不至于无法执行服务,也不能大到会威胁到其他程序的安全,实在是一个需要仔细考虑的问题。 a.由于我们的目的是达到让bind程序以named用户身份运行,所以必须让它具有读配置,无写配置文件的权限,而且最好其他程序也不能改变我们的配置文件,只有root能改,named用户能读。为了满足这个要求的,自然就想到把文件的拥有者改为root,组用户设置为named,然后再慢慢仔细划分权限。 cd /chroot/named chown –R root.named ./ #-R参数表示下属目录也依照此权限,-R参数在chown和chmod中经常用到 b.接下来想想各个文件、子目录的权限。Root组对 文件需要读写执行权限,named组对文件需要读取权限,而对下属子目录而言,则必须具有执行权限才能进入其中。因此作以下权限设置。 # 对文件赋予root 读写权限,赋予组named读权限 # 对目录赋予roo读写执行权限,赋予组named读执行权限(这里的执行是为了能进入到下级目录中) #对etc目录下的配置文件,能不让其他用户读取当然是最好的,因此设置 # "secondaries" 子目录是此作辅助,从主服务器更新消息的时候需要的,会在里面创建一些新文件。因此它的权限也需要特别设置,在这个目录下,named组、用户需要具有读权限,而不需要用到root用户,也不想让其他的用户身份访问。 chown root.named conf/secondaries/ #设置secondaries目录用户为root,组为named chmod ug=rwx,o= conf/secondaries/ #给予root和named全部权限,以方便访问下面的文件 touch conf/secondaries/.empty # 去掉旧有的该文件 find conf/secondaries/ -type f -print | xargs chown named.named #将用户组、用户都设置为named find conf/secondaries/ -type f -print | xargs chmod ug=r,o= #只让named组和用户有读权限,而其他用户无任何权限 接着是为var/目录设置权限(在这里会生成进程守护文件named.pid—我们在named.conf中设置了的) chown root.root var/ #这里可以把named抛弃, chmod u=rwx,og=x var/ #root可以读写设置,其他用户能执行就行,其实我们之所以做一个chroot DNS需要大费周折地单独设置目录,就是为了不让named具有访问真正的/var的权限。 chown root.named var/run/ #因为在run下面的需要由named身份来写named.pid文件,所以需要将组改为named好限制权限 chmod ug=rwx,o=rx var/run/ #用户/组具有读写执行权限,其他用户能读/执行就可以了,这样的设置,主要是为了方便我们后面写shell来判断DNS目前的状态。 chown root.named logs/ #日志目录,设置成这样的原因不用解释了吧 chmod ug=rwx,o=rx logs/ #日志允许其他人看比较好,方便以后挂第三方程序 |
配置一个安全的chroot DNS(4) |
|
| |
| |
| |
|
5、启动并运行bind 9 激动人心的时候到了,即将开始我们的处女bind 9运行了。 运行以下命令
这样的结果,说明成功了,恭喜你!!! 每次都这样输入累不累??所以还是一起来写个shell吧(其实shell真的粉好用,但是一般真要系统地讲解起来又没有意思,所以我尽量在每篇文章中都把shell用上,慢慢就领会到它的好处咯)
然后以sh /chroot/named.start 执行此命令就行了,之后在/etc/resolv.conf为自己的DNS地址就可以测试 了,当然,也可以用dig命令来查(个人觉得dig命令比nslookup好用,但是Solaris 2.6上默认没有)。 6. 控制工具rndc的安装和使用 rndc=remote dnc,以前装过bind 8的朋友都知道有个ndc工具,而在bind 9中,更是连的功能都加上了。说“加上”其实不够恰当,因为rdnc并不是用ndc改的,而是重新写的一个通过tcp协议进行DNS控制的软件。(有什么用?问问做虚拟主机/系统管理的朋友就知道,DNS一般都是用独立主机,如果可以远程reload配置文件,可以方便很多的)。 rndc 原本是应该读取/usr/local/etc/rndc.conf 作为配置文件的,但我们既然是安装chroot的DNS,所以有必要把rndc.conf转到/chroot/named/etc/rndc.conf。好,下面来看看我们的rndc.conf的写法。
接下来,就是要生成/chroot/named/etc/rndc.key 文件了,它是一个采用bASe-64编码加密的长字符串key,我们用DNSsec-keygen命令来生成它: cd /chroot/named/etc 得到一个类似Krndc.+157+30481这样的返回值,这说明已经在当前目录下成功建立了Krndc.+157+30481.key和Krndc.+157+30481.private两个文件。
在这里,Key后面的那串字符就是我们想要的key了,把它复制下来,然后删除临时文件
现在已经配置完成了,建立2个软连接
如果出现的是rndc: send remote authenticator: permission denied 则肯定上面的步骤中存在问题,请一步步检查吧。 |
配置一个安全的chroot DNS(5) |
|
| |
| |
| |
|
7、开机执行脚本 每次输入很长的命令来进行重新启动,停止DNS实在不是明智的做法,写个shell脚本来帮助我们吧。
然后当然是 chmod a+x /etc/init.d/named 接下来就是对各个启动模式做符号连接了Red Hat 下:
到这里,我们的chroot bind 9 可以说真正正式完工!! 在最后,我付上一个在Red Hat AS3 上调试通过的自动 安装chroot bind 9的安装包(已内含bind |
开始配置bind:
/usr/local/named/etc/named.conf //DNS主配置文件, 需自己创建并且配置
/etc/resolv.conf //转换程序配置文件,系统自带需配置
/usr/local/named/etcv/rndc.conf //远程名称守护进程配置文件,需自己创建并且配置
/usr/local/named /var/named/named.root // 根域名服务器指向文件,需自己创建并且配置
/usr/local/named /var/named/localhost.zone //正向区文件, 需自己创建并且配置
/usr/local/named /var/named/named.local //反向区文件,需自己创建并且配置
/usr/local/named /var/named/cerc.local.zone //用户配置正向区文件,需自己创建并且配置
/usr/local/named /var/named/10.226.159.zone //用户配置反向区文件,需自己创建并且配置
1、编辑named.conf
# vi /usr/localnamed/etc/named.conf
写入以下内容:
Option {
Directory "/usr/local/named/v ar/ named"; 设置named要读写文件的路径
dump-file "/usr/local/named/v ar/named/data/cache_dump.db"; 设置服务器存放数据库的路径
Pid-file "/usr/local/named /var /run/named.pid";
Allow-query ( any ;);
};
Zone "." in { 容器指令zone的作用是定义一个DNS区域
Type hint; 设置区域的类型为“hint
File "named.root"; 设置根服务器列表文件名
};
Zone "localhost" in {
Type master;
File "localhost.zone";
};
Zone "0.0.127.in-addr.arpa" in {
Type master;
File "named.local";
};
include "/etc/rndc.key"; 设置共享密匙文件
退出,保存。
2、创建 rndc.conf文件
用bind自带程序生成
# cd /usr/local/named/
# sbin/rndc-confgen > /usr/local/named/etcv/rndc.conf
通过rndc.conf 中的key信息创建rndc.key文件。将rndc.conf文件中注释部分拷贝生成如下文件:
# vi /usr/local/named/etc/rndc.key
key "rndc-key" {
algorithm hmac-md5;
secret "y9xvvfQjdWv
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
3、匿名登录到ftp站点FTP.RS.INTERNIC.NET,获取/domain目录下的named.root文件,
将该文件置于/usr/local/named /var/named目录下