Bienvenido(a) a Alcance Libre 08/08/2022, 23:31
Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1
© 1999-2015 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector, hace mal uso de éstos.
Es un servidor DNS autoritativo escrito en C++ y distribuido bajo los términos de la licencia GNU/GPLv2 creado pro la compañía danesa PowerDNS.com BV, con colaboración de la comunidad del software libre. Funciona en todos los sistemas operativos tipo POSIX como Linux™ y los derivados de Unix™. Incluye soporte para utilizar diversos motores de bases de datos, desde los simples archivos tipo BIND hasta bases de datos relacionales. Hay soporte para consultas recursivas a través de un programa separado conocido como pdns-recursor.
Es una muy robusta y versátil alternativa hacia BIND9.
URL: http://www.powerdns.com/.
Es una interfaz HTTP amistosa e intuitiva que sirve como herramienta de administración para PowerDNS. La interfaz incluye soporte para todas la funciones de PowerDNS, así como también todos los tipos de zonas y registros DNS, soporte para aprovisionamiento de servidores supermasters para los servidores esclavos, soporte completo para IPv6 y soporte para algunos idiomas —lamentablemente carece de soporte para español.
URL: http://www.poweradmin.org/.
ALDOS y Fedora™ ya incluyen lo necesario para realizar la instalación del paquete necesario. Si utiliza CentOS o Red Hat™ Enterprise Linux, utilice el almacén YUM de Alcance Libre para servidores en producción, descargando el archivo https://www.alcancelibre.org/al/server/AL-Server.repo dentro del directorio /etc/yum.repos.d/:
wget -N https://www.alcancelibre.org/al/server/AL-Server.repo \ |
Examine el contenido del archivo /etc/yum.repos.d/AL-Server.repo:
vi /etc/yum.repos.d/AL-Server.repo |
El contenido debe ser el siguiente:
[AL-Server] name=AL Server para Enterprise Linux $releasever mirrorlist=https://www.alcancelibre.org/al/el$releasever/al-server gpgcheck=1 gpgkey=https://www.alcancelibre.org/al/AL-RPM-KEY |
Salga del editor de texto.
Ejecute lo siguiente para instalar lo necesario:
yum -y install pdns pdns-backend-mysql poweradmin mod_ssl |
Se requiere haber abierto previamente el puerto 53 (dns) por TCP y UDP.
Ejecute lo siguiente:
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT
|
Ejecute lo siguiente para guardar los cambios:
service iptables save |
O bien añada lo siguiente al archivo /etc/sysconfig/iptables:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT
|
Reinicie el servicio para aplicar los cambios:
service iptables restart |
Edite el archivo /etc/shorewall/rules:
vi /etc/shorewall/rules |
Las reglas corresponderían a algo similar a lo siguiente:
#ACTION SOURCE DEST PROTO DEST SOURCE # PORT PORT(S) ACCEPT all fw tcp 53 ACCEPT all fw udp 53 |
Ejecute lo siguiente para aplicar los cambios:
service shorewall restart |
Ejecute lo siguiente para añadir de manera permanente la reglas necesarias:
firewall-cmd --permanent --zone=home --add-port=53/tcp firewall-cmd --permanent --zone=home --add-port=53/udp |
Reinicie el servicio para aplicar los cambios:
systemctl restart firewalld |
Detenga el servicio named y elimine este del arranque del sistema en caso de que esté instalado BIND.
service named status && service named stop && chkconfig named off |
Detenga el servicio named y elimine este del arranque del sistema en caso de que esté instalado BIND.
systemctl status named && systemctl stop named && systemctl disable named |
Acceda hacia el intérprete de MySQL/MariaDB:
mysql -uroot -p |
Cree una nueva base de datos con el nombre que mejor prefiera. En el ejemplo se utilizará powerdns.
create database powerdns;
|
Otorgue todos los permisos al usuario que prefiera con la contraseña que prefiera. En el ejemplo se utilizará al usuario powerdns y utilizará como contraseña la palabra contraseña.
grant all on powerdns.* to powerdns@localhost identified by 'contraseña'; |
Salga del intérprete de MySQL/MariaDB:
exit; |
Ejecute lo siguiente para crear los esquemas requeridos para PowerDNS en la nueva base de datos:
mysql -upowerdns -pcontraseña powerdns \ < /usr/share/poweradmin/sql/poweradmin-mysql-db-structure.sql |
Ejecute lo siguiente para crear los esquemas requeridos para PowerAdmin en la nueva base de datos:
mysql -upowerdns -pcontraseña powerdns \ < /usr/share/poweradmin/sql/powerdns-mysql-db-structure.sql |
Edite el archivo /etc/pdns/pdns.conf:
vi /etc/pdns/pdns.conf |
Añada lo siguiente al final del archivo donde deberá definir que se utilizará como motor MySQL/MariaDB, el nombre de la base de datos y las credenciales de ésta:
launch=gmysql gmysql-host=localhost gmysql-user=powerdns gmysql-password=contraseña gmysql-dbname=powerdns |
Añada debajo de lo anterior las siguientes opciones para definir que se funcionará como servidor maestro con master=yes, que se permiten las transferencias de zonas con disable-axfr=no y la dirección IP de un hipotético servidor esclavo donde se replicarán las zonas con allow-axfr-ips=192.168.70.25. En el siguiente ejemplo 192.168.70.25 corresponde a la dirección IP del servidor esclavo:
master=yes
disable-axfr=no
allow-axfr-ips=192.168.70.25
|
Si requiere especificar dos o más servidores esclavos, puede hacerlo definiendo como valor de allow-axfr-ips una lista separada por comas. Ejemplo:
allow-axfr-ips=192.168.70.25,192.168.70.26,192.168.70.27
|
Añada debajo de lo anterior la opción recursor usando como valor al dirección IP del servidor DNS que se utilizará para hacer consultas recursivas. Regularmente se utiliza otro servidor con pdns-recursor instalado y ejecutándose o bien cualquier otro servidor o dispositivo que se pueda utilizar como servidor DNS para consultas recursivas. En el siguiente ejempl0 se define 192.168.1.254 como dirección IP del servidor DNS para consultas recursivas.
recursor=192.168.1.254 |
Añada debajo de lo anterior la opción allow-recursion usando como valor una dirección IP o segmento de red o una lista separada por comas de todos los segmentos de red que tendrán permitido de hacer consultas recursivas a través de PowerDNS. Las conusltas serán redirigidas hacia el servidor que se haya definido en la opción recursor. En el siguiente ejemplo se define al anfitrión local y a la red 192.168.70.0/24:
allow-recursion=127.0.0.1/32,::1,192.168.70.0/25
|
Como medida de seguridad conviene ocultar la versión de PowerDNS. Añada debajo de lo anterior la siguiente línea:
version-string=powerdns |
Lo anterior hará que se devuelva simplemente «Served by PowerDNS - http://www.powerdns.com» como respuesta al solicitar información al servidor.
Guarde los cambios y cierre el editor de texto.
Añada el servicio pdns al arranque del sistema.
Ejecute lo siguiente si utiliza ALDOS, CentOS 6 o Red Hat™ Enterprise Linux 6:
chkconfig pdns on |
Ejecute lo siguiente si utiliza CentOS 7 o Red Hat™ Enterprise Linux 7:
systemctl enable pdns |
Inicie el servicio pdns.
Ejecute lo siguiente si utiliza ALDOS, CentOS 6 o Red Hat™ Enterprise Linux 6:
service pdns start |
Ejecute lo siguiente si utiliza CentOS 7 o Red Hat™ Enterprise Linux 7:
systemctl start pdns |
Verifique que el servicio está funcionando y que se ha ocultado al versión de PowerDNS del servidor ejecutando lo siguiente:
dig chaos txt version.bind @127.0.0.1 |
La respuesta debe ser similar a la siguiente:
; <<>> DiG 9.9.4-RedHat-9.9.4-18.el7.al.1.2 <<>> chaos txt version.bind @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18273
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 2800
;; QUESTION SECTION:
;version.bind. CH TXT
;; ANSWER SECTION:
version.bind. 5 CH TXT "Served by PowerDNS - http://www.powerdns.com"
;; Query time: 4 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: mar may 05 01:02:43 CDT 2015
;; MSG SIZE rcvd: 98
|
Edite el archivo /etc/poweradmin/config.inc.php:
vi /etc/poweradmin/config.inc.php |
Encontrará el siguiente contenido:
<?php
$db_host = "localhost";
$db_user = "powerdns";
$db_pass = "";
$db_name = "powerdns";
$db_type = "mysql";
$iface_lang = "en_EN";
$dns_hostmaster = "hostmaster.example.com";
$dns_ns1 = "ns1.example.com";
$dns_ns2 = "ns2.example.com";
// Security settings
// This should be changed upon install
$session_key = 'p0w3r4dm1n';
$password_encryption = 'md5'; // or md5salt
?>
|
Personalice el contenido para que ajuste el nombre y las credenciales de la base de datos; defina el administrador del servidor en la opción $dns_hostmaster; defina el nombre de anfitrión del servidor en la opción $dns_ns1; opcionalmente puede definir un servidor secundario en la opción $dns_ns2; configure una firma de sesión tan compleja como sea posible en la opción $session_key. Ejemplo:
<?php
$db_host = "localhost";
$db_user = "powerdns";
$db_pass = "contraseña";
$db_name = "powerdns";
$db_type = "mysql";
$iface_lang = "en_EN";
$dns_hostmaster = "root.dominio.com";
$dns_ns1 = "ns1.dominio.com";
$dns_ns2 = "ns2.dominio.com";
// Security settings
// This should be changed upon install
$session_key = 'LbR98Urri1+3HPJUqwsX';
$password_encryption = 'md5'; // or md5salt
?>
|
Edite el archivo /etc/httpd/conf.d/poweradmin.conf:
vi /etc/httpd/conf.d/poweradmin.conf |
Encontrará el siguiente contenido. La configuración predeterminada permite el acceso a PowerAdmin sólo desde el anfitrión local como https://localhost/poweradmin/.
Alias /poweradmin /usr/share/poweradmin
<Directory /usr/share/poweradmin/>
<IfModule mod_authz_core.c>
# Apache 2.4
Require local
# Uncomment to allow only 192.168.0.0/16.
# Require ip 192.168.0.0/16
# Uncomment to allow everyone.
# Require all granted
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Allow from ::1
# Uncomment to allow only 192.168.0.0/16.
# Allow from 192.168.0.0/16
# Uncomment to allow everyone.
# Allow from all
</IfModule>
# http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
php_value date.timezone America/Mexico_City
# Force use of HTTPS.
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</Directory>
|
Personalice la configuración. Por motivos de de seguridad defina un alias de directorio distinto al predeterminado; defina desde dónde se permitirá acceder a PowerAdmin; personalice la zona horaria para PHP.
Alias /adminpdns /usr/share/poweradmin
<Directory /usr/share/poweradmin/>
<IfModule mod_authz_core.c>
# Apache 2.4
Require local
# Uncomment to allow only 192.168.0.0/16.
# Require ip 192.168.0.0/16
# Uncomment to allow everyone.
Require all granted
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Allow from ::1
# Uncomment to allow only 192.168.0.0/16.
# Allow from 192.168.0.0/16
# Uncomment to allow everyone.
Allow from all
</IfModule>
# http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
php_value date.timezone America/Mexico_City
# Force use of HTTPS.
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</Directory>
|
Reinicie el servicio httpd para que surtan efecto los cambios:
service httpd restart |
Acceda con cualquier navegador hacia https://dominio.com/adminpdns/. El usuario predeterminado de PowerAdmin es admin y la contraseña es admin.
Pantalla de ingreso de PowerAdmin.
Por favor cambié la contraseña inmediatamente y defina una lo más compleja posible.
Cambio de contraseña en PowerAdmin.
La interfaz de PowerAdmin es muy intuitiva y permite añadir fácilmente zonas y todos los tipos de registros para DNS.
Si va a configurar también un servidor esclavo, repita en éste todos los procedimientos anteriores, omitiendo las opciones master, disable-axfr y allow-axfr-ips.
Edite nuevamente el archivo /etc/pdns/pdns.conf:
vi /etc/pdns/pdns.conf |
Localice la opción slave alrededor de la línea 343.
#################################
# slave Act as a slave
#
# slave=no
|
Descomente y cambie el valor no por yes:
################################# # slave Act as a slave # slave=yes |
Reinicie el servicio pdns en el servidor esclavo para aplicar los cambios:
service pdns restart |
Puede crear zonas esclavas desde PowerAdmin y dejar que éstas sincronicen solas con el servidor maestro.
Agregar zona esclava en PowerAdmin.
Se requiere que el nombre de anfitrión del servidor esclavo se defina con registro NS en cada zona en el servidor maestro.
Agregar registro NS en PowerAdmin.
También puede definir desde PowerAdmin un servidor como supermaster. Todas la zonas del servidor supermaster se copian y sincronizan automáticamente en el servidor secundario.
Agregar supermaster en PowerAdmin.
Puede migrar fácilmente las zonas existentes en BIND utilizando las herramienta zone2sql.
Copie el archivo /etc/named.conf al directorio de trabajo actual.
cp /etc/named.conf ./ |
Edite el archivo named.conf que acaba de crear:
vi ./named.conf |
Elimine las vistas, la zona hint, las zonas del RFC 1912 —regularmente una inclusión del archivo /etc/named.rfc1912.zones— y la sección logging —si acaso ésta existiese. El archivo sólo debe contener la configuración básica y las configuración de las zonas a migrar. Ejemplo:
options {
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
managed-keys-directory "/var/named/dynamic";
forwarders { 8.8.8.8; 8.8.4.4; };
forward first;
version "BIND";
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
bindkeys-file "/etc/named.iscdlv.key";
};
include "/etc/rndc.key";
include "/etc/named.root.key";
include "/etc/named.rfc1912.zones";
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
category lame-servers { null; };
};
controls {
inet 127.0.0.1 allow { 127.0.0.1; } keys { "rndc-key"; };
};
zone "dominio.com" {
type master;
file "dominio.com.zone";
allow-update { key "rndc-key"; };
allow-transfer { 192.168.1.25; };
};
zone "168.192.in-addr.arpa" {
type master;
file "168.192.in-addr.arpa.zone";
allow-update { key "rndc-key"; };
allow-transfer { 192.168.1.25; };
};
|
Terminado lo anterior, ejecute lo siguiente:
zone2sql --gmysql --named-conf=./named.conf --verbose > mis-zonas.sql |
Lo anterior debe devolver una salida similar a la siguiente:
|
Ejecute lo siguiente para importarlas en PowerDNS, asumiendo que la base de datos y el nombre del usuario de la misma se denominan powerdns:
mysql -upowerdns -pcontraseña powerdns < mis-zonas.sql |
Es innecesario reiniciar el servicio pdns para que surtan efecto los cambios.
Haga consultas con host y dig hacia el anfitrión local para hacer las comprobaciones necesarias.
PowerDNS permite configurar fácilmente DNSSEC. Se requiere primero añadir una opción a la configuración y añadir los esquemas correspondientes a la base de datos.
Cargue primero los esquemas para MySQL™/MariaDB™:
mysql -upowerdns -pcontraseña powerdns \ < /usr/share/doc/pdns-backend-mysql-*/dnssec.schema.mysql.sql |
Edite nuevamente el archivo /etc/pdns/pdns.conf:
vi /etc/pdns/pdns.conf |
Añada la opción gmysql-dnssec justo debajo de launch=gmysql:
launch=gmysql gmysql-dnssec gmysql-host=localhost gmysql-user=powerdns gmysql-password=contraseña gmysql-dbname=powerdns master=yes disable-axfr=no allow-axfr-ips=192.168.70.72 recursor=192.168.1.254 allow-recursion=127.0.0.1/32,::1,192.168.70.0/25,192.168.1.0/24 version-string=powerdns |
Reinicie el servicio pdns para aplicar los cambios.
Ejecute lo siguiente si utiliza ALDOS, CentOS 6 o Red Hat™ Enterprise Linux 6:
service pdns restart |
Ejecute lo siguiente si utiliza CentOS 7 o Red Hat™ Enterprise Linux 7:
systemctl restart pdns |
Ejecute lo siguiente para verificar que la zona a asegurar está libre de errores:
pdnssec check-zone dominio.com |
La salida debe ser similar a la siguiente:
Checked 38 records of 'dominio.com', 0 errors, 0 warnings. |
Ejecute lo siguiente para configurar DNSSEC en una zona existente:
pdnssec secure-zone dominio.com |
La salida debe ser similar a la siguiente:
Securing zone with rsasha256 algorithm with default key size Zone dominio.com secured |
Re-calcule los campos correspondientes al ordenamiento de nombres y autenticación ejecutando lo siguiente:
pdnssec rectify-zone dominio.com |
La salida debe ser similar a la siguiente:
Adding NSEC ordering information |
Hasta aquí es el procedimiento básico utilizando NSEC.
Para incrementar la seguridad y evitar se exponga información innecesaria que es mostrada con NSEC e impedir la enumeración de zona —lo que se conoce como zone walking—, es conveniente convertir la zona de NSEC a NSEC3. Para este fin se requiere generar primero una cadena de texto aleatorio en hexadecimal:
head -c 1000 /dev/urandom | sha1sum | cut -b 1-16 |
La salida será una cadena de texto en hexadecimal similar al siguiente:
ffca99871f78fa91 |
Ejecute lo siguiente para establecer los parámetros NSEC3 utilizando la cadena de texto aleatorio hexadecimal:
pdnssec set-nsec3 dominio.com "1 0 1 ffca99871f78fa91" narrow |
La salida debe ser similar a la siguiente:
NSEC3 set, please rectify-zone if your backend needs it |
Re-calcule nuevamente los campos correspondientes al ordenamiento de nombres y autenticación ejecutando lo siguiente:
pdnssec rectify-zone dominio.com |
La salida debe ser similar a la siguiente:
Adding NSEC3 hashed ordering information for 'dominio.com' |
Ejecute lo siguiente para ver el estado de la zona:
pdnssec show-zone dominio.com |
La salida debe ser similar a la siguiente:
|
Observe que la cadena de texto aleatorio en hexadecimal aparece entre los datos mostrados. PowerDNS se encargará de firmar automáticamente los nuevos registros que se vayan agregando a la zona, sin embargo necesitará ejecutar lo siguiente cada vez que realice cambios a fin realizar las rectificaciones correspondientes.
pdnssec rectify-zone dominio.com |
Deshabilitar DNSSEC para una zona es tan sencillo como ejecutar algo similar al siguiente ejemplo:
pdnssec disable-dnssec dominio.com |
La enumeración de zona —que también se conoce como zone walking— es una técnica utilizada para encontrar todos registros RR —registros de Recurso— de una zona al realizar una consulta el registro NSEC de la zona. NSEC3 oculta esta información con código utilizando una cadena de texto aleatorio en hexadecimal, lo cual dificulta la enumeración de la zona, pero sin imposibilitar ésta. Un atacante con determinación puede recurrir a tablas arcoíris para romper esta codificación, sin embargo ésto puede demorar considerablemente aún con equipo de cómputo de gran poder. Para impedir que ésto ocurra es que se recomienda volver a computar la cadena de texto aleatorio en hexadecimal en intervalos regulares.
Ejecute lo siguiente para consultar el valor actual del registro NSEC3PARAM:
pdnssec show-zone dominio.com |grep NSEC3 |
La salida debe ser similar a la siguiente:
Zone has NARROW hashed NSEC3 semantics, configuration: 1 0 1 EC59FF1470068907 |
Ejecute lo siguiente para generar un nuevo archivo denominado /usr/sbin/pdnszonesigner.sh:
vi /usr/sbin/pdnszonesigner.sh |
Añada el siguiente contenido:
#!/bin/bash SALT=`head -c 1000 /dev/urandom | sha1sum | cut -b 1-16` pdnssec set-nsec3 $1 "1 0 1 $SALT" narrow pdnssec rectify-zone $1 |
Ejecute lo siguiente para hacer ejecutable el programa:
chmod +x /usr/sbin/pdnszonesigner.sh |
Pruebe que funciona ejecutando lo siguiente:
pdnszonesigner.sh dominio.com
|
Espere unos segundos y ejecute lo siguiente para consultar nuevamente el valor del registro NSEC3PARAM:
pdnssec show-zone dominio.com |grep NSEC3 |
La salida debe ser similar a la siguiente, dónde el valor del registro NSEC3PARAM es diferente al de hace unos instantes:
Zone has NARROW hashed NSEC3 semantics, configuration: 1 0 1 89473870BEECC103 |
Ejecute lo siguiente para añadir una tarea programada:
crontab -e |
Añada el siguiente contenido:
0 0 */3 * * /usr/sbin/pdnszonesigner.sh dominio.com
|
Lo anterior hará que se cambie el valor del registro NSEC3PARAM y renovará las firmas cada 3 días, haciendo fútil cualquier intento de enumerar la zona —que también se conoce como zone walking— y romper el cifrado utilizando tablas arcoíris pues se carecerá del tiempo suficiente para lograrlo.
Última Edición: 10/09/2015, 11:53| Hits: 15,685