<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body style='font-size: 10pt; font-family: Verdana,Geneva,sans-serif'>
<p>Hello Bind users,</p>
<p>Trying to extend my understanding about tkey-gssapi-keytab statement<br />and possibility to use multiple principal names in single keytab file</p>
<p>The use case is simple:<br />Merging to MS AD environments to single ISC BIND DNS server with secure updates using update-policy</p>
<p>For testing, I create two AD domains</p>
<ul>
<li>test.local</li>
<li>test1.local</li>
</ul>
<p>During multiple testing, it looks like that using 'tkey-gssapi-keytab' is not enough to verify properly secure updates<br />Let me details result of my example:</p>
<p><strong>named.conf</strong></p>
<blockquote type="cite" style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0">
<p><em>options {</em><br /><em>directory "/usr/local/etc/namedb/working";</em><br /><em>listen-on {</em><br /><em>"any";</em><br /><em>};</em><br /><em>pid-file "/var/run/named/pid";</em><br /><em>tkey-gssapi-keytab "/usr/local/etc/namedb/working/keytab.krb5";</em><br /><em>};</em></p>
<p><em>zone "test.local" {</em><br /><em>type master;</em><br /><em>file "/usr/local/etc/namedb/master/test.local";</em><br /><em>update-policy {</em><br /><em>grant "TEST.LOCAL" ms-self "." "ANY";</em><br /><em>};</em><br /><em>auto-dnssec maintain;</em><br /><em>};</em><br /><em>zone "test1.local" {</em><br /><em>type master;</em><br /><em>file "/usr/local/etc/namedb/master/test1.local";</em><br /><em>update-policy {</em><br /><em>grant "TEST1.LOCAL" ms-self "." "ANY";</em><br /><em>};</em><br /><em>auto-dnssec maintain;</em><br /><em>};</em></p>
</blockquote>
<p>keytab file is loaded and I can get TGT from AD for TEST.LOCAL</p>
<blockquote type="cite" style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0">
<p><em>root@dns2:~ # ktutil -k /usr/local/etc/namedb/working/keytab.krb5 list</em><br /><em>/usr/local/etc/namedb/working/keytab.krb5:</em></p>
<p><em>Vno Type Principal Aliases</em><br /><em>9 arcfour-hmac-md5 DNS/dns2.test.local@TEST.LOCAL</em><br /><em>root@dns2:~ # kinit -k -t /usr/local/etc/namedb/working/keytab.krb5 DNS/dns2.test.local@TEST.LOCAL</em><br /><em>root@dns2:~ # klist</em><br /><em>Credentials cache: FILE:/tmp/krb5cc_0</em><br /><em>Principal: DNS/dns2.test.local@TEST.LOCAL</em></p>
<p><em>Issued Expires Principal</em><br /><em>Nov 4 23:28:05 2020 Nov 5 09:28:03 2020 krbtgt/TEST.LOCAL@TEST.LOCAL</em><br /><em>root@dns2:~ #</em></p>
</blockquote>
<p><strong>Possible challenge I see is that BIND does not use keytab file to compare GSS request with keytab;</strong><br /><strong>I can see on debug 8 gss messages with failure 'No No kerberos credential available'</strong></p>
<blockquote type="cite" style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0">
<p><em>04-Nov-2020 23:29:04.945 client @0x803875000 10.0.110.207#61795 (612-ms-7.11-94d12b.7a3e8427-1ed6-11eb-438f-005056bd8592): query: 612-ms-7.11-94d12b.7a3e8427-1ed6-11eb-438f-005056bd8592 IN TKEY -T (10.0.50.33)</em><br /><em>04-Nov-2020 23:29:04.947 failed gss_inquire_cred: GSSAPI error: Major = Unspecified GSS failure. Minor code may provide more information, Minor = No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_0).</em><br /><em>04-Nov-2020 23:29:04.950 gss-api source name (accept) is AD207$@TEST.LOCAL</em><br /><em>04-Nov-2020 23:29:04.951 process_gsstkey(): dns_tsigerror_noerror</em><br /><em>04-Nov-2020 23:29:04.951 client @0x803875000 10.0.110.207#61795 (612-ms-7.11-94d12b.7a3e8427-1ed6-11eb-438f-005056bd8592): send</em><br /><em>04-Nov-2020 23:29:04.951 client @0x803875000 10.0.110.207#61795 (612-ms-7.11-94d12b.7a3e8427-1ed6-11eb-438f-005056bd8592): sendto</em><br /><em>04-Nov-2020 23:29:04.952 client @0x803875000 10.0.110.207#61795 (612-ms-7.11-94d12b.7a3e8427-1ed6-11eb-438f-005056bd8592): senddone</em><br /><em>04-Nov-2020 23:29:04.952 client @0x803875000 10.0.110.207#61795 (612-ms-7.11-94d12b.7a3e8427-1ed6-11eb-438f-005056bd8592): next</em><br /><em>04-Nov-2020 23:29:04.952 client @0x803875000 10.0.110.207#61795 (612-ms-7.11-94d12b.7a3e8427-1ed6-11eb-438f-005056bd8592): endrequest</em><br /><em>04-Nov-2020 23:29:04.952 client @0x803875000 10.0.110.207#61795: closetcp</em><br /><em>04-Nov-2020 23:29:04.953 client @0x804c11000 10.0.110.207#61795: next</em><br /><em>04-Nov-2020 23:29:04.953 client @0x804c11000 10.0.110.207#61795: request failed: end of file</em><br /><em>04-Nov-2020 23:29:04.953 client @0x804c11000 10.0.110.207#61795: endrequest</em><br /><em>04-Nov-2020 23:29:04.953 client @0x804c11000 10.0.110.207#61795: closetcp</em><br /><em>04-Nov-2020 23:29:04.953 client @0x803bfa400 10.0.110.207#51833: UDP request</em><br /><em>04-Nov-2020 23:29:04.954 client @0x803bfa400 10.0.110.207#51833: using view '_default'</em><br /><em>04-Nov-2020 23:29:04.954 client @0x803bfa400 10.0.110.207#51833: request has valid signature: AD207\$\@TEST.LOCAL</em><br /><em>04-Nov-2020 23:29:04.954 client @0x803bfa400 10.0.110.207#51833/key AD207\$\@TEST.LOCAL: recursion available</em><br /><em>04-Nov-2020 23:29:04.954 client @0x803bfa400 10.0.110.207#51833/key AD207\$\@TEST.LOCAL: update</em><br /><em>04-Nov-2020 23:29:04.954 client @0x803bfa400 10.0.110.207#51833/key AD207\$\@TEST.LOCAL: updating zone 'test.local/IN': prerequisites are OK</em><br /><em>04-Nov-2020 23:29:04.954 client @0x803bfa400 10.0.110.207#51833/key AD207\$\@TEST.LOCAL: updating zone 'test.local/IN': update section prescan OK</em><br /><em>04-Nov-2020 23:29:04.954 client @0x803bfa400 10.0.110.207#51833/key AD207\$\@TEST.LOCAL: updating zone 'test.local/IN': deleting rrset at 'ad207.test.local' AAAA</em><br /><em>04-Nov-2020 23:29:04.954 client @0x803bfa400 10.0.110.207#51833/key AD207\$\@TEST.LOCAL: updating zone 'test.local/IN': deleting rrset at 'ad207.test.local' A</em><br /><em>04-Nov-2020 23:29:04.954 client @0x803bfa400 10.0.110.207#51833/key AD207\$\@TEST.LOCAL: updating zone 'test.local/IN': adding an RR at 'ad207.test.local' A 10.0.110.207</em><br /><em>04-Nov-2020 23:29:04.954 client @0x803bfa400 10.0.110.207#51833/key AD207\$\@TEST.LOCAL: updating zone 'test.local/IN': redundant request</em></p>
</blockquote>
<p><strong>but still update get in and is approved.</strong></p>
<p><strong>The same is accepted also for client from second domain - TEST1.LOCAL</strong><br /><strong>Even I do not have keytab loaded with Principal Name from TEST1.LOCAL, update will get in</strong></p>
<blockquote type="cite" style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0">
<p><em>04-Nov-2020 23:31:39.879 client @0x803875000 10.0.110.216#59439 (932-ms-7.51-18e34bc.2db42801-1eb9-11eb-d293-005056bddce2): query: 932-ms-7.51-18e34bc.2db42801-1eb9-11eb-d293-005056bddce2 IN TKEY -T (10.0.50.33)</em><br /><em>04-Nov-2020 23:31:39.880 failed gss_inquire_cred: GSSAPI error: Major = Unspecified GSS failure. Minor code may provide more information, Minor = No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_0).</em><br /><em>04-Nov-2020 23:31:39.884 gss-api source name (accept) is AD206$@TEST1.LOCAL</em><br /><em>04-Nov-2020 23:31:39.884 process_gsstkey(): dns_tsigerror_noerror</em><br /><em>04-Nov-2020 23:31:39.884 client @0x803875000 10.0.110.216#59439 (932-ms-7.51-18e34bc.2db42801-1eb9-11eb-d293-005056bddce2): send</em><br /><em>04-Nov-2020 23:31:39.884 client @0x803875000 10.0.110.216#59439 (932-ms-7.51-18e34bc.2db42801-1eb9-11eb-d293-005056bddce2): sendto</em><br /><em>04-Nov-2020 23:31:39.884 client @0x803875000 10.0.110.216#59439 (932-ms-7.51-18e34bc.2db42801-1eb9-11eb-d293-005056bddce2): senddone</em><br /><em>04-Nov-2020 23:31:39.884 client @0x803875000 10.0.110.216#59439 (932-ms-7.51-18e34bc.2db42801-1eb9-11eb-d293-005056bddce2): next</em><br /><em>04-Nov-2020 23:31:39.884 client @0x803875000 10.0.110.216#59439 (932-ms-7.51-18e34bc.2db42801-1eb9-11eb-d293-005056bddce2): endrequest</em><br /><em>04-Nov-2020 23:31:39.884 client @0x803875000 10.0.110.216#59439: closetcp</em><br /><em>04-Nov-2020 23:31:39.885 client @0x804811a00 10.0.110.216#59439: next</em><br /><em>04-Nov-2020 23:31:39.885 client @0x804811a00 10.0.110.216#59439: request failed: end of file</em><br /><em>04-Nov-2020 23:31:39.885 client @0x804811a00 10.0.110.216#59439: endrequest</em><br /><em>04-Nov-2020 23:31:39.885 client @0x804811a00 10.0.110.216#59439: closetcp</em><br /><em>04-Nov-2020 23:31:39.886 client @0x803874600 10.0.110.216#53407: UDP request</em><br /><em>04-Nov-2020 23:31:39.886 client @0x803874600 10.0.110.216#53407: using view '_default'</em><br /><em>04-Nov-2020 23:31:39.886 client @0x803874600 10.0.110.216#53407: request has valid signature: AD206\$\@TEST1.LOCAL</em><br /><em>04-Nov-2020 23:31:39.886 client @0x803874600 10.0.110.216#53407/key AD206\$\@TEST1.LOCAL: recursion available</em><br /><em>04-Nov-2020 23:31:39.886 client @0x803874600 10.0.110.216#53407/key AD206\$\@TEST1.LOCAL: update</em><br /><em>04-Nov-2020 23:31:39.886 client @0x803874600 10.0.110.216#53407/key AD206\$\@TEST1.LOCAL: updating zone 'test1.local/IN': prerequisites are OK</em><br /><em>04-Nov-2020 23:31:39.886 client @0x803874600 10.0.110.216#53407/key AD206\$\@TEST1.LOCAL: updating zone 'test1.local/IN': update section prescan OK</em><br /><em>04-Nov-2020 23:31:39.886 client @0x803874600 10.0.110.216#53407/key AD206\$\@TEST1.LOCAL: updating zone 'test1.local/IN': deleting rrset at 'ad206.test1.local' AAAA</em><br /><em>04-Nov-2020 23:31:39.886 client @0x803874600 10.0.110.216#53407/key AD206\$\@TEST1.LOCAL: updating zone 'test1.local/IN': deleting rrset at 'ad206.test1.local' A</em><br /><em>04-Nov-2020 23:31:39.886 client @0x803874600 10.0.110.216#53407/key AD206\$\@TEST1.LOCAL: updating zone 'test1.local/IN': adding an RR at 'ad206.test1.local' A 10.0.110.206</em><br /><em>04-Nov-2020 23:31:39.886 client @0x803874600 10.0.110.216#53407/key AD206\$\@TEST1.LOCAL: updating zone 'test1.local/IN': adding an RR at 'ad206.test1.local' A 10.0.110.216</em><br /><em>04-Nov-2020 23:31:39.886 client @0x803874600 10.0.110.216#53407/key AD206\$\@TEST1.LOCAL: updating zone 'test1.local/IN': redundant request</em><br /><em>04-Nov-2020 23:31:39.886 client @0x803874600 10.0.110.216#53407/key AD206\$\@TEST1.LOCAL: send</em></p>
</blockquote>
<p><strong>This update was not expected to get accepted.</strong></p>
<p><strong>=======================================</strong></p>
<p><strong>I did modification of test to include tkey-gssapi-credential</strong><br /><strong>where I got more expected result</strong></p>
<blockquote type="cite" style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0">
<p>tkey-gssapi-credential "DNS/dns2.test.local@TEST.LOCAL";</p>
</blockquote>
<p>Update into main domain TEST.LOCAL shows sucessfull GSS</p>
<blockquote type="cite" style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0">
<p>04-Nov-2020 23:35:12.167 client @0x803875000 10.0.110.207#60534: query<br />04-Nov-2020 23:35:12.167 client @0x803875000 10.0.110.207#60534 (612-ms-7.12-9a6b9d.7a3e8427-1ed6-11eb-438f-005056bd8592): query: 612-ms-7.12-9a6b9d.7a3e8427-1ed6-11eb-438f-005056bd8592 IN TKEY -T (10.0.50.33)<br />04-Nov-2020 23:35:12.168 gss cred: "DNS/dns2.test.local@TEST.LOCAL", GSS_C_ACCEPT, 4294967295<br />04-Nov-2020 23:35:12.170 gss-api source name (accept) is AD207$@TEST.LOCAL<br />04-Nov-2020 23:35:12.170 process_gsstkey(): dns_tsigerror_noerror</p>
</blockquote>
<p><strong>with 2nd domain TEST1.LOCAL, ending in error</strong></p>
<blockquote type="cite" style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0">
<p>04-Nov-2020 23:36:07.223 client @0x804c11000 10.0.110.216#62340 (932-ms-7.53-192491b.2db42801-1eb9-11eb-d293-005056bddce2): query: 932-ms-7.53-192491b.2db42801-1eb9-11eb-d293-005056bddce2 IN TKEY -T (10.0.50.33)<br />04-Nov-2020 23:36:07.224 gss cred: "DNS/dns2.test.local@TEST.LOCAL", GSS_C_ACCEPT, 4294967295<br />04-Nov-2020 23:36:07.224 failed gss_accept_sec_context: GSSAPI error: Major = Unspecified GSS failure. Minor code may provide more information, Minor = Cannot find key for DNS/dns2.test.local@TEST.LOCAL kvno 3 in keytab (request ticket server DNS/dns2.test.local@TEST1.LOCAL).<br />04-Nov-2020 23:36:07.224 process_gsstkey(): dns_tsigerror_badkey</p>
</blockquote>
<p><strong>where I understood that I apply explicitly 1 'security credential' to verify GSS;</strong><br /><strong>Of course, update for TEST1.LOCAL is not valid for TEST.LOCAL Principal name</strong></p>
<p><strong>Other observation:</strong></p>
<p><strong>On my FreeBSD, I think BIND is caching Kerberos into</strong></p>
<blockquote type="cite" style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0">
<p>root@dns2:~ # ls -la /var/tmp/krb5_53.rcache2<br />-rw------- 1 bind wheel 13584 Nov 4 23:56 /var/tmp/krb5_0.rcache2</p>
</blockquote>
<p><strong>but log entry points to: <em>/tmp/krb5cc_0</em></strong></p>
<p><br /></p>
<p><strong>Making sum, my concern goes to:</strong></p>
<ul>
<li><strong>is it expected to use single keytab file with multiple Principal Name authenticate clients from multiple domains?</strong><br /><strong>In case yes - did my I miss any configuration to be done or I hit area which is not covered</strong><br /><br /><strong>In case no, we should be clear on documentation to point to single principal name to be used</strong></li>
</ul>
<p><br /></p>
<p>Appreciate any feedback on this topic.</p>
<p><br /></p>
<p>Best Regards,<br />Peter</p>

</body></html>