Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

jueves, 15 de octubre de 2015

Cifrando la comunicación con el DNS con DNSCrypt

Muy buenas a todos. Hoy quiero hablaros sobre las comunicaciones seguras con los servidores DNS. Ya en su día hablé sobre cómo configurar nuestro propio servidor con bind9, dándonos la libertad de controlar quien se conecta, quien no, etc... En esta ocasión quiero dar una pequeña vuelta de tuerca al concepto del DNS y enfocarlo más en el concepto de la seguridad. Toda comunicación corre el riesgo de ser comprometida mediante los cada vez más famosos ataques de Man in the Middle. Es por ello que no solo hay que intentar conectarse a páginas que usen SSL, sino que también hay que asegurarse que la comunicación con el DNS sea segura.


Esto puede parecer complicado, pero la verdad es que es mucho más sencillo de lo que a primera vista parece. En este caso recurriremos a una herramienta de terceros denominada DNSCrypt, la cual llama especialmente su atención por su facilidad de uso y por su gran variedad de DNSs con los que uno puede conectarse según su geolocalización. Esta herramienta lo que hace es que las comunicaciones con el DNS pasen cifradas a través de un servidor especialmente preparado para soportar conexiones protegidas mediante una capa de cifrado.

Dicha herramienta, no es una herramienta que esté incluida en los repositorios por defecto, sino que tiene que ser descarga de su página oficial para poder usarla; además de depender de una librería denominada libsodium, que también debe de ser descargada desde otro enlace. Como la propia instalación de DNSCrypt depende de libsodium, empezaremos instalando esta última, pues sino directamente no podremos instalar la otra.

Instalando libsodium

La instalación de libsodium es realmente sencilla, si bien al final de ésta habrá que realizar dos pasos "especiales" si queremos poder instalar DNSCrypt. El primer paso que deberíamos seguir sería descargar el paquete de instalación de libsodium, el cual se puede obtener en el siguiente enlace:


El enlace no nos descargará el programa en sí, sino que nos mostrará un listado de paquetes entre los cuales tendremos que escoger aquel que mejor se adapte a nuestras necesidades... En mi caso en concreto he optado por la versión más reciente de todas; es decir por el paquete: libsodium-1.0.2.tar.gz. Tras descargar el paquete en cuestión, pasaríamos a descomprimirlo, lo cual es tan sencillo como ejecutar el siguiente comando:

tar -xvzf libsodium-1.0.2.tar.gz

Dentro de la carpeta que hemos obtenido de la descompresión (en este caso libsodium-1.0.2) ejecutaríamos una de las combinaciones de comandos más conocida entre aquellos que están acostumbrados a trabajar con gcc. Dicha combinación se basa en la ejecución del fichero configure, seguido del uso de los archifamosos make y make install, pues para instalar este paquete tendremos que compilarlo primero.  Para ello es necesario tener las herramientas make y gcc, con lo que es recomendable asegurarse de que están instaladas mediante:

apt-get install gcc make

Sin estas dos librerías cualquier acción que requiera compilación es imposible... Ahora sí que podríamos pasar a compilar e instalar la librería, lo cual se basa en únicamente en escribir, dentro de la carpeta libsodium-1.0.2, lo siguiente:

  1. ./configure
  2. make
  3. make install

Esto de por sí podría parecer suficiente; es decir que a primera vista parece que la librería está instalada y es plenamente funcional; pero desgraciadametne no es así. Es necesario volcar las librerías que hemos instalado dentro del directorio  /etc/ld.so.conf.d/usr_local_lib.conf y enviar el comando necesario para "actualizar" las librerías que usa el sistema... Este proceso es tan sencillo como escribir estas dos líneas:

  1. echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf
  2. ldconfig


Instalando DNSCrypt

Habiendo instalado las dependencias necesarias para poder trabajar con nuestro DNS especial, pasaríamos a la instalación del DNS en cuestión. Ello conllevaría la descarga del paquete DNSCrypt, el cual podemos obtener en el enlace de a continuación:

https://download.dnscrypt.org/dnscrypt-proxy/

Aquí al igual que con libsodium, tendremos una lista en la que podremos elegir la versión que más nos convenga. Yo personalmente suelo recomendar la más reciente, si bien no es algo obligatorio... En este caso en concreto he optado por descargarme el fichero dnscrypt-proxy-1.6.0.tar.gz, el más actual en estos momentos. Con el fichero descargado, el procedimiento es muy parecido que el seguido con libsodium: Lo primero sería descomprimir el paquete:

tar -xvzf dnscrypt-proxy-1.6.0.tar.gz

Dentro del directorio resultante, dnscrypt-proxy-1.6.0, habría que ejecutar la misma combinación antes realizada, solo que en este caso el afectado sería dnscrypt-proxy:

  1. ./configure
  2. make
  3. make install


Hora de usar DNSCrypt

Los preparativos ya están listos, ahora faltaría sacarle partido a la herramienta... Para eso lo ideal es entender el funcionamiento de ésta antes de hacer nada, lo cual es bastante sencillo. El comando dnscrypt-proxy tiene la siguiente estructura:

dnscrypt-proxy -E -R ${nombre_dns} -d

Cada parámetro tiene el siguiente significado:
  • -E: Ephemeral Keys. Por defecto se usa siempre la misma "clave pública" establecer la conexión cifrada con los servidores... Esto hace que la clave pública usada se pueda asociar a la ip de uno y que puedan conocer desde qué ips se conecta aquella clave (y junto con la ip su localización). Esto se puede evitar haciendo que el servidor cree una clave pública efímera que tenga una fecha de caducidad de alrededor de un año... No es algo obligatorio, pero sí recomendable.
  • -R: Resolver name. El parámetro por excelencia de esta herramienta. Cuando queremos establecer la conexión cifrada, tenemos que especificar con qué servidor DNS queremos comunicarnos... El servidor en cuestión no puede ser cualquiera, sino uno que esté preparado para una conexión cifrada; afortunadamente existe una página (especificada en la página oficial de dnscrypt) que posee un listado muy extenso de servidores disponibles; listado que podemos ver aquí: https://github.com/jedisct1/dnscrypt-proxy/blob/master/dnscrypt-resolvers.csv. Habría que escoger un nombre dentro de dicho listado y nombrarlo después del parámetro -R.
  • -d: Daemon. Un parámetro opcional pero muy recomendable. Por defecto el programa corre en "primer plano" y cuando se ejecuta no se puede hacer otra cosa y no se puede cerrar la terminal en la que se ha ejecutado el susodicho... Gracias a este parámetro el comando puede seguir ejecutándose en segundo plano como un demonio.
En mi caso por ejemplo he optado por un DNS francés cuyo nombre es: d0wn-fr-ns1.

sudo dnscrypt-proxy -E -R d0wn-fr-ns1 -d

Al haberse ejecutado en segundo plano no veremos nada en pantalla; es decir que no sabremos si se ha ejecutado bien o mal... Para consultar si el comando ha sido existoso habría que consultar el fichero de log /var/log/syslog o escribir el comando:

ps -e |grep dnscrypt-proxy

En caso de que el fichero de log dijese que se ha ejecutado con éxito el comando o el comando ps, hubiese generado un proceso, significaría que el comando ha funcionado correctamente. 

Ahora solamente faltaría un paso, apuntar hacia el DNS cifrado... En este caso, debido al funcionamiento de la herramienta dnscrypt tendremos que apuntar a nuestro propio equipo; es decir a localhost o 127.0.0.1. Para modificar el DNS al que queremos "apuntar" tendremos que modificar el fichero /etc/resolv.conf y dejarlo de esta forma:

En Debian:
nameserver 127.0.0.1
En Ubuntu:
dns-nameservers 127.0.0.1

Ahora cualquier la comunicación con el DNS estaría cifrada, otorgandonos una capa más de seguridad. En este caso hemos optado por un DNS francés, pero uno puede optar por aquel que se encuentre más cerca de su país; esto ya es un tema que depende de cada uno.

Como dato importante habría que tener en cuenta que este "enlace" con el DNS solamente duraría mientras que el demonio dnscrypt-proxy se mantuviese activo, con lo que si se parase dicho servicio o se reiniciase el equipo, no podríamos resolver ningún nombre de dominio (recordemos que estamos apuntando ahora mismo a la ip de nuestro propio equipo). El mantener el servicio activo depende de nosotros, pero para apuntar al DNS siempre que iniciemos sesión, podemos crear un fichero llamado dnscifrado.sh en el directorio /etc/init.d/:

  1. #!/bin/bash
  2. ### BEGIN INIT INFO
  3. # Provides:          dnscifrado
  4. # Required-Start:    $local_fs $remote_fs $network $syslog $named
  5. # Required-Stop:     $local_fs $remote_fs $network $syslog $named
  6. # Default-Start:     2 3 4 5
  7. # Default-Stop:      0 1 6
  8. # X-Interactive:     true
  9. # Short-Description: inicio de DNS cifrado
  10. ### END INIT INFO
  11. dnscrypt-proxy -E -R d0wn-fr-ns1 -d

Aparte del script, obviamente habría que hacer que éste se iniciase durante el arranque, lo cual es tan sencillo como escribir estos dos comandos:

  1. chmod +x /etc/init.d/dnscifrado.sh
  2. insserv dnscifrado.sh

Espero que os haya resultado útil.

Saludos.

No hay comentarios :

Publicar un comentario