\documentclass{beamer}

\usetheme{AnnArbor}

\usepackage[french]{babel}
\usepackage[utf8x]{inputenc}

\usepackage{bortzmeyer-utils}

\author[Stéphane Bortzmeyer]
{
  Stéphane Bortzmeyer \texttt{stephane+root66@bortzmeyer.org}
}

\title[DNS et vie privée]
{
  Noms de domaine, DNS et vie privée
}

\date[2018]
{Root66, 13 janvier 2018}

\begin{document}

\begin{frame}
  \titlepage
\end{frame}

\AtBeginSection[]
{
\begin{frame}
    \frametitle{Plan}
    \tableofcontents[currentsection]
\end{frame}
}

\section{Rappel noms de domaine et DNS}

\begin{frame}
  \frametitle{Généralités}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
   \item Des noms uniques et mémorisables,
     \item Un vecteur d'identité, % Pensez à amazon.com, dont le nom est un nom de domaine. Un NDD n'est pas purement un truc technique.
  \item Un nommage arborescent : racine, puis TLD puis domaine de deuxième niveau, de troisième niveau et ainsi de suite,
  \item Le nombre de composants dans un nom est quelconque (1, 2, 3, 4…)
  \end{itemize}
  \end{overlayarea}
\end{frame}

  \begin{frame}[fragile]
    \frametitle{Les noms}
    \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize} 
  \item<2->Exemples de noms de domaines : \url{www.root66.net},
    \url{foire-aux-greniers.fontenay-le-fleury.org}, \url{www.phy.cam.ac.uk}, \url{fr.wikipedia.org},
    \url{www.potamochère.fr}, \url{gmail.com},
    \url{www.st-cyr.terre.defense.gouv.fr}, \url{re}, \url{_sipfederationtls._tcp.en-marche.fr},
    \url{mamot.fr}\ldots
   \item<3->\url{nca.x.gsi.gov.uk} a cinq composants. Le nom le plus
     général, le \emph{TLD} 
    (\foreign{Top-Level Domain}, ici \url{uk}) est à la fin.
  \end{itemize}
    \end{overlayarea}
\end{frame}

  \begin{frame}
    \frametitle{L'arbre du DNS}
  \includegraphics[scale=0.3]{arbre.eps}
\end{frame}

\begin{frame}
   \frametitle{Délégation} 
   \begin{block}
     {Des noms peuvent être \emph{délégués} et on change alors
    d'organisme responsable. Par exemple \url{uk.com} est délégué
    depuis \url{com} et délègue à son tour.}
     {Rien dans le nom
    n'indique où est la frontière de délégation : il faut utiliser le
    DNS.}
   \end{block}
\end{frame}

\begin{frame}
    \frametitle{Le DNS}
    DNS = \foreign{Domain Name System}
    \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->Les adresses IP ne sont pas stables\only<2>{ (et ont d'autres
    limites)},
   \item<3->On utilise donc plutôt des \emph{noms}\only<3>{ qui, eux, sont
     stables},
    \item<4->Le DNS est une base de données et un protocole qui associent à ces noms des
      informations\only<4>{ (comme les adresses IP)},
     \item<5->C'est une technologie d'\emph{infrastructure} comme
       l'eau ou l'électricité : tant qu'elle marche, personne ne la
       voit.\only<5>{ Le DNS reste donc peu connu et peu discuté. Ses
       failles « vie privée » ont donc été peu étudiées.}
  \end{itemize}
    \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Vocabulaire important}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
     \item \emph{Résolveur} (ou serveur récursif) : serveur DNS qui ne connait rien mais pose des questions aux serveurs faisant autorité et mémorise les réponses. Chez le FAI, ou sur le réseau local ou chez Google.
     \item \emph{Serveur faisant autorité} : serveur DNS qui connait
       le contenu d'un domaine. Exemple : les serveurs de l'AFNIC qui
       connaissent ce qu'il y a dans \url{.fr} et peuvent répondre. Ou
       les serveurs de \computer{gouvernement.fr} chez Gandi.
  \end{itemize}
\end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Résolution de noms, ou le protocole DNS en action}
    Résolution : demander aux serveurs DNS les informations associées
      à un nom de domaine (par exemple les adresses IP)
  \includegraphics[scale=0.41]{resolution.eps}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Avec le client DNS dig}
  \begin{info}
% dig AAAA www.bortzmeyer.org
; <<>> DiG 9.10.3-P4-Debian <<>> AAAA www.bortzmeyer.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39813
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 3, AUTHORITY: 7, ADDITIONAL: 21
...
;; ANSWER SECTION:
www.bortzmeyer.org.	64232 IN AAAA 2605:4500:2:245b::42
...
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Jan 11 21:20:25 CET 2018
;; MSG SIZE  rcvd: 2310
\end{info}
\end{frame}

\begin{frame}
  \frametitle{Types de données}
  \begin{itemize}
  \item AAAA : adresses IP
  \item NS : serveurs de noms faisant autorité
  \item A : adresses de l'ancien protocole IP (IPv4)
  \item SRV : serveurs du domaine pour une application donnée (par
    exemple XMPP)
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Les informations dans une requête DNS}
\begin{info}
20:22:31.203363 IP 192.0.2.1.43850 > 195.154.55.57.53: 29630 [1au] \
         A? www.bresil-guide.com. (49)
\end{info}
\begin{enumerate}
\item Adresse IP source
\item QNAME (\foreign{Query Name}, le nom demandé),   
\end{enumerate}

Des clients BitTorrent demandent
\url{_bittorrent-tracker._tcp.domain.example}\ldots

\end{frame}

\section{Vie privée}

\begin{frame}
  \frametitle{Le numérique laisse des traces}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->Tout peut être enregistré,
  \item<3->Et, en pratique, l'est souvent,
  \item<4->Et peut être traité automatiquement.  
  \end{itemize}
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Révélations Snowden}
   \begin{overlayarea}{\textwidth}{.6\textheight}
     \begin{itemize}
       \item<2->Juin 2013 : la NSA espionne tout le monde et de
         manière illégale,
       \item<3->C'était déjà bien connu des spécialistes. Mais, après
         Snowden, plus moyen de faire semblant, de dire « mais arrête
         d'être parano ».
         \end{itemize}
     \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Données personnelles}
   \begin{overlayarea}{\textwidth}{.6\textheight}
     \begin{itemize}
     \item<2->Contrairement à ce qu'on lit souvent, une « donnée
       personnelle » n'est pas uniquement une donnée où apparait un
       nom,
     \item<3->Un numéro « de Sécu », un numéro de téléphone, sont des
       données personnelles,
     \item<4->L'adresse IP aussi. % https://www.cnil.fr/fr/ladresse-ip-est-une-donnee-caractere-personnel-pour-lensemble-des-cnil-europeennes
     \end{itemize}
     \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{RGPD}
  \begin{overlayarea}{\textwidth}{.6\textheight}
    \begin{itemize}
      \item<2->N° 2016/679, Règlement général sur la protection des données,
      \item<3->Rentre en application le 25 mai 2018.
      \item<4->Parmi les grands principes : ne pas stocker des données
        juste parce qu'on peut, tout stockage doit avoir une raison.
      \item<5->Une grande partie de ce qu'on présente comme « obligations
  RGPD » était déjà dans la loi Informatique \& Libertés en janvier 1978 !
    \end{itemize}
     \end{overlayarea}
\end{frame}

\section{Les risques}

\begin{frame}
  \frametitle{Qui peut lire vos questions ?}
  \begin{itemize}
  \item<2->Le gérant du résolveur,
  \item<3->Le gérant du serveur faisant autorité,
  \item<4->Tout ceux qui capturent le trafic entre vous et ces deux serveurs.  
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Le résolveur}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{enumerate}
  \item<2->Le résolveur peut enregistrer vos requêtes\only<2>{ (vous
    avez consulté \url{www.djihad.sa}, \url{pornhub.com} et
    \url{alcooliques-anonymes.fr})}\only<2>{, quel que soit le TLD},
  \item<3->Il voit l'adresse IP de votre machine personnelle,
  \item<4->Il n'est pas gêné par les caches,
  \item<5->Le résolveur en sait beaucoup, mais est une machine que vous avez choisie\only<5>{
    (même si vous ne le savez pas)}.  
  \end{enumerate}
 \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Comment je trouve mon résolveur DNS ?}
\begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{enumerate}
  \item<2->Par défaut, indiqué à votre machine par le serveur DHCP, % http://www.bortzmeyer.org/changer-dns.html
  \item<3->Ce serveur DHCP peut être contrôlé par votre FAI / votre
    service informatique, ou bien cela peut être un engin à
    vous\only<3>{ (100 \% libre avec OpenWRT; cf. Turris Omnia)},
  \item<4->On peut souvent surmonter cette décision et indiquer le
    résolveur qu'on veut.  
  \end{enumerate}
 \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Le serveur faisant autorité}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{enumerate}
  \item<2->Le serveur faisant autorité peut enregistrer vos requêtes,
  \item<3->Il voit l'adresse IP du résolveur\only<3>{ (mais attention à ECS,
    RFC 7871, qui lui permet de voir celle des clients)},
  \item<4->Les caches font qu'il ne voit pas toutes les requêtes,
  \item<5->Ils ne sont pas forcément sur le chemin entre vous et votre
    pair\only<5>{ (vous vous connectez à \url{example.com} en France,
      vos requêtes DNS vont quand même aux USA)},  
  \item<6->Ils sont nombreux et vous ne les avez pas choisis.
  \end{enumerate}
 \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Les écoutants}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{enumerate}
  \item<2->Ils écoutent (\foreign{sniffing}) le trafic qui passe,
  \item<3->Un écoutant situé avant le résolveur\only<3>{ (en amont)} voit tout ce que voit
    le résolveur.
  \item<4->L'écoutant a davantage de travail que les serveurs pour
    reconstituer les requêtes\only<4>{ (fragmentation, TCP\ldots)}. Pas un
    problème pour la NSA mais peut gêner l'amateur.
  \item<5->Il ne suffit donc pas d'avoir confiance dans le serveur ! % Cas de FDN  
  \end{enumerate}
 \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Et en pratique ?}
  \begin{overlayarea}{\textwidth}{.6\textheight}
    \begin{itemize}
   \item<2->L'espionnage DNS est réel (programme MoreCowBell de la
     NSA),
   \item<3->Il y a aussi beaucoup de captures et d'analyses du trafic
     faites pour le bien (?) : \foreign{passive DNS}, analyse
     comportementale de logiciels malveillants, genre zombies\ldots
    \end{itemize}
 \end{overlayarea}
\end{frame}

\begin{frame}
 \frametitle{Politique « vie privée » de serveurs DNS}
  \begin{overlayarea}{\textwidth}{.6\textheight}
    \begin{itemize}
    \item<2->Google Public DNS « \foreign{In the permanent logs, we don't keep personally identifiable information or IP information. We do keep some location information (at the city/metro level)} »  % https://developers.google.com/speed/public-dns/privacy
    \item<3->Quad9 « \foreign{In the permanent logs, we do not keep personally identifiable information (PII) or IP information. We do keep some location information (at the city/metro level)} » % https://quad9.net/#/privacy https://quad9.net/#/policy
    \item<4->Je ne connais aucun gérant de serveur faisant autorité
      qui ait une politique « vie privée ».  
    \end{itemize}
 \end{overlayarea}
\end{frame}

\section{Travail à l'IETF}

\begin{frame}
  \frametitle{Projet « DNS privacy »}
  \begin{overlayarea}{\textwidth}{.6\textheight}
    \begin{itemize}
    \item<2->Démarrage en novembre 2013,
    \item<3->Groupes de travail dnsop\only<3>{ (existant)} et
      dprive\only<3>{ (créé pour l'occasion)},
    \item<4->RFC 7626, documentation du problème, en août 2015,
    \item<5->RFC 7816, minimisation des données, en mars 2016,
    \item<6->RFC 7858, chiffrement du DNS, en mai 2016,
    \item<7->RFC sur l'authentification du résolveur, d'un moment à
      l'autre,
    \item<8->En cours, l'authentification du serveur faisant autorité.  
       \end{itemize}
      \end{overlayarea}
\end{frame}

\section{Solutions techniques}

\begin{frame}
  \frametitle{Deux classes de solutions}
    \begin{overlayarea}{\textwidth}{.6\textheight}
      \begin{itemize}
      \item<2->Chiffrer,
      \item<3->Minimiser les données envoyées.
      \end{itemize}
      \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Chiffrer}
   \begin{overlayarea}{\textwidth}{.6\textheight}
     \begin{itemize}
       \item<2->Protège contre les écoutants \emph{mais pas contre les
         serveurs},
       \item<3->« Le chiffrement vous permet d'avoir une liaison
         sécurisée avec un ennemi »
       \item<4->DNS-sur-TLS, RFC 7858, sur le port 853,
       \item<5->Ou bien dnscrypt et dnscurve (non standards). 
     \end{itemize}
      \end{overlayarea}   
\end{frame}

\begin{frame}[fragile]
  \frametitle{Configuration Unbound, chiffrement vers l'aval}
  \begin{info}
server:
  ...
  ssl-upstream: yes # Should be TLS, not SSL!

forward-zone:
  name: "."
  # https://dns-resolver.yeti.eu.org/
  forward-addr: 2001:4b98:dc2:43:216:3eff:fea9:41a@853
  forward-first: no    
  \end{info}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Configuration Unbound, chiffrement vers l'amont}
  \begin{info}
server:
  interface: 2001:db8:1::dead:beef@853
  ssl-service-key: "/etc/unbound/privatekeyfile.key"
  ssl-service-pem: "/etc/unbound/publiccertfile.pem"
  ssl-port: 853    
  \end{info}
    Quad9 utilise Unbound pour fournir ce service DNS-sur-TLS.
\end{frame}

\begin{frame}[fragile]
  \frametitle{C'est bien du vrai TLS}
  Résolveur public de LDN :
  \begin{info}
% openssl s_client -connect \[2001:913::8\]:853  -showcerts
...
Server certificate
subject=/C=FR/ST=Some-State/O=LDN/CN=80.67.188.188
issuer=/C=FR/ST=Some-State/O=LDN/CN=80.67.188.188   
  \end{info}
\end{frame}

\begin{frame}[fragile]
  \frametitle{DNS sur TLS, vu par Wireshark}
    \begin{info}
9.542061163 2001:db8::1 → 2001:4b98:dc2:43:216:3eff:fea9:41a SSL 262 
        Client Hello
9.559873308 2001:4b98:dc2:43:216:3eff:fea9:41a → 2001:db8::1 TLSv1.2 2576 
        Server Hello, Certificate, Server Key Exchange, Server Hello Done
9.561219238 2001:db8::1 → 2001:4b98:dc2:43:216:3eff:fea9:41a TLSv1.2 171 
        Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
...
9.579324930 2001:db8::1 → 2001:4b98:dc2:43:216:3eff:fea9:41a TLSv1.2 109 
        Application Data
    \end{info}
  
\end{frame}

\begin{frame}
  \frametitle{Autres mises en œuvre}
  \begin{overlayarea}{\textwidth}{.6\textheight}
    % https://dnsprivacy.org/wiki/display/DP/DNS+Privacy+Implementation+Status
     \begin{itemize}
     \item<2->Dans Android depuis juillet 2017 (pas encore dans les
       versions publiées), % https://android-review.googlesource.com/c/platform/system/netd/+/380593/
     \item<3->Dans l'excellente bibliothèque C getdns,
     \item<4->Le résolveur (incomplet) Stubby, bâti sur getdns, % https://dnsprivacy.org/wiki/display/DP/DNS+Privacy+Daemon+-+Stubby  
     \item<5->Dans l'excellente bibliothèque Go go-dns,
     \item<6->En 2018, vient d'arriver dans le résolveur Knot.  
     \end{itemize}
      \end{overlayarea} 
\end{frame}

\begin{frame}[fragile]
  \frametitle{Configuration Stubby}
  \begin{info}
listen_addresses:
  - 0::1@8053

dns_transport_list:
  - GETDNS_TRANSPORT_TLS

upstream_recursive_servers:
# Quad9
# Other resolvers, see
# https://dnsprivacy.org/wiki/display/DP/DNS+Privacy+Test+Servers
   - address_data: 9.9.9.9
     tls_auth_name: "dns.quad9.net"
   - address_data: 2620:fe::fe
     tls_auth_name: "dns.quad9.net"    
  \end{info}
\end{frame}

\begin{frame}
   \frametitle{Minimiser les données}
   \begin{overlayarea}{\textwidth}{.6\textheight}
     \begin{itemize}
     \item<2->\foreign{QNAME minimisation}, RFC 7816,
      \item<3->N'envoyer au serveur faisant autorité que ce qu'il a
        besoin de savoir\only<3>{ (\foreign{Need To Know})},
       \item<4->Mis en œuvre uniquement dans le résolveur.   
     \end{itemize}
      \end{overlayarea}   
\end{frame}

\begin{frame}[fragile]
  \frametitle{Effet de la QNAME minimisation, vu par tcpdump}
  \begin{info}
% ping foo.toto.so    
  \end{info}
  
  Sans :
\begin{info}
> racine: 27934% [1au] A? foo.toto.so. (40)
> TLD: 63293% [1au] A? foo.toto.so. (40)
> SLD: 63293% [1au] A? foo.toto.so. (40)
\end{info}

  Avec :
  \begin{info}
> racine: 58136% [1au] A? so. (31)
> TLD: 45447% [1au] A? toto.so. (36)
> SLD: 46928% [1au] A? foo.toto.so. (40)
  \end{info}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Déploiement QNAME minimisation}
\begin{info}
% atlas-resolve -r 1000 -t TXT qnamemintest.internet.nl
[TIMEOUT(S)] : 7 occurrences 
[ERROR: SERVFAIL] : 5 occurrences 
["hooray - qname minimisation is enabled"] : 23 occurrences 
["no - qname minimisation is not enabled"] : 960 occurrences 
Test #10854359 done at 2018-01-11T20:48:07Z
\end{info}
\end{frame}

\begin{frame}
  \frametitle{Activer la QNAME minimisation}
  \begin{overlayarea}{\textwidth}{.6\textheight}
    \begin{itemize}
    \item<2->Par défaut dans Knot,
    \item<3->Dans Unbound, \computer{qname-minimisation: yes}.
    \end{itemize}
      \end{overlayarea}   
\end{frame}

\begin{frame}
  \frametitle{Remplissage}
   \begin{overlayarea}{\textwidth}{.6\textheight}
     \begin{itemize}
     \item<2->TLS ne dissimule pas la taille des données,
     \item<3->Le DNS étant public, on peut connaitre cette taille et
       en déduire la requête,
     \item<4->Remplissage (\foreign{padding}, RFC 7830).
     \end{itemize}
      \end{overlayarea}  
\end{frame}

\section{Choisir}

\begin{frame}
  \frametitle{Choix du résolveur}
  \begin{overlayarea}{\textwidth}{.6\textheight}
    \begin{itemize}
     \item<2->Résolveur du FAI / du service informatique : écoute
       difficile en amont\only<2>{ (mais, en aval, peu font de la
         \foreign{QNAME minimisation})}.
      \item<3->Résolveur public :  que font-ils des données ? Rarement chiffré\only<3>{ (sauf Cisco OpenDNS, LDN et
    Quad9)} donc vulnérable à l'écoute en amont. En aval, on est
        « protégé » par le nombre de requêtes.
      \item<4->Son propre résolveur : aucune capture des
        données\only<4>{ (si logiciel libre)}. Bonne protection des requêtes amont mais très mauvais pour
    les requêtes aval\only<4>{ (pensez à la \foreign{QNAME minimisation})}.
       \end{itemize}
 \end{overlayarea}
\end{frame}

\end{document}

% https://dnsprivacy.org/
% https://www.afnic.fr/fr/ressources/blog/vers-un-dns-moins-indiscret-3.html


