domingo, 3 de junio de 2012

Configuración de PowerDNS

Para que procrastinar hoy, si lo puedo hacer mañana...

Hace ya más de dos años, contraté un cloud server con Rackspace, cuya finalidad era eventualmente reemplazar un servidor moribundo que tengo en GoDaddy. Durante ese tiempo me ha servido para realizar todo tipo de pruebas, pero nunca me dediqué a configurarlo para lo que realmente era su objetivo.

Para no seguir pagando la renta de dos servidores, hoy pensé en seguir en donde me había quedado. Durante mis pruebas, la seguridad de mi servidor desafortunadamente pasó a segundo plano, y como era de esperarse, al revisar los logs encontré evidencia de intrusos. Como realmente no tenía información importante en ese servidor, decidí utilizar la excelente herramienta de Rackspace para borrar todo y volver a empezar de cero, ahora utilizando Ubuntu 12.04 LTS.

En este post seguiré paso a paso la configuración incial del servidor, llegando hasta el punto en que logremos tener una instalación funcional de PowerDNS.

Elegí PowerDNS porque necesito tener un backend basado en MySQL, y lograr esto con BIND se complica un poco. Además, de todos programas de DNS (excluyendo a BIND), este es el que me pareció mas popular, y esto normalmente se traduce a mejor documentación...aunque después de terminar la configuración he de decir que hay algunas cosas no están tan bien documentadas (como la integración con DNSSEC). Aún así, creo que fue una buena elección.

Una vez que la imagen haya terminado de cargarse en el servidor, lo primero que hay que hacer es conectarse por ssh y cambiar el password de root.

$ passwd 

Me siento sucio al estar haciendo todo como root, entonces mejor creamos un usuario normal, y lo agregamos a la lista de sudoers:

$ adduser kenneth
$ adduser kenneth sudo

Accedemos usando el nuevo usuario e instalamos los paquetes iniciales:

$ sudo apt-get update
$ sudo apt-get install vim subversion rar unrar apache2 php5 php5-mysql mysql-server php5-mcrypt ack-grep pdns-backend-mysql

Como podrás notar, en este punto ya estamos instalando PowerDNS. Apt se encargará de conseguir los demás paquetes requeridos. En este paso también quedarán instalados MySQL y Apache 2.

Lo primero que me gusta hacer con la instalación de Apache, es cambiar el DocumentRoot de lugar, para que quede en /www. En este directorio descargamos y descomprimimos los paquetes de PHPMyAdmin y PowerAdmin.

Después de configurar PHPMyAdmin, podemos fácilmente crear un usuario y una base de datos para PowerDNS.

El siguiente schema incluye los campos nuevos requeridos en la versión 3.0 de PDNS:

create table domains (
 id   INT auto_increment,
 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,
 primary key (id)
) Engine=InnoDB;

CREATE UNIQUE INDEX name_index ON domains(name);

CREATE TABLE records (
  id              INT auto_increment,
  domain_id       INT DEFAULT NULL,
  name            VARCHAR(255) DEFAULT NULL,
  type            VARCHAR(10) DEFAULT NULL,
  content         VARCHAR(64000) DEFAULT NULL,
  ttl             INT DEFAULT NULL,
  prio            INT DEFAULT NULL,
  change_date     INT DEFAULT NULL,
  primary key(id)
) Engine=InnoDB;

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
) Engine=InnoDB;

-- Cambios necesarios para la version 3.0

create table domainmetadata (
 id   INT auto_increment,
 domain_id       INT NOT NULL,
 kind   VARCHAR(16),
 content TEXT,
 primary key(id)
);

create index domainmetaidindex on domainmetadata(domain_id);               


create table cryptokeys (
 id  INT auto_increment,
 domain_id      INT NOT NULL,
 flags  INT NOT NULL,
 active  BOOL,
 content TEXT,
 primary key(id)
);   

create index domainidindex on cryptokeys(domain_id);           

alter table records add ordername      VARCHAR(255);
alter table records add auth bool;
create index orderindex on records(ordername);

create table tsigkeys (
 id  INT auto_increment,
 name  VARCHAR(255), 
 algorithm VARCHAR(50),
 secret  VARCHAR(255),
 primary key(id)
);

create unique index namealgoindex on tsigkeys(name, algorithm);
alter table records change column type type VARCHAR(10);

Ahora podemos empezar a configurar PowerDNS. Empezamos por deshabilitar las funciones de DNSSEC:

#/etc/powerdns/pdns.d/pdns.local.gmysql

gmysql-dnssec=no

Después probamos que PDNS funcione y que la conexión a MySQL sea exitosa:

$ /etc/init.d/pdns monitor
Jun 03 18:53:29 Creating backend connection for TCP
% Jun 03 18:53:29 gmysql Connection successful

Si todo parece estar bien, podemos empezar a configurar PowerAdmin. Esta es una interfaz web que facilita la interacción con la base de datos de PowerDNS.
Para configurarlo, primero debemos asegurarnos de que apache tenga el acceso correcto a los archivos:

$ sudo chown -R www-data /www/poweradmin

Navegamos a http://host/powerdns/install para entrar al script de configuración. Aquí se crearán unas tablas extra en la base de datos para guardar plantillas y usuarios.

Hablando de plantillas, ya que esté configurado PowerAdmin, podemos crear una plantilla como la siguiente:

Name Type Content TTL Priority
[ZONE] SOA localhost hostmaster@[ZONE] [SERIAL] 86400
[ZONE] NS ns1.knet.mx 86400
[ZONE] NS ns2.knet.mx 86400
*.[ZONE] CNAME [ZONE] 120
[ZONE] MX mail.[ZONE] 120 25
[ZONE] CNAME 173.203.206.44 86400 10

Después de agregar la zona "example.com", podemos probar la resolución usando dig y host:

$ dig example.com
$ host example.com knet.mx

Ese último comando básicamente quiere decir "Pregúntale a knet.mx cuáles son los registros DNS de example.com".


¡Y listo! Con esto queda el servidor preparado para atender los dominios que quieras, solo hay que agregarlos utilizando la plantilla.



No hay comentarios.:

Publicar un comentario