Solaris10下DNS服务器安全攻略
DNS服务器是为了网络上的主机提供域名解析的服务的服务器。Solaris10虽然自带了BIND9.2.4版本,但它并不是Sun公司的产品,InternetSoftwareConsortium负责BIND软件的更新,我们应当到www.isc.org网站下载最新版本的BIND软件,因为新的版本的软件可以防止某些漏洞。
下面我们来介绍如何配置DNS服务器。
一、从源代码安装配置DNS服务器
(1)为了下载最新的BIND软件,我们到http://www.isc.org/products/BIND/下载,本例子下载的是bind-9.3.2.tar.gz。
(2)将下载的软件放到系统中的某个目录下,本例中放在usr/local/src目录下。
#cdusr/local/src
#wgethttp://ftp.isc.org/isc/bind9/9.3.2/bind-9.3.2.tar.gz
#cpbind-9.3.2.tar.gz..
#cd..
#gzip-dbind-9.3.2.tar.gz
#tar-vxfbind-9.3.2.tar
#rmbind-9.3.2.tar
#cdbind-9.3.2
#./configure
#make
#makeinstall
#cd/usr/sbin
(3)生成的可执行文件位于/usr/local/sbin目录下。最重要的可执行文件为named和rndc。
#/usr/local/sbin/rndc-confgen>/etc/rndc.conf
#cat/etc/rndc.conf
输出为:
#Startofrndc.conf
key"rndc-key"…{
algorithmhmac-md5;
secret"y9xvvfQjdWv9f/Fo7wquBg==";
};
options…{
default-key"rndc-key";
default-server127.0.0.1;
default-port953;
};
#Endofrndc.conf
#Usewiththefollowinginnamed.conf,adjustingtheallowlistasneeded:
#key"rndc-key"…{
#algorithmhmac-md5;
#secret"y9xvvfQjdWv9f/Fo7wquBg==";
#};
#controls…{
#inet127.0.0.1port953
#allow…{127.0.0.1;}keys…{"rndc-key";};
#};
#Endofnamed.conf
(9)创建rndc.key文件。将rndc.conf文件中注释部分拷贝生成如下文件:
#vi/etc/rndc.key
key"rndc-key"…{
algorithmhmac-md5;
secret"y9xvvfQjdWv9f/Fo7wquBg==";
};
controls…{
inet127.0.0.1port953\
allow…{127.0.0.1;}keys…{"rndc-key";};\
};
检查rndc是否正常工作:
#/usr/local/sbin/named-g
Jan1111:56:45.075startingBIND9.2.3-g
Jan1111:56:45.076using1CPU
Jan1111:56:45.079loadingconfigurationfrom’/etc/named.conf’
……
#/usr/local/sbin/rndcstatus
(10)编辑named.conf配置文件。
#vi/etc/named.conf
第一段的内容如下:
//generatedbynamed-bootconf.pl
options…{
directory"/var/named";
/**//*
*Ifthereisafirewallbetweenyouandnameserversyouwant
*totalkto,youmightneedtouncommentthequery-source
*directivebelow.PreviousversionsofBINDalwaysasked
*portbydefault.
*/
//query-sourceaddress*port53;
};
上面的部分是在这个文件开头的options设定的,首先用directory指定了named的资源记录(RR-ResourceRecord文件目录所在位置为:“/var/named”。也就是说,它会到这个目录下面寻找DNS记录文件)。所以,我们在后面部分所指定的文件,就无须使用绝对路径了,但它们一定要放在这个目录下面。
那一段被注释文字,如果你仔细阅读一下,它大致意思是如果你要设定的DNS服务器和client之间隔着防火墙的话,要将“//query-sourceaddress*port53;”前面的注解符号“//”拿掉(当然,也必须要设定好你的火墙)。不过,这只对早期的版本有影响,而在bind8.1之后则无须担心这个设定。接下来再让我们看下一段句子:
//
//acachingonlynameserverconfig
//
zone"."IN…{
typehint;
file"named.root";
};
通过这几行语句,我们为named定义了DNS系统中的根区域“.”(rootzone)的设定,同时它是一个internet(IN)的区域类别。这里还指定了rootzone的服务器种类(type)为“hint”(也只有这个zone会使用这样的种类)。最后,用file指定这个区域记录文件为:“named.root”,也就是“/var/named/named.root”文件。在rootzone后面,你应该还会看到如下这两段:
zone"localhost"IN…{
typemaster;
file"localhost.zone";
allow-update…{none;};
};
zone"0.0.127.in-addr.arpa"IN…{
typemaster;
file"named.local";
allow-update…{none;};
};
这里是定义出关于本机名称的DNS解释:第一个zone是localhost的正解zone,其服务器种类是master,记录档名称是localhost.zone(在/var/named目录下面),但这个zone不允许客户主机(或服务器)自行更新DNS的记录。而第二个zone则是本机区域的反向解析zone。
再看下面的两段,这两段是cjh.com域的正向和反向解析。
zone"cjh.com"IN…{//新加cjh.com的域
typemaster;
file"cjh.com.zone";
allow-update…{none;};
};
zone"9.168.192.in-addr.arpa"IN…{//新加域的反向解析
typemaster;
file"named.192.168.9";
allow-update…{none;};
};
最后一行是bind9.x版本的新功能,用来进行区域转移或DNS更新所用的加密处理。
include"/etc/rndc.key";
(11)创建/var/named目录。
#mkdir/var/named
#cd/var/named
(12)匿名登录到ftp站点FTP.RS.INTERNIC.NET,获取/domain目录下的named.root文件,将该文件置于/var/named目录下。
(13)创建localhost.zone文件。
#vi/var/named/localhost.zone
$TTL86400
$ORIGINlocalhost.
@1DINSOA@root(
42;serial(d.adams)
3H;refresh
15M;retry
1W;expiry
1D);minimum
1DINNS@
1DINA127.0.0.1
(14)创建named.local文件。
#vinamed.local
$TTL86400
@INSOAlocalhost.root.localhost.(
2005022700;Serial
28800;Refresh
14400;Retry
3600000;Expire
86400);Minimum
INNSlocalhost.
1INPTRlocalhost.
[root@Linuxetc]#mkdir/var/named
//进入/var/named
[root@Linuxetc]#cd/var/named
//建立localhost.zone文件
[root@Linuxnamed]#vilocalhost.zone
$TTL86400
$ORIGINlocalhost.
@1DINSOA@root(
42;serial(d.adams)
3H;refresh
15M;retry
1W;expiry
1D);minimum
1DINNS@
1DINA127.0.0.1
//建立named.local文件
[root@Linuxnamed]#vinamed.local
$TTL86400
@INSOAlocalhost.root.localhost.(
1997022700;Serial
28800;Refresh
14400;Retry
360000061.177.252;Expire
86400);Minimum
INNSlocalhost.
1INPTRlocalhost.
(15)创建cjh.com.zone文件。
#vicjh.zone
$TTL1D
@INSOAcjh.com.root.cjh.com.(
1053891162
3H
15M
1W
1D)
INNScjh.com.
INMX5cjh.com.
wwwINA192.168.9.9
(16)创建named.192.168.9文件。
#vinamed.192.168.9
$TTL86400
@INSOAcjh.com.root.cjh.com.(
20031001;
7200;
3600;
43200;
86400);
@INNScjh.com.
9INPTRdns.cjh.com.
(17)在Solaris10操作系统中启动DNS服务。
#svcadmenable/network/dns/server
查看:
#svcs-l/network/dns/server
fmrisvc:/network/dns/server:default
nameInternetdomainnameserver(DNS)
enabledtrue
stateonline
next_statenone
restartersvc:/system/svc/restarter:default
contract_id25
dependencyrequire_all/nonesvc:/system/filesystem/minimal(online)
dependencyrequire_all/nonefile://localhost/etc/named.conf(online)
dependencyrequire_any/errorsvc:/network/loopback(online)
dependencyoptional_all/errorsvc:/network/physical(online)
(18)测试DNS反向解析是否成功。
#host192.168.9.9
9.9.168.192.in-addr.arpadomainnamepointerdns.cjh.com.
(19)测试DNS解析是否成功。
#nslookup
>www.cjh.com
Server:192.168.9.9
Address:192.168.9.9#53
Name:www.cjh.com
Address:192.168.9.9
>
出现上面的提示,说明DNS服务已经启动成功。
应用说明:
Solaris10基本上就已经安装好Bind9DNSServer,所以,跟本就不存在安装的问题。但为什么还要写这编文章呢?在某程度上跟和Solaris10的新功能ServiceManagementFacility(SMF)有关,而且,这编文章也有助于对SMF的深入了解。
Solaris10以前版本的DNS服务器启动和停止方法是:
启动DNSServer命令:
/etc/init.d/namedstart
停止DNSServer命令:
/etc/init.d/named
Solaris10版本的DNS服务器启动和停止方法是:
启动DNSServer命令:
svcadmenabledns/server或svcadmenabledns/server:default
停止DNSServer命令:
stopsvcadmdisabledns/server或svcadmdisabledns/server:default
二、让DNS服务器在“牢监”中运行
所谓“监牢”就是指通过chroot机制来更改某个软件运行时所能看到的根目录,即将某软件运行限制在指定目录中,保证该软件只能对该目录及其子目录的文件有所动作,从而保证整个服务器的安全。这样即使出现被破坏或被侵入,所受的损伤也较小。将软件chroot化的一个问题是该软件运行时需要的所有程序、配置文件和库文件都必须事先安装到chroot目录中,通常称这个目录为chrootjail(chroot“监牢”)。如果要在“监牢”中运行dns,而事实上根本看不到文件系统中那个真正的目录。因此需要事先创建目录,并将dns文件复制到其中。图-1中的例子,说明了牢监中的环境状态
图1“监牢”环境示意图
以下是具体步骤:
为DNSServer建立监牢目录
建立/chroot/dns目录
#mkdir/chroot/dns
建立一个空壳目录架构
#cd/chroot/dns
#mkdir-petc/namedvar/run
复制/etc/named.conf到监牢中
#cp/etc/named.conf/chroot/dns/etc/named.conf
复制/etc/named目录中的文件到Jail监牢中
#cp/etc/named/*/chroot/dns/etc/named/
更改/chroot/dns/var/run目录的权限
#chmod770/chroot/dns/var/run
#chownnoaccess:root/chroot/dns/var/run
为Solaris10建立一个新服务
原本的DNSServerService名称为dns/server。
建立新服务后,以后要启动旧版本的DNS服务时,不能只启动dns/server,而要改为dns/server:default。
新DNSServerChroot服务名称为,dns/server:chroot
开始建立新服务
#cd/var/svc/manifest/network/dns
#cpserver.xmlserver-chroot.xml
编辑server-chroot.xml
寻找
instancename=’default’enabled=’false’
改为
instancename=’chroot’enabled=’false’
寻找
exec=’/usr/sbin/named’
改为
exec=’/usr/sbin/named-t/chroot/dns’
寻找
privileges=’basic,!proc_session,!proc_info,!file_link_any,net_privaddr,file_dac_read,file_dac_search,sys_resource’/>
改为
privileges=’basic,!proc_session,!proc_info,!file_link_any,net_privaddr,priv_proc_chroot,priv_file_dac_read,file_dac_search,sys_resource’/>
寻找
user=’root’
改为
user=’noaccess’
保存文件退出。
停止原来的DNS服务
#svcadmdisabledns/server:default
加入新的DNSServerChrootservice
#svccfgimportserver-chroot.xml
启动chrootDNSservice
#svcadmenabledns/server:chroot
#svcsdns/server
STATESTIMEFMRI
disabled6:21:03svc:/network/dns/server:default
online6:27:01svc:/network/dns/server:chroot
Bind9DNSServer现在已经能够在“监牢”环境中运行
三、在Solaris环境下,DNS客户端程序的配置非常容易,它只需要几个简单的步骤就可以完成。
(1)除了对/etc/inet/hosts文件或NIS/NIS+的主机名映射或者主机名(hostnames)表文件进行检查以外,还必须配置命名服务开关文件(/etc/nsswitch.conf),指定域名解析服务向DNS进行查询。为了确保DNS的正常工作,在/etc/nsswitch.conf文件中必须包括下行的内容:
hosts:filesdns
这行的意思是如果需要命名服务,首先查找/etc/inet/hosts文件,如果找不到,就到DNS中去查找。
(2)我们需要将主机的本地域名输入到/etc/defaultdomain文件中。例如,主机www.cjh.net的/etc/defaultdomain文件应有如下的输入项:
cjh.net
(3)我们需要在/etc/resolv.conf文件中包含本地域名、本地基本DNS服务器的IP地址,以及辅助的DNS服务器的IP地址。这意味着本地DNS服务器出现故障,我们仍可以通过辅助的NDS服务器来提供最新的外部主机信息,而不必依赖/etc/hosts文件中的数据来解析本地地址。例如,/etc/resolv.conf文件的内容可能是这样:
domaincjh.net
nameserver202.104.0.20
nameserver53.58.31.2
它表明本地域是cjh.net,本地域有两台基本DNS服务器。其中,202.104.0.20为主DNS服务器,53.58.31.2为辅助DNS服务器。
(4)下面我们可以启动DNS客户端软件了。
#svcadmenablesvc:/network/dns/client
(5)使用nslookup命令来检查DNS客户端配置是否正确。
#nslookup
>
四、升级Solaris10自带BIND9.2.4版本到9.3.2的步骤
如果您正在使用Solaris10自带的BIND9.2.4版本,升级步骤如下:
首先编译源代码同上。
#cd/usr/sbin
#mvnamednamed.orig
#mvnamed-checkconfnamed-checkconf.orig
#mvnamed-checkzonenamed-checkzone.orig
#cp/usr/local/sbin/named.
#cp/usr/local/sbin/named-checkconf.
#cp/usr/local/sbin/named-checkzone.
检查新安装的BIND9DNSServer版本命令如下:
#/usr/sbin/named-v
BIND9.3.2
从新启动ChrootJail了的DNS服务
#svcadmdisabledns/server:chroot
#svcadmenabledns/server:chroot
#svcsdns/server
STATESTIMEFMRI
disabled6:21:03svc:/network/dns/server:default
online6:27:01svc:/network/dns/server:chroot
#ps-elf|grepnamed
noaccess1331020:31:29?0:00/usr/sbin/named-t/chroot/dns
新的Bind9DNSServerVersion9.3.2现在已经安装好了。
总结:本文介绍了如下内容:
怎样启动和停止Bind9DNSServer?
如何设定Bind9DNSServer?
什么是监牢?
Bind9DNSServer怎样使用ChrootJail(保安监牢)功能来防止入侵者进入系统?
怎样建立新的SMFService来启动ChrootJail后的DNSServer?
DNS客户端设置
如何把Solaris10内的Bind9DNSServer升级到最新版本?
正如其他的Internet协议一样,DNS由几个Internet的RFC规范(最初是RFC882、883和973)。不过要理解DNS服务器的工作原理最好的标准还是RFC1035。你可以在Internet上的好几个地方找到RFC1035,比如在http://www.crynwr.com/crynwr/rfc1035/就有一个不错的HTML版本。正如你可能想到的那样,RFC具有相当的技术性,你不大可能会对超出DNS服务器一般操作的细节感兴趣。但是如果你想做个服务器管理员,那么就记住RFC吧。在Internet的命名服务中最常用的恐怕就是网络域名服务(DNS)了,所以Solaris10操作系统主要应用是BIND9DNS服务器。本文介绍如何设置和管理DNS服务器。
抱歉,暂停评论。