Приватні імена VPN не працюють? Підозрюваний — захист від ребіндингу DNS
Резолвер, що відкидає відповіді з приватного простору, ламає внутрішні імена, а не тунель. Прочитайте відповідь, звузьте виняток, захист залиште в інших місцях.
В офісній локальній мережі внутрішнє ім'я відповідає миттєво. У момент увімкнення VPN воно перестає працювати, застосунок повідомляє про тайм-аут, а сам тунель без скарг пропускає трафік. Змінився резолвер, і цей резолвер має власну думку про приватні адреси.
Захист від ребіндингу існує, щоб зупинити один конкретний трюк. Навмисно опубліковане приватне ім'я виглядає достатньо схоже, щоб захист спрацював.
Спочатку прочитайте відповідь, потім політику
Запитайте ім'я в того резолвера, який VPN справді роздає, а не в того, який ваш ноутбук використовує вдома. Порівняйте відповідь з очікуваним записом і занотуйте, чи вона порожня, відкинута чи повна публічних адрес, яких ніхто не планував.
Симптоми перетинаються, тому діагноз визначає форма відповіді. NXDOMAIN — відсутній запис, REFUSED — правило доступу, публічна адреса для внутрішнього імені — помилка політики або split-DNS, а правильна приватна адреса, яку клієнт не може використати, — зовсім інша проблема. Відкинуте з'єднання чи завислий запит самі по собі нічого не доводять, тому першою командою в таких заявках має бути запит, а не перезапуск. Запишіть відповідь, перш ніж щось змінювати.
Що захист насправді зупиняє
Ребіндинг DNS працює, змінюючи те, у що розв'язується ім'я після того, як клієнт уже йому довірився. Сторінка завантажується з імені, контрольованого атакувальником, відповідь перемикається на приватну адресу, і браузер обманом змушують говорити з чимось у локальній мережі, з чим він ніколи не прийняв би прямого з'єднання. Захист полягає в тому, щоб відкидати відповіді, які вказують у приватний простір, коли резолвер ніколи не просили обслуговувати приватний простір імен. Ця асиметрія і є вся атака.
dnsmasq документує саме таку поведінку разом з винятками для доменів. У своєму посібнику він описує rebind-domain-ok як спосіб назвати домени, які можуть законно повертати такі адреси. Читайте це як сигнал, що задумане виправлення — обмежений дозвіл, а не глобальний перемикач.
Обмежте виняток простором імен
Спочатку виправте простір імен, потім виняток. Переконайтеся, що збійне ім'я належить домену, яким керує організація, і що запис підтримується навмисно. Неочікувана адреса, яка лише нагадує знайомий діапазон локальної мережі, заслуговує на підозру, а не на виняток, тому перевірте власника зони, перш ніж писати будь-який дозвіл.
# ask the resolver the VPN pushed, and show the full answer
dig +noall +answer db.corp.example @10.40.0.1
dig +short db.corp.example @10.40.0.1
# dnsmasq: what does the running configuration already allow?
grep -R 'rebind' /etc/dnsmasq.d /etc/dnsmasq.conf
Потім додайте найвужчий дозвіл, що охоплює потрібні імена: один домен або один делегований піддомен, у конфігурації резолвера, який опитують клієнти VPN. Вимкнення захисту для всіх імен на цьому резолвері позбавляє оборони всіх одразу, включно з іменами, яким вона ніколи не була потрібна.
Split DNS входить до того самого рішення. Якщо приватний простір імен має відповідати лише на внутрішньому резолвері, опублікуйте його там і припиніть витікати його в публічні резолвери, щоб виняток покривав один шлях, а не кожен шлях.
Повторно перевірте ресурс і захист
Запитайте ще раз, потім підключіться до сервісу й перевірте, що бачить клієнт. Правильна приватна відповідь із робочою сесією означає, що виняток застосувався. Правильна відповідь із завислою сесією означає, що наступний підозрюваний — маршрут або ідентичність сервісу.
# the internal name and the public control should behave differently
dig +short db.corp.example @10.40.0.1
dig +short www.example.com @10.40.0.1
# and the service itself, with the certificate it presents
curl -sS -o /dev/null -w '%{http_code}\n' https://db.corp.example/health
Перевірте також публічне ім'я через той самий резолвер. Захист має й далі поводитися правильно для імен поза винятком, і якщо ця перевірка не вдалася, зміна була ширшою за задум. Не чіпайте перевірку сертифікатів увесь час, бо ім'я, що розв'язується правильно, все одно має збігатися із сертифікатом, який представляє сервіс.
Запишіть у заявці відкинуту відповідь, домен, резолвер і того, хто володіє політикою. Саме цей запис перетворює загадковий внутрішній збій на зміну конфігурації, яку хтось може переглянути.