Sábado Jan 21, 2012

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

Comments:

Post a Comment:
  • HTML Syntax: Allowed