Unbound

Sécurité des requêtes DNS
DNSSEC DNSSEC-TRIGGER
Préambule :

Faiblesse du DNS
Une des faiblesses de la sécurité de l’Internet est que le mécanisme d’annuaire principal, le DNS, n’est pas très sécurisé.
Il est trop facile de tromper un serveur DNS en lui injectant de fausses informations (faille dite Kaminsky).

Mais il y a pire : souvent, c’est le serveur DNS mis à la disposition de l’utilisateur, par le FAI ou par le service informatique local, qui le trompe. Une solution technique existe, à ces deux problèmes : DNSSEC. Mais pour que DNSSEC protège M. Michu, les vérifications que permet ce protocole doivent être faites sur la machine de M. Michu, la seule en qui il peut avoir un peu confiance.

C’est ce que permet le nouveau logiciel dnssec-trigger.

Que disent les RFC

Les RFC 4033; 4034; 4035 nous propose une solution,

Installation d’un serveur récursif en local

Développé aux NLnetLabs, partiellement financé par l’AFNIC, il va permettre de donner la puissance de DNSSEC.

Contexte :
Resolveur en local, ou pour son LAN il y aura une étape supplémentaire pour le LAN.

Nous allons également mettre en place le protocole DNSSEC afin de parait à une des faiblesses des requêtes DNS en chiffrant notre requête et en s’assurant de la fiabilité de la chaine DNS, c’est particulièrement pratique lors d’une connexion sur les bornes WIFI des hotels, hal de gare etc; etc.

apt-get install unbound && unboud-host && unbound-anchor && dnssec-trigger

Organisation

>~ tree -A -L 3 /etc/unbound/
/etc/unbound/
├── [332] unbound.conf
├── [4096] unbound.conf.d
│ └── [190] root-auto-trust-anchor-file.conf
├── [1277] unbound_control.key
├── [802] unbound_control.pem
├── [1277] unbound_server.key
└── [790] unbound_server.pem
1 directory, 6 files

 

Unbound.conf

Pour une récursivité en locale unbound va  » écouter » sur la boucle local soit:  127.0.0.1

# The following line will configure unbound to perform cryptographic
# DNSSEC validation using the root trust anchor.
server:
interface: 127.0.0.1
auto-trust-anchor-file: "/var/lib/unbound/root.key"

/var/lib/unbound/root.key

Nous devons peupler le fichier root.key avec une clé de chiffrement appartenant à un serveur racine avec la commande suivante:

# unbound-anchor -a "/var/lib/unbound/root.key"

Le fichier contient alors:

; autotrust trust anchor file
;;id: . 1
;;last_queried: 1465504617 ;;Thu Jun 9 22:36:57 2016
;;last_success: 1465504617 ;;Thu Jun 9 22:36:57 2016
;;next_probe_time: 1465546194 ;;Fri Jun 10 10:09:54 2016
;;query_failed: 0
;;query_interval: 43200
;;retry_time: 8640
.
 172800 IN
 DNSKEY 257 3 8
AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjFFVQUTf6v58fLjwBd0YI0Ezr
AcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoXbfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkj
f5/Efucp2gaDX6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpzW5hOA2hzCTMjJ
PJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relSQageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLK
BP1dfwhYB4N7knNnulqQxA+Uk1ihz0= ;{id = 19036 (ksk), size = 2048b} 
;;state=2 [ VALID ]
;;count=0 
;;lastchange=1465490355 
;;Thu Jun 9 18:39:15 2016

/etc/unbound/unbound.conf.d/root-auto-trust-anchor-file.conf

server:
# The following line will configure unbound to perform cryptographic
# DNSSEC validation using the root trust anchor.
auto-trust-anchor-file: "/var/lib/unbound/root.key"

Démarrer et tester le service

# /etc/init.d/unbound status
● unbound.service - (null)
Loaded: loaded (/etc/init.d/unbound)
Drop-In: /run/systemd/generator/unbound.service.d
└─50-insserv.conf-$named.conf, 50-unbound-$named.conf
Active: active (running) since sam. 2016-06-11 11:17:35 CEST; 10min ago
Process: 22073 ExecStop=/etc/init.d/unbound stop (code=exited, status=0/SUCCESS)
Process: 22082 ExecStart=/etc/init.d/unbound start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/unbound.service
└─22094 /usr/sbin/unbound
juin 11 11:17:35 gally unbound-anchor[22090]: /var/lib/unbound/root.key has content
juin 11 11:17:35 gally unbound[22082]: Starting recursive DNS server: unbound.
juin 11 11:17:35 gally unbound[22094]: [22094:0] notice: init module 0: validator
juin 11 11:17:35 gally unbound[22094]: [22094:0] notice: init module 1: iterator
juin 11 11:17:35 gally unbound[22094]: [22094:0] info: start of service (unbound 1.4.22).

Test récursivité

>~ dig @127.0.0.1 AAAA ordinatous.com
; <<>> DiG 9.9.5-9+deb8u6-Debian <<>> @127.0.0.1 AAAA ordinatous.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52593
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ordinatous.com.
 IN
;; AUTHORITY SECTION:
ordinatous.com.
 164
 IN
3600000 300
AAAA
SOA dns108.ovh.net. tech.ovh.net. 2016060801 86400 3600
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Jun 09 23:00:29 CEST 2016
;; MSG SIZE rcvd: 98


Bonus
La configuration DNSSEC pour BIND

options {
// N'écouter que sur l'interface locale. Autrement, faites
// attention à interdire l'accès aux machines non-locales, pour
// ne pas faire un résolveur ouvert.
listen-on {127.0.0.1;};
dnssec-enable yes;
dnssec-validation yes;
};
trusted-keys {
"." (fichier bind.keys)
};

DNSSEC-TRIGGER

DNSSEC-TRIGGER est un utilitaire permettant de gérer la chaine de chiffrement
Cas pour un usage nomade

Typiquement les employés d’une structure qui auraient besoins de connectivité, dans ce genre de cas l’utilisateur se connectera d’ordinaire à la première borne d’accés WIFI, il convient donc de protéger les requêtes.

Commande de configuration

dnssec-trigger-control-setup
# dnssec-trigger-control-setup
setup in directory /etc/dnssec-trigger
dnssec_trigger_server.key exists
dnssec_trigger_control.key exists
create dnssec_trigger_server.pem (self signed certificate)
create dnssec_trigger_control.pem (signed client certificate)
Signature ok
subject=/CN=dnssec-trigger-control
Getting CA Private Key
Setup success. Certificates created.
run this script again with -i to:
- enable remote-control in unbound.conf
- start unbound-control-setup
- add root trust anchor to unbound.conf
if you have not done this already
# dnssec-trigger-control-setup -i
setup in directory /etc/dnssec-trigger
unbound-checkconf: no errors in /etc/unbound/unbound.conf
checking if unbound-control needs to be enabled
checking if root trust anchor needs to be enabled
check for search path in resolv.conf and edit /etc/dnssec-trigger/dnssec-trigger.conf
check for domain in resolv.conf and edit /etc/dnssec-trigger/dnssec-trigger.conf

Démarrer l’interface graphique

dnssec-trigger-panel

Le logiciel vous indiquera si la chaine de DNS est fiable ou non, et vous laisse le choix
d’accepter ou non de poursuivre votre navigation.

Anchor-trust

Ce sont des zones qui garantissent leur fiabilité via l’échange de clé asymétrique, c’est
une méthode censé être très fiable, très protocolaire. L’échange peut se faire de
manière très confidentielle, avec un support amovible.

sectreeLes zones dites « parentes » sont garantes des zones dites « enfants ».

chainoftrust

L’IANNA

Fourni la liste ici : Trust anchor & key
Ainsi que la synthaxe et les règles d’édition.
draft-icann
Observation wireshark
DNSSEC introduit de nouveau enregistrement comme :

•DS
•DNSKEY
•NSEC
•RRSIG

wire

Resolv.conf

L’usage de unbound et du DNSSEC m’ont permis de comprendre le mécanisme l’écriture de resolv.conf, DHCP vient écrire les informations indiquant le serveur de noms, à chaque redémarrage.

DNSSEC-TRIGGER gère l’écriture du fichier, cependant si vous aviez quelques difficultés, il faut modifier un autre fichier:

/etc/resolvconf/resolv.conf.d/head

Et indiquer ceci:

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
127.0.0.1

Configuration pour un LAN

Modifier le fichier /etc/unbound.conf
Nous autorisons le serveur à répondre au LAN 192.168.1.0/24
Une liste de forwarder est déjà proposée je vous recommande les 2 premiers=French Data Network

## Simple recursive caching DNS
## unbound.conf – chezmoi.lan
#
Server:
#repond sur toutes les interfaces
Interface: 0.0.0.0
#plage d’adresse clients allow ou deny
#access-control: 10.0.0.0/16 allow
#access-control: 127.0.0.0/8 allow
access-control: 192.168.1.0/24 allow
verbosity: 1
forward-zone:
name: "."
forward-addr : 80.67.169.12    #FDN
forward-addr : 80.67.169.40    #FDN
#forward-addr: 8.8.4.4          #google
#forward-addr: 8.8.8.8          #google
#forward-addr: 37.235.1.174     #freedns
#forward-addr: 37.235.1.177     #freedns
#forward-addr: 50.116.23.211    #openNIC    
#forward-addr: 64.6.64.6        #verisign
#forward-addr: 64.6.65.6        #verisign
#forward-addr: 74.82.42.42      #hurrican electric
#forward-addr: 84.200.69.80     #DNS watch
#forward-addr: 84.200.70.40     #DNS watch
#forward-addr: 91.239.100.100   #censurfridns.dk
#forward-addr: 109.69.8.51      #punCAT
#forward-addr: 208.67.222.220   #openDNS
#forward-addr: 208.67.222.222   #openDNS
#forward-addr: 216.146.35.35    #Dyn public
#forward-addr: 216.146.36.36    #Dyn public

Un example est diponible ici : /usr/share/doc/unbound/examples/unbound.conf
Le fichier est très grand, souvenez-vous ; utiliser un PAGER pour afficher du texte, il est
là pour ça,
Un EDITOR pour editer, et cat est un outil pour assembler du texte.

Sidebar