PowerDNS: Replicação AXFR
Replicação utilizando AXFR e IXFR é um padrão antigo utilizando no DNS. A grande vantagem dele é a interoperabilidade com outros servidores de DNS. Grande parte das empresas não possuem o luxo da padronização, ou da utilização de replicação de banco de dados, como o slony explicado aqui anteriormente.
Explicado isso, mãos à massa. O setup será o seguinte:
Aproveite o que for necessário à sua estrutura.
Master
A operação de um master não é muito complicada, e em DNS na verdade as coisas nunca são realmente complicadas (exceção: DNSSEC).
--- /etc/pdns/pdns.conf --- # configuracao do master master=yes allow-axfr-ips=192.0.2.0/24 # Essas flags sao padrao, mas mostradas para mostrar a utilidade disable-axfr=no disable-tcp=no # Banco de dados launch=gpgsql gpgsql-user=pdns gpgsql-dbname=powerdns gpgsql-dnssec=yes
O backend (pensando em um PostgreSQL), será configurado da seguinte maneira:
insert into domains (name, type) values ('example.com', 'MASTER');
insert into records values (default, currval('domains_id_seq'), 'example.com', 'SOA', 'ns1.example.com postmaster.example.com 2012013001 3600 600 1209600 3600', 3600, default, default);
insert into records values (default, currval('domains_id_seq'), 'example.com', 'NS', 'ns1.example.com', 3600, default, default);
insert into records values (default, currval('domains_id_seq'), 'example.com', 'NS', 'ns2.example.com', 3600, default, default);
insert into records values (default, currval('domains_id_seq'), 'ns1.example.com', 'A', '192.0.2.2', 3600, default, default);
insert into records values (default, currval('domains_id_seq'), 'ns2.example.com', 'A', '192.0.2.3', 3600, default, default);
insert into records values (default, currval('domains_id_seq'), 'example.com', 'A', '192.0.2.4', 3600, default, default);
Agora falta só o DNSSEC:
pdnssec secure-zone example.com
Qual a diferença entre MASTER e NATIVE? Quando o processo do powerdns se inicia, ele procura por todos os domínios que possuem o tipo MASTER para notificar aos respectivos slaves.
Slave
A operação do slave também é simples:
--- /etc/pdns/pdns.conf --- # configuracao do slave slave=yes allow-axfr-ips=192.0.2.0/24 # Essas flags sao padrao, mas mostradas para mostrar a utilidade disable-axfr=no disable-tcp=no # Banco de dados launch=gpgsql gpgsql-user=pdns gpgsql-dbname=powerdns gpgsql-dnssec=yes
O banco de dados fica desta maneira:
insert into domains (name, type) values ('example.com', 'SLAVE');
Após realizar essa configuração, execute o comando abaixo para o serviço entender que os registros de DNSSEC vieram de um AXFR e mostrá-los de maneira correta:
pdnssec set-presigned example.com
Da mesma maneira que o tipo MASTER afeta o comportamento do PowerDNS para o master, o tipo SLAVE é consultado quando o serviço se inicia para buscar as atualizações conforme os tempos estipulados no SOA. Caso tenha feito alguma mudança e quer que ela se propague de imediato, existe o comando abaixo:
pdns_control notify example.com
Pronto, feita a replicação AXFR. O setup acima é um exemplo de um master e um slave ambos rodando PowerDNS, mas nessa situação existem alguns atalhos para facilitar a vida. Veremos isso em um post futuro sobre SUPERMASTERS.
Posted at 10:53PM Jan 29, 2012 by ze in PowerDNS | Comments[0]
PowerDNS: upgrade fácil de versão
O upgrade de versão do PowerDNS autoritativo exige uma atualização de tabelas e criação de outras. Isso pode não ser uma tarefa simples dependendo do seu ambiente.
Uma das opções que a documentação fala, utilizando o bindbackend (os dados ficam armazenados em arquivos no mesmo formato que ficam no bind) é a criação de uma base específica para os dados de DNSSEC conforme descrito aqui. A parte interessante do PowerDNS é que podemos ter a informação em mais de um lugar, e ligar vários backends ao mesmo tempo. Esses backends normalmente são diferentes uns dos outros, porém podemos utilizar o mesmo backend mais de uma vez. Para isso criamos um apelido para uma das intâncias.
Então, da mesma forma que criamos um backend de banco de dados em cima do bindbackend, podemos criar um backend de banco de dados em cima de outro.
Esta configuração também é muito conveniente para testes, sem estragar o que já está em produção. Mãos à massa
psql
ze=# create database powerdnssec;
ze=# \l powerdnssec
create table domains (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
master VARCHAR(128) DEFAULT NULL,
last_check INT DEFAULT NULL,
type VARCHAR(6) NOT NULL,
notified_serial INT DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL
);
CREATE UNIQUE INDEX name_index ON domains(name);
CREATE TABLE records (
id SERIAL PRIMARY KEY,
domain_id INT DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(10) DEFAULT NULL,
content VARCHAR(4096) DEFAULT NULL,
ttl INT DEFAULT NULL,
prio INT DEFAULT NULL,
change_date INT DEFAULT NULL,
CONSTRAINT domain_exists
FOREIGN KEY(domain_id) REFERENCES domains(id)
ON DELETE CASCADE
);
CREATE INDEX rec_name_index ON records(name);
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
create table supermasters (
ip VARCHAR(25) NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) DEFAULT NULL
);
GRANT SELECT ON supermasters TO pdns;
GRANT ALL ON domains TO pdns;
GRANT ALL ON domains_id_seq TO pdns;
GRANT ALL ON records TO pdns;
GRANT ALL ON records_id_seq TO pdns;
alter table records add ordername VARCHAR(255);
alter table records add auth bool;
create index orderindex on records(ordername);
create table domainmetadata (
id SERIAL PRIMARY KEY,
domain_id INT REFERENCES domains(id) ON DELETE CASCADE,
kind VARCHAR(16),
content TEXT
);
create table cryptokeys (
id SERIAL PRIMARY KEY,
domain_id INT REFERENCES domains(id) ON DELETE CASCADE,
flags INT NOT NULL,
active BOOL,
content TEXT
);
GRANT ALL ON domainmetadata TO pdns;
GRANT ALL ON domainmetadata_id_seq TO pdns;
GRANT ALL ON cryptokeys TO pdns;
GRANT ALL ON cryptokeys_id_seq TO pdns;
create table tsigkeys (
id SERIAL PRIMARY KEY,
name VARCHAR(255),
algorithm VARCHAR(255),
secret VARCHAR(255)
);
create unique index namealgoindex on tsigkeys(name, algorithm);
GRANT ALL ON tsigkeys TO pdns;
GRANT ALL ON tsigkeys_id_seq TO pdns;
alter table records alter column type type VARCHAR(10);
Assumindo que a base legada se chama powerdns, temos a seguinte configuração
--- /etc/pdns/pdns.conf --- launch=gpgsql,gpgsql:sec gpgsql-user=pdns gpgsql-dbname=powerdns gpgsql-sec-user=pdns gpgsql-sec-dbname=powerdnssec gpgsql-sec-dnssec=yes
Assumindo que já exista o domínio "benetasso.com" dentro da base powerdns, o que precisamos fazer para ter os dados assinados é o seguinte procedimento:
# su - pdns -s /bin/bash
$ psql powerdnssec -c "insert into domains (name, type) values ('benetasso.com', 'NATIVE');"
$ pdnssec set-nsec3 benetasso.com '1 1 1 ab' narrow
$ pdnssec rectify-zone benetasso.com
Pronto! agora só falta publicar a DS:
$ pdnssec show-zone benetasso.com Zone has NARROW hashed NSEC3 semantics, configuration: 1 1 1 ab Zone is not presigned keys: ID = 1 (KSK), tag = 15812, algo = 8, bits = 2048 Active: 1 KSK DNSKEY = benetasso.com IN DNSKEY 257 3 8 AwEAAZSglooxX8aSJvvi/FtLX2A5FZ6FLGQAkcETE3hdLOJG/AWb0/... DS = benetasso.com IN DS 15812 8 1 75ab832514dc25ffdf4791a71c3b371accea8539 DS = benetasso.com IN DS 15812 8 2 7412bdb8d54165453ed9d9e5d91ab8095ab2c3c30309a5dd91c1289ddfc51402 ID = 2 (ZSK), tag = 57109, algo = 8, bits = 1024 Active: 1 ID = 3 (ZSK), tag = 53724, algo = 8, bits = 1024 Active: 0
Posted at 11:23AM Jan 21, 2012 by ze in PowerDNS | Comments[0]
PowerDNS
Uma boa alternativa ao Bind é o PowerDNS.
Trabalhei com ele algum tempo e tenho algum conhecimento sobre este assunto, e espero escrever alguns posts sobre isso.
O foco será alternativas de deploy com DNSSEC habilitado.
Posted at 10:12AM Jan 21, 2012 by ze in PowerDNS | Comments[0]
