如何使用 auto-dnssec 更新区域:维护

如何使用 auto-dnssec 更新区域:维护

我在 Debian Jessie 上运行着权威的 BIND 9.9.5-9+deb8u8-Debian。我有一个可以robin.info正常工作的工作区(各种测试都报告成功,例如 pingdom.com 的 DNS 检查工具上的测试)

我正在尝试使用 dnssec 来保护它。我按照BIND DNSSEC 指南,第 4 章,轻松入门。我成功生成了 ZSK 和 KSK,并更新了我的区域,添加了粗体行:

区域“robin.info”{
        類型主屬;
        文件“/etc/bind/zones/robin.info”;
        包括“/etc/bind/include-zones/acls”;
        密钥目录“/etc/bind/dnssec/robin.info/2016”;
        内联签名是;
        自动 DNSSEC 维护;
};

我确保区域文件中不存在.jnl.jbk和文件,然后重新启动绑定.signed并确认区域已加载并具有 DNSKEY 条目,尽管日志中出现了一些错误:.signed.jnlrndc reload

11-Dec-2016 13:54:20.742 zone robin.info/IN/internal (signed): loaded serial 2016121111
11-Dec-2016 13:54:20.742 zone robin.info/IN/external (signed): loaded serial 2016121111
11-Dec-2016 13:54:20.750 zone robin.info/IN/external (signed): receive_secure_serial: unchanged
11-Dec-2016 13:54:20.750 zone robin.info/IN/external (signed): reconfiguring zone keys
11-Dec-2016 13:54:20.766 zone robin.info/IN/external (signed): next key event: 11-Dec-2016 14:54:20.750
11-Dec-2016 13:54:20.796 zone robin.info/IN/internal (signed): receive_secure_serial: unchanged
11-Dec-2016 13:54:20.796 zone robin.info/IN/internal (signed): reconfiguring zone keys
11-Dec-2016 13:54:20.805 malformed transaction: /etc/bind/zones/robin.info.signed.jnl last serial 2016121113 != transaction first serial 2016121111
11-Dec-2016 13:54:20.805 zone robin.info/IN/internal (signed): zone_rekey:dns_journal_write_transaction -> unexpected error

当我想更新我的区域时,这些串行错误似乎会导致问题。我在未签名的区域中进行了更改/etc/bind/zones/robin.info,并将串行增加到2016121121

11-Dec-2016 13:57:58.658 zone robin.info/IN/internal (signed): serial 2016121121 (unsigned 2016121121)
11-Dec-2016 13:57:58.658 zone robin.info/IN/internal (signed): could not get zone keys for secure dynamic update
11-Dec-2016 13:57:58.658 zone robin.info/IN/internal (signed): receive_secure_serial: not found
11-Dec-2016 13:57:58.659 malformed transaction: /etc/bind/zones/robin.info.jnl last serial 2016121121 != transaction first serial 2016121111
11-Dec-2016 13:57:58.659 zone robin.info/IN/external (unsigned): not loaded due to errors.
11-Dec-2016 13:57:58.659 all zones loaded
11-Dec-2016 13:57:58.659 running
11-Dec-2016 13:57:58.661 zone robin.info/IN/internal (signed): reconfiguring zone keys
11-Dec-2016 13:57:58.670 malformed transaction: /etc/bind/zones/robin.info.signed.jnl last serial 2016121115 != transaction first serial 2016121111
11-Dec-2016 13:57:58.670 zone robin.info/IN/internal (signed): zone_rekey:dns_journal_write_transaction -> unexpected error
11-Dec-2016 13:57:58.670 zone robin.info/IN/external (signed): reconfiguring zone keys
11-Dec-2016 13:57:58.671 zone robin.info/IN/external (signed): next key event: 11-Dec-2016 14:57:58.670

我可以确认dig我的旧区域仍然被加载(来自 SOA 和不可见的更改)。

这里有几个错误信息:

1) 提示我遇到了密钥问题(“无法获取安全动态更新的区域密钥”)。但是 bind 在第一次加载时没有遇到任何问题,并且 bind 可以读取我的密钥文件(named 以bind组成员身份运行bind):

xavier@dent:/etc/bind/zones$ ls -l /etc/bind/dnssec/robin.info/2016
total 17k
-rw-r--r-- 1 root bind  603 Dec 10 17:23 Krobin.info.+008+43324.key
-rw-r----- 1 root bind 1.8k Dec 10 17:23 Krobin.info.+008+43324.private
-rw-r--r-- 1 root bind  604 Dec 10 17:22 Krobin.info.+008+44679.key
-rw-r----- 1 root bind 1.8k Dec 10 17:22 Krobin.info.+008+44679.private

2) 提示序列号有错误(初始错误为last serial 2016121113 != transaction first serial 2016121111)。不过我认为我不必太担心序列号,因为在 ISC 的 KB 中我可以看到:

请注意,此响应中的序列号与文件 example.com.db 中的序列号不同。Named 会独立于未签名版本跟踪区域的签名版本的序列号。如果未签名区域更新为新的序列号,且该序列号高于签名副本中的序列号,则签名副本的序列号将增加以匹配该序列号,否则将分开保存这两个序列号。[1]

到目前为止,我发现更新区域的唯一方法是停止绑定,删除.jnl.jbk和文件.signed.signed.jnl然后重新开始绑定。这似乎是错误的,我需要确保增加足够的序列号以激活新区域。我做错了什么,我该如何修复我的 dnssec?

答案1

我想我终于找到了问题的根源。我有两个视图,它们配置为包含相同的主区域文件两次。

不能对两个区域使用同一个文件。因此这是无效的并导致了我的问题:

view "internal" {
    match-clients ...;
    zone "example.com" {
        type master;
        file "/etc/bind/zones/example.net";
    };
};
view "external" {
    match-clients ...;
    zone "example.com" {
        type master;
        file "/etc/bind/zones/example.net";
    };
};

“通过示例了解 BIND 9 中的视图”指南的第 4 章中描述了共享区域的正确方法。基本上,只有一个区域必须是主区域,另一个必须是从区域。在正确的位置添加一些 acl、密钥以及 localhost 的 also-notify 后,我摆脱了这些错误。

最后这是我的最终配置:

key "internal" {
    // TSIG Key generated with dnssec-keygen -a HMAC-MD5 -b 512 -n USER internal
    algorithm hmac-md5;
    secret "XXXX";
};

view "internal" {
    match-clients { key internal; ...IPs...; }; // our network
    zone "robin.info" {
        type slave;
        file "/etc/bind/slave-zones/robin.info"; // Not the same file as external view!
        masters { 127.0.0.1; };
    };
};

view "external" {
    match-clients { !key internal; "any"; }; // everyone else
    server 127.0.0.1 {
        /* Deliver notify messages to internal view with internal key. */
        keys { internal; };
    };
    zone "robin.info" {
        type master;
        file "/etc/bind/zones/robin.info";
        // ACL file with allow-transfer and also-notify
        // including secondary DNS servers and 127.0.0.1
        include "/etc/bind/acls"; 
        key-directory "/etc/bind/dnssec/robin.info/2017";
        inline-signing yes;
        auto-dnssec maintain;
    };
};

答案2

核心似乎是could not get zone keys for secure dynamic update错误消息,因此退回到未签名状态;并且由于它没有经过自动碰撞 SOA 进行签名的签名路径,因此它会抱怨 SOA 已过时。

我在向三个区域添加签名时收到相同的错误消息,我挠了挠头,然后叹了口气,完全重新启动了命名。这为我解决了问题。绑定 9.11.0P3。

我不记得以前添加签名时见过这个问题,但所有其他区域都是很久以前在早期版本的 Bind 下通过转换签名的。此外,这三个区域是反向 DNS 文件,因此文件名略有不同。这就是我要解释的全部内容。

因此:绑定错误,完全重新启动命名,让它找到真正的密钥文件,然后进行签名。

答案3

我也遇到过类似的问题,也是使用 debian jessie 的 bind。我没有多个视图,也没有共享文件,但 bind 抱怨了与以下相同的错误:

11-Dec-2016 13:54:20.796 zone robin.info/IN/internal (signed): reconfiguring zone keys
11-Dec-2016 13:54:20.805 malformed transaction: /etc/bind/zones/robin.info.signed.jnl last serial 2016121113 != transaction first serial 2016121111
11-Dec-2016 13:54:20.805 zone robin.info/IN/internal (signed): zone_rekey:dns_journal_write_transaction -> unexpected error

我的解决方案是使用

rndc sync -clean

以及重新加载绑定(即使未启用动态更新!)。来自 man:

Sync changes in the journal file for a dynamic zone to the master file. If the 
"-clean" option is specified, the journal file is also removed. If no zone is 
specified, then all zones are synced.

相关内容