Administra tus Zonas DNS con PowerDNS Authoritative

Una zona DNS es un segmento administrado del espacio de nombres de dominio, contiene los registros (A, AAAA, MX, CNAME, TXT, etc.) que definen cómo se resuelve y se dirige el tráfico para uno o varios dominios o subdominios, en otras palabras, una zona es el “archivo de configuración” que, alojado en un servidor autoritativo, indica qué direcciones IP corresponden a cada nombre dentro de ese dominio.

Aunque parezca y sea algo complicado, realmente es muy útil en los ambientes empresariales en donde por ejemplo una de las recomendaciones vitales es la segmentación, pero segmentación de qué, de los espacios de pruebas y producción de sistemas informáticos o recursos de TI, para poner un ejemplo, el DNS de fagadevs está gestionado en la nube puesto que necesitamos que sea alcanzable por todas las personas a nivel mundial, pero en nuestros videos en el canal, realmente usamos zonas DNS locales autogestionadas, es por ello que, frecuentemente verás algo como fagadevs.intranet o fagadevs.corp, tú como usuario no podrás alcanzar estas zonas ya que responden a IPs privadas, generalmente conocidas como intranet.

Para gestionar estas zonas existen múltiples herramientas, una de ellas y que hemos visto en el canal es AdGuard pero en este video hemos optado por implementar PowerDNS (PDNS) como servidor autoritativo, esta solución ha sido de mucho interés, puesto que se utiliza a nivel mundial y a gran escala, por lo que es necesario conocer cómo opera y poder aplicarla en ambientes de producción.

Adicional a PDNS en el video se explica cómo desplegar una interfaz de administración, dado que en su versión gratuita no lo tiene (hasta el momento de este post no conozco alguna herramienta de la misma empresa), integramos también Nginx Proxy Manager y open-appsec para brindarle un mayor nivel de seguridad a nuestra interfaz, con esto tendrá un WAF que mejora la protección contra amenazas usando inteligencia artificial.

Como requerimientos para el video utilizamos un contenedor en Proxmox con Ubuntu 24.10, se encuentra instalado Docker y Docker Compose para levantar servicios adicionales a PDNS, instalamos los paquetes necesarios con:

sudo apt install pdns-server pdns-backend-mysql -y

y con esto listo, procedemos a configurar nuestro archivo docker compose:

services:

  appsec-npm:
    container_name: npm-attachment
    image: 'ghcr.io/openappsec/nginx-proxy-manager-attachment:latest'
    ipc: host
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "127.0.0.1:81:81"
    volumes:
      - ./proxy-manager/data:/data
      - ./proxy-manager/letsencrypt:/etc/letsencrypt
      - ./waf/appsec-logs:/ext/appsec-logs
      - ./waf/appsec-localconfig:/ext/appsec
    networks:
      services:
        ipv4_address: 172.18.0.2
        ipv6_address: fd00:dead:beef::2

  appsec-agent:
    container_name: appsec-agent
    image: 'ghcr.io/openappsec/agent:latest'
    network_mode: service:appsec-npm
    ipc: host
    restart: unless-stopped
    environment:
      - user_email=in**@******vs.com
      - nginxproxymanager=true
      - autoPolicyLoad=true
    volumes:
      - ./waf/appsec-config:/etc/cp/conf
      - ./waf/appsec-data:/etc/cp/data
      - ./waf/appsec-logs:/var/log/nano_agent
      - ./waf/appsec-localconfig:/ext/appsec
    command: /cp-nano-agent --standalone

  mariadb:
    image: mariadb:latest
    container_name: mariadb-database
    restart: always
    environment:
      - MARIADB_ROOT_PASSWORD=my-secret-pw
    volumes:
      - ./mariadb/data/mariadb:/var/lib/mysql
    networks:
      services:
        ipv4_address: 172.18.0.3
        ipv6_address: fd00:dead:beef::3
    ports:
      - "127.0.0.1:3306:3306"

  pdns:
    image: powerdnsadmin/pda-legacy:latest
    container_name: powerdns_admin
    restart: unless-stopped
    ports:
      - "127.0.0.1:9191:80"
    logging:
      driver: json-file
      options:
        max-size: 50m
    environment:
      - SQLALCHEMY_DATABASE_URI=mysql://powerdns:tu_clave_segura@172.18.0.3/powerdns
      - GUNICORN_TIMEOUT=60
      - GUNICORN_WORKERS=2
      - GUNICORN_LOGLEVEL=DEBUG
      - SECRET_KEY=cambia_esta_clave_secreta
      - POWERDNS_API_KEY=adminapikey
      - POWERDNS_API_URL=http://172.18.0.1:8081
      - POWERDNS_API_VERSION=v1
      - FLASK_DEBUG=0
    networks:
      services:
        ipv4_address: 172.18.0.4
        ipv6_address: fd00:dead:beef::4

networks:
  services:
    driver: bridge
    enable_ipv6: true
    ipam:
      config:
       - subnet: 172.18.0.0/24
       - subnet: fd00:dead:beef::/64

Con los servicios de docker listos, tenemos crear una base de datos y un usuario, para poder importar el esquema de base de datos que se encuentra en:

/usr/share/pdns-backend-mysql/schema/schema.mysql.sql

Finalmente preparamos nuestro archivo de configuración de PDNS de la siguiente manera:

launch=gmysql

gmysql-host=172.18.0.3
gmysql-user=powerdns
gmysql-password=tu_clave_segura
gmysql-dbname=powerdns

api=yes
api-key=adminapikey

webserver=yes
webserver-address=0.0.0.0
webserver-port=8081
webserver-allow-from=0.0.0.0/0

Ahora estás listo para ingresar a la interfaz web de PowerDNS Admin y gestionar tu propia zona DNS, en el video te contamos muchos más trucos y tips para que la implementación sea exitosa, tienes alguna duda? te leo en los comentarios, éxitos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *