DNS и криптография [331.4]

Рейтинг: 67.6% · 8 голосов
Специализация LPIC-3 303 (v3.0): криптография и PKI/X.509, шифрование ФС (LUKS/TPM2/Clevis), DNSSEC, hardening хоста, IDS, контроль доступа (SELinux/AppArmor), сетевая безопасность, nftables, VPN, пентест.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

DNS и криптография [331.4]

Сообщение Sergey_Sysadmin »

Оглавление курса (16)
  1. Введение в LPIC-3 303: безопасность Linux
  2. X.509 и инфраструктура открытых ключей [331.1]
  3. X.509 для шифрования, подписи и аутентификации [331.2]
  4. Шифрование файловых систем [331.3]
  5. DNS и криптография [331.4] (вы здесь)
  6. Усиление защиты хоста [332.1]
  7. Урок 6. Обнаружение вторжений на хосте: AIDE, auditd, сканеры руткитов и OpenSCAP
  8. Контроль ресурсов [332.3]
  9. Дискреционный контроль доступа: ACL и атрибуты [333.1]
  10. Мандатный контроль доступа: SELinux и AppArmor [333.2]
  11. Усиление сетевой защиты [334.1]
  12. Сетевое обнаружение вторжений
  13. Фильтрация пакетов [334.3]
  14. Виртуальные частные сети (VPN) [334.4]
  15. Уязвимости и угрозы [335.1]
  16. Основы тестирования на проникновение [335.2]
Урок 4. DNS и криптография [331.4]

DNS изначально проектировался без всякой защиты: резолвер верит любому ответу, который пришёл с нужного адреса и с нужным ID запроса. Это открывает дорогу подмене ответов и отравлению кеша. В этом уроке мы закрываем дыру криптографией: DNSSEC подписывает данные зоны и строит цепочку доверия от корня, DANE привязывает TLS-сертификат к имени через DNS, TSIG защищает служебные транзакции между серверами, а CAA ограничивает, кто вообще может выпустить сертификат на ваш домен. В конце разберём, как закалить сам резолвер.

Изображение

Как это работает

DNSSEC не шифрует трафик. Он добавляет к записям подписи, чтобы резолвер мог проверить целостность и подлинность данных. Каждая зона держит пару ключей. ZSK (Zone Signing Key) подписывает обычные наборы записей, KSK (Key Signing Key) подписывает только сам набор DNSKEY. Подписи лежат в записях RRSIG, публичные ключи - в DNSKEY.

Доверие строится снизу вверх. Родительская зона хранит запись DS - это хеш вашего KSK. Резолвер идёт от корня: проверяет DS у родителя, по нему доверяет вашему KSK, тот подтверждает DNSKEY, а ZSK из DNSKEY проверяет RRSIG на конкретной записи. Корневой ключ зашит в резолвер как trust anchor. Если хоть одно звено не сходится, ответ помечается как SERVFAIL с флагом провала валидации.

DANE решает другую задачу. Обычный TLS доверяет любому из сотен CA. DANE через запись TLSA говорит: для этого хоста и порта валиден вот именно такой сертификат или ключ. Работает только поверх DNSSEC, иначе саму TLSA-запись можно подменить. Формат - три числа: usage, selector, matching-type. Для почты по RFC 7672 канон это 3 1 1: DANE-EE (проверяем сам сертификат сервера, без оглядки на CA), selector SPKI (хешируем только публичный ключ, а не весь сертификат), SHA-256.

TSIG - это симметричная подпись транзакций общим секретом. Её ставят на трансфер зоны (AXFR/IXFR), на динамические обновления и на NOTIFY. Сервер и клиент знают один ключ, подпись кладётся в дополнительную секцию пакета. Время в подписи имеет значение: разъехавшиеся часы ломают TSIG.

CAA - простая, но важная запись. Она перечисляет, какие удостоверяющие центры имеют право выпускать сертификаты на домен. Перед выдачей CA обязан её проверить. Это не про DNSSEC напрямую, но это часть той же гигиены доверия.

Команды и примеры

В 2026 в BIND 9.20 ручное жонглирование ключами через auto-dnssec ушло в прошлое. Используем dnssec-policy: BIND сам генерирует ключи, подписывает зону inline и ротирует ключи по расписанию. Дефолтная политика - один CSK на алгоритме 13 (ECDSAP256SHA256).

Установка пакетов:

Код: Выделить всё

# Debian 13 / Ubuntu 24.04
apt install bind9 bind9-dnsutils

# RHEL 10 / Fedora 41+
dnf install bind bind-utils
Подключаем политику в named.conf для зоны:

Код: Выделить всё

zone "example.com" {
    type primary;
    file "/var/lib/bind/example.com.zone";
    dnssec-policy default;
    inline-signing yes;
};
После перезапуска BIND сам подпишет зону. Смотрим состояние ключей и достаём DS для родителя:

Код: Выделить всё

rndc dnssec -status example.com
dnssec-dsfromkey -2 Kexample.com.+013+12345.key
Полученную DS-запись отдаём регистратору домена - это и замыкает цепочку доверия. Проверяем валидацию через резолвер (флаг ad - authenticated data):

Код: Выделить всё

dig +dnssec +multi example.com SOA @1.1.1.1
delv example.com SOA   # delv делает полную валидацию локально
В выводе dig ищем flags: ad и записи RRSIG. delv пишет fully validated если цепочка цела.

Генерируем TLSA для почтового сервера из живого сертификата (3 1 1, SPKI, SHA-256):

Код: Выделить всё

openssl x509 -in /etc/letsencrypt/live/mail.example.com/cert.pem \
  -noout -pubkey \
  | openssl pkey -pubin -outform DER \
  | openssl dgst -sha256 -binary | xxd -p -c 256
Запись в зоне:

Код: Выделить всё

_25._tcp.mail.example.com. IN TLSA 3 1 1 <хеш>
Важно: при автообновлении Let's Encrypt запускайте certbot с --reuse-key, тогда ключ не меняется и TLSA-запись остаётся валидной.

CAA-запись в зоне:

Код: Выделить всё

example.com. IN CAA 0 issue "letsencrypt.org"
example.com. IN CAA 0 iodef "mailto:security@example.com"
TSIG-ключ для трансфера зоны:

Код: Выделить всё

tsig-keygen -a hmac-sha256 xfr-key > /etc/bind/xfr.key
На primary разрешаем трансфер только с этим ключом:

Код: Выделить всё

key "xfr-key" { algorithm hmac-sha256; secret "..."; };
zone "example.com" { ... allow-transfer { key xfr-key; }; };
Частые грабли
  • Забыли отдать DS регистратору. Зона подписана, но родитель про неё не знает - валидирующие резолверы либо не видят защиты, либо при наличии старого DS получают SERVFAIL.
  • Сменили алгоритм или KSK, а DS у родителя остался старый. Цепочка рвётся мгновенно - домен пропадает для всех валидирующих резолверов.
  • TLSA без DNSSEC бесполезна и опасна: запись можно подменить, проверка превращается в фикцию.
  • Обновили сертификат, забыли про --reuse-key - ключ сменился, TLSA указывает на старый, почта по DANE отбивается.
  • Разъехались часы на серверах - TSIG валит транзакции с BADTIME, RRSIG считаются протухшими или ещё не вступившими в силу.
  • Открытый рекурсивный резолвер наружу - это участие в DNS amplification атаках. Рекурсию пускайте только для своих сетей.
Мини-лаба
  • Поднимите authoritative BIND 9.20 для тестовой зоны lab.local на стенде.
  • Включите dnssec-policy default и inline-signing, перезапустите named, дождитесь подписи зоны.
  • Командой rndc dnssec -status убедитесь, что CSK в состоянии signing, найдите DNSKEY и RRSIG через dig +dnssec.
  • Сгенерируйте DS через dnssec-dsfromkey и вручную пропишите его в родительскую тестовую зону, чтобы замкнуть цепочку.
  • Проверьте полную валидацию через delv - добейтесь fully validated.
  • Создайте TLSA 3 1 1 для тестового TLS-сервиса и проверьте её dig TLSA.
  • Настройте TSIG-ключ и разрешите AXFR только по нему, затем убедитесь, что трансфер без ключа отбивается.
Контрольные вопросы
  • Чем функционально различаются KSK и ZSK и почему DS у родителя считается именно от KSK, а не от ZSK?
  • Какие записи участвуют в цепочке доверия от корня до конечного RRset и в каком порядке их проверяет резолвер?
  • Почему для SMTP по RFC 7672 рекомендуют именно TLSA 3 1 1, а usage 0 и 1 не применяют?
  • Зачем DANE строго требует работающего DNSSEC и что произойдёт при его отсутствии?
  • На какие три типа транзакций ставят TSIG и почему рассинхрон времени ломает проверку?
  • Что именно ограничивает запись CAA и в какой момент жизненного цикла сертификата она проверяется?
👍4 ❤️2 🔥 😄 🤔1
Аватара пользователя
asynclord
Сообщения: 1
Зарегистрирован: 15 май 2026, 12:09

Re: DNS и криптография [331.4]

Сообщение asynclord »

А если регистратор поддерживает CDS/CDNSKEY, можно же вообще не таскать DS руками? BIND 9.20 сам публикует CDS, родитель его подхватывает - проверял, работает, но не у всех регистраторов есть.
👍1 ❤️1 🔥 😄 🤔
Аватара пользователя
rhowes
Сообщения: 1
Зарегистрирован: 20 май 2026, 09:29

Re: DNS и криптография [331.4]

Сообщение rhowes »

Споткнулся ровно на --reuse-key: обновился серт по крону, ключ сменился, и почта по DANE встала колом на пару часов, пока не понял что TLSA указывает в пустоту.
👍 ❤️1 🔥1 😄 🤔
Ответить
← Предыдущая глава
Шифрование файловых систем [331.3]
Следующая глава →
Усиление защиты хоста [332.1]

Все главы курса «LPIC-3 303: безопасность Linux»

Поделиться темой: ✈ Telegram VK

Вернуться в «LPIC-3 303: безопасность Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость