Translate

miércoles, 6 de junio de 2018

Actualización automática de registros de DNS con nsupdate en CentOS 6 / Automatic DNS record administration with nsupdate in CentOS 6


  • Instalar bind (que contiene el daemon named) con:
yum -y install bind-chroot
  • Una vez instalado bind agregamos al dominio el permiso de actualización en el archivo /etc/named.conf. Ejemplo:

zone "midominio.org" IN {
        type master;
        file "midominio.org.zone";
        allow-update{
                127.0.0.1;
        };
};


  • Ahora en el directorio /var/named ( el cual está definido en el parámetro directory de la sección 'options'. ) Verificamos que esté creado el file de la zona. Ejemplo de contenido del archivo: midominio.org.zone:
[root@localhost named]# pwd
/var/named
[root@localhost named]# cat midominio.org.zone
$ORIGIN .
$TTL 86400    ; 1 day
midominio.org        IN SOA    midominio.org. micorreo.midomio.org. (
                2018060602 ; serial corresponde a Año-mes-día-versión
                28800      ; refresh (8 hours)
                7200       ; retry (2 hours)
                604800     ; expire (1 week)
                86400      ; minimum (1 day)
                )
                NS    ns.midominio.org.
                A    10.0.2.15
$ORIGIN midominio.org.
ns              A    10.0.2.15
tst1            A    10.0.3.1
tst2            A    10.0.3.2


  • Verificamos que el usuario propietario de /var/named sea named y que tenga permisos de actualización:
[root@localhost named]# chown named:named /var/named
[root@localhost named]# ls -ald /var/named
drwxr-x---. 6 named named 4096 Jun  6 16:06 /var/named



  • Activamos el booleano de SELinux para escritura de named:
setsebool -P named_write_master_zones On

  • Hacemos que se levante el named cuando arranque el sistema. (Esto se hace una sola vez):
[root@localhost named]# chkconfig named on
[root@localhost named]# chkconfig named --list
named              0:off    1:off    2:on    3:on    4:on    5:on    6:off


  • Reiniciamos el servidor de named
[root@localhost named]# service named restart
Stopping named:                                            [  OK  ]
Generating /etc/rndc.key:                                  [  OK  ]
Starting named:                                            [  OK  ]


La llave /etc/rndc.key solo la genera la primera vez que arranca el servidor named.


  • Probamos la actualización de registro de DNS mediante nsupdate (la opción -v es para que se conecte por IP y -d es debug):
[root@localhost named]# nsupdate -v -d
> server localhost
> zone midominio.org
> update add tst3.midominio.org. 86400 A 10.0.3.3
> show
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst3.midominio.org.    86400    IN    A    10.0.3.3

> send
Sending update to 127.0.0.1#53
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  35487
;; flags:; ZONE: 1, PREREQ: 0, UPDATE: 1, ADDITIONAL: 0
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst3.midominio.org.    86400    IN    A    10.0.3.3


Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  35487
;; flags: qr ra; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;midominio.org.            IN    SOA

> quit


  • Modificamos el archivo /etc/resolv.conf para que se emplee nuestro servidor de DNS. Ejemplo:
[root@localhost named]# cat /etc/resolv.conf
domain midominio.org
search midominio.org google.com
nameserver 127.0.0.1
nameserver 8.8.8.8

  • Verificamos que sí existe el nuevo host:
[root@localhost named]#  gethostip -d tst3
10.0.3.3


  • El archivo de zona (ej: midominio.org.zone ), no se actualiza hasta que no se reinicia el servidor. Sin embargo la información queda temporalmente grabada en el archivo con extensión jnl (ej:  midominio.org.zone.jnl). Ejemplo:
# ll midominio.zone*
-rw-r--r--. 1 root  root   551 Jun  6 17:16 midominio.org.zone
-rw-r--r--. 1 named named  734 Jun  6 17:32 midominio.org.zone.jnl

[root@localhost named]# cat midominio.org.zone
$ORIGIN .
$TTL 86400    ; 1 day
midominio.org        IN SOA    midominio.org. micorreo.midomio.org. (
                2018060602 ; serial corresponde a Año-mes-día-versión
                28800      ; refresh (8 hours)
                7200       ; retry (2 hours)
                604800     ; expire (1 week)
                86400      ; minimum (1 day)
                )
                NS    ns.midominio.org.
                A    10.0.2.15
$ORIGIN midominio.org.
ns              A    10.0.2.15
tst1            A    10.0.3.1
tst2            A    10.0.3.2
 

[root@localhost named]# service named restart
Stopping named: .                                          [  OK  ]
Starting named:                                            [  OK  ]


[root@localhost named]# cat midominio.org.zone
$ORIGIN .
$TTL 86400    ; 1 day
midominio.org        IN SOA    midominio.org. micorreo.midomio.org. (
                2018060603 ; serial
                28800      ; refresh (8 hours)
                7200       ; retry (2 hours)
                604800     ; expire (1 week)
                86400      ; minimum (1 day)
                )
                NS    ns.midominio.org.
                A    10.0.2.15
$ORIGIN midominio.org.
ns              A    10.0.2.15
tst1            A    10.0.3.1
tst2            A    10.0.3.2
tst3            A    10.0.3.3


# ls -l midominio.org.zone*
-rw-r--r--. 1 named named  387 Jun  6 17:33 midominio.org.zone
-rw-r--r--. 1 named named  734 Jun  6 17:32 midominio.org.zone.jnl



Como conectarse por dnssec

  • Generamos el par de llaves con el comando dnsssec-genkey. Nota: En mi máquina virtual se tardó más de 2 minutos en ejecutar el comando:
[root@localhost named]# dnssec-keygen -a HMAC-SHA512 -b 512 -n USER micorreo.midominio.org.
Kmicorreo.midominio.org.+165+45033

[root@localhost named]# ll *micorreo.midominio.org*
-rw-r--r--. 1 root root 129 Jun  6 19:02 Kmicorreo.midominio.org.+165+45033.key
-rw-------. 1 root root 232 Jun  6 19:02 Kmicorreo.midominio.org.+165+45033.private


La extensión "key" es 'la llave pública' y la extensión "private" se supone es la privada.

  • Creamos el archivo que contendrá la llave 'pública'. Ej.:  
 [root@localhost named]# cat dnskeys.conf
key micorreo.midominio.org. {
    algorithm HMAC-SHA512;
    secret "VVYc19ygyNU3kJ8tkyaL2Q6h9jw60kMbP14XSrbyTWsgDa3OfXnRkWlJ NJHKPuZ5vCR79B5/cYO1OYzB6BZjaA==";
}; 
  • Modificamos el archivo /etc/named.conf para que ahora la conexión se haga por llave e incluimos el archivo con la llave pública. Ej.:
include "dnskeys.conf";
zone "midominio.org" IN {
        type master;
        file "midominio.org.zone";
        allow-update{
                key micorreo.midominio.org.;
                127.0.0.1;
        };
};



  • Reiniciamos servidor para que tome los cambios:

[root@localhost named]# service named restart
Stopping named:                                            [  OK  ]
Starting named:                                            [  OK  ]


  • Probamos hacer la conexión ahora con la llave "pública". Nota: Deben estar presentes en el mismo directorio el archivo .key y elarchivo .private. Al invocar el nsupdate no es necesario ponerle la extensión .key o private , pero también funciona así:

[root@localhost named]# nsupdate -v -d -k Kmicorreo.midominio.org.+165+45033.key
Creating key...
> server localhost
> zone midominio.org
>  update add tst4.midominio.org. 86400 A 10.0.3.4
> show
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst4.midominio.org.    86400    IN    A    10.0.3.4

> send
Sending update to 127.0.0.1#53
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  43670
;; flags:; ZONE: 1, PREREQ: 0, UPDATE: 1, ADDITIONAL: 1
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst4.midominio.org.    86400    IN    A    10.0.3.4

;; TSIG PSEUDOSECTION:
micorreo.midominio.org.    0    ANY    TSIG    hmac-sha512. 1528331218 300 64 Gy+LtKqROMGWjRc/DBHoviCJn54o5rwyWtk+f+tURxOkJU1q6BxKKVUY Vkp3iBNduUatbNIKyawKMnA1vxXnwg== 43670 NOERROR 0


Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  43670
;; flags: qr ra; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 1
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; TSIG PSEUDOSECTION:
micorreo.midominio.org.    0    ANY    TSIG    hmac-sha512. 1528331219 300 64 bqXuQBmqM/UBCTyfQA2x2H0VN+o3cWbdZefpQtd0dBRYTCNbY3FGQcfi 15HZk+V0QqpRwPpbBnhkPUe24/Z4Mw== 43670 NOERROR 0

> quit

  • Verificamos que sí se dio de alta el nuevo host:
[root@localhost named]# gethostip -d tst4
10.0.3.4


  • Ejemplo por medio de ligas:
ln -s /var/named/Kmicorreo.midominio.org.+165+45033.private dnskey.private
ln -s /var/named/Kmicorreo.midominio.org.+165+45033.key dnskey.key

ls -l
total 0
lrwxrwxrwx. 1 root root 49 Jun  6 20:42 dnskey.key -> /var/named/Kmicorreo.midominio.org.+165+45033.key
lrwxrwxrwx. 1 root root 53 Jun  6 20:42 dnskey.private -> /var/named/Kmicorreo.midominio.org.+165+45033.private
 

# nsupdate -v -d -k dnskey
Creating key...
> server 127.0.0.1
> zone midominio.org
> update add tst5.midominio.org. 86400 A 10.0.3.5
> show
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst5.midominio.org.    86400    IN    A    10.0.3.5

> send
Sending update to 127.0.0.1#53
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  58893
;; flags:; ZONE: 1, PREREQ: 0, UPDATE: 1, ADDITIONAL: 1
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst5.midominio.org.    86400    IN    A    10.0.3.5

;; TSIG PSEUDOSECTION:
micorreo.midominio.org.    0    ANY    TSIG    hmac-sha512. 1528335893 300 64 yHpONPHjgYNfoBS7Xjug01AXEMx3moPJSQu8msWh+lLduwL5yjZ97lET Ee+SXTEsmuhf4U7QFlzq+7Z5QSrX4g== 58893 NOERROR 0


Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  58893
;; flags: qr ra; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 1
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; TSIG PSEUDOSECTION:
micorreo.midominio.org.    0    ANY    TSIG    hmac-sha512. 1528335893 300 64 61pYdkJNq7E5Yro4DElMUD+b+W8cjcV65kccEiF4ZQpXAAxC7n5tMCKm Tzkz7tuuSVyWJzpOMGDnhNm2mGQ3rg== 58893 NOERROR 0

> quit
[root@localhost bin]# gethostip -d tst5
10.0.3.5
 
 



Automatización 

Ejemplo de  script para automatizar el proceso de alta (suponiendo que se encuentra en el mismo directorio de dnskey.private y dnskey.key):

# cat addhost
#!/bin/bash
SERVER="127.0.0.1"
ZONE="midominio.org."
HOST="$1.$ZONE"
IP=$2
TTL="86400"
RECORD=" $HOST $TTL A $IP"

echo "
server $SERVER
zone $ZONE
update add $RECORD
show
send" | nsupdate -v -d -k dnskey
 

[root@localhost bin]# addhost tst6 10.0.3.6
Creating key...
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst6.midominio.org.    86400    IN    A    10.0.3.6

Sending update to 127.0.0.1#53
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:    860
;; flags:; ZONE: 1, PREREQ: 0, UPDATE: 1, ADDITIONAL: 1
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst6.midominio.org.    86400    IN    A    10.0.3.6

;; TSIG PSEUDOSECTION:
micorreo.midominio.org.    0    ANY    TSIG    hmac-sha512. 1528336819 300 64 5rZzjNol8Zx4fZMwo9e23JsXuAEM2kaisoVr7BnLARIS9ZQsAmqKSkbv D0+1t9bC3oyVrD8zWjCBLWo9GEy5OQ== 860 NOERROR 0


Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:    860
;; flags: qr ra; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 1
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; TSIG PSEUDOSECTION:
micorreo.midominio.org.    0    ANY    TSIG    hmac-sha512. 1528336820 300 64 8sq6u0DSsbFSO3/K2Xg/AlbMBmjWFkSsIeTzMo1wGpQmj39+s0b8Oohj lczoEIjYzy4vCQGRtZPB/RZmGh5otg== 860 NOERROR 0

[root@localhost bin]# gethostip -d tst6
10.0.3.6
 

Posibles errores y como solucionarlos:

Si al realizar el send aparece el error:
;; ->>HEADER<<- opcode: UPDATE, status: SERVFAIL, id:

pero todo lo demás parece estar bien. Ejemplo:

> send
Sending update to 127.0.0.1#53
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  47128
;; flags:; ZONE: 1, PREREQ: 0, UPDATE: 1, ADDITIONAL: 0
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst3.midominio.org.    86400    IN    A    10.0.3.3


Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: SERVFAIL, id:  47128
;; flags: qr ra; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;midominio.org.            IN    SOA



Puede ser por lo siguiente:
  • Que no esté puesto el booleano de SELinux . Esto se arregla poniendo:
setsebool -P named_write_master_zones On

Verificación de la variable: 

[root@localhost named]# getsebool named_write_master_zones
named_write_master_zones --> on

  • Que no haya permisos de escritura en el directorio /var/named para el usuario named. Esto se arregla poniendo:
[root@localhost named]# chown named:named /var/named
[root@localhost named]# ls -ald /var/named
drwxr-x---. 6 named named 4096 Jun  6 17:16 /var/named
 

  • Si al verificar el estado del servidor da: named dead but subsys locked . Ejemplo:

# service named status
version: 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.5
CPUs found: 12
worker threads: 12
number of zones: 20
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running
named dead but subsys locked


 

Puede ser:
El contexto de selinux no permite guardar datos, por ejemplo nos se crea el file named.pid en la carpeta /var/named/chroot/var/run/named. Ejemplo de contexto incorrecto:

# ls -aldZ /var/named/chroot/ named/
drwxr-xr-x. root root  unconfined_u:object_r:named_conf_t:s0 /var/named/
drwxr-x---. root named system_u:object_r:named_conf_t:s0 /var/named/chroot/


Esto se puede arreglar arreglando el contexto con restorecon. Ej.:

restorecon -r -v /var/named/chroot

o mejor aún:

restorecon -r -v /var/named

[root@lab c]#  ls -aldZ /var/named/chroot/ /var/named/
drwxr-x---. named named system_u:object_r:named_zone_t:s0 /var/named/
drwxr-x---. named named system_u:object_r:named_conf_t:s0 /var/named/chroot/



  • El error:
 ; TSIG error with server: tsig indicates error

Puede ocurrir porque:
  • No se está dando la llave correcta.
  • No se creó el archivo que contiene la llave pública (por ejemplo dnskeys.conf), o no se está incluyendo en el archivo de configuración de /etc/named.conf
  • No se cuenta con los permisos necesarios para leer/guardar información en la carpeta /var/named. En este caso, como ya se mencionó más arriba, se recomienda verificar el boolean correspondiente de SELinux, verificar/restaurar los contextos, verificar propietarios y permisos.

No hay comentarios: