Сети и протоколы
DNSSEC: цепочка доверия и сбой валидации
Ваша DNS-запись выглядит корректно во всех авторитативных инструментах. Но 30% пользователей не могут открыть ваш сайт — они видят DNS_PROBE_FINISHED_NXDOMAIN. Остальные 70% работают нормально. Разница не в провайдере; разница в том, валидирует ли их резолвер DNSSEC. На прошлой неделе вы ротировали KSK и забыли обновить DS-запись у родительского регистратора. Цепочка оборвалась.
Что делает DNSSEC и чего не делает
DNSSEC аутентифицирует DNS-ответы: он доказывает, что A-запись для bank.example пришла от легитимного авторитативного сервера и не была подделана в пути. Он не шифрует DNS-сообщения — перехватчик по-прежнему видит, какой домен вы запрашивали; этим занимаются DoH и DoT. DNSSEC валидирует данные; шифрование скрывает запросы.
Роли ключей: ZSK и KSK
Каждая подписанная зона публикует два типа ключей:
- ZSK (Zone Signing Key) — подписывает фактические RRset-данные (A-, MX-, TXT-записи и т. д.). Ротируется часто (на практике каждые 1–3 месяца).
- KSK (Key Signing Key) — подписывает только DNSKEY RRset, который публикует ZSK. Ротируется редко (каждые 1–3 года). Его хэш публикуется в родительской зоне как запись DS (Delegation Signer).
Разделение существует затем, чтобы ротация ZSK была дешёвой (без обновления у родителя), а ротация KSK — требующая координации с родителем — происходила редко.
Цепочка доверия
Каждый валидирующий резолвер хранит один жёстко заданный якорь доверия: отпечаток KSK корневой зоны. Валидация идёт сверху вниз:
- Резолвер держит отпечаток KSK корня как якорь доверия.
- Корень публикует DNSKEY (KSK корня + ZSK корня). Резолвер проверяет, что KSK корня совпадает с якорем доверия.
- ZSK корня подписывает DS-запись для
.com. Резолвер верифицирует DS.comс помощью ZSK корня. .comпубликует DNSKEY (KSK и ZSK.com). Резолвер проверяет, что KSK.comсовпадает с хэшем из DS шага 3.- ZSK
.comподписывает DS-запись дляexample.com. И так далее, вплоть до листовой зоны. - ZSK листовой зоны подписывает A-запись. RRSIG идёт с ответом.
- Если каждый шаг верифицируется → пометить ответ AD (Authentic Data). Если любой шаг падает → пометить BOGUS → вернуть SERVFAIL.
- Якорь доверия
- Отпечаток KSK корня (жёстко задан в каждом валидирующем резолвере)
- Назначение ZSK
- Подписывает данные зоны (A, MX, TXT, …)
- Назначение KSK
- Подписывает только DNSKEY RRset
- DS-запись
- Родительская зона хранит хэш KSK дочерней зоны
- RRSIG
- Подпись над одним RRset, прилагается к каждой записи
- Результат BOGUS
- Клиенту возвращается SERVFAIL
Режим отказа при ротации KSK
Самый распространённый инцидент DNSSEC:
- Оператор генерирует новый KSK в дочерней зоне.
- Оператор обновляет DNSKEY в дочерней зоне — новый KSK теперь подписывает DNSKEY RRset.
- Оператор забывает обновить DS-запись у родительского регистратора.
- Результат: DS у родителя содержит хэш старого KSK; RRSIG в дочерней зоне создан новым KSK.
- Валидирующие резолверы получают DNSKEY дочерней зоны, верифицируют RRSIG — он валиден с новым KSK — но затем проверяют DS у родителя и обнаруживают, что хэш не совпадает. Цепочка оборвана → BOGUS → SERVFAIL.
Только резолверы, валидирующие DNSSEC (Cloudflare 1.1.1.1, Google 8.8.8.8, Quad9), возвращают SERVFAIL. Невалидирующие резолверы провайдеров отдают неподписанный ответ в обычном режиме. Это разделяет трафик: примерно 30–40% глобальных пользователей (те, кто на валидирующих резолверах) не могут открыть сайт; остальные — могут.
Старшего инженера поднимают по инциденту: bank.example недоступен для ~30% пользователей по всему миру. Пройдите диагностику.
Вывод dig во время инцидента DNSSEC — поставьте диагноз
$ dig @1.1.1.1 +dnssec api.bank.example
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 41832
;; flags: qr rd ra; QUERY: 1, ANSWER: 0
$ dig @8.8.8.8 +dnssec api.bank.example
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 8821
$ dig @1.1.1.1 +cd api.bank.example # +cd = checking disabled
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1284
;; flags: qr rd ra cd; QUERY: 1, ANSWER: 1
api.bank.example. 60 IN A 203.0.113.42 Оба валидирующих резолвера возвращают SERVFAIL, но +cd возвращает нормальную A-запись. Первопричина и влияние на пользователей?
NSEC vs NSEC3: отрицание существования
DNSSEC должен также доказывать, что имя не существует — иначе атакующий мог бы удалить запись и заявить «нет A-записи для bank.example». Механизм:
- NSEC: цепочка имён зоны в алфавитном порядке. «Между
alpha.example.comиzebra.example.comничего нет.» Легко верифицировать, но позволяет атакующему обходить все NSEC-записи и перечислять всю зону. - NSEC3 (RFC 5155): хеширует имена с солью перед включением в цепочку. Соседние элементы в цепочке — хеш-соседи, а не алфавитные. Предотвращает тривиальное перечисление зоны; атака с таблицами радужных хешей всё ещё возможна, но затратна.
- NSEC5 (предложен/экспериментален): использует верифицируемые случайные функции; широко не развёрнут.
Операционная рекомендация: используйте NSEC3 для зон, где перечисление критично (корпоративные интрасети, поддомены клиентов); NSEC подходит для публичных зон, содержимое которых и так известно.
Почему ротация KSK без обновления DS у родителя вызывает SERVFAIL только у ~30% пользователей?
Расставьте шаги валидации DNSSEC для подписанного ответа:
- 1 Получить RRSIG над ответом; нужен DNSKEY зоны для верификации
- 2 Получить DNSKEY RRset зоны; верифицировать с подписью ZSK
- 3 Проверить, что ZSK подписан KSK зоны
- 4 Сравнить хэш KSK с DS-записью у родительской зоны
- 5 Верифицировать RRSIG родительского DS вплоть до корневой зоны
- 6 Сравнить KSK корня с локально настроенным якорем доверия
- 7 Если все звенья верифицированы — пометить ответ AD (Authentic Data) и вернуть
Почему это работает
Ротация KSK корня в 2018 году. Якорь доверия корневой зоны был опубликован в 2010 году и с тех пор ни разу не менялся. В 2018 году ICANN провела первую в истории ротацию KSK корня (KSK-2010 → KSK-2017). Подготовка заняла более трёх лет: любой резолвер, не обновивший якорь доверия до дня ротации, начал бы возвращать SERVFAIL для всех DNSSEC-подписанных имён по всему миру. ICANN мониторила популяции резолверов через специально инструментированные запросы и приостановила ротацию на 11 месяцев в 2017 году, обнаружив слишком много резолверов без поддержки RFC 5011, всё ещё использующих KSK-2010. RFC 5011 определяет автоматическую ротацию ключей: корневая зона публикует новый KSK рядом со старым не менее 30 дней, чтобы совместимые резолверы добавили новый ключ до удаления старого. Следующая запланированная ротация KSK корня ожидается около 2027–2028 годов. Урок: операционная сложность DNSSEC растёт с размером аудитории, зависящей от вашей зоны.
Требование CA/Browser Forum 2026
Ballot SC-085v2 CA/Browser Forum (вступил в силу 15 марта 2026 года) обязывает все публично доверенные центры сертификации валидировать DNSSEC при его наличии во время Domain Control Validation и проверок CAA. Если у вашего домена неправильно настроена цепочка DNSSEC — просроченные подписи, сломанная делегация, неверный DS — CA откажет в выдаче или продлении TLS-сертификата до исправления цепочки. Это не обязывает активировать DNSSEC; зоны, которые никогда не были подписаны, не затрагиваются. Но домены, подписавшие свои зоны, теперь обязаны поддерживать цепочку в рабочем состоянии, иначе потеряют возможность получать новые сертификаты.
- 01DNSSEC валидирует что именно — данные A-записи, факт существования имени или и то, и другое?
- 02Каково операционное различие между ZSK и KSK, и зачем нужно это разделение?
- 03Что делает флаг +cd в dig и почему он полезен при инциденте DNSSEC?
DNSSEC аутентифицирует DNS-ответы с помощью цепочки криптографических подписей — от якоря доверия корневой зоны вниз до отдельных записей. Два типа ключей выполняют разные роли: ZSK подписывает RRset-данные и ротируется часто; KSK подписывает DNSKEY RRset и ротируется редко, а его хэш хранится как DS-запись у родительской зоны. Разрыв в цепочке — несовпадение DS после ротации KSK, просроченный RRSIG, неверная делегация — заставляет валидирующие резолверы возвращать SERVFAIL и помечать ответ BOGUS. Невалидирующие резолверы по-прежнему отдают данные, поэтому неправильная конфигурация DNSSEC обычно ломает 30–40% пользователей (тех, кто на Cloudflare, Google, Quad9), не затрагивая остальных. NSEC и NSEC3 аутентифицируют отрицание существования; хеш-цепочка NSEC3 предотвращает тривиальное перечисление зоны. С марта 2026 года CA обязаны валидировать цепочки DNSSEC при выдаче сертификатов — сломанная цепочка теперь также блокирует продление TLS-сертификата.