Bind 9: Nerušte mi moje kruhy

Ač již Česká republika nedrží primát v absolutním počtu DNSSEC podepsaných domén, tak stále je necelých 410 tisíc podepsaných domén úctyhodné číslo. S tím, jak narůstá počet zabezpečených domén, ale také vzrůstá počet poskytovatelů připojení, kteří na svých DNS resolverech ověřují DNSSEC. Je tedy normální, že se také občas přijde na nějaký implementační zádrhel. Jelikož jsme na jedno takové škobrtnutí narazili již podruhé, tak jej na následujících řádkách popíšu, společně s dobrou zprávou, že oprava je již na cestě.

Představte si docela běžnou situaci, kdy máte na DNS serveru nějaké podepsané domény, a z nenadání vám vaši zákazníci hlásí, že se v síti poskytovatele ABCXYZ, který používá na svých resolverech Bind 9, jejich (nebo vaši) uživatelé nemohou dostat na stránky. Pečlivě prozkoumáte DNSSEC a bohužel neobjevíte žádnou závadu. A ani nemůžete, protože celý problém tkví v tom, že Bind 9 obsahuje kontrolní mechanismus, který za specifických podmínek označí autoritativní DNS server jako neschopný komunikovat pomocí rozšíření EDNS0. Naneštěstí je EDNS0 nutnou podmínkou pro fungování DNSSECu a výsledkem celé této akce je, že takový resolver najednou není schopen ověřovat DNSSEC podepsané domény běžící na tomto DNS serveru.

Zrada ovšem spočívá v tom, že k nastavení příznaku není-schopen-EDNS0 stačí, aby v úplně libovolné doméně, kterou máte na serveru, někdo vytvořil úplně jednoduchou CNAME smyčku (circular CNAME).

Záznam pak bude vypadat takto:

maly.kasuar.cz. IN CNAME maly.kasuar.cz.

Pokud pak koncový uživatel položí neopravenému resolveru dotaz na maly.kasuar.cz, tak je problém na světě.

Dobrá zpráva nakonec, opravné verze Bind 9.6-ESV-R9, 9.8.5, a 9.9.3 již tuto chybu neobsahují. Pokud byste hledali konkrétní opravu, tak ji najdete pod číslem #30811 a patch vypadá takto:

diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c
index d81de76..46af973 100644
--- a/lib/dns/resolver.c
+++ b/lib/dns/resolver.c
@@ -6627,13 +6627,7 @@ resquery_response(isc_task_t *task, isc_event_t *event) {
			 */
			options |= DNS_FETCHOPT_NOEDNS0;
			resend = ISC_TRUE;
-			/*
-			 * Remember that they don't like EDNS0.
-			 */
-			dns_adb_changeflags(fctx->adb,
-					    query->addrinfo,
-					    DNS_FETCHOPT_NOEDNS0,
-					    DNS_FETCHOPT_NOEDNS0);
+			add_bad_edns(fctx, &query->addrinfo->sockaddr);
		} else {
			/*
			 * There's no hope for this query.
@@ -6700,14 +6694,8 @@ resquery_response(isc_task_t *task, isc_event_t *event) {
					 */
					options |= DNS_FETCHOPT_NOEDNS0;
					resend = ISC_TRUE;
-					/*
-					 * Remember that they don't like EDNS0.
-					 */
-					dns_adb_changeflags(
-							fctx->adb,
-							query->addrinfo,
-							DNS_FETCHOPT_NOEDNS0,
-							DNS_FETCHOPT_NOEDNS0);
+					add_bad_edns(fctx,
+						    &query->addrinfo->sockaddr);
					inc_stats(fctx->res,
						 dns_resstatscounter_edns0fail);
				} else {
@@ -6731,13 +6719,7 @@ resquery_response(isc_task_t *task, isc_event_t *event) {
				 */
				options |= DNS_FETCHOPT_NOEDNS0;
				resend = ISC_TRUE;
-				/*
-				 * Remember that they don't like EDNS0.
-				 */
-				dns_adb_changeflags(fctx->adb,
-						    query->addrinfo,
-						    DNS_FETCHOPT_NOEDNS0,
-						    DNS_FETCHOPT_NOEDNS0);
+				add_bad_edns(fctx, &query->addrinfo->sockaddr);
				inc_stats(fctx->res,
						 dns_resstatscounter_edns0fail);
			} else {
Autor:

Zanechte komentář