Безопасность DNS и сети с нулевым доверием
DNS решает, кому доверять, ещё до того как TLS это подтвердит, — поэтому сам запрос остаётся поверхностью атаки, о которой забывают. Урок разбирает отравление кэша, DNSSEC и DoH и то, почему индустрия сменила сетевой периметр на идентичность в каждом запросе.
Ваш сервис делает один исходящий вызов: https://payments.internal/charge. Вы запинили TLS-сертификат, проротировали ключ, включили HSTS. Вы чувствуете себя в безопасности. Но прежде чем что-либо из этого запустится, резолвер спрашивает: «какой IP у payments.internal?» — по UDP на порт 53, открытым текстом, без аутентификации и без проверки целостности, и любое устройство на пути или отравленный кэш может ответить адресом атакующего. TLS затем честно устанавливает шифрованный, аутентифицированный канал именно к этому хосту. Криптография отработала идеально — она просто защитила разговор не с тем сервером. DNS — это решение о доверии, которое принимается раньше, чем просыпается ваш стек безопасности, и почти всю историю интернета оно по умолчанию было неаутентифицированным.
К концу урока вы поймёте, почему DNS — поверхность атаки, лежащая под TLS, что именно защищают (и не защищают) DNSSEC и DoH и почему индустрия отказалась от сетевого периметра в пользу модели нулевого доверия, построенной на идентичности в каждом запросе.
DNS — это решение о доверии, а не просто поиск
Считайте DNS трубопроводом — и будете защищать не тот слой. Резолюция имени в адрес — это момент, когда ваша система выбирает, кому доверять, и классический DNS делает этот выбор по неаутентифицированному UDP открытым текстом. В продакшене доминируют два сценария отказа.
Отравление кэша. Резолвер, кэширующий ответы, можно обманом заставить закэшировать поддельный. Атака Камински 2008 года сделала это особенно жёстким: рассылая поддельные ответы для множества случайных поддоменов, атакующему нужно выиграть лишь одну гонку с легитимным ответом, а поскольку у ранней версии протокола был всего лишь 16-битный идентификатор транзакции (65 536 значений) и известный исходный порт, эту гонку можно было выиграть за секунды на быстром канале. Отравленная запись затем отдаётся всем нижестоящим клиентам, пока не истечёт TTL. Патч — рандомизация исходного порта, добавляющая ~16 бит энтропии, — превратил секундную атаку в статистически непрактичную, но это смягчение, а не исправление: ничто в протоколе так и не аутентифицировало ответ.
Атакующий на пути и привилегия резолвера. Любой между вами и резолвером — вредоносная Wi-Fi-точка, скомпрометированный роутер, враждебный провайдер — может прочитать каждое имя, которое вы ищете (утечка приватности), и переписать ответ (атака на целостность). Ваш резолвер — один из самых привилегированных хостов в стеке: он молча решает, куда пойдёт каждое ваше соединение.
DNSSEC и DoH защищают разные вещи
Их постоянно путают, и эта путаница рождает ложное чувство безопасности. Они решают ортогональные проблемы.
DNSSEC подписывает DNS-записи криптографией с открытым ключом, выстраивая цепочку доверия от корневой зоны до ответа. Он гарантирует целостность и подлинность: запись, которую вы получили, — это запись, опубликованная владельцем зоны, без изменений. Он ничего не шифрует — DNSSEC-запрос и подписанный ответ по-прежнему видны на проводе — и решает отравление кэша в корне, потому что поддельный ответ не пройдёт проверку подписи. Его цена реальна: развёртывание операционно тяжёлое (ротации ключей, разрыв цепочки доверия уводит зону в офлайн), а внедрение годами буксует значительно ниже половины зон, так что полагаться на него от края до края обычно нельзя.
DoH / DoT (DNS over HTTPS / over TLS) оборачивают запрос в шифрованный транспорт. Они гарантируют конфиденциальность и целостность транспорта от наблюдателя на пути: атакующий из кофейни больше не видит и не переписывает ваши запросы. Они не аутентифицируют саму запись — ваш резолвер всё ещё может вернуть отравленный или цензурированный ответ; вы просто перенесли своё доверие на того, кто держит резолвер. То, что DoH туннелирует DNS внутри обычного HTTPS (порт 443), также объясняет его спорность: он обходит сетевой мониторинг DNS, на который опираются корпоративные и родительские фильтры.
| Механизм | Защищает | НЕ защищает | Реальная цена / подвох |
|---|---|---|---|
| DNSSEC | Целостность + подлинность записи (убивает отравление кэша) | Конфиденциальность — запрос и ответ по-прежнему открытым текстом | Тяжёлые операции (ротация ключей, разрыв цепочки); внедрение <50% зон |
| DoH / DoT | Конфиденциальность от стороны на пути; целостность транспорта | Подлинность записи — резолвер всё ещё может солгать | Доверие смещается на оператора резолвера; DoH обходит сетевую фильтрацию |
| Рандомизация исходного порта | Поднимает сложность отравления (~+16 бит энтропии) | Всё, что дал бы аутентифицированный канал — это лишь налог на вероятность | Смягчение, а не исправление; считает атакующего не на пути |
Зрелое прочтение: DNSSEC плюс шифрованный транспорт — это полный ответ — подпишите запись, чтобы её нельзя было подделать, зашифруйте запрос, чтобы его нельзя было прочитать или переписать в полёте. Каждое в отдельности оставляет реальную брешь. И ни то ни другое не отвечает на более глубокий вопрос, ради которого этот урок и существует: даже при идеально разрешённом, идеально зашифрованном соединении с правильным хостом — должен ли этот вызывающий вообще иметь к нему доступ? Вот где ломается модель периметра.
Почему периметр умер: нулевое доверие
Классическая модель — это замок: жёсткий сетевой периметр (файрвол, VPN) вокруг мягкой, доверенной внутренней части. Попал внутрь VPN — и ты «в корпоративной сети», что неявно означало доверенный — плоский east-west доступ к внутренним сервисам. У этой модели один катастрофический сценарий отказа: как только атакующий внутри, он владеет всем. Фишинговый ноутбук, скомпрометированная VPN-учётка подрядчика, одно проэксплуатированное краевое устройство — и плоская внутренняя часть превращается в площадку для свободного латерального движения. Вторжение SolarWinds 2020 года — канонический пример: доверенная внутренняя позиция превратила одну точку опоры в цепочке поставок в широкий охват.
Нулевое доверие, закреплённое в NIST SP 800-207, переворачивает допущение: никогда не доверяй, всегда проверяй. Доверенной сети не существует. Расположение запроса — внутри VPN или в Wi-Fi отеля — даёт ноль неявной авторизации. Каждый отдельный запрос к ресурсу аутентифицируется и авторизуется по собственным заслугам, оценивается против идентичности пользователя и устройства, а не IP, с которого пришёл. Доверие никогда не выдаётся по сетевому положению и непрерывно переоценивается, а не раздаётся один раз при входе.
▸Почему это работает
Почему «сеть — это периметр» перестаёт работать именно сейчас? Два структурных сдвига. Первый: периметр растворился — SaaS, нагрузки в публичном облаке и удалённая работа означают, что ваши пользователи и сервисы больше не внутри какой-то одной сети, которую вы контролируете; обводить стеной больше нечего. Второй: допущение «внутри = безопасно» всегда было латентным багом — просто раньше оно было переживаемым. По мере того как пробои росли, а латеральное движение становилось доминирующей пост-компрометационной тактикой, цена допущения о неявном доверии в конце концов превысила цену аутентификации каждого запроса. Нулевое доверие — это не новый продукт, который покупают, а снятие допущения, которое вы больше не можете себе позволить.
Как нулевое доверие выглядит на практике: BeyondCorp и IAP
BeyondCorp от Google — эталонная реализация, рождённая из атаки Aurora 2009 года, прошедшей прямо сквозь их периметр. Ключевой компонент — identity-aware proxy (IAP): вместо VPN, который высаживает вас в сеть, каждый запрос к внутреннему приложению проходит через прокси, который в каждом запросе проверяет аутентифицированную идентичность пользователя, состояние устройства (управляемое ли оно, пропатченное, здоровое?) и политику авторизации для конкретного ресурса — и затем разрешает или запрещает. Нет сети, в которой можно было бы «находиться». Инженер попадает на внутренний дашборд из кафе ровно так же, как из офиса: через прокси, доказывая, кто он и с какого устройства, каждый раз.
Это схлопывает поверхность атаки так, как VPN никогда не мог. Украденная сессия или фишинговая учётка больше не отдают сеть; они отдают, самое большее, узкий набор ресурсов, на которые авторизована эта пара идентичность-плюс-устройство, перепроверяемый в каждом запросе — а состояние устройства может отозвать доступ в момент, когда машина выпадает из соответствия. Рукопожатие TLS 1.3 (RFC 8446), аутентифицирующее каждое из этих соединений, — криптографический фундамент, на котором стоит нулевое доверие: взаимная идентичность, прямая секретность и более быстрое рукопожатие делают проверку в каждом запросе достаточно дешёвой, чтобы делать её везде.
Удалённому инженеру нужен доступ к внутреннему админ-дашборду. Из вашего доступа на основе VPN только что выфишили учётку. Выберите дизайн, следующий нулевому доверию.
Вы включаете DoH (DNS over HTTPS) для всех клиентов и считаете, что подмена DNS теперь решена. Что всё ещё открыто?
В архитектуре нулевого доверия (NIST SP 800-207) инженер подключён к корпоративному VPN. Что этот факт ему даёт?
Упорядочьте, что происходит в запросе нулевого доверия (IAP) к внутреннему приложению, от вызова клиента до решения разрешить/запретить:
- 1 Клиент запрашивает внутреннее приложение; запрос попадает на identity-aware proxy (нет VPN, нет доверенной сети)
- 2 Прокси аутентифицирует идентичность пользователя (SSO / взаимный TLS)
- 3 Прокси проверяет состояние устройства — управляемое, пропатченное, здоровое?
- 4 Прокси оценивает политику авторизации для этого конкретного ресурса
- 5 Разрешить или запретить — переоценивается на следующем запросе, не кэшируется как «доверенный»
- 01Почему DNS — поверхность атаки, лежащая под TLS, и что защищает каждый из DNSSEC и DoH?
- 02Что нулевое доверие (NIST SP 800-207) заменяет и как identity-aware proxy его обеспечивает?
DNS — это решение о доверии, принимаемое раньше, чем просыпается ваш стек безопасности: классическая резолюция идёт по неаутентифицированному открытому UDP/53, так что отравление кэша (Камински) или атакующий на пути могут перенаправить вас на вредоносный хост, к которому ваш идеально настроенный TLS затем безупречно подключится — защитив разговор не с тем сервером. DNSSEC и DoH чинят ортогональные половины: DNSSEC подписывает записи ради целостности и подлинности (убивая отравление, но оставляя запросы открытым текстом и застряв ниже 50% внедрения), а DoH/DoT шифруют запрос ради конфиденциальности от наблюдателей на пути (но не остановят лгущий резолвер) — поэтому полный ответ это оба. Над резолюцией стоит более глубокий сдвиг: сетевой периметр умер, потому что SaaS, облако и удалённая работа растворили стену, а «внутри = доверенный» превращал каждую точку опоры в плоское латеральное движение. Нулевое доверие (NIST SP 800-207) вовсе убирает сетевое положение как сигнал доверия — никогда не доверяй, всегда проверяй, — а identity-aware proxy из BeyondCorp обеспечивает это, аутентифицируя идентичность пользователя, состояние устройства и политику для конкретного ресурса в каждом отдельном запросе, стоя на TLS 1.3. Теперь, увидев систему, которая выдаёт доступ потому, что запрос пришёл «изнутри VPN», ваш первый вопрос: что здесь на самом деле аутентифицируется — идентичность и устройство или просто IP?
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.
Примени это
Примени этот урок в реальном проекте.