DNS BIND主辅同步之TSIG加密

Transaction signatures(TSIG)通常是一种确保DNS消息安全,并提供安全的服务器与服务器之间通讯(通常是在主从服务器之间)的机制。TSIG可以保护以下类型的DNS服务器:Zone转换、Notify、动态升级更新、递归查询邮件。TSIG适用于BIND v8.2及以上版本。TSIG使用共享秘密和单向散列函数来验证的DNS信息。 TSIG是易于使用的轻便解析器和命名机制。TSIG是一个安全的访问控制机制,保护信息在传输的过程中不会被改变。
一、工作原理
1、每个域名服务器增加了一个TSIG记录DNS服务器间的查询和信息的数据块
2、TSIG中记录了DNS消息签名,证明该邮件发件人与收件人共有一个共享密钥,并且在消息发送后不可被修改。
3、TSIG使用单向散列函数来验证身份和判断数据完整性。
要求:时间必须是准确的。

二、生成TSIG

使用bind提供的工具dnsssec-kengen生成共享密钥。

/home/slim/bind/sbin/dnssec-keygen -a HMAC-MD5 -b 128 -n HOST "test_key"

生成Ktest_key.+157+45410.key公用和Ktest_key.+157+45410.private私钥文件

# cat Ktest_key.+157+45410.private
Private-key-format: v1.3
Algorithm: 157 (HMAC_MD5)
Key: epYaIl5VMJGRSG4WMeFW5g==
Bits: AAA=
Created: 20150418165400
Publish: 20150418165400
Activate: 20150418165400
将生成的key写到secret文件中
vi test_key

key "test_key" {                                  #注意:这里写的是生成key的名字
        algorithm hmac-md5;
        secret "epYaIl5VMJGRSG4WMeFW5g==";        #将生成的key复制到此处
};

注:尽管共有密钥和私有密钥是等价的,但为了确保安全通常dnssec-keygen采用例如HMAC-MD5的称加密算法来对生成的密钥进行加密。

三、主服务器配置

在named.conf增加如下配置:

include "/etc/test_key";

并在全局options配置中添加

allow-transfer { key test_key; };
notify yes;  

定义有key的主机才能同步。

四、从服务器

将主服务器的test_key文件复制过来

在named.conf增加如下配置:

include "/etc/test_key";

server 192.168.36.54{
        keys{
                test_key;
        };
};

修改zone test.com指定主服务器:

zone "test.com" IN {
        type slave;
        file "zone/test.com.zone";
        masters{
                192.168.36.54;
        };
};

四、测试

启动主辅服务器,检查是否能正常解析,然后修改主服务器zone/test.com.zone SOA中的Serial值+1,重启加载主服务器配置,查看是否同步。

/home/slim/bind/sbin/rndc -c /home/slim/chroot/etc/rndc.conf reload

可以看到同步日志如下:

主服务器:

18-Apr-2015 17:29:30.089 client 192.168.36.189#50319/key test_key (test.com): query: test.com IN SOA -SE (192.168.36.54)
18-Apr-2015 17:29:30.098 client 192.168.36.189#39445/key test_key (test.com): query: test.com IN IXFR -ST (192.168.36.54)
18-Apr-2015 17:29:30.099 client 192.168.36.189#39445/key test_key (test.com): transfer of 'test.com/IN': AXFR-style IXFR started: TSIG test_key
18-Apr-2015 17:29:30.100 client 192.168.36.189#39445/key test_key (test.com): transfer of 'test.com/IN': AXFR-style IXFR ended
辅服务器:

18-Apr-2015 17:27:12.156 client 192.168.36.54#1246: received notify for zone 'test.com'
18-Apr-2015 17:27:12.157 zone test.com/IN: notify from 192.168.36.54#1246: zone is up to date
18-Apr-2015 17:29:27.899 client 192.168.36.54#13088: received notify for zone 'test.com'
18-Apr-2015 17:29:28.099 zone test.com/IN: Transfer started.
18-Apr-2015 17:29:28.106 transfer of 'test.com/IN' from 192.168.36.54#53: connected using 192.168.36.189#39445
18-Apr-2015 17:29:28.109 zone test.com/IN: transferred serial 60: TSIG 'test_key'
18-Apr-2015 17:29:28.109 transfer of 'test.com/IN' from 192.168.36.54#53: Transfer completed: 1 messages, 8 records, 289 bytes, 0.003 secs (96333 bytes/sec)
18-Apr-2015 17:29:28.110 zone test.com/IN: sending notifies (serial 60)
可以看见同步过程中使用TSIG 'test_key'
五、配置zone同步key

由于bind的主辅同步可以控制到具体的zone,所以TSIG可以真不同zone,配置不同的TSIG,不过要通过view配置。

如主服务器:

view"tisg"{
	match-clients{
		key"tisg";192.168.36.0/24;
	};server192.168.36.189{
		keys"tisg";
	};zone"."IN{
		typehint;file"named.root";
	};zone"test.com"{
		typemaster;also-notify{
			192.168.36.189;
		};file"tisg/test.com.zone";
	};
};

辅服务器:

view"tisg"{
	match-clients{
		key"tisg";192.168.36.0/24;
	};server192.168.36.54{
		keys"tisg";
	};zone"."IN{
		typehint;file"/var/named/named.root";
	};zone"test.com"{
		typeslave;file"tisg/test.com.zone"masters{
			192.168.36.54;
		};
	};
};

如果主dns不设置server语句的话,则主服务器主动发送给从dns的notify会被拒绝;如果从服务器不设置server语句的话,则不能实现分view同步的功能;如果主从服务器时间不同步的话,则会导致验证失败;如果从dns的ip匹配到主dns的view,则会导致只同步这个view的数据下来,即使配置了key。

参考文章:http://www.cnblogs.com/qlight/archive/2012/08/30/2663314.html

你可能感兴趣的:(dns)