Installare DNS Autoritativo¶
Questa ricetta, che fa ampiamente riferimento alla documentazione esistente, ti guida all'installazione di un server PowerDNS Authoritative DNS e del suo frontend GUI PowerDNS-admin. Il server PowerDNS è supportato da un database MySQL/MariaDB.
La ricetta è intesa per quei casi in cui è necessario un servizio DNS minimale. Per questo motivo, il server DNS (così come il database MySQL/MariaDB di backend) e la sua GUI saranno installati sulla stessa macchina virtuale.
Verrà installata la versione 4.X di PowerDNS, che agisce come un server autoritativo DNS puro. Potresti anche considerare di installare un PowerDNS recursor, ma questa parte non è coperta qui e viene lasciata come esercizio.
La ricetta assume il sistema operativo CentOS: per altri sistemi operativi, fare riferimento alle pagine ufficiali pertinenti e modificare i comandi di conseguenza.
Tra le molte possibili alternative per la GUI di gestione, ho abbandonato il glorioso PowerAdmin (ancora disponibile su https://www.poweradmin.org/), che mi ha servito così bene fino ad oggi, poiché sembra non essere mantenuto da molto tempo. D'altra parte, PowerDNS-Admin sembra avere una comunità piuttosto ampia e vivace dietro. Un vantaggio di quest'ultimo prodotto è che non richiede più l'accesso diretto al database MySQL, poiché interagisce tramite API PowerDNS.
Prerequisiti¶
Configurare il firewall¶
Per proteggere la macchina virtuale che esegue il server DNS, è necessario configurare correttamente il firewall. Se la macchina virtuale viene creata all'interno di un tenant OpenStack, consiglio vivamente di creare un Security Group dedicato contenente le seguenti eccezioni:
- consentire accesso UDP alla porta 53 (dall'Universo, se questo DNS deve essere autoritativo)
- consentire accesso TCP alla porta 53 (dall'Universo, se questo DNS deve essere autoritativo)
- consentire accesso TCP alla porta 8181 (GUI del server web PowerDNS) da host/reti fidati
- consentire accesso TCP alla porta 9191 (GUI di gestione PowerDNS-Admin) da host/reti fidati
- consentire accesso TCP alla porta 22 (SSH) da host/reti fidati
Inoltre, trovo anche conveniente aggiungere l'accesso ICMP da 0.0.0.0.
Server MySQL¶
Installa il server MariaDB, configuralo, aggiorna e riavvia:
yum install epel-release
yum install mariadb-server
systemctl start mariadb
systemctl enable mariadb
systemctl status mariadb
mysql_secure_installation # inizialmente, la password di root è vuota, durante l'esecuzione del comando puoi impostarla su qualcosa di sensato
yum update
reboot
Ansible¶
Installa Ansible:
yum install epel-release
yum install ansible
Crea utente Ansible, con privilegi sudo:
- crea un gruppo per
ansible, modifica il file/etc/groupe aggiungi una riga come:
groupadd --gid 22222 ansible
- crea utente
ansible:
useradd --create-home --gid 22222 --uid 22222 ansible
- aggiungi l'utente a sudoers, crea il file
/etc/sudoers.d/ansiblecon contenuto:
Defaults:ansible !requiretty
ansible ALL = (root) NOPASSWD:ALL
Installazione e configurazione PowerDNS¶
PowerDNS è gestito tramite un ruolo Ansible.
Poiché assumiamo che la macchina virtuale appartenga a un tenant OpenStack e abbia un IP floating, stiamo configurando il nostro server DNS in modo che ascolti su qualsiasi interfaccia.
- crea una directory di lavoro:
mkdir /home/Ansible/PowerDNS
- scarica da GitHub:
cd /home/Ansible/PowerDNS
ansible-galaxy --roles-path . install PowerDNS.pdns
- crea il file
inventorynella directory di lavoro Ansible, con contenuto:
[mydns]
localhost
[mydns:vars]
ansible_user=ansible
- crea
manageDNS.ymlnella directory di lavoro Ansible, contenente la configurazione per il tuo server DNS, leggi la documentazione PowerDNS per ulteriori informazioni. Ad esempio, qualcosa di simile:
- hosts: localhost
roles:
- { role: PowerDNS.pdns }
vars:
pdns_config:
daemon: yes
master: true
slave: false
# local-address: # lasciando questo commentato, quindi il DNS si legherà a qualsiasi interfaccia
disable-axfr: yes
log-dns-details: on
loglevel: 3
slave-cycle-interval: 60
api: yes
api-key: superStringaSicura
webserver: yes
# webserver-address: # lasciando questo commentato, quindi il webserver ascolterà su qualsiasi interfaccia
webserver-password: dnspwd
# configura la riga successiva come necessario: aggiungi tutte le reti autorizzate a fare query
webserver-allow-from: 127.0.0.0/16,10.200.0.0/16,192.168.209.0/24,10.3.0.0/23,193.206.158.0/23
pdns_backends:
gmysql:
host: 127.0.0.1
port: 3306
# utente/password e nome database PowerDNS da creare
user: powerdns
password: qualchePasswordSicuraPerIlMioDNS
dbname: pdns
pdns_mysql_databases_credentials:
gmysql:
# imposta priv_user e priv_password alle tue credenziali MySQL
priv_user: root
priv_password: qualsiasiPasswordTuAbbiaConfiguratoPerMysqlRoot
priv_host:
- "%"
pdns_install_repo: "\{\{ pdns_auth_powerdns_repo_41 \}\}"
- esegui Ansible:
cd /home/Ansible/PowerDNS
ansible-playbook -b -v -i inventory.yml manageDNS.yml
Installazione e configurazione PowerDNS-Admin¶
La documentazione ufficiale per PowerDNS-Admin è disponibile qui: molta documentazione utile è disponibile anche nella wiki.
Crea il database MySQL come da istruzioni ufficiali per impostare il database powerdnsadmin.
Installa PowerDNS-Admin come da istruzioni ufficiali per CentOS 7 o controlla la pagina pertinente nella wiki per altri sistemi operativi.
Una volta che hai PowerDNS-Admin attivo e funzionante, segui le istruzioni nella wiki per renderlo un servizio: ho optato per Systemd, altre configurazioni sono possibili. Rispetto alle istruzioni sopra, ho fatto solo un paio di modifiche:
-
creato
powerdnsadmine il suo gruppo con il comando:useradd --system --user-group powerdnsadmin
-
cambiata la proprietà della directory PowerDNS-Admin:
chown -R powerdnsadmin.powerdnsadmin /opt/web/powerdns-admin
Per riferimento, ho creato il file config.py copiando config_template.py e modificando:
BIND_ADDRESS = '0.0.0.0'
SQLA_DB_USER = '<scegli_il_tuo_nome_utente_DB>'
SQLA_DB_PASSWORD = '<scegli_una_password_decente>'
SQLA_DB_HOST = 'localhost'
PDNS_STATS_URL = 'http://127.0.0.1:8081/'
PDNS_API_KEY = '<qualsiasi_cosa_sia_impostata_in_pdns.conf_per_api-key>'