Resolvons de manière sécurisé

network 14 avr. 2021

Le DNS, brique de base pour Internet évolue à son rythme. Depuis plusieurs années l'ensemble de la toile s'est sécurisé en activant du TLS un peu partout.

Et donc le DNS à suivi. Deux nouvelle façon ont émérgé:

  • DNS over TLS
  • DNS over HTTPs

Cela restais compliqué à mettre en œuvre, peu de client compatible, mais ça c'était avant. Depuis je dirais 12 à 18mois c'est de plus en plus simple.

DNS Dist

DNSDist est proposé par powerdns. Ce logiciel est dans la ligné de tout ce que produit powerdns: excellent. Si je fais l'analogie c'est un reverse proxy du DNS.

Pour commencer je me suis donc créé un container à base d'alpine puis installé dnsdist.

On commence donc par lui fournir un backend, ici mon dns resolveur menteur chez moi:

newServer({address="2a01:e0a:49e:2b83::2", qps=10})
backend

Je souhaite que ce résolveur soit ouvert à tous pour DoT et DoH, pour cela ajoutons une ACL "open bar" :

addACL('::/0')
addACL('0.0.0.0/0')
acl

Qui dit DNS ouvert il faut se méfier et donc ajouter un peu de ratelimiting

addAction(MaxQPSIPRule(50), DropAction())
ratelimiting

Je le réserve à mon usage personnel et fonction des graphs d'utilisation je verrais pour modifier cela avec une charte et tout ce qui va avec.

Monitoring & Graphing

Avant de faire DoT & DoH je n'imagine pas utiliser un service sans un minimum d'observabilité avec prometheus. Ici pas besoin d'exporter spécifique c'est natif au serveur web

webserver("[::]:8083", "webinterfacepassword", "apipassword", {}, "prometheusIP")
prometheus

J'ai donc un serveur web qui tourne et répond dans /metrics il fait plein d'autre chose mais j'aurais la même dans grafana.

La configuration prometheus est aussi simple:

- job_name: 'dnsdist'
    basic_auth:
      username: dontcare
      password: mysuperextrapassword
    static_configs:
      - targets: ['dnsdist:8083']
prometheus configuration

Et me voila avec des metrics \o/

DNS over TLS (DoT)

Pas de roue réinventé ce qui n'est pas plus mal, ce n'est "que" du TLS ajouté au protocole DNS. Cela impose TCP uniquement, exit donc UDP (peut-être avec h3?)

Sa mise en place côté dnsdist est simple en v4 et v6, forçons un minimum de TLSv1.2:‌

addTLSLocal('::','/ssl/certs/verry.org/fullchain.pem','/ssl/certs/verry.org/privkey.pem', {minTLSVersion: "tls1.2"})
addTLSLocal('0.0.0.0','/ssl/certs/verry.org/fullchain.pem','/ssl/certs/verry.org/privkey.pem', {minTLSVersion: "tls1.2"})
DOT config

dnsdist va donc se mettre à faire du DoT sur le port par défaut à savoir 853/TCP:

Listening on [::]:853 for TLS
Listening on 0.0.0.0:853 for TLS
dot info

Il est compatible nativement sur mon téléphone Android et ça c'est vraiment top, ici sur un samsung par exemple

Paramètres -> Connexions -> Plus de paramètres de connexion :

‌Un peu de TCPdump m'indique que mon serveur est utilisé (en plus des metrics)

DNS over HTTPS (DoH)

Les navigateurs implémentent aussi DoH, car un flux sécurisé c'est bien mais si on indique à notre fournisseur ce qu'on visite il y a comme un petit loupé. C'est la que DoH intervient, il est sur HTTPS donc autorisé partout à contrario de DoT qui utilise un port spécifique et peu donc être bloqué.

Côté dnsdist:

addDOHLocal("[::]:8053", nil, nil, "/", { reusePort=true })

Et ensuite j'ajoute mon serveur web Caddy

doh.verry.org {
  import logs
  import headers
  import tls_verry
  reverse_proxy http://dnsdist:8053
}

Et ... c'est tout côté serveur. Pour le client firefox le prend en charge, dans les paramètres chercher DoH :

Conclusion

Il est devenu facile avec dnsdist de se créer son propre serveur DoT et DoH, la compatibilité avec mon téléphone android (coucou l'anti pub) est ce qui m'a motivé à le mettre en place. Le besoin d'utilisation de mon vpn wireguard est vraiment remis en question car l'utilité première était la confidentialité, dans un hôtel (ahahah), en vadrouille (re hahahaha) deviens quasi nul.

Mots clés

Super ! Vous vous êtes inscrit avec succès.
Super ! Effectuez le paiement pour obtenir l'accès complet.
Bon retour parmi nous ! Vous vous êtes connecté avec succès.
Parfait ! Votre compte est entièrement activé, vous avez désormais accès à tout le contenu.