AWS: Route53 Private Hosted Zones – прячем домены от мира

Автор: | 23/07/2021

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.

Готово.