Как использовать Net :: DNS :: RR: TSIG с файлами ключей, сгенерированными ddns-confgen? - PullRequest
0 голосов
/ 11 марта 2019

Я давно пользуюсь nsupdate в различных сценариях, связанных с динамическими обновлениями зон DNS без каких-либо проблем. Я всегда использовал TSIG для аутентификации запросов к DNS-серверу, где ключи были сгенерированы ddns-confgen. Это означает, что я не использовал ключевые пары , подобные тем, которые были сгенерированы dnssec-keygen; скорее, формат файла ключей выглядит следующим образом:

key "ddns-key.my.domain.example" {
        algorithm hmac-sha512;
        secret "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefijklmnopqrstuvwxyzabcdefghij==";
};

Соответствующая конфигурация зоны содержит:

update-policy {
        grant ddns-key.my.domain.example name host.my.domain.example ANY;
};

Теперь у меня есть более сложная задача, и я пытаюсь решить ее с помощью Perl сценария. Я изучил документацию Perl::DNS::Update, Perl::DNS и Perl::DNS:RR:TSIG и изучил множество примеров, которые должны прояснить использование этих модулей.

Однако каждый пример, который я видел, когда приходил к подписанию запроса с помощью TSIG, использовал файлы ключей в формате dnssec-keygen, а не файлы ключей в формате, который у меня есть. Действительно, что-то вроде

$o_Resolver = new Net::DNS::Resolver(nameservers => ['127.0.0.1']);
$o_Update = new Net::DNS::Update('my.domain.example', 'IN');

$o_Update -> push(update => rr_del('host A'));
$o_Update -> push(update => rr_add('host 1800 IN A 192.0.2.1'));
$o_Update -> sign_tsig('/etc/bind/ddns-key.my.domain.example.key');

$o_Reply = ($o_Resolver -> send($o_Update));

не работает, выдавая следующее сообщение:

TSIG: unable to sign packet at /path/to/script.pl line 240.
unknown type "ddns-key.my.domain.example" at /usr/local/share/perl/5.20.2/Net/DNS/RR.pm line 669.
  file /etc/bind/ddns-key.my.domain.example.key line 1
  at /usr/local/share/perl/5.20.2/Net/DNS/RR/TSIG.pm line 403.

TSIG: unable to sign packet at /path/to/script.pl line 240.

Полагаю, у меня теперь есть два варианта: либо использовать ключи в формате dnssec-keygen, который, как представляется, можно непосредственно использовать с Net::DNS и его друзьями, либо создать ключ TSIG вручную, как показано в документе:

my $key_name = 'tsig-key';
my $key      = 'awwLOtRfpGE+rRKF2+DEiw==';

my $tsig = new Net::DNS::RR("$key_name TSIG $key");
$tsig->fudge(60);

my $update = new Net::DNS::Update('example.com');
$update->push( update     => rr_add('foo.example.com A 10.1.2.3') );
$update->push( additional => $tsig );

[Конечно, я бы не стал жестко кодировать ключ в моем скрипте Perl, но вместо этого прочитал бы его из файла ключа.]

Переключение на другой формат файла ключа означало бы изменение конфигурации DNS-сервера, что не является элегантным решением. «Ручное» чтение файлов ключей, а затем «ручное» создание ключей также не очень удовлетворительно, поэтому возникает вопрос:

Правильно ли я понял, что невозможно использовать файлы ключей в формате ddns-confgen напрямую с Net::DNS и его подмодулями для TSIG -подписывания запросов на обновление DNS?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...