Настройка DNSSEC в Bind 9.9+

DNSSEC (англ. Domain Name System Security Extensions) — набор расширений IETF протокола DNS, позволяющих минимизировать атаки, связанные с подменой DNS-адреса при разрешении доменных имён. Он направлен на предоставление DNS-клиентам (англ. термин resolver) аутентичных ответов на DNS-запросы (или аутентичную информацию о факте отсутствия данных) и обеспечение их целостности. При этом используется криптография с открытым ключом. Не обеспечивается доступность данных и конфиденциальность запросов. Обеспечение безопасности DNS критически важно для интернет-безопасности в целом.

Правда ведь, что мы хотим быть уверенными, что наш DNS никто не подменит (на самом деле не факт)?

Давайте разберемся как нам сделать свой DNS сервер немного более надежным. Это не гарантирует полной безопасности. Но в общем случае - будет полезно.

Фокус в том, что тот же 8.8.8.8 проверяет DNSSEC и перестает резолвить домены, если цифровая подпись нарушена. Не очень знаю на счет 1.1.1.1, но мне кажется, что он ведет себя так же. А вот если клиент использует провайдерский DNS, который не проверяет целостность данных, то вот тут уже возможна подмена.

В общем, решайте, надо оно вам или нет... А я расскажу, как это реализовать. Итак, для начала предположим, что у нас уже есть настроенный Bind с зоной example.net.

Создаем каталог для ключей:

mkdir /etc/bind/keys

Генерируем ключи для DNSSEC. Это занимает довольно продолжительное время. Чтоб ускорить процесс - поставьте пакет haveged.

$ dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE example.net
$ dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE example.net

Теперь нужно указать, что зона должна подписываться автоматически. Это делается в параметрах зоны:

zone "example.net" {
    type master;
    file "/etc/bind/zones/example.net";

    # look for dnssec keys here:
    key-directory "/etc/bind/keys";

    # publish and activate dnssec keys:
    auto-dnssec maintain;

    # use inline signing:
    inline-signing yes;
};

Перезагружаем конфигурацию Bind:

$ rndc reload

Проверяем, все ли у нас прошло успешно и подписана ли зона:

$ dig DNSKEY example.net. @localhost +multiline

Результат должен быть что-то типа такого (естественно хеши будут отличаться):

;; Truncated, retrying in TCP mode.

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> DNSKEY example.net. @localhost +multiline
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43986
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;example.net.       IN DNSKEY

;; ANSWER SECTION:
example.net.        86400 IN DNSKEY   256 3 7 (
                AwEAActPMYurNEyhUgHjPctbLCI1VuSj3xcjI8QFTpdM
                8k3cYrfwB/WlNKjnnjt98nPmHv6frnuvs2LKIvvGzz++
                kVwVc8uMLVyLOxVeKhygDurFQpLNNdPumuc2MMRvV9me
                fPrdKWtEEtOxq6Pce3DW2qRLjyE1n1oEq44gixn6hjgo
                sG2FzV4fTQdxdYCzlYjsaZwy0Kww4HpIaozGNjoDQVI/
                f3JtLpE1MYEb9DiUVMjkwVR5yH2UhJwZH6VVvDOZg6u6
                YPOSUDVvyofCGcICLqUOG+qITYVucyIWgZtHZUb49dpG
                aJTAdVKlOTbYV9sbmHNuMuGt+1/rc+StsjTPTHU=
                ) ; key id = 40400
example.net.        86400 IN DNSKEY   257 3 7 (
                AwEAAa2BE0dAvMs0pe2f+D6HaCyiFSHw47BA82YGs7Sj
                qSqH3MprNra9/4S0aV6SSqHM3iYZt5NRQNTNTRzkE18e
                3j9AGV8JA+xbEow74n0eu33phoxq7rOpd/N1GpCrxUsG
                kK4PDkm+R0hhfufe1ZOSoiZUV7y8OVGFB+cmaVb7sYqB
                RxeWPi1Z6Fj1/5oKwB6Zqbs7s7pmxl/GcjTvdQkMFtOQ
                AFGqaaSxVrisjq7H3nUj4hJIJ+SStZ59qfW3rO7+Eqgo
                1aDYaz+jFHZ+nTc/os4Z51eMWsZPYRnPRJG2EjJmkBrJ
                huZ9x0qnjEjUPAcUgMVqTo3hkRv0D24I10LAVQLETuw/
                QOuWMG1VjybzLbXi5YScwcBDAgtEpsQA9o7u6VC00DGh
                +2+4RmgrQ7mQ5A9MwhglVPaNXKuI6sEGlWripgTwm425
                JFv2tGHROS55Hxx06A416MtxBpSEaPMYUs6jSIyf9cjB
                BMV24OjkCxdz29zi+OyUyHwirW51BFSaOQuzaRiOsovM
                NSEgKWLwzwsQ5cVJBEMw89c2V0sHa4yuI5rr79msRgZT
                KCD7wa1Hyp7s/r+ylHhjpqrZwViOPU7tAGZ3IkkJ2SMI
                e/h+FGiwXXhr769EHbVE/PqvdbpcsgsDqFu0K2oqY70u
                SxnsLB8uVKYlzjG+UIoQzefBluQl
                ) ; key id = 62910

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Nov 27 18:18:30 2013
;; MSG SIZE  rcvd: 839

Еще один тест и ответ:

$ dig A example.net. @localhost +noadditional +dnssec +multiline
; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> A example.net. @localhost +noadditional +dnssec +multiline
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32902
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 5
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;example.net.         IN A

;; ANSWER SECTION:
example.net.          86400 IN A 93.184.216.119
example.net.          86400 IN RRSIG A 7 2 86400 20131227171405 (
                            20131127171405 40400 example.net.
                            JCoL8L7As1a8CXnx1W62O94eQl6zvVQ3prtNK7BWIW9O
                            lir/4V+a6c+0tbt4z4lhgmb0sb+qdvqRnlI7CydaSZDb
                            hlrJA93fHqFqNXw084YD1gWC+M8m3ewbobiZgBUh5W66
                            1hsVjWZGvvQL+HmobuSvsF8WBMAFgJgYLg0YzBAvwHIk
                            886be6vbNeAltvPl9I+tjllXkMK5dReMH40ulgKo+Cwb
                            xNQ+RfHhCQIwKgyvL1JGuHB125rdEQEVnMy26bDcC9R+
                            qJNYj751CEUZxEEGI9cZkD44oHwDvPgF16hpNZGUdo8P
                            GtuH4JwP3hDIpNtGTsQrFWYWL5pUuuQRwA== )

;; AUTHORITY SECTION:
example.net.          86400 IN NS master.example.net.
example.net.          86400 IN NS slave.example.net.
example.net.          86400 IN RRSIG NS 7 2 86400 20131227171405 (
                            20131127171405 40400 example.net.
                            hEGzNvKnc3sXkiQKo9/+ylU5WSFWudbUc3PAZvFMjyRA
                            j7dzcVwM5oArK5eXJ8/77CxL3rfwGvi4LJzPQjw2xvDI
                            oVKei2GJNYekU38XUwzSMrA9hnkremX/KoT4Wd0K1NPy
                            giaBgyyGR+PT3jIP95Ud6J0YS3+zg60Zmr9iQPBifH3p
                            QrvvY3OjXWYL1FKBK9+rJcwzlsSslbmj8ndL1OBKPEX3
                            psSwneMAE4PqSgbcWtGlzySdmJLKqbI1oB+d3I3bVWRJ
                            4F6CpIRRCb53pqLvxWQw/NXyVefNTX8CwOb/uanCCMH8
                            wTYkCS3APl/hu20Y4R5f6xyt8JZx3zkZEQ== )

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Nov 28 00:01:06 2013
;; MSG SIZE  rcvd: 1335

Записи RRSIG означают, что записи имеют цифровую подпись. Все работает. Осталось получить DS записи для реестра доменов и прописать их в панели регистратора. Сделать это тоже не сложно:

$ dig @127.0.0.1 dnskey example.net | dnssec-dsfromkey -f - example.net

И вот наши записи:

example.net. IN DS 50707 8 1 42727823EB40A1D93F0A1CF22E4AE8768BC40FBA
example.net. IN DS 50707 8 2 BC34B1EA3196C01EEFCC4C571B61753423D264A712E0A4F35847BBDC A5954A5F

Из пояснений тут надо указать, что тэг - это число 50707. Дальше цифры: 8 - это алгоритм, 1 или 2 - это тип подписи (1 - SHA1, 2 - SHA-256).

После того, как мы добавили DS записи в реестр, спустя какое-то время можно проверять все ли в порядке. Это можно сделать на сайте https://dnssec-analyzer.verisignlabs.com.



Комментарии: