Private Hosted Zone в AWS Route53 позволяет ограничить доступ к DNS-записям домена, таким образом оградив её от атак типа DNS Enumeration, или DNS brute-force, когда атакующий перебирает доступные записи домена, после чего получает список ендпоинтов для проверок на уязвимости.
Для подобных переборов существует множество готовых решения, например DNSEnum, DNSRecon, Fierce или даже обычный Nmap и его скрипт dns-brute
.
Идея в использовании приватных зон DNS состоит в том, что обратиться к ней может только ресурс внутри AWS VPC, и только из тех VPC, которым такие запросы разрешены.
Содержание
AWS VPC DNS
Для начала – как DNS работает в VPC: в каждой VPC адрес *.0.1 – это Gateway, шлюз, а *.0.2 – это адрес дефолтного DNS-сервера для этой VPC.
К примеру, у нас есть VPC с блоком 10.0.6.0/24. Следовательно, с любого инстанса в этой VPC мы можем обратиться к 10.0.6.2 за получением информации о доменном имени:
[simterm]
admin@bttrm-stage-console:~$ dig @10.0.6.2 ya.ru +short 87.250.250.242
[/simterm]
Обращение к VPC DNS является поведением по-умолчанию для сервисов в VPC, хотя может быть переопределено. К примеру, некоторые из наших серверов сначала обращаются к dnsmasq
, и уже только после него к VPC DNS (хотя сам dnsmasq
, как кеширующий сервер, в случае необходимости идёт к тому же DNS-серверу):
[simterm]
admin@bttrm-stage-console:~$ cat /etc/resolv.conf domain us-east-2.compute.internal search us-east-2.compute.internal nameserver 127.0.0.1 nameserver 10.0.6.2 nameserver 1.1.1.1
[/simterm]
См. больше про DNS в AWS в постах DNS: установка BIND, DNS Load Balancing и network-based routing через view и DNS: dnsmasq и порядок разрешения домён из resolv.conf, и в документации – Resolving DNS queries between VPCs and your network.
Имейте ввиду, что для того, что бы в VPC работал локальный DNS для этой VPC должны быть включены опции enableDnsHostnames
и enableDnsSupport
. Кроме того, есть ограничения на типы Route 53 health checks и routing policies. См. документацию Considerations when working with a private hosted zone.
AWS Route53 Private Hosted Zone
Теперь, когда мы поняли, как разрешение имён работает в AWS VPC, давайте создадим приватную зону.
Переходим в Route53, создаём зону, выбираем тип Private hosted zone:
Внизу появится окно для настройки доступа к этой зоне, в которой мы можем выбрать регион и добавить список VPC, из которых эта зона будет доступна:
Зона создана – добавим к ней записей:
Создадим запись для одного из серверов – app1.stage.mobilebackend.bm.local:
И проверяем доступ со стейджового сервера:
[simterm]
admin@bttrm-stage-console:~$ dig app1.stage.mobilebackend.bm.local +short 10.0.6.68
[/simterm]
Или с помощью dnstracer
:
[simterm]
admin@bttrm-stage-console:~$ dnstracer app1.stage.mobilebackend.bm.local Tracing to app1.stage.mobilebackend.bm.local[a] via 10.0.6.2, maximum of 3 retries 10.0.6.2 (10.0.6.2) Got answer
[/simterm]
Ответ получен, и ответ от 10.0.6.2 – VPC DNS, как и ожидалось.
И пробуем доступ к записи из офиса:
[simterm]
15:06:02 [setevoy@setevoy-arch-work ~] $ dig app1.stage.mobilebackend.bm.local ; <<>> DiG 9.16.18 <<>> app1.stage.mobilebackend.bm.local ;; global options: +cmd ;; Got answer: ;; WARNING: .local is reserved for Multicast DNS ;; You are currently testing what happens when an mDNS query is leaked to DNS ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 27027 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;app1.stage.mobilebackend.bm.local. IN A
[/simterm]
Миру ничего не известно про этот домен и запись в нём, что и требовалось.
И, кстати, вполне допустимо создать две доменные зоны с одним именем- одну публичную, а вторую – приватную, т.н. “split-view DNS”. См. How can I use Route 53 to access an internal version of my website using the same domain name as my public website? и Split-view DNS.
Готово.