Управление зоной на dns-сервере BIND с помощью nsupdate

Понадобилось мне примменять изменения в динамической зоне на сервере, где установлен dns-сервер BIND. Можно, конечно, подредактировать сам файл зоны, а потом перезапустить named или средствами rndc перечитать зону из файла. Это без проблем работает со статической зоной, но в динамической не катит, т.к. в файле зоны хранится не последняя версия зоны, есть ещё дополнения с расширениями jbk и jnl. Поэтому используем правильный метод средствами nsupdate.

Сперва нужно создать сам ключ. Ранее ключ создавался средствами dnssec-keygen, однако сейчас уже это делать не рекомендуется и в будущем данная возможность из утилиты dnssec-keygen выпилится. Поэтому сделаем так:

$ tsig-keygen -a HMAC-SHA512 dnsupdater > dnsupdater.key
$ more dnsupdater.key
key "dnsupdater" {
        algorithm hmac-sha512;
        secret "8k6iPPHUlSaUKhvuVYbPbvTkWYA7qF/vB+y54 /blT9mmDkSC3595IRhJAsq0iJG90J+2SWcZXuqCNMWeyrygqg==";
};

Пояснения: -a — задаёт алгоритм ключа, dnsupdater — имя ключа; dnsupdater.key — имя файла, где сохранится ключ. Для подробностей юзать man tsig-keygen.

Теперь этот ключ нужно подсунуть dns-серверу. Можно конечно содержимое файла просто подсунуть в named.conf, но это опять не кошерный вариант. Поступим правильно — добавим в конфиг named.conf строку:

include "/usr/local/etc/namedb/keys.conf"

а уже в файле /usr/local/etc/namedb/keys.conf будет наш ключ:

# cat dnsupdater.key >> /usr/local/etc/namedb/keys.conf
# chown root:wheel /usr/local/etc/namedb/keys.conf
# chmod 600 /usr/local/etc/namedb/keys.conf

После данных манипуляций файл с ключами может прочитать только root, тогда как named.conf прочитать можно всем. При запуске демон named прочитает ключи под root-ом однократно, а далее будет работать под пользователем bind.

Следующий этап — настройка dns-сервера для управления зоной. Для этого нужно править в файле named.conf раздел требуемой зоны. Добавим туда следующее:

update-policy {
        grant dnsupdater wildcard *.domain.com. ANY;
        grant dnsupdater name domain.com ANY;
};

Получиться следующий раздел:

zone "domain.com" {
        type master;
        file "/usr/local/etc/namedb/dynamic/domain.com.db";
        update-policy {
                grant dnsupdater wildcard *.domain.com. ANY;
                grant dnsupdater name domain.com ANY;
        };
};

Перезапускаем dns-сервер — named готов к управлению.

Ну а теперь меняем что-то в зоне. Например поменяем содержимое SOA

$ dig soa domain.com
...
ANSWER SECTION: domain.com. 259200 IN SOA server1.domain.com. hostmaster.domain.com. 22 86400 43200 604800 10800 ;; Query time: 0 msec
...
$ nsupdate -k dnsupdater.key
> zone domain.com
> update delete domain.com SOA server1.domain.com hostmaster.domain.com. 22 86400 43200 604800 10800
> update add domain.com 259200 SOA server2.domain.com hostmaster.domain.com. 23 86400 43200 604800 10800
> send
quit
$ dig soa domain.com
...
;; ANSWER SECTION:
domain.com. 259200 IN SOA server2.domain.com. hostmaster.domain.com. 23 86400 43200 604800 10800

Всё работает.

Добавить комментарий