<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Ted écrit des trucs</title><link href="https://desfontain.es/blogue/" rel="alternate"></link><link href="https://desfontain.es/blogue/feed.xml" rel="self"></link><id>https://desfontain.es/blogue/</id><updated>2024-05-13T00:00:00+02:00</updated><entry><title>Anonymiser des données pour de vrai avec la confidentialité différentielle</title><link href="https://desfontain.es/blogue/anonymiser-pour-de-vrai.html" rel="alternate"></link><published>2024-05-13T00:00:00+02:00</published><updated>2024-05-13T00:00:00+02:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2024-05-13:/blogue/anonymiser-pour-de-vrai.html</id><summary type="html">&lt;p&gt;La transcription d'une présentation donnée à la CNIL en avril 2024.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;span class='notlettrine'&gt;E&lt;/span&gt;n avril 2024, j'ai été invité par les équipes
techniques de la &lt;a href="https://cnil.fr/fr"&gt;CNIL&lt;/a&gt; pour donner une présentation sur la
confidentialité différentielle lors d'un séminaire de recherche du
&lt;a href="https://linc.cnil.fr/"&gt;LINC&lt;/a&gt;. La vidéo de cette présentation a été ensuite
&lt;a href="https://video.cnil.fr/w/5arnm6cSqddUHbSsjhThms"&gt;publiée en ligne&lt;/a&gt;. J'ai
reproduit mes diapositives et la transcription de cette présentation ci-dessous,
après quelques modifications.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="La diapositive de titre de la présentation. On peut y lire le titre,
&amp;quot;Anonymiser des données pour de vrai avec la confidentialité différentielle&amp;quot;,
entre le logo de Tumult Labs, et une ligne indiquant &amp;quot;Damien Desfontaines, pour
Research@LINC, Avril 2024&amp;quot;." src="https://desfontain.es/blogue/images/cnil-24-01.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;Bonjour à toutes et à tous !&lt;/p&gt;
&lt;p&gt;Je m’appelle Damien et j’ai une mauvaise nouvelle.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="Une diapositive avec le texte, en gros, &amp;quot;Toute publication de données, même
statistique, fait fuiter des données individuelles&amp;quot;, suivi d'un emoji &amp;quot;Visage
confus&amp;quot;." src="https://desfontain.es/blogue/images/cnil-24-02.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;La mauvaise nouvelle, c’est qu’on peut pas prendre des données appartenant à des
individus et publier ou partager des statistiques sur ces données, sans &lt;em&gt;aussi&lt;/em&gt;
révéler de l’information sur des individus spécifiques.&lt;/p&gt;
&lt;p&gt;Ça, c’est une vérité fondamentale, qu’on peut formaliser et prouver avec des
maths. Comme on m’a fait promettre de ne pas vous parler de maths, à la place,
je vais vous donner deux exemples qui illustrent ce phénomène.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="Un diagramme à bandes avec &amp;quot;nombre de participants&amp;quot; sur l'axe y, et des
drapeaux de différents pays sur l'axe x." src="https://desfontain.es/blogue/images/cnil-24-03.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;Supposons qu’on organise une conférence francophone de protection de données. On
demande aux participants et participantes de remplir un formulaire où leur pose
des questions comme « quel est votre pays d’origine ? ».&lt;/p&gt;
&lt;p&gt;La conférence dure plusieurs jours. À l’issue du premier jour, on observe la
distribution suivante. Il y a plusieurs personnes provenant de chaque pays, donc
on se dit : « ce sont des données statistiques, pas individuelles, on peut
sans problème les publier sur le site de la conférence ».&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="Un diagramme à bandes similaire au précédent, avec certaines barres légèrement
plus hautes." src="https://desfontain.es/blogue/images/cnil-24-04.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;Le lendemain, il y a quelques nouveaux participants, donc les données sont mises
à jour sur le site.&lt;/p&gt;
&lt;p&gt;Moi, j’étais à la conférence, et je me souviens des données publiées la veille.
Donc je peux calculer la différence des deux…&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="Un diagramme à bandes combinant les deux précédents, montrant qu'il y a une
augmentation de une personne sur trois bandes. Sur la bande &amp;quot;France&amp;quot;, cette
différence est étiquetée &amp;quot;Collègue française&amp;quot;. Sur la bande &amp;quot;Suisse&amp;quot;, cette
différence est étiquetée &amp;quot;Nouvelle personne, a priori inconnue&amp;quot;. Sur la bande
&amp;quot;Belgique&amp;quot;, cette différence est étiquetée &amp;quot;Présentateur
belge&amp;quot;." src="https://desfontain.es/blogue/images/cnil-24-05.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;… et savoir qu’il y a exactement trois nouvelles personnes qui n’ont pas pu
assister au premier jour.&lt;/p&gt;
&lt;p&gt;Mais attendez une minute.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une d’entre elles, je la connais — c’est une de mes collègues, arrivée
  aujourd'hui. Je sais qu’elle est française. Ce petit bout de données à gauche,
  ça correspond exactement à elle.&lt;/li&gt;
&lt;li&gt;L’autre, c’est quelqu’un qui donne une présentation et qui s’excuse de ne pas
  avoir été là hier. Sa bio indique qu’il est belge, donc il est là dans les
  données statistiques.&lt;/li&gt;
&lt;li&gt;Donc la troisième… Ça doit être cette autre personne dans l’audience, que je
  suis sûr de ne pas avoir vue hier. Je ne sais pas encore qui c’est, mais je
  viens d’apprendre qu’elle est Suisse.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et ça… c’était pas vraiment supposé arriver. J’ai appris quelque chose à propos
d’une personne unique, alors que tout ce qu’on a fait jusqu’à maintenant, c’est
juste publier des statistiques.&lt;/p&gt;
&lt;p&gt;C’est un premier exemple qui illustre la mauvaise nouvelle de tout à l’heure :
on a fait fuiter de l’information individuelle sans le vouloir.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="Un diagramme à cinq étapes. À gauche, une icône représentant un bâtiment
public, étiqueté &amp;quot;United States Census Bureau&amp;quot;. Quatre flèches vont vers des
icônes de visualisation de données, étiquetées &amp;quot;Statistiques publiées&amp;quot;. Quatre
flèches vont vers des icônes de tableur et d'équation mathématique, étiquetées
&amp;quot;Système d'équations&amp;quot;. Quatre flèches vont vers une icône de centre de données,
étiqueté &amp;quot;Algorithm&amp;quot;. Une flèche va vers une icône de base de données, étiquetée
&amp;quot;Données reconstruites&amp;quot;." src="https://desfontain.es/blogue/images/cnil-24-06.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;Vous allez me dire : « Damien, ton exemple est un peu tiré par les cheveux. Ce
genre de truc, ça n’arrive pas dans la vraie vie. »&lt;/p&gt;
&lt;p&gt;Laissez-moi vous parler du bureau du recensement américain. C’est l’équivalent
de notre INSEE en France. C’est une agence publique qui collecte des données sur
tout un tas de choses, y compris des individus, puis qui publie des statistiques
démographiques et économiques sur le pays.&lt;/p&gt;
&lt;p&gt;En 2010, ils ont, comme tous les 10 ans, publié un tas de statistiques
démographiques. Combien de gens vivent à quel endroit, quels âge ils ont,
quelles sont leur caractéristiques ethniques, combien y a-t-il de personnes par
foyer, ce genre de chose. Plus tard, ils ont voulu estimer à quel point ces
données pouvaient être réidentifiables.&lt;/p&gt;
&lt;p&gt;Voilà un truc qu’on peut faire avec une grosse collection de statistiques.&lt;/p&gt;
&lt;p&gt;On peut prendre chaque statistique et la voir comme résultat d’une équation à
plein d’inconnues. On imagine chaque attribut de chaque individu comme étant une
variable, un truc inconnu. Puis on se dit : on sait que la moyenne d’âge dans
cette zone géographique, c'est 42,17. Ça veut dire que la somme de tous les âges
(inconnus, donc), divisé par le nombre de personnes, c'est exactement 42,17. Et
on fait ça pour toutes les statistiques. On obtient un gros système à plein
d’inconnues. C’est une sorte d’énigme, un énorme puzzle.&lt;/p&gt;
&lt;p&gt;Les puzzles, ça se résout ; les systèmes d’équation aussi. On peut mettre tout
ça dans un gros algorithme pour faire ce genre de maths à grande échelle…&lt;/p&gt;
&lt;p&gt;Et on obtient des données reconstruites. Un truc qui ressemble fichtrement à la
base de données originale : une série d’informations qui correspondent à des
individus uniques. Si ces données individuelles ont l’air d’être les mêmes que
dans la base de données originale, c’est déjà assez suspect. Mais on peut faire
pire.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="Deux tables. L'une a des colonnes étiquetées &amp;quot;Name&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;Date of
birth&amp;quot;, et &amp;quot;Sex&amp;quot;, l'autre a des colonnes étiquetées &amp;quot;Census block ID&amp;quot;, &amp;quot;Age&amp;quot;,
&amp;quot;Sex&amp;quot;, &amp;quot;Race&amp;quot;, &amp;quot;Ethnicity&amp;quot;. Une ligne avec des informations est montrée pour
chaque table. La valeur &amp;quot;Name&amp;quot; dans la table de gauche est étiquetée &amp;quot;Identité&amp;quot;.
Les valeurs &amp;quot;Location&amp;quot;, &amp;quot;Date of birth&amp;quot;, et &amp;quot;Sex&amp;quot; dans la table de gauche sont
reliées par une double flèche avec les valeurs &amp;quot;Census block ID&amp;quot;, &amp;quot;Age&amp;quot; et &amp;quot;Sex&amp;quot;
de la table de droite, le tout est étiqueté &amp;quot;Informations communes&amp;quot;. Les valeurs
des colonnes &amp;quot;Race&amp;quot; et &amp;quot;Ethnicity&amp;quot; de la table de droite sont étiquetées
&amp;quot;Nouvelles informations&amp;quot;." src="https://desfontain.es/blogue/images/cnil-24-07.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;Les données reconstruites ressemblent à la table en bas à droite. On a des
informations géographiques et démographiques, mais on a pas de nom.&lt;/p&gt;
&lt;p&gt;Mais on peut facilement trouver un autre jeu de données auxiliaires qui contient
l’identité de certaines personnes, et certaines informations à leur sujet. Ce
genre d’info, plein de gens peuvent l’avoir, par exemple votre employeur, vos
connaissances, ou bien les services en ligne que vous utilisez.&lt;/p&gt;
&lt;p&gt;On remarque un truc intéressant : certaines informations sont communes aux deux
jeux de données. Donc on peut associer chaque ligne de la base de données avec
un individu reconstruit à partir des données statistiques.&lt;/p&gt;
&lt;p&gt;Mais on a un truc en plus dans les deux bases de données. Dans l’une, on a
l’identité de chaque personne…&lt;/p&gt;
&lt;p&gt;… dans l’autre, on a des information qu’on avait pas à l’origine. Ça, c’est une
mauvaise nouvelle, parce que ça nous permet d’apprendre des informations
sensibles, et nouvelles, sur des gens spécifiques.&lt;/p&gt;
&lt;p&gt;Au sein le bureau du recensement américain, la possibilité et l’efficacité de
cette attaque a été un véritable signal d’alarme. D’autant plus qu’ils avaient
quand même essayé de protéger leurs données statistiques, en injectant un peu
d’aléatoire dans certaines parties de leur processus. Mais ça a pas suffi.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="Une diapositive avec le texte, en gros, &amp;quot;Toute publication de données, même
statistique, fait fuiter des données
individuelles…&amp;quot;." src="https://desfontain.es/blogue/images/cnil-24-08-1.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;Donc, c’est une illustration un peu déprimante de la mauvaise nouvelle de tout à
l’heure.&lt;/p&gt;
&lt;p&gt;Est-ce que tout est perdu ? Est-ce qu’il faut juste arrêter entièrement de
publier ou de partager des données si on veut être sûr de ne rien fuiter ?
Est-ce que finalement, l’anonymisation, c’est perdu d’avance ? Est-ce qu’on
ferait pas mieux d’aller déménager en montagne et élever des chèvres ?&lt;/p&gt;
&lt;p&gt;Peut-être pas. Parce que les mathématiciens et cryptologues qui ont formalisé
cette vérité fondamentale ont aussi proposé une sorte de “lot de consolation”.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="La même diapositive que précédemment, avec, plus bas, &amp;quot;… mais on peut
quantifier et limiter cette fuite&amp;quot;, avec un émoji de
cotillons." src="https://desfontain.es/blogue/images/cnil-24-08-2.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;Ce lot de consolation, c’est un moyen mathématique de &lt;em&gt;quantifier&lt;/em&gt; et de
&lt;em&gt;limiter&lt;/em&gt; cette fuite de données personnelles.&lt;/p&gt;
&lt;p&gt;On se dit, bon, on peut pas avoir le beurre et l’argent du beurre. En tous cas,
pas entièrement. Le mieux qu’on puisse faire, c’est un compromis entre
“qu’est-ce qu’on publie comme données globales utiles” et “qu’est ce qu’on fait
potentiellement fuiter sur des individus”. Et on peut quantifier ce compromis.
On décider du niveau de risque qu’on est prêt à accepter.&lt;/p&gt;
&lt;p&gt;On peut faire ça avec une notion qui s’appelle la &lt;em&gt;confidentialité
différentielle&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="Un diagrame. À gauche, un emoji de diable mécontent, avec une bulle de pensée
avec un emoji de personne dedans. Deux flèches partent de cet emoji: l'un va
vers le même emoji, mais content, avec un emoji d'ampoule allumée dans la bulle
de pensée. L'autre va aussi vers un emoji diable, mais mécontent, avec un emoji
&amp;quot;Visage en pleine réflexion&amp;quot; dans la bulle de
pensée." src="https://desfontain.es/blogue/images/cnil-24-09.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;L’intuition de la confidentialité différentielle, c’est de prendre la
perspective d’un type méchant qui essaie de deviner une information sur
quelqu’un en particulier. Par exemple, est-ce que cette personne spécifique a un
cancer. Au début, le type méchant est pas trop sûr si c’est le cas.&lt;/p&gt;
&lt;p&gt;Si jamais il regarde le jeu de données qu’on a publié et qu’il peut répondre à
cette question avec certitude, c’est une mauvaise nouvelle. On a fait fuiter des
informations personnelles. Le type méchant a gagné.&lt;/p&gt;
&lt;p&gt;Mais si, après avoir regardé les données qu’on a publié, le type méchant est
toujours pas trop sûr de la réponse à sa question, alors c’est bien. Ça veut
dire qu’on a pas fait fuiter de données. Enfin, non : on a dit tout à l'heure
que c’était pas possible de ne rien faire fuiter. Ça veut dire qu’on a pas
&lt;em&gt;trop&lt;/em&gt; fait fuiter de données.&lt;/p&gt;
&lt;p&gt;Comment on quantifie ça ?&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="Un diagramme. À gauche, un emoji de diable mécontent, avec une bulle de pensée
avec un emoji de personne dedans. Deux flèches partent de cet emoji: l'un va
vers le même emoji, mais content, avec un emoji d'ampoule allumée dans la bulle
de pensée. L'autre va aussi vers un emoji diable, mais mécontent, avec un emoji
&amp;quot;Visage en pleine réflexion&amp;quot; dans la bulle de
pensée." src="https://desfontain.es/blogue/images/cnil-24-10.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;On quantifie ça avec le langage que les mathématiciens utilisent pour parler
d’incertitude : avec des probabilités. Ah non zut ! On avait dit « pas de
maths ».&lt;/p&gt;
&lt;p&gt;On quantifie ça avec le langage que les gens normaux utilisent pour parler
d’incertitude : avec des paris sportifs.&lt;/p&gt;
&lt;p&gt;On imagine qu’au début, notre type méchant n'a pas la moindre idée de si sa
cible a le cancer ou pas. Si on lui demande de parier sur le sujet, il hausse
les épaules, et dit : « Aucune idée. Je vais décider en tirant à pile ou face.
Je suis prêt à parier 1€ pour gagner 1€ si j’ai raison ». C’est l’incertitude
totale.&lt;/p&gt;
&lt;p&gt;Maintenant, ça veut dire quoi si le type méchant a appris de l’information
sensible avec un haut degré de certitude ? Ça veut dire qu’il est prêt à parier
bien plus qu’il a raison. Il peut dire, par exemple : « Je suis quasiment sûr
que ma cible a le cancer. je suis prêt à mettre 100€ sur la table et tout perdre
si j’ai tort, tout ça pour ne gagner que 1€ si j’ai raison ».&lt;/p&gt;
&lt;p&gt;À l’inverse, si le type méchant n’a pas appris grand-chose, alors il est
peut-être prêt à mettre un peu plus sur la table — disons, 1,10€. Il a peut-être
une raison d’être légèrement plus suspicieux que sa cible a le cancer, ou ne l’a
pas, mais il reste quand même pas trop sûr. Son niveau d’incertitude a diminué,
mais pas de beaucoup. Dans ce cas, on peut se dire : « C’est OK, on a pas trop
fait fuiter de données ».&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="Une diapositive avec, au centre un gros emoji d'étincelles. En haut à gauche,
un emoji de biceps étiqueté &amp;quot;Robuste: résiste à toute attaque présente ou
future&amp;quot;. En haut à droite, un emoji du signe plus, étiqueté &amp;quot;Composable: on peut
publier plusieurs jeux de données&amp;quot;. En bas à gauche, un emoji de loupe étiqueté
&amp;quot;Transparent: pas de sécurité par l'obscurité&amp;quot;. En bas à droite, un emoji de
personne méditant avec les jambes croisées, étiqueté &amp;quot;Flexible: compatible avec
la plupart des opérations." src="https://desfontain.es/blogue/images/cnil-24-11.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;La confidentialité différentielle a plusieurs avantages majeurs.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;D’une part, on ne suppose absolument rien sur le type méchant. La diminution
   d’incertitude dont je viens de parler correspond au pire des cas : il a accès
   à toutes les données auxiliaires qu’il veut, un ordinateur surpuissant, etc.
   On ne fait pas d’hypothèse sur quelle méthode précise il utilise pour arriver
   à ses fins. C’est du coup une définition très &lt;em&gt;robuste&lt;/em&gt;: il n’y a pas de
   risque que quelqu’un découvre une attaque plus astucieuse dans six mois qui
   rende obsolète notre méthode d’anonymisation.&lt;/li&gt;
&lt;li&gt;La confidentialité différentielle est la seule définition d’anonymisation qui
   permet de raisonner sur le risque &lt;em&gt;cumulatif&lt;/em&gt; de plusieurs publications. Si
   je publie des statistiques sur des données une fois, et puis six mois plus
   tard je publie autre chose qui utilise aussi ces données, je peux quantifier
   le risque — la diminution d’incertitude du type méchant — des deux
   publications ensembles.&lt;/li&gt;
&lt;li&gt;La confidentialité différentielle, c’est comme le chiffrement : comme c’est
   basé sur des maths, on peut être très transparent sur ce qu’on fait
   exactement aux données pour les protéger. Plus besoin de garder les détails
   du processus d’anonymisation secrets, comme c’est souvent le cas
   actuellement.&lt;/li&gt;
&lt;li&gt;Enfin, pas mal de définitions alternatives ne fonctionnent que avec des cas
   d’utilisation simples, comme des histogrammes. La confidentialité
   différentielle, ça marche aussi pour faire des choses beaucoup plus
   compliquées, comme des médianes, du partitionnement de données, des
   algorithmes d’apprentissage…&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="Un diagramme. À gauche, un emoji de meuble à dossiers, étiqueté &amp;quot;On part d'une
base de données&amp;quot;. Une flèche pointe vers un emoji serre-joint étiqueté &amp;quot;On
limite l'influence de chaque individu&amp;quot;. Une flèche pointe vers un émoji abaque
étiqueté &amp;quot;On calcule ce qu'on veut calculer&amp;quot;. Une flèche pointe vers un émoji dé
étiqueté &amp;quot;On ajoute de l'aléa dans les données&amp;quot;. Une flèche pointe vers un émoji
diagramme à barres étiqueté &amp;quot;Et on publie les données une fois
bruitées !&amp;quot;." src="https://desfontain.es/blogue/images/cnil-24-12.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;Comment ça marche en pratique ?&lt;/p&gt;
&lt;p&gt;C’est un peu comme le chiffrement : les techniques fondamentales reposent sur
des maths assez simples, mais ça devient assez vite compliqué. Sans rentrer trop
dans les détails, l’immense majorité des techniques qui permettent d’obtenir une
propriété de confidentialité différentielle fonctionnent sur le même schéma.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On commence à partir de nos données sensibles.&lt;/li&gt;
&lt;li&gt;La première étape, c’est de limiter à quel point chaque individu peut
  contribuer au résultat qu’on veut calculer. Par exemple, si on veut calculer
  la moyenne des salaires d’un groupe de personnes, il faut limiter le salaire
  maximal qu’on peut prendre en compte. Sinon, si Bernard Arnault fait partie du
  jeu de données, ça va être compliqué de cacher cette info.&lt;/li&gt;
&lt;li&gt;Ensuite, on calcule ce qu’on veut calculer — typiquement, des statistiques.&lt;/li&gt;
&lt;li&gt;Puis on va ajouter du bruit dans les données. On peut imaginer qu’on lance un
  dé et qu’on ajoute le résultat à ce qu’on a calculé jusqu’à maintenant. À la
  place de publier un salaire moyen de 2800 euros dans une certaine catégorie de
  la population, on va publier 2816, ou quelque chose de ce genre. L’idée est
  que le bruit “cache” la contribution de chaque individu. Plus il y a de bruit,
  moins les statistiques qu’on obtient sont précises, et mieux les gens sont
  protégés.&lt;/li&gt;
&lt;li&gt;Une fois qu’on a fait tout ça, on peut publier ou partager les données qu’on
  obtient. Et on peut prouver que chaque individu est correctement protégé.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je vous donne cette explication pour que vous ayez une idée des grands
principes. Mais en pratique, est-ce que c’est ça qu’on fait ? Est-ce qu’on va, à
la main, limiter l’influence de chaque individu, calculer des trucs,
échantillonner des nombres aléatoires et les ajouter ?&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="Le même diagramme qu'avant, barré avec une grosse croix rouge. En-dessous, un
gros texte : &amp;quot;On utilise un outil robuste existant&amp;quot;, avec un emoji arc-en-ciel.
En bas à droite, en plus petit : &amp;quot;Plus d'infos:
tmlt.dev&amp;quot;." src="https://desfontain.es/blogue/images/cnil-24-13.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;Surtout pas.&lt;/p&gt;
&lt;p&gt;La confidentialité différentielle, c’est comme le chiffrement. Même quand, sur
le papier, ça n’a pas l’air très compliqué, le diable se cache dans les détails.
Il y a un tas de problèmes d’implémentation pénibles avec la génération de
nombres aléatoires, le calcul de l’influence de chaque individu pour des
opérations compliquées, les imprécisions dûes à l’utilisation de nombres en
virgule flottante, et tout un tas d’autres considérations pénibles.&lt;/p&gt;
&lt;p&gt;Donc c’est une très mauvaise idée de réimplémenter ça tout seul, et c’est
important d’utiliser un des outils conçus et maintenus par des expertes et
experts qui prennent en compte et résolvent tous ces problèmes pour vous.&lt;/p&gt;
&lt;p&gt;La startup pour laquelle je travaille développe un de ces outils, &lt;a href="https://tmlt.dev"&gt;Tumult
Analytics&lt;/a&gt;, qu’on utilise avec tous nos clients.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="En haut, le logo de Tumult Labs, suivi des logos du United States Census
Bureau, de l'IRS, de Wikimedia Foundation, et de l'USDA. Au centre de la
diapositive, un gros diagramme, partagé en trois parties : conception,
optimisation, lancement. La partie conception est composée de deux rectangles,
une flèche va de &amp;quot;Formalisation du problème et des indicateurs de réussite&amp;quot;
jusqu'à &amp;quot;implémentation du prototype initial&amp;quot;. Une flèche va vers le premier
rectangle de &amp;quot;optimisation&amp;quot;: &amp;quot;Évaluation de la qualité des données en sortie&amp;quot;,
et une double flèche va de là jusqu'à &amp;quot;Optimisation de l'algorithme, sélection
de ses paramètres&amp;quot;. Puis, une flèche va jusqu'au premier rectangle de la partie
&amp;quot;lancement&amp;quot; : &amp;quot;Finalisation et documentation de l'approche choisir&amp;quot;, et une
flèche part de là pour aller à &amp;quot;Mise en service&amp;quot;, avec un émoji
fusée." src="https://desfontain.es/blogue/images/cnil-24-14.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;Avec mon employeur, Tumult Labs, on travaille avec plusieurs clients pour les
aider à publier des données de façon sécurisée, avec de la confidentialité
différentielle. J’ai mis quelques exemples en haut.&lt;/p&gt;
&lt;p&gt;Plus qu’un outil, on a développé un processus en plusieurs étapes qu’on
reproduit à chaque cas d’utilisation.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;La première grande étape, c’est la conception. On formalise le problème :
   qu’est-ce qu’on essaie d’accomplir, quel est le but du projet, qui va
   utiliser les données en sortie. C’est là qu’on définit les indicateurs de
   réussite. D’un côté, quel est l’objectif de protection de données ? Quel
   niveau de confidentialité différentielle est acceptable ? Qu’est-ce qu’on
   essaie de protéger ? De l’autre, on sait qu’on va ajouter du bruit dans les
   données. Comment quantifier cette imprécision ? Quel type d’imprécision est
   la plus importante à limiter ? À partir de ces infos, on écrit un premier
   prototype qui génère les données qu’on veut.&lt;/li&gt;
&lt;li&gt;On passe ensuite à la deuxième grande étape : l’optimisation. On
   génère des données avec notre prototype, et on regarde — est-ce que le
   niveau d’imprécision dans les données est acceptable ? Ou bien est-ce qu’il y
   a trop de bruit, au point que les données ne sont pas utilisables de la façon
   dont on aimerait ? Quel genre de biais on a introduit ? Généralement, la
   performance du premier prototype est pas terrible. Il faut donc optimiser
   notre approche, en changeant certains aspects de l’algorithme, et en
   sélectionnant des paramètres différents. Observez que les flèches vont dans
   les deux sens dans cette étape. C’est un processus itératif, où on se rend
   compte petit à petit de qu’est-ce qui marche bien. Parfois, on se rend compte
   qu’il y a un critère de succès auquel on avait pas pensé initialement, donc
   on révise nos indicateurs et on repart pour un tour.&lt;/li&gt;
&lt;li&gt;Enfin, on finit par la phase de lancement, une fois qu’on a déterminé notre
   algorithme final. On écrit son implémentation, on la teste, on la documente,
   et on passe le tout en production.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tout ça paraît peut-être encore un peu abstrait, donc laissez-moi vous donner
un exemple du genre de résultat qu'on peut obtenir par l'application de ces
méthodes.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="À gauche, les logos de la Wikimedia Foundation et de Wikipédia. À droite, une
table légendée &amp;quot;Visites d'article par pays&amp;quot;, avec quatre colonnes &amp;quot;Project&amp;quot;,
&amp;quot;Page ID&amp;quot;, &amp;quot;Country&amp;quot;, et &amp;quot;Views&amp;quot;, et trois lignes de données
d'exemple." src="https://desfontain.es/blogue/images/cnil-24-15.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;Un de nos clients, c’est la Fondation Wikimédia, qui s’occupe de la gestion de
Wikipédia et d’autres projets apparentés, comme Wikidata our le Wiktionnaire.&lt;/p&gt;
&lt;p&gt;L’objectif du premier projet sur lequel on a travaillé avec eux, c’était de
publier des statistiques du type — chaque jour, pour chaque article de
Wikipédia, combien y a-t-il eu de personnes qui ont visité cet article. Avant
notre collaboration, la Fondation pouvait ne publier ces statistiques qu’à un
niveau global. Les statistiques par pays n’étaient publiées que lorsqu’elles
étaient suffisamment grandes, et pas mal de gens — scientifiques, contributeurs,
éditrices, etc., — leur avaient demandé de publier plus de données.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="Un gros logo de la Wikimedia Foundation. Dessous, une ligne avec trois
statistiques : &amp;quot;40x plus de données publiées par jour&amp;quot;, &amp;quot;250 000 000&amp;quot;
statistiques publiées&amp;quot;, &amp;quot;granularité 10x plus précise&amp;quot;. En bas à droite, en plus
petit, est indiqué &amp;quot;Plus d'infos: tmlt.io/wmf&amp;quot;." src="https://desfontain.es/blogue/images/cnil-24-15.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;Après l'application de notre méthodologie, et en utilisant la bibliothèque
logicielle que j'évoquais plus tôt, on a pu leur permettre de publier 40 fois
plus de données qu’avant, 250 millions au total (et des centaines de milliers en
plus chaque jour). On a aussi pu réduire le seuil auquel on publie des
statistiques par un facteur 10, alors même qu’on a une définition
d’anonymisation plus robuste.&lt;/p&gt;
&lt;p&gt;Pour plus d'infos, vous pouvez consulter
l'&lt;a href="https://www.tmlt.io/resources/publishing-wikipedia-usage-data-with-strong-privacy-guarantees"&gt;étude de cas&lt;/a&gt;
que j'ai écrit à propos de ce project.&lt;/p&gt;
&lt;p&gt;À propos d’anonymisation plus robuste. Comme je suis invité par la CNIL, je me
suis dit que ça valait peut-être le coup de finir par un sujet peut-être un peu
acrobatique…&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="En haut, deux émoji, l'un d'une personne programmant sur un ordinateur,
l'autre d'une personne en robe de juge. Au centre, une capture d'écran du site
de la CNIL: &amp;quot;L’anonymisation est un traitement qui consiste à utiliser un
ensemble de techniques de manière à rendre impossible, en pratique, toute
identification de la personne par quelque moyen que ce soit et de manière
irréversible.&amp;quot; En bas à gauche, trois lignes toutes précédées d'un émoji croix
rouge: &amp;quot;Individualisation&amp;quot;, &amp;quot;Corrélation&amp;quot;, &amp;quot;Inférence&amp;quot;. En bas à droite, des
captures d'écran de titres de papiers scientifiques : &amp;quot;Towards formalizing the
GDPR's notion of singling out&amp;quot;, &amp;quot;The role of differential privacy in GDPR
compliance&amp;quot;, &amp;quot;A principled approach to defining anonymization as applied to EU
data protection law&amp;quot;, &amp;quot;Privacy: from database reconstruction to legal
theorems." src="https://desfontain.es/blogue/images/cnil-24-17.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;… et c’est parler un peu de l’aspect légal de tout ce que je viens de vous
raconter. Comment est-ce que les organismes de régulation définissent
l’anonymisation de données ?&lt;/p&gt;
&lt;p&gt;Voilà ce que la CNIL dit sur son site web. Il faut que la réidentification soit
impossible, par quelque moyen que ce soit. C’est très bien, comme définition.
C’est clair, c’est concis, ça ne fait pas dans la demi-mesure. Bon travail.
C’est très clairement aligné avec la propriété dont je parlais tout à l’heure :
la confidentialité différentielle ne fait pas d’hypothèse sur la façon dont les
données pourraient être réidentifiées en théorie, donc on peut compter dessus
pour capturer cette impossibilité fondamentale.&lt;/p&gt;
&lt;p&gt;Le groupe de travail de l’article 29 précise qu’il faut qu’il y ait trois choses
qui soient impossibles à faire avec des données anonymes.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;L’individualisation, c’est le fait de pointer à un morceau de données et
   d’isoler une personne précise.&lt;/li&gt;
&lt;li&gt;La corrélation, c’est de prendre deux données différentes et de pouvoir dire
   que ça provient de la même personne.&lt;/li&gt;
&lt;li&gt;L’inférence, c’est d’apprendre une information nouvelle, de façon quasi
   certaine, sur un individu.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Là encore, c’est assez raisonnable. La partie sur l’inférence a des subtilités
qui font que c’est pas si clair, mais je vais pas m’étendre dessus.&lt;/p&gt;
&lt;p&gt;Au sein de la communauté des gens qui font de la communauté différentielle, il y
a eu plusieurs efforts pour essayer de lier les deux mondes. À la fois expliquer
en quoi certaines définitions satisfont (ou pas) ces critères, et les formaliser
avec des maths. Il y a un vrai désir de combler l’écart entre les deux mondes,
parce qu’on veut que notre travail soit utile au plus grand nombre.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="En haut, deux émoji, l'un d'une personne programmant sur un ordinateur,
l'autre d'une personne en robe de juge. Au centre, trois lignes: &amp;quot;Définitions ad
hoc toujours considérées comme un standard à suivre&amp;quot; suivi d'un émoji grimaçant,
&amp;quot;Prédominance de méthodes transformatives et non agrégatives&amp;quot; suivi d'un émoji
avec la bouche en diagonale, et &amp;quot;Pas d'encouragement à passer à des procédés
plus robustes&amp;quot; avec un émoji triste." src="https://desfontain.es/blogue/images/cnil-24-18.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;Donc tout ça, c’est super chouette, la collaboration entre les deux mondes est
excellente, et il n’y a rien à améliorer.&lt;/p&gt;
&lt;p&gt;Sauf que… sauf que les autorités de régulation ne se contentent pas de décrire
des buts, elles suggèrent aussi des moyens d’atteindre cet objectif
d’anonymisation. Et c'est là que c'est moins enthousiasmant. À la fois dans
l’avis du groupe de travail de l’article 29, dans ce qu’on lit sur les sites Web
des différentes autorités de protection de données, et dans ce qu’on entend dans
des conférences fréquentées par des juristes ou des régulateurs… c’est vraiment
pas terrible.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;D’abord, l’exemple typique qui est toujours présenté comme étant une bonne
  idée, c’est des définitions vieilles de plus de 25 ans, comme le k-anonymat,
  et ça on sait que c’est complètement cassé en pratique. Donc c’est pas
  terrible.&lt;/li&gt;
&lt;li&gt;Mais le problème est plus profond: le modèle mental qui est typiquement
  présenté, c’est un modèle &lt;em&gt;transformatif&lt;/em&gt; : on chaque donnée individuelle et
  on fait quelque chose avec. Par exemple, enlever certaines informations,
  ajouter du bruit à certaines valeurs, généraliser certaines catégories… Mais
  on sait que ce genre de mécanisme est très loin d’être robuste. Mieux vaut
  adopter une stratégie qui &lt;em&gt;agrège&lt;/em&gt; des données de plusieurs personnes
  ensemble, et encourager les gens à publier des statistiques plutôt que des
  micro-données.&lt;/li&gt;
&lt;li&gt;Il y a aussi un réel manque d’encouragement à faire évoluer les pratiques dans
  le bon sens. Le RGPD, à l’endroit où il parle de la sécurité du traitement, il
  dit de prendre en compte “l’état des connaissances”. L’endroit qui définit
  l’anonymisation dit qu’il faut tenir compte “des technologies disponibles au
  moment du traitement et de l'évolution de celles-ci”. Et… nous on essaie !
  C’est ce qu’on fait toute la journée ! Mais c’est difficile d’avoir
  l’impression que de votre côté du monde, c’est la même chose. On a pas encore
  parlé à un client qui nous a dit “on a envie d’adopter la confidentialité
  différentielle parce que le régulateur nous y encourage”.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Comment on peut faire pour améliorer ça ?&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="La même diapositive que la précédente, avec en plus une ligne de texte en
bas : &amp;quot;Plus de collaborations, plus de transparence&amp;quot;, avec un émoji arc-en-ciel
de chaque côté." src="https://desfontain.es/blogue/images/cnil-24-19.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;Écoutez, j’y connais rien, donc c’est peut-être super naïf, mais : ça serait
bien d’avoir plus de collaborations, et surtout que ces collaborations soient
plus transparentes.&lt;/p&gt;
&lt;p&gt;J'ai pu voir la différence que ça peut faire en comparant les interactions que
j'ai eu avec des organismes publics de régulation d'un côté et de de l'autre de
l'Atlantique.&lt;/p&gt;
&lt;p&gt;J'ai fait des efforts pour lire ce que les différentes institutions européennes
publient au sujet de l'anonymisation, mais ces documents me semblent toujours
être mis en ligne à la toute fin du processus, sans qu'il n'y ait d'étape de
collection de retours publics. Et quand c'est carrément à côté de la plaque — je
pense par exemple à l'étude de cas sur la confidentialité publiée par
l'&lt;a href="https://fr.wikipedia.org/wiki/Information_Commissioner%27s_Office"&gt;ICO&lt;/a&gt; — envoyer des retours et suggestions a l'air d'être complètement
inefficace.&lt;/p&gt;
&lt;p&gt;Peut-être que je m'y prends mal car je ne connais pas assez ce milieu, mais je
sais que les choses peuvent se passer très différemment. NIST, l’organisation
pour la standardisation technologique aux USA, a récemment reçu l’ordre du
gouvernement américain de publier un guide sur la confidentialité
différentielle. Leur processus, c’est d’écrire un brouillon, de publier le
brouillon, de demander à toutes les personnes intéressées de leur envoyer des
retours et suggestions, d’avoir un gros dialogue pour décider quoi mettre dans
la version finale, et de publier le résultat de ce processus.&lt;/p&gt;
&lt;p&gt;Donc j’ai passé une semaine sur leur brouillon et je leur ai envoyé plein
d’idées, et je vais les rencontrer en visio dans quelques semaines pour discuter
de comment améliorer leur guide. Toutes mes contributions vont ensuite tomber
dans le domaine public, et je vais pouvoir voir qui d’autre a contribué quelles
autres suggestions. Je suis citoyen français, je vis en Europe, donc ça me
paraît un peu fou que je puisse avoir une telle influence sur des documents
publiés par des organismes américains, mais que l'UE me semble être une boîte
noire complète.&lt;/p&gt;
&lt;p&gt;Donc ma question ou requête pour vous pour conclure cette présentation, c’est…
comment on met en place ce genre d’échange, de collaboration transparente et
constructive sur les questions techniques, en Europe ?&lt;/p&gt;
&lt;p&gt;Je suis sûr que je ne suis pas le seul intéressé !&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img alt="La diapositive de fin de la présentation. On peut y voir un logo de Tumult
Labs, un &amp;quot;Merci&amp;quot; suivi d'un émoji cœur, et le nom, addresse mail, et liens vers
les profils LinkedIn et Mastodon de l'auteur, Damien
Desfontaines." src="https://desfontain.es/blogue/images/cnil-24-20.png"&gt;
&lt;/center&gt; &lt;/p&gt;
&lt;p&gt;Sur ce, merci pour l'invitation, pour votre attention, et d'avance pour vos
questions ! Voilà mon adresse mail, et des liens vers mes profils
&lt;a href="https://desfontain.es/linkedin"&gt;LinkedIn&lt;/a&gt; et
&lt;a href="https://desfontain.es/mastodon"&gt;Mastodon&lt;/a&gt; si vous voulez rester en contact.&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Faire marcher un Lenovo X1 Carbon sous Linux</title><link href="https://desfontain.es/blogue/x1-carbon.html" rel="alternate"></link><published>2017-04-02T00:00:00+02:00</published><updated>2017-04-03T00:00:00+02:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2017-04-02:/blogue/x1-carbon.html</id><summary type="html">&lt;p&gt;Retour d'expérience sur la configuration d'un X1 Carbon de quatrième génération sous Linux.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;J'ai&lt;/strong&gt; récemment acquis un
&lt;a href="https://en.wikipedia.org/wiki/ThinkPad_X1_Carbon"&gt;Lenovo X1 Carbon&lt;/a&gt;, de
quatrième génération. Je suis satisfait du matériel et déçu par son manque de
compatibilité générale avec Linux. Globalement, tous les problèmes rencontrés
sont résolubles (et ce billet détaille comment, pour ceux que j'ai eus), mais il
y plein de choses qui ne fonctionnent pas magiquement du premier coup.&lt;/p&gt;
&lt;h2 id="les-bons-cotes"&gt;Les bons côtés&lt;/h2&gt;
&lt;h3 id="materiel"&gt;Matériel&lt;/h3&gt;
&lt;p&gt;Les specs sont enthousiasmantes (un SSD, ça change la vie \o/), et le produit
fini est d'excellente qualité, comme le reste de la ligne ThinkPad.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il est très léger pour un 14'' — lenovo.com annonce « Vous vous surprendrez
    […] à vérifier fréquemment si vous ne l'avez pas oublié ! », je confirme ^^&lt;/li&gt;
&lt;li&gt;Il est solide et ne se pète pas au moindre choc.&lt;/li&gt;
&lt;li&gt;L'écran mat a une résolution splendide, et reste lisible quel que soit
    l'angle où l'on se trouve.&lt;/li&gt;
&lt;li&gt;Le clavier est confortable, le trackpoint aussi. Je ne peux pas commenter
    sur le pavé tactile, je ne l'utilise jamais.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La connectique est évidemment moindre que sur mon laptop précédent (beaucoup
plus épais), mais est meilleure que nombre d'ultraportables : 3 ports USB, un
HDMI, un MiniDP, un jack 3.5mm et un truc propriétaire pour mettre un dock.
Suffisant pour une grande majorité d'utilisations. Pas de prise Ethernet, je
pensais que ça me manquerait mais en pratique ça va, le Wi-Fi marche bien.&lt;/p&gt;
&lt;h3 id="le-touchpad-et-trackpoint-fonctionnent"&gt;Le touchpad et trackpoint fonctionnent&lt;/h3&gt;
&lt;p&gt;Les deux fonctionnent sous Debian Testing sans que j'aie eu besoin de rien
faire, y compris le mouvement "trackpoint + clic milieu" pour émuler la molette
de défilement. Désactiver le touchpad se fait
&lt;a href="http://askubuntu.com/questions/677152/how-to-toggle-xinput-device-prop"&gt;très facilement&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="les-moins-bons-cotes"&gt;Les moins bons côtés&lt;/h2&gt;
&lt;p&gt;C'était &lt;em&gt;pénible&lt;/em&gt; de parvenir à un système qui soit vraiment satisfaisant à
utiliser au quotidien avec ma distribution favorite (Debian Testing).&lt;/p&gt;
&lt;h3 id="booter-sur-une-cle-usb-etait-complique"&gt;Booter sur une clé USB était compliqué&lt;/h3&gt;
&lt;p&gt;J'ai essayé de suivre les
&lt;a href="https://wiki.debian.org/InstallingDebianOn/Thinkpad/X1%20Carbon%204thGen%20PCIe_SSD/jessie"&gt;instructions du wiki Debian&lt;/a&gt;
mais ma clé USB n'était pas reconnue. Après pas mal de galère (j'ai essayé
toutes les combinaisons possibles d'options dans le BIOS…), j'ai compris
pourquoi : les 3 ports USB de ma machine sont en USB 3.0, mais son BIOS n'a
&lt;a href="https://i.imgur.com/fUVoleU.gif"&gt;pas les bons drivers&lt;/a&gt;… J'étais à deux doigts
de booter sur Windows pour installer la version suivante de mon BIOS, et puis je
me suis souvenu qu'on m'a fourni
&lt;a href="https://support.lenovo.com/ch/en/documents/acc100252"&gt;un dock OneLink+&lt;/a&gt; avec
ma machine, et que ce truc a (entre autres) une prise USB 2.0. J'ai pu brancher
ma clé USB dessus, relier le dock à ma machine, et booter sur la clé \o/&lt;/p&gt;
&lt;p&gt;Sans cette astuce, la solution standard semble être de mettre le BIOS à jour.&lt;/p&gt;
&lt;h3 id="le-dock-onelink-est-tout-pourri"&gt;Le dock OneLink+ est tout pourri&lt;/h3&gt;
&lt;p&gt;Bref, mon université m'a fourni le dock OneLink+ avec mon laptop sans me
demander mon avis, mais il n'est normalement pas compris dans le prix. Je
déconseille fortement son achat. Il fonctionne très mal avec Linux.&lt;/p&gt;
&lt;p&gt;Ça ne concerne pas vraiment le laptop lui-même, mais comme ça a l'air d'être le
seul dock prévu pour le X1 Carbon et qu'un dock est un truc raisonnable à avoir
quand on achète un ultraportable qu'on veut aussi utiliser au travail ou à la
maison, je compte ça dans les points négatifs de la machine elle-même. Je me
souviens de trois points problématiques, il y en a peut-être d'autres.&lt;/p&gt;
&lt;h4 id="la-prise-jack-marche-par-intermittence"&gt;La prise jack marche par intermittence&lt;/h4&gt;
&lt;p&gt;PulseAudio a bien l'air de le reconnaître (&lt;code&gt;pacmd list-sources&lt;/code&gt; renvoie bien une
section avec "OneLink+" dedans) mais il faut parfois plusieurs essais pour que
le son parvienne sur des enceintes branchées sur le dock. Et quand il n'y a pas
de son qui sort, on entend un genre de bruit électronique désagréable.&lt;/p&gt;
&lt;h4 id="les-prises-video-ne-marchent-pas-super-bien"&gt;Les prises vidéo ne marchent pas super bien&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;xrandr&lt;/code&gt; est extrêmement perturbé par le dock, et renvoie des sections qui ne
correspondent à rien de branché. Trouver comment lui dire d'envoyer de la vidéo
sur le vieil écran que l'on m'a filé à l'université était pénible.&lt;/p&gt;
&lt;h4 id="la-prise-ethernet-ne-marche-juste-pas"&gt;La prise Ethernet ne marche juste pas&lt;/h4&gt;
&lt;p&gt;Les drivers sont pourtant supposés être
&lt;a href="http://www.asix.com.tw/products.php?op=pItemdetail&amp;amp;PItemID=131;71;112"&gt;disponibles&lt;/a&gt;…
J'ai décompressé le bidule, l'ai installé, ai tout bien suivi les instructions,
mais pas moyen que ça fonctionne (&lt;code&gt;ifconfig&lt;/code&gt; ne le détecte désespérément pas).
Comme on m'a aussi fourni un
&lt;a href="http://www.linksys.com/us/p/P-USB3GIG/"&gt;dongle Ethernet → USB&lt;/a&gt;, et que celui-ci
fonctionne (même quand on le branche dans le OneLink+), j'ai pas cherché
beaucoup plus loin. Note que le dongle en question n'est pas non plus super
satisfaisant, cf. la section suivante.&lt;/p&gt;
&lt;h3 id="avalanche-de-messages-derreur-depuis-le-kernel"&gt;Avalanche de messages d'erreur depuis le kernel&lt;/h3&gt;
&lt;p&gt;Une fois le système installé, j'ai eu le déplaisir de constater que ma console
se faisait inonder sous les messages du noyau comme décrit dans
&lt;a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1626371"&gt;ce bug&lt;/a&gt;,
probablement causé par le dongle que j'utilise pour me connecter à Internet
(pour une raison temporaire et tout aussi stupide). J'ai "résolu" le problème de
façon temporaire en
&lt;a href="http://superuser.com/questions/351387/how-to-stop-kernel-messages-from-flooding-my-console"&gt;ignorant les messages du noyau&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="pas-de-wi-fi-par-defaut"&gt;Pas de Wi-Fi par défaut&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;apt-get install firmware-iwlwifi&lt;/code&gt; et redémarrer la machine a suffi à ce que ça
fonctionne.&lt;/p&gt;
&lt;h3 id="xbacklight-ne-fonctionne-pas"&gt;xbacklight ne fonctionne pas&lt;/h3&gt;
&lt;p&gt;Les instructions
&lt;a href="https://wiki.archlinux.org/index.php/backlight#xbacklight"&gt;trouvées ici&lt;/a&gt;
(créer un &lt;code&gt;/etc/X11/xorg.conf&lt;/code&gt; avec ce qui va bien dedans) ont fonctionné.&lt;/p&gt;
&lt;h3 id="pas-de-son-par-defaut"&gt;Pas de son par défaut&lt;/h3&gt;
&lt;p&gt;Il a fallu que je passe à PulseAudio, alors que je m'en étais très bien passé
jusqu'à maintenant. C'était en fait plus facile que ce à quoi je m'attendais,
j'ai suivi le premier tutoriel que j'ai trouvé en ligne et ça a marché. Je crois
me souvenir que &lt;code&gt;sudo apt-get install pulseaudio pavucontrol&lt;/code&gt; a suffi.&lt;/p&gt;
&lt;h3 id="pas-de-bluetooth-par-defaut"&gt;Pas de Bluetooth par défaut&lt;/h3&gt;
&lt;p&gt;Internet m'a indiqué les bons trucs à installer : &lt;code&gt;sudo apt-get install
pulseaudio-module-bluetooth bluez-firmware blueman&lt;/code&gt;. Ça a eu l'air de marcher
(on peut voir la liste des périphériques, etc.), mais en fait j'ai pas réussi à
envoyer du son sur les enceintes Bluetooth que j'utilisais avant de faire &lt;code&gt;pactl
load-module module-bluetooth-discover&lt;/code&gt; et de re-faire l'étape de pairage.&lt;/p&gt;
&lt;h3 id="le-lecteur-dempreintes-digitales-ne-marche-pas"&gt;Le lecteur d'empreintes digitales ne marche pas&lt;/h3&gt;
&lt;p&gt;Ça a l'air impossible de le faire fonctionner pour l'instant, et ça n'arrivera
&lt;a href="https://bugs.freedesktop.org/show_bug.cgi?id=94536"&gt;probablement pas dans un futur proche&lt;/a&gt;.
Triste =(&lt;/p&gt;
&lt;h3 id="les-touches-multimedia-doivent-etre-configurees"&gt;Les touches multimédia doivent être configurées&lt;/h3&gt;
&lt;p&gt;Mais paraît normal, puisque j'utilise i3 comme gestionnaire de fenêtres. On peut
trouver les codes des touches avec &lt;code&gt;xev&lt;/code&gt;, puis leur faire faire ce qu'on veut
dans &lt;code&gt;.i3/config&lt;/code&gt;, c'est standard. Celle pour le Wi-Fi fonctionne sans avoir
besoin de configurer quoi que ce soit (une fois le driver installé), et a l'air
d'avoir le même effet qu'un toggle de rfkill sur l'interface Wi-Fi.&lt;/p&gt;
&lt;p&gt;Parfois, les touches multimédia cessent complètement de fonctionner, et
n'envoient plus rien de reconnaissable dans &lt;code&gt;xev&lt;/code&gt;. Je n'ai pas réussi à trouver
comment reproduire le bug de façon déterministe, mais il me semble que c'est
encore un problème avec le dock. Tout débrancher, mettre le système en veille et
le rallumer suffit généralement à ce que ça revienne.&lt;/p&gt;
&lt;h3 id="la-resolution-de-lecran-est-vraiment-grande"&gt;La résolution de l'écran est &lt;em&gt;vraiment&lt;/em&gt; grande&lt;/h3&gt;
&lt;p&gt;La majorité des logiciels sont inadaptés à l'écran HiDPI du X1 Carbon : LyX,
Quod Libet, Firefox, etc., ont leurs textes et menus qui apparaissent
minuscules. J'ai réglé ça en trois étapes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;J'ai ajouté &lt;code&gt;xrandr --dpi 120&lt;/code&gt; dans mon &lt;code&gt;.xinitrc&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;J'ai changé mes raccourcis pour ouvrir des terminaux pour afficher de
    plus gros caractères, et une
    &lt;a href="http://en.wikipedia.org/wiki/Andal%C3%A9_Mono"&gt;belle police&lt;/a&gt; lisible et
    compacte.&lt;/li&gt;
&lt;li&gt;Et j'ai installé l'extension Firefox
    &lt;a href="https://addons.mozilla.org/fr/firefox/addon/autohidpi/"&gt;AutoHiDPI&lt;/a&gt; pour
    avoir le DPI de Firefox qui change automatiquement suivant l'écran sur
    lequel la fenêtre se trouve (parce que mes écrans auxiliaires n'ont pas une
    telle résolution). Malheureusement, ça ne marche pas si deux fenêtres se
    trouvent sur deux écrans différents ; je n'ai pas de solution pour ça.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Si je devais me choisir une autre machine maintenant, il est probable que je
regarde si il n'y a pas des laptops avec une meilleure compatibilité (en
particulier avec des docks qui marchent mieux sous Linux). Mais il est assez
possible que je prenne malgré tout le même modèle. Les problèmes sont pénibles,
mais on finit par en venir à bout (et c'est satisfaisant quand ça finit par
marcher :D) — je n'ai essentiellement plus de souci gênant avec cette machine.
Et je suis carrément fan du matériel.&lt;/p&gt;
&lt;p&gt;J'espère quand même que les modèles suivants de la ligne ThinkPad marcheront un
peu mieux.&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Passer d'OfflineIMAP à isync/mbsync</title><link href="https://desfontain.es/blogue/offlineimap-mbsync.html" rel="alternate"></link><published>2015-05-26T00:00:00+02:00</published><updated>2017-04-02T00:00:00+02:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2015-05-26:/blogue/offlineimap-mbsync.html</id><summary type="html">&lt;p&gt;Un guide pour remplacer OfflineIMAP par mbsync, qui marche vachement mieux.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Ça&lt;/strong&gt; fait un petit bout de temps que j'en ai marre d'OfflineIMAP. À l'époque,
la seule raison pour laquelle je l'avais choisi comme utilitaire de
synchronisation IMAP, c'était sa position proéminente dans les résultats de
recherche sur Internet. Puis, je l'ai gardé pendant longtemps par inertie, et
parce que faute de point de comparaison, je ne savais pas si ce que je lui
reprochais était inhérent à n'importe quel utilitaire du genre. Mes griefs
principaux étaient les suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;c'est leeent (30 secondes pour synchroniser cinq comptes, en ne comptant pas
    le temps de téléchargement) ;&lt;/li&gt;
&lt;li&gt;lorsque je n'ai pas de connexion Internet, ça devient &lt;em&gt;vraiment&lt;/em&gt; lent, comme
    s'il ne comprenait pas qu'il était hors-ligne ;&lt;/li&gt;
&lt;li&gt;lorsqu'on lance une instance d'OfflineIMAP alors qu'il y en a déjà une qui
    tourne, ça crée une situation chaotique et imprévisible, une sorte de
    deadlock (aw, Wikipédia me dit que ça s'appelle une « étreinte fatale » en
    français, n'est-ce pas adorable) qui nécessite souvent de tuer le processus
    à la main pour que ça aille mieux, et si on lance OfflineIMAP
    automatiquement toutes les deux minutes, ce genre de situation arrive
    &lt;em&gt;souvent&lt;/em&gt; ;&lt;/li&gt;
&lt;li&gt;puis, finalement, j'ai rencontré un
    &lt;a href="http://comments.gmane.org/gmane.mail.imap.offlineimap.general/7239"&gt;bug incompréhensible&lt;/a&gt;
    qui m'a convaincu d'aller voir ailleurs si l'herbe était plus verte.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J'ai donc installé et fait marcher isync/mbsync (le premier nom est historique,
le second est le nom de la nouvelle version de l'exécutable). Je ne sais pour
l'instant pas si c'est significativement mieux qu'OfflineIMAP, mais ça a l'air
rapide, les gens en disent du bien sur Internet, et surtout, ça a l'avantage de
ne pas être OfflineIMAP.&lt;/p&gt;
&lt;p&gt;Bref, voilà un mini-guide pour passer de l'un à l'autre. Mon &lt;code&gt;.offlineimaprc&lt;/code&gt;
ressemblait à ça :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[general]&lt;/span&gt;
&lt;span class="na"&gt;accounts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;damien&lt;/span&gt;
&lt;span class="na"&gt;ui&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;quiet&lt;/span&gt;

&lt;span class="k"&gt;[Account damien]&lt;/span&gt;
&lt;span class="na"&gt;localrepository&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;damien_local&lt;/span&gt;
&lt;span class="na"&gt;remoterepository&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;damien_remote&lt;/span&gt;

&lt;span class="k"&gt;[Repository damien_local]&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Maildir&lt;/span&gt;
&lt;span class="na"&gt;localfolders&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;~/Mail/ikura_damien/&lt;/span&gt;

&lt;span class="k"&gt;[Repository damien_remote]&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;IMAP&lt;/span&gt;
&lt;span class="na"&gt;ssl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;remotehost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;desfontain.es&lt;/span&gt;
&lt;span class="na"&gt;remoteuser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;damien&lt;/span&gt;
&lt;span class="na"&gt;remotepasseval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;monsupermotdepasse&lt;/span&gt;
&lt;span class="na"&gt;realdelete&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;no&lt;/span&gt;
&lt;span class="na"&gt;cert_fingerprint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;[plein de lettres et de chiffres]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et la section correspondante de mon &lt;code&gt;.mbsyncrc&lt;/code&gt; ressemble maintenant à ça :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;IMAPAccount dam
Host desfontain.es
User damien
Pass monsupermotdepasse
CertificateFile ~/Documents/cert-imap-ikura.pem

IMAPStore dam-remote
Account dam

MaildirStore dam-local
Path ~/Mail/ikura_damien/
Inbox ~/Mail/ikura_damien/INBOX

Channel dam
Master :dam-remote:
Slave :dam-local:
Create Both
SyncState *
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et une fois que c'est fait, il faut bien sûr remplacer l'appel à l'exécutable
d'OfflineIMAP par &lt;code&gt;mbsync -a&lt;/code&gt; (typiquement, dans le crontab). Passons donc les
configurations en revue pour comprendre comment traduire l'une en l'autre.&lt;/p&gt;
&lt;h2 id="trucs-generaux"&gt;Trucs généraux&lt;/h2&gt;
&lt;p&gt;Pas mal de trucs ne nécessitent pas qu'on s'y attarde : j'imagine que vous aurez
compris que les options basiques ont changé de nom, que la syntaxe diffère un
peu. Les trucs nouveaux sont essentiellement le &lt;code&gt;Create Both&lt;/code&gt; (qui signifie :
quand y'a un dossier qui est créé en local, le créer aussi sur le serveur ; et
de même dans l'autre sens) et le &lt;code&gt;SyncState *&lt;/code&gt; qui dit de créer le fichier
contenant les informations sur l'état des dossiers dans les deux sens dans un
emplacement qui dépend du compte (&lt;code&gt;~/Mail/ikura_damien/INBOX/.mbsyncstate&lt;/code&gt; dans
mon exemple).&lt;/p&gt;
&lt;h2 id="configuration-ssl"&gt;Configuration SSL&lt;/h2&gt;
&lt;p&gt;Mon serveur IMAPS utilise un certificat auto-signé, donc par défaut, mbsync
(comme OfflineIMAP) va logiquement m'envoyer balader lorsque je vais essayer de
m'y connecter. Avec OfflineIMAP, on pouvait indiquer un fichier &lt;code&gt;.crt&lt;/code&gt; contenant
le certificat en question, ou bien directement son empreinte.&lt;/p&gt;
&lt;p&gt;Avec mbsync, on peut aller chercher le certificat et le mettre dans un fichier
de la façon suivante :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;s_client&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="n"&gt;desfontain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;es&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;993&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;showcerts&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;
    &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sed&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ne&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p&amp;#39;&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;
    &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sed&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ne&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;1,/-END CERTIFICATE-/p&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;Documents&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cert&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;imap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ikura&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;puis on indique &lt;code&gt;CertificateFile ~/Documents/cert-imap-ikura.pem&lt;/code&gt; dans le
fichier de configuration, et pouf ça marche. (Évidemment, il faut utiliser
l'adresse de votre serveur imap à la place de &lt;code&gt;desfontain.es&lt;/code&gt; — le port 993
utilisé est le standard 993, mais vous aurez peut-être aussi besoin de changer
sa valeur par défaut.)&lt;/p&gt;
&lt;h2 id="les-mots-de-passe-en-clair-cest-mal"&gt;Les mots de passe en clair, c'est mal&lt;/h2&gt;
&lt;p&gt;Vous vous souvenez peut-être que dans un
&lt;a href="https://desfontain.es/blog/client-mail-4-gpg.html#msmtp"&gt;article précédent&lt;/a&gt;,
j'expliquais que j'appelais un script Python depuis OfflineIMAP pour stocker mes
mots de passe IMAP dans un fichier chiffré par GPG, et non pas en dur dans le
fichier de configuration. mbsync ne sait pas appeler un script Python, mais il
sait lancer une commande externe. J'ai donc transformé mon &lt;code&gt;.offlineimap.py&lt;/code&gt; en
un &lt;a href="decryptpasswd.py"&gt;script indépendant&lt;/a&gt;, que j'ai rendu exécutable et que j'ai
mis dans un dossier de mon
&lt;a href="http://www.generation-linux.fr/index.php?post/2008/10/15/Changer-les-dossiers-par-defaut-dans-le-PATH"&gt;$PATH&lt;/a&gt;,
ce qui me permet de traduire mon &lt;code&gt;remotepass = mailpasswd("damien")&lt;/code&gt; en un
&lt;code&gt;PassCmd "decryptpasswd.py damien"&lt;/code&gt; (qui remplace le &lt;code&gt;Pass monsupermotdepasse&lt;/code&gt;
précédent).&lt;/p&gt;
&lt;p&gt;(Précision : le script &lt;code&gt;decryptpasswd.py&lt;/code&gt; contient en dur le chemin du dossier
dans lequel je stocke mes mots de passe chiffré : vous aurez probablement envie
de changer ça avant de l'utiliser.)&lt;/p&gt;
&lt;h2 id="conclusion-ajoutee-en-avril-2017"&gt;Conclusion &lt;small&gt;(Ajoutée en avril 2017)&lt;/small&gt;&lt;/h2&gt;
&lt;p&gt;Ça fait donc presque deux ans que j'utilise isync et j'en suis très content.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les rares problèmes que j'ai eus sont arrivés avec une fréquence bien
    moindre que quand j'utilisais OfflineIMAP.&lt;/li&gt;
&lt;li&gt;C'est beaucoup plus rapide, ça n'ajoute qu'une à deux secondes au temps
    nécessaire pour télécharger les nouveaux mails.&lt;/li&gt;
&lt;li&gt;Ça arrive que ça échoue parce qu'il y a plusieurs instances qui tournent en
    même temps, mais c'est vraiment rare. Tuer toutes les instances de &lt;code&gt;mbsync&lt;/code&gt;
    suffit à le refaire fonctionner.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je recommande :-)&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Pour envoyer des colis (notamment en Suisse), évitez EnvoiMoinsCher et Chronopost</title><link href="https://desfontain.es/blogue/evitez-envoimoinscher-et-chronopost.html" rel="alternate"></link><published>2015-02-22T00:00:00+01:00</published><updated>2015-02-23T00:00:00+01:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2015-02-22:/blogue/evitez-envoimoinscher-et-chronopost.html</id><summary type="html">&lt;p&gt;Certaines entreprises de livraison sont nulles, retour d'expérience.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Cet&lt;/strong&gt; article n'intéressera probablement pas les quelques gens abonnés à mes flux
RSS, désolé ; je l'écris plus avec l'espoir qu'il apparaisse dans les résultats
des moteurs de recherches lorsque des âmes perdues chercheront le nom de l'une
des deux entreprises avec qui j'ai eu le malheur de traiter ces derniers mois.
Quoique, l'histoire a un petit côté délicieusement kafkaïen qui peut, pourquoi
pas, être vaguement divertissant.&lt;/p&gt;
&lt;p&gt;J'ai déménagé en Suisse il y a quelques mois et j'avais quelques affaires à
emporter, un peu trop pour les prendre simplement lors de mon voyage mais pas
assez pour louer un camion de déménagement. J'ai donc tout mis dans trois
cartons, cherché sur Internet quelles entreprises proposaient le transport de
colis lourds et volumineux, et ai décidé de faire appel à EnvoiMoinsCher
(&lt;a href="http://www.envoimoinscher.com"&gt;envoimoinscher.com&lt;/a&gt;). J'ai suivi les
instructions, ai donc joint une &lt;em&gt;facture Proforma&lt;/em&gt; signée, en cinq exemplaires,
décrivant de manière lapidaire le contenu des colis (du genre « habits, draps,
ustensiles de cuisine, autres effets personnels ») pour la douane, et ai donné
les colis à un employé de Chronopost le jour indiqué. Puis, j'ai attendu mes
colis, qui ne sont pas arrivés : ils se sont fait bloquer à la douane suisse,
car les douaniers archaïques de cet îlot au milieu d'une joyeuse zone de libre
échange ont décidé que les colis étaient louches pour plusieurs raisons (ce que
je n'ai pas compris tout de suite, faute d'informations pertinentes).&lt;/p&gt;
&lt;p&gt;Dans l'ordre, voilà le torrent d'absurdités que j'ai subi au fil des semaines
suivantes. Admirez l'incompétence chronique et systématique d'EnvoiMoinsCher et
de Chronopost.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EnvoiMoinsCher m'envoie un mail lapidaire, &lt;em&gt;quatre jours&lt;/em&gt; après avoir été
  prévenus par la douane que ma facture n'était pas valide, pour me dire
  simplement « Veuillez nous transmettre une facture Proforma signée », sans la
  moindre précision supplémentaire.&lt;/li&gt;
&lt;li&gt;Lorsque je les ai appelés pour leur dire « heu, j'ai déjà joint une facture
  Proforma, c'est quoi votre problème exactement ? », on m'a dit « oh, ça a dû
  être arraché pendant le trajet ». Du coup, j'ai renvoyé la même facture
  scannée.&lt;/li&gt;
&lt;li&gt;Silence radio pendant deux semaines. Pendant ce temps, j'ai essayé de les
  joindre par téléphone, de façon répétitive, sans succès. Puis, je joins
  directement Chronopost, qui a un standard téléphonique surtaxé mais au moins
  vaguement efficace, et ces gens-là (avec qui je ne devrais même pas avoir à
  traiter, ayant passé un contrat avec EnvoiMoinsCher) me disent qu'en fait, la
  facture n'est pas valable, il faut que j'en renvoie une beaucoup plus
  détaillée. Ils me disent avoir prévenu EnvoiMoinsCher, qui ne m'ont pas fait
  suivre l'information.&lt;/li&gt;
&lt;li&gt;Je renvoie une facture &lt;a href="FactureDouaneSuisse.pdf"&gt;absurdement détaillée&lt;/a&gt; (ce
  lien est hilarant, cliquez dessus) à Chronopost et à EnvoiMoinsCher, et je
  leur dis avec insistance « &lt;strong&gt;tenez-moi au courant, je suis à votre disposition
  si vous avez besoin de quoi que ce soit de supplémentaire&lt;/strong&gt; ».&lt;/li&gt;
&lt;li&gt;Silence radio. Nombreux appels téléphoniques, impossible d'avoir des infos
  chez Chronopost, quant à EnvoiMoinsCher, leur standard ne répond pas.&lt;/li&gt;
&lt;li&gt;Dix jours plus tard, un employé de Chronopost finit par me dire que le colis
  a été renvoyé à son point de départ, dans mon ancienne résidence étudiante à
  Paris. En effet, la douane a demandé des informations supplémentaires (ils
  étaient visiblement perturbés par le fait que j'étais à la fois l'expéditeur
  et le destinataire des colis) comme une photocopie de mes papiers d'identité
  et de mon permis de séjour, Chronopost a fait suivre l'info à EnvoiMoinsCher,
  qui ne me l'a pas transmise. Au bout de quelques jours, les douaniers ont
  renvoyé le colis.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J'ai ensuite demandé à Chronopost s'ils ne pouvaient pas faire un geste humain
et commercial en récupérant mes colis (encombrant la loge de ma résidence), ils
m'ont dit qu'ils ne pouvaient pas faire ça, puisqu'ils n'avaient qu'un contrat
avec EnvoiMoinsCher, je ne peux pas déposer de réclamation directement (ce qui
est frustrant, mais un peu logique), et que comme la loge de ma résidence a
« accepté » le retour, le dossier chez eux était clos.&lt;/p&gt;
&lt;p&gt;Je me suis donc plaint par mail à EnvoiMoinsCher. Mon échange avec eux est
reproduit &lt;a href="ReclamationEnvoiMoinsCher.html"&gt;par ici&lt;/a&gt;. J'ai commencé par expliquer
pourquoi je m'estimais lésé et mis dans une situation épouvantable par leur
faute, ils m'ont répondu en ne comprenant visiblement pas le problème (disant
que c'était ma faute pour ne pas avoir fourni de facture correcte en premier
lieu, alors même que leur site ne précisait rien de tout ça — théoriquement, nul
n'est censé ignorer les réglementations douanières archaïques, d'accord, mais
prétendre qu'il n'y a pas eu de problème de transmission d'information de leur
part…), j'ai insisté avec toute la politesse dont j'étais capable en expliquant
le problème, et ils ont quand même gentiment continué à m'expliquer que tout
était de ma faute, qu'ils avaient déjà payé les frais de retour et que c'était
déjà un gentil geste commercial de leur part, suivi d'un boilerplate commercial
crétin insistant sur la qualité de leur service.&lt;/p&gt;
&lt;p&gt;Je tiens mes promesses et publie cette histoire sur Internet. Je décourage à
quiconque d'utiliser EnvoiMoinsCher, particulièrement pour envoyer des choses
dans un pays ayant des barrières douanières. Ça doit probablement très bien
marcher pour la majorité des gens dont les colis n'ont pas de soucis en route,
mais ils sont dramatiquement incompétents et de mauvaise foi dès qu'un problème
apparaît. Je me souviens les avoir choisis parce que c'était moins cher que de
s'adresser directement à Chronopost ou à des entreprises similaires (je ne sais
trop par quelle magie), mais le niveau de complexité supplémentaire apporté par
le fait qu'on doit traiter avec &lt;em&gt;deux&lt;/em&gt; intermédiaires au lieu d'un ne vaut
&lt;em&gt;clairement&lt;/em&gt; pas la légère différence de prix, surtout vu la nullité absolue et
le manque de professionnalisme de l'intermédiaire supplémentaire.&lt;/p&gt;
&lt;p&gt;Quant à Chronopost, malgré ma demande &lt;em&gt;répétée&lt;/em&gt; de me tenir au courant, ils ont
continué (à en croire les gens que j'ai eu au téléphone) de simplement mettre à
jour le dossier partagé avec EnvoiMoinsCher au lieu de me prévenir directement
de l'évolution de la situation. Par ailleurs, leur standard téléphonique pour
les clients normaux est encombré et les gens qui répondent sont affreusement
incompétents : il faut appeler leur standard pour entreprises, qui est surtaxé,
mais qui a l'avantage de mettre en communication avec des gens qui savent un peu
ce qu'ils font et qui font des efforts pour résoudre le problème (une voix
automatique annonce « si vous êtes un particulier, appelez plutôt ce numéro » au
début de la communication, ignorez-la).&lt;/p&gt;
&lt;p&gt;Entreprises stupides, laissez-moi vous bouuuher un peu publiquement : bouuuh.&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Pratiques commerciales du XXIème siècle, chapitre I : vente en ligne</title><link href="https://desfontain.es/blogue/pratiques-commerciales-xxieme-siecle.html" rel="alternate"></link><published>2015-02-22T00:00:00+01:00</published><updated>2015-02-24T00:00:00+01:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2015-02-22:/blogue/pratiques-commerciales-xxieme-siecle.html</id><summary type="html">&lt;p&gt;Les sites de vente en ligne sont tous nuls et je râle à leur propos.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Salut&lt;/strong&gt;, toi, commerçant-e ayant survécu à la révolution technologique des deux
dernières décennies. Tu as probablement suivi les conseils de tes consultant-e-s
en stratégie, ou bien tu as écouté tes enfants ou ton bon sens, et tu t'es
muni-e d'une plateforme de vente en ligne. Tu penses donc avoir fait ce qu'il
faut pour atteindre une large audience, comprenant entre autres la frange la
plus jeune et la plus technophile du marché que tu cibles.&lt;/p&gt;
&lt;p&gt;Cher site de vente en ligne, écoute-moi bien et crois-moi sur parole : &lt;strong&gt;tu as
tort&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Considère la liste de points suivants. Pour chaque remarque te concernant,
sois &lt;strong&gt;sûr&lt;/strong&gt; qu'une quantité non-négligeable de tes clients te &lt;strong&gt;haïssent&lt;/strong&gt; et
ont proféré des torrents d'insultes à ton encontre (ou plutôt, à la machine qui
sert d'intermédiaire entre eux et toi) à chaque fois qu'ils se sont retrouvés
dans une situation frustrante canonique, dont j'ai essayé de dresser la liste
(vraisemblablement non-exhaustive).&lt;/p&gt;
&lt;p&gt;Ah, et par avance, pardonne-moi le franc-parler. Tu apportes à tes clients des
heures et des heures de frustration, pour des stupidités que tu pourrais régler
totalement en une quantité ridicule de travail de ta part, tu mérites qu'on te
secoue un peu.&lt;/p&gt;
&lt;h4 id="livraison"&gt;Livraison&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Tu n'indiques pas clairement le prix de la livraison ? Le seul moyen de le
  découvrir est d'aller jusqu'au bout du processus d'achat ? Va crever. T'as un
  système de panier où tu peux voir le prix de ce que t'achètes au fur et à
  mesure, donc tu &lt;em&gt;affiches&lt;/em&gt; le prix que ça va me coûter de passer à la caisse,
  &lt;strong&gt;livraison incluse&lt;/strong&gt;, en &lt;strong&gt;permanence&lt;/strong&gt;, à un endroit &lt;strong&gt;visible&lt;/strong&gt; de mon
  écran. Tu modifies la foutue ligne de ton algorithme pour recalculer ça en
  permanence et tu ne me prends pas par surprise après m'avoir forcé à rentrer
  mes infos personnelles. Tu me laisses comparer le &lt;strong&gt;vrai&lt;/strong&gt; prix que ça va me
  coûter d'acheter ça chez toi par rapport à chez ton concurrent, et tu me
  laisses faire ça &lt;strong&gt;rapidement&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ah, oui, si &lt;strong&gt;en plus&lt;/strong&gt; le fait d'aller à la fin du processus d'achat pour
  voir le vrai prix nécessite de se créer un compte sur ton site, crois-moi :
  y'a une place &lt;strong&gt;spécialement&lt;/strong&gt; prévue en Enfer pour les gens comme toi. Avant
  ça, un avant-goût sur Terre s'appelle la faillite et le chômage, parce que
  &lt;strong&gt;personne&lt;/strong&gt; n'a envie d'acheter quoi que ce soit chez toi, et tout le monde
  te hait.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jackpot&lt;/strong&gt; si en plus de ça, tu indiques fièrement que tu offres la livraison
  gratuite à partir d'une certaine somme (absurdement élevée). Si tu ne me dis
  pas quel est le tarif de livraison en temps normal, je ne peux que partir du
  principe que tu te fous ouvertement de ma gueule.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;À propos de tes prix de livraison. Regarde-les, regarde-les bien. S'ils sont
  un &lt;strong&gt;centime&lt;/strong&gt; de plus que ce que ça me coûterait à moi d'envoyer ta merde par
  la Poste, je te classifie instantanément comme un-e enfoiré-e malhonnête. Ta
  marge, tu te la fais sur le prix des produits. Si j'ai l'impression que tu
  veux te faire des sous en me sur-facturant des coûts fixes sous le
  qualificatif de « frais de port », ça te garantit 1) ma haine profonde et 2)
  le fait d'ignorer automatiquement ton apparition dans les comparateurs de
  sites marchands, puisque de toute façon je sais que tu vas essayer de
  m'arnaquer quand je vais vouloir payer chez toi.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pas directement lié à la livraison, mais tant qu'on est sur les frais cachés
  de dernière minute : je sais. Tu paies une quantité de frais absurde aux gens
  qui gèrent ton système d'acceptation de cartes bancaires. Tant pis pour toi,
  t'avais qu'à accepter Bitcoin. En attendant, c'est ton problème, pas le mien,
  donc tu compenses sur la marge de tes produits et puis c'est tout. Si tu
  essaies de me faire payer une surtaxe à la fin parce que je paie par carte, tu
  peux te référer au paragraphe précédent pour connaître le fond de ma pensée
  sur tes pratiques d'escroc. Tout particulièrement si je n'ai &lt;strong&gt;aucun autre
  moyen&lt;/strong&gt; de payer, auquel cas c'est du foutage de gueule assumé.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tu n'affiches pas clairement où tu livres les produits que tu vends ? Au nom
  de tous ceux qui parlent ta langue et qui ont passé du temps à faire leur
  shopping sur ton site, avant de se rendre compte qu'en fait ils ne pouvaient
  pas être livrés, &lt;strong&gt;va au diable&lt;/strong&gt;. Ça te prend &lt;em&gt;deux minutes&lt;/em&gt; de faire un
  lien « Conditions de livraison » en bas de la page où tu détailles ça. Y'a pas
  que les gens vivant en France qui parlent français. Par ailleurs, si tu ne
  vends pas ailleurs qu'en France (ou dans le pays où t'es basé), une petite
  phrase expliquant pourquoi, et si c'est prévu dans un futur proche ou
  lointain, ça peut pas faire de mal.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="informations-personnelles"&gt;Informations personnelles&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ma date de naissance ? Qu'est-ce que tu peux possiblement en faire, de ma date
  de naissance ? T'es de la police ? Tu veux pas mon numéro de passeport, tant
  que t'y es ? Crétin-e.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tu veux mon numéro de téléphone ? Tu m'expliques pour quoi tu comptes t'en
  servir, et tu me laisses le choix de te dire « hey, je t'aime bien, mais en
  fait, va mourir, contacte-moi par mail si t'as besoin de me joindre, t'auras
  pas mon numéro de téléphone ». Sinon, tu vas récupérer un faux numéro. Je te
  le garantis.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ah, tant que j'y suis. Ça devient rare, mais : un champ « téléphone fixe »
  obligatoire, vraiment ? T'es au courant que les années 90, c'est fini depuis
  15 ans ?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tu me vends un truc dématérialisé ? Je peux savoir pourquoi t'as besoin de mon
  adresse physique, du coup ? Pour rien, hein. Ouais, c'est ce que je me disais.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tu ne me proposes &lt;strong&gt;pas&lt;/strong&gt; de conserver mon numéro de carte bancaire pour la
  prochaine fois, à moins que t'aies une &lt;strong&gt;armée&lt;/strong&gt; d'employés à plein temps qui
  s'occupent de sécuriser ton bordel. Et quand tu le fais, tu me fais comprendre
  &lt;strong&gt;clairement&lt;/strong&gt; à quoi ça correspond (c'est pas pour moi, c'est pour mes aïeux)
  en termes de confiance, et pas juste en termes de « hihi, tu devrais carrément
  faire ça, c'est trop pratique pour quand tu reviendras, lol ».&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tu coches automatiquement la case qui dit en substance « je donne mon accord
  pour me faire spammer violemment jusqu'à la fin des temps » (je crois que le
  texte exact est généralement plus proche de « je souhaite recevoir des
  informations gnagnagna ») ? Sale petit-e vicieux-se retors-e, va brûler dans
  les flammes de l'Enfer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pour finir, je &lt;strong&gt;veux&lt;/strong&gt; une option pour ne &lt;strong&gt;pas&lt;/strong&gt; faire de compte chez toi,
  pour juste faire un achat unique, qui me garantisse que tu ne conserves pas
  mes données (et surtout que tu ne m'envoies pas de spam). C'est pas que je te
  fais pas confiance pour gérer mes coordonnées personnelles, mais je te fais
  pas confiance pour gérer mes coordonnées personnelles. Et vu à quel point le
  reste de ton site est moisi, j'ai de bonnes raisons de ne pas te faire
  confiance. Laisse-moi acheter un truc chez toi pour me convaincre que tu sais
  vaguement ce que tu fais.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="ergonomie"&gt;Ergonomie&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Un champ « confirmation d'adresse e-mail » ? C'est ta manière de me faire
  comprendre subtilement que tu me prends pour un demeuré fini ? Ou bien faire
  perdre du temps à tes clients, c'est juste ton petit fétichisme perso ?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tu m'interdis de copier-coller dans le champ de confirmation en question ? Ah
  mais c'est même plus subtil, à ce niveau-là, c'est juste totalement assumé.
  « Non seulement t'es tellement &lt;strong&gt;stupide&lt;/strong&gt; que tu devrais pas être autorisé à
  taper sur un clavier sans qu'on vérifie plusieurs fois ce que tu tapes, mais
  en plus, on veut être &lt;strong&gt;sûrs&lt;/strong&gt; que t'es au courant qu'on te méprise et qu'on te
  crache à la gueule. »&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Non, j'ai pas envie de sélectionner ma ville dans un champ déroulant. Durant
  le laps de temps nécessaire pour que ton menu optimisé à la tronçonneuse
  finisse de se charger (relancer le filtrage à chaque fois que j'ajoute une
  lettre, &lt;em&gt;vraiment&lt;/em&gt; ?), j'ai eu approximativement &lt;strong&gt;dix-sept fois&lt;/strong&gt; le temps
  d'entrer ma ville et mon code postal. Que je connais, par ailleurs, et que je
  n'ai donc pas besoin que tu vérifies. Me prendrais-tu pour un imbécile ?
  Impossible. Ça ne te ressemble pas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;T'as absolument &lt;strong&gt;aucune&lt;/strong&gt; raison de me faire sélectionner le bon type de ma
  carte bancaire. Tu peux le déduire de son numéro. Hééé oui.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ah, et quatre champs de quatre caractères chacun pour rentrer ledit numéro ?
  Vraiment ? Ça sert à quoi, à part m'empêcher de le copier-coller ?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cliquer sur le bouton « précédent » pour revenir en arrière dans un formulaire
  fait planter intégralement le processus ? &lt;strong&gt;WHAT YEAR IS THIS&lt;/strong&gt;?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le champ « mot de passe » est automatiquement effacé lorsque j'ai mal rempli
  un bout de ton formulaire et que je dois le corriger ? Le mec qui a fait ton
  site, rassure-moi, c'était ton neveu lors de son son stage de troisième ?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="conclusion"&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;En résumé : donne-moi toutes les informations dont je pourrais avoir besoin, le
plus vite possible, demande-moi le strict minimum dont tu as besoin, et embauche
des gens compétents pour faire ton site. Prends des gens au hasard, qui ne
connaissent pas ton site Internet, donne-leur des tâches simples (acheter tel
modèle de cafetière, comparer les différents produits de ta gamme, se renseigner
sur le prix de tel produit tout compris…), et chronomètre-les jusqu'à ce qu'ils
mettent autant de temps qu'ils en mettraient sur Amazon (sinon, je te &lt;em&gt;garantis&lt;/em&gt;
qu'ils vont aller sur Amazon). Écoute leur cris de rage et fais en sorte que tes
futurs utilisateurs ne rencontrent pas les mêmes frustrations.&lt;/p&gt;
&lt;p&gt;Et pendant que t'y es, va donc acheter des billets de train sur
&lt;a href="https://www.capitainetrain.com"&gt;Capitaine Train&lt;/a&gt;, et prends-en de la graine.
C'est à ça que ton site devrait ressembler.&lt;/p&gt;
&lt;h4 id="future-research"&gt;Future research&lt;/h4&gt;
&lt;p&gt;Des articles similaires, sur le service après-vente à distance, et sur les sites
Internet des commerces physiques, sont en préparation. Consolidez-vous.&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Exhiber une proposition indémontrable « pour de vrai »</title><link href="https://desfontain.es/blogue/proposition-indemontrable.html" rel="alternate"></link><published>2015-02-14T00:00:00+01:00</published><updated>2015-02-14T00:00:00+01:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2015-02-14:/blogue/proposition-indemontrable.html</id><summary type="html">&lt;p&gt;Et si on écrivait une proposition indémontrable explicitement ?&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;span class='notlettrine'&gt;t&lt;/span&gt;l;dr
&lt;a href="proposition-indemontrable.ml.html"&gt;Ce code&lt;/a&gt; genère
&lt;a href="proposition-indemontrable.txt"&gt;cette formule mathématique&lt;/a&gt;, qui est vraie, mais
indémontrable dans l'arithmétique de Tarksi. Woo.&lt;/p&gt;
&lt;p&gt;&lt;span class='lettrine'&gt;I&lt;/span&gt;l y a quelques années, j'ai lu &lt;em&gt;Les théorèmes
d'incomplétude de Gödel&lt;/em&gt;, un
&lt;a href="http://www.amazon.fr/Les-th%C3%A9or%C3%A8mes-dincompl%C3%A9tude-G%C3%B6del-Smullyan/dp/210005287X"&gt;petit bouquin&lt;/a&gt;
de Smullyan qui explique de façon claire et simple les théorèmes d'incomplétude
de Gödel (incroyable, n'est-ce pas ?). À l'époque, j'en avais vaguement entendu
parler, ça avait l'air fascinant, et j'avais envie de savoir comment ça marchait
pour de vrai, et comment on pouvait construire en pratique l'étrange animal dont
mon prof de maths de l'époque (béni soit-il) avait mentionné l'existence : une
proposition mathématique vraie mais indémontrable, qui par une étrange pirouette
arrive à exprimer exactement « je ne suis pas démontrable ».&lt;/p&gt;
&lt;p&gt;Le bouquin est très bien écrit, mais c'était quand même un poil ardu pour le
taupin que j'étais, du coup je le lisais par petits bouts et puis l'oubliais.
L'été entre mes deux années de prépa, je me suis plongé dedans sérieusement, et
ai décidé d'avoir une lecture un peu plus organisée. Et comme je ne suis pas
doué pour prendre des notes, et que j'ai compris que la preuve se résumait à
répondre à la question « comment construit-on la proposition étrange qui affirme
sa propre indémontrabilité ? », je me suis dit que j'allais faire mieux que
prendre des notes, j'allais écrire la proposition pas à pas.&lt;/p&gt;
&lt;p&gt;Évidemment, comme le fait si justement remarquer David Monniaux dans un 
&lt;a href="http://david.monniaux.free.fr/dotclear/index.php/post/2015/02/09/Le-th%C3%A9or%C3%A8me-de-G%C3%B6del-pour-les-nuls"&gt;récent billet&lt;/a&gt;,
la construction est longue et la proposition obtenue est « très long[ue],
illisible pour un humain », il n'est donc pas question de le faire à la main. Du
coup, comme à l'époque, j'étais aussi en train d'apprendre OCaml (tout seul,
parce que ma prépa pensait que c'était une bonne idée de nous apprendre le
Pascal en cours d'informatique), je me suis dit que j'allais écrire un programme
qui faisait ça à ma place.&lt;/p&gt;
&lt;p&gt;Du coup, c'est ce que j'ai fait. C'était effectivement fastidieux, ça n'a — pour
reprendre les mots pleins de sagesse et de vérité de David Monniaux « pas grand
intérêt », mais je me suis quand même amusé, et ça m'a permis d'avoir une idée
plus "pratique" de comment ça marchait (vu qu'écrire un programme qui génère la
proposition revient essentiellement à refaire toute la preuve étape par étape).
Et sur les conseils d'amis qui m'ont prétendu que ça valait la peine de
ressortir ça de mes dossiers poussiérieux, je me suis dit que j'allais le
publier ici. Voici donc
&lt;a href="proposition-indemontrable.ml.html"&gt;le code avec une jolie coloration syntaxique&lt;/a&gt;,
et voilà &lt;a href="proposition-indemontrable.ml"&gt;le fichier original&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;C'est loin d'être le code le plus propre du monde (hé, je débutais), mais c'est
commenté de façon assez extensive, et je l'ai relu et ré-indenté récemment, donc
ça Devrait™ être lisible. Je reproduis presque intégralement la preuve dans les
commentaires, mais c'est probablement beaucoup plus compréhensible avec le livre
sous les yeux. Il y a peut-être des erreurs qui ont survécu aux multiples
relectures ; et comme ce n'est pas vérifié en Coq, c'est impossible d'être
absolument certain que le résultat est bien indécidable.&lt;/p&gt;
&lt;p&gt;À propos de résultat, voici &lt;a href="proposition-indemontrable.txt"&gt;la formule obtenue&lt;/a&gt;.
Il y a plusieurs choses à dire à son sujet. L'alphabet utilisé est décrit dans
le commentaire en haut du fichier &lt;code&gt;.ml&lt;/code&gt;, mais je l'imprime en utilisant des
raccourcis (pour les opérations arithmétiques, et surtout pour les numéros de
variable), pour que ça soit (&lt;em&gt;ahem&lt;/em&gt;) plus lisible. Les &lt;code&gt;E&lt;/code&gt; et les &lt;code&gt;A&lt;/code&gt; sont des
quantificateurs (OCaml n'aime pas Unicode), respectivement existentiels et
universels.&lt;/p&gt;
&lt;p&gt;La taille de la chaîne de caractère imprimée est de l'ordre de quelques
centaines de milliers de caractères. Ça n'a en fait pas grande signification,
étant donné que les nombres sont codés en unaire et que je les imprime en
binaire… La véritable taille est donc plus grande, mais en fait, &lt;em&gt;beaucoup&lt;/em&gt; plus
grand, parce qu'elle contient des constantes du genre 812939 qui codent "en dur"
le numéro de Gödel de certaines propositions. Évidemment, la présence de ces
grosses constante n'est pas nécessaire, on pourrait écrire à la place un terme
plus court qui est égal à cette formule… Bref, on ne peut pas dire grand-chose
d'intelligent de la taille de cette formule, à part « c'est probablement
non-trivial d'arriver sous la centaine de milliers de caractères à coup
d'optimisations mineures ».&lt;/p&gt;
&lt;p&gt;(La question « quelle est la plus petite formule indémontrable » est, je pense
(sans avoir le moindre morceau de science pour étayer cette hypothèse),
indécidable — je doute qu'on puisse prouver d'une formule « ceci est la plus
petite formule indémontrable » — mais ne serait-ce que savoir qu'une formule de,
disons, quelques centaines ou milliers de caractères est indémontrable serait
intéressant. Peut-être qu'une piste serait d'utiliser le 
&lt;a href="https://en.wikipedia.org/wiki/Kolmogorov_complexity#Chaitin.27s_incompleteness_theorem"&gt;théorème d'incomplétude de Chaitin&lt;/a&gt;
et d'encoder la formule &lt;code&gt;K(s) ≥ L&lt;/code&gt; dans notre langage pour un L assez grand.)&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Avoir une bonne configuration SSL avec nginx</title><link href="https://desfontain.es/blogue/bonne-configuration-ssl-nginx.html" rel="alternate"></link><published>2015-01-16T00:00:00+01:00</published><updated>2015-02-24T00:00:00+01:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2015-01-16:/blogue/bonne-configuration-ssl-nginx.html</id><summary type="html">&lt;p&gt;Petit guide pour améliorer sa note de SSL Labs avec nginx.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Aujourd'hui, j'ai découvert le &lt;a href="https://www.ssllabs.com/ssltest/"&gt;testeur de configuration SSL de
Quarlys&lt;/a&gt;, qui vérifie automatiquement si un
serveur donné est vulnérable à des failles classiques, ou a des problèmes de
configuration. C'est intéressant de passer le site de sa banque, ou d'un autre
site supposé sérieux et critique, au travers de cette moulinette — ma banque
suisse obtient un B ; ma banque française un gros F bien rouge et bien
déprimant.&lt;/p&gt;
&lt;p&gt;Évidemment, vu que j'utilise SSL sur ce site (vous pouvez vérifier que
&lt;a href="https://desfontain.es"&gt;https://desfontain.es&lt;/a&gt; fonctionne bien), j'ai voulu
savoir la note que j'obtenais à ce test. Deux minutes plus tard, j'ai pu lire
« C: This server is vulnerable to the POODLE attack. If possible, disable SSL 3
to mitigate. Grade capped to C. ».&lt;/p&gt;
&lt;p&gt;Fichtre. Allons donc joyeusement désactiver SSL 3, puisqu'il est troué, et
n'autorisons que TLS. Ça se fait de la façon suivante. Il faut ouvrir le fichier
contenant les règles de nginx (&lt;code&gt;/etc/nginx/sites-enabled/default&lt;/code&gt; dans mon cas),
et y ajouter une ligne entre la paire d'accolades commençant par &lt;code&gt;server {&lt;/code&gt;,
après les lignes qui parlent déjà de SSL (&lt;code&gt;listen 443 default ssl&lt;/code&gt; &amp;amp; cie):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On redémarre nginx (en root, bien sûr):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;service nginx restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;on repasse le test, et ce coup-ci, « A-: The server does not support Forward
Secrecy with the reference browsers. Grade capped to A-. ». Hmmm. A-, c'est pas
mal, mais c'est quand même significativement moins bien que A.&lt;/p&gt;
&lt;p&gt;Surtout que la Forward Secrecy, c'est un concept plutôt cool qui permet d'avoir
la garantie de sécurité suivante : si un attaquant récupère l'échange chiffré
entre le client et le serveur ; et que plus tard il obtient la clé privée du
serveur, il ne peut pas déchiffrer l'échange passé. C'est magique. Je ne sais
pas comment ça marche. Mais ça crache du feu, et le fait que ça ne marche pas
avec tous les navigateurs possibles est perturbant.&lt;/p&gt;
&lt;p&gt;La raison est décrite par &lt;a href="https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html"&gt;ce
billet&lt;/a&gt; (en
anglais) : les paramètres que nginx choisit par défaut pour le protocole sont
ceux d'OpenSSL. Or, OpenSSL utilise par défaut une clé de 1024 bits ; tandis que
le certificat qu'on utilise fait 2048 bits. Du coup, c'est pas compatible, et
les clients vont utiliser un protocole moins cool qui n'a pas la propriété qu'on
veut. On va donc générer des meilleurs paramètres à la main :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cd /etc/ssl/certs
openssl dhparam -out dhparam.pem 4096
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et dire à nginx de les utiliser en ajoutant ça au même endroit que tout à
l'heure:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ssl_dhparam /etc/ssl/certs/dhparam.pem;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et pouf, Forward Secrecy, ça c'est fait. Re-testons allègrement notre serveur
après redémarrage de nginx… Ooooh, un joli « A » ! Joie, bonheur et allégresse.&lt;/p&gt;
&lt;p&gt;Le billet que j'ai mis en lien
&lt;a href="https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html]"&gt;un petit peu au-dessus&lt;/a&gt;
a quelques sections supplémentaires. Par exemple, le petit bout suivant :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.4.4 8.8.8.8 valid=300s;
resolver_timeout 10s;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;active le « OCSP Stapling », une technologie permettant de mettre en cache dans
le serveur la réponse de l'autorité du certification quand le client demande une
preuve d'identification. C'est un peu comme si on était dans un pays étranger où
à chaque fois qu'on rencontre un policier, il demande qu'on lui montre le tampon
du pays sur notre passeport. Comme y'a beaucoup de policiers, au bout d'un
moment, on en a un peu marre, surtout que le document est au fin fond de notre
sac et que du coup, ça nous fait perdre du temps à chaque fois. La solution
naturelle, c'est de s'agrafer une photocopie du tampon sur le manteau, comme ça
le policier peut juste jeter un coup d'œil et être convaincu, et on perd moins
de temps.&lt;/p&gt;
&lt;p&gt;(Je sais. Cette analogie n'est pas parfaite. Mais elle est absurde, donc vous
allez la retenir. Et de toute façon, vous avez probablement compris que vous
pouviez tout aussi bien copier-coller tous les bouts de configuration de cet
article dans votre configuration nginx sans vous poser tellement de questions,
donc vous allez arrêter de m'embêter.)&lt;/p&gt;
&lt;p&gt;Enfin, on peut ajouter quelques &lt;a href="https://www.owasp.org/index.php/List_of_useful_HTTP_headers"&gt;chouettes headers
HTTP&lt;/a&gt; aux réponses
qu'on envoie aux clients, pour améliorer encore notre configuration. La ligne
suivante :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;add_header Strict-Transport-Security max-age=63072000;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;active le « HSTS » (HTTP Strict Transport Security), ce qui dit aux navigateurs
qui vont sur notre site en utilisant la version HTTP non sécurisée par défaut
« hey, y'a une version sécurisée, utilisez-la :D », et si ils ne sont pas trop
stupides (&lt;em&gt;erm&lt;/em&gt; Internet Explorer 6 &lt;em&gt;erm&lt;/em&gt;), ils le font.&lt;/p&gt;
&lt;p&gt;Remarque (merci à elarnon) : un inconvénient de HSTS, c'est que si jamais HTTPS
ne marche pas pour une raison ou pour une autre (on a oublié de renouveler son
certificat, le serveur OCSP ne répond plus, quelqu'un est en train d'essayer de
faire un man-in-the-middle…), la version HTTP du site ne sera plus disponible.
Ça n'est donc pas très adapté aux sites dont la disponibilité est capitale, mais
qui ne gèrent pas de données critiques qui ne supporteraient pas d'être envoyés
en clair. Bon, en vrai, si on fait attention à ne pas que son certificat expire,
ça ne devrait pas poser de problème majeur.&lt;/p&gt;
&lt;p&gt;Ce header-ci :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;add_header X-Frame-Options DENY;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;permet d'interdire que le contenu de mon site soit réutilisé tel quel dans une
balise &lt;code&gt;&amp;lt;frame&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; ou &lt;code&gt;&amp;lt;object&amp;gt;&lt;/code&gt;, ce qui permet de se protéger contre
les attaques par &lt;a href="https://fr.wikipedia.org/wiki/D%C3%A9tournement_de_clic"&gt;détournement de
clic&lt;/a&gt;. Je… ne sais pas
dans quel contexte une telle attaque pourrait avoir du sens sur mon brave petit
site perso. Mais ça ne coûte pas très cher. Même remarque à propos de ce dernier
header :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;add_header X-Content-Type-Options nosniff;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;qui permet d'éviter que des navigateurs essaient de deviner le type d'un fichier
qu'on leur envoie en regardant son contenu, plutôt que le type de ses headers.
Pourquoi ça a du sens de faire ça avec mon contenu, je n'en ai pas la moindre
espèce d'idée, parce que (pour autant que je sache) je documente bien le type de
mes fichiers avant de les envoyer sur mon serveur, mais oh well.&lt;/p&gt;
&lt;p&gt;Je vous ai probablement perdu. Ou vous lisez ces lignes après avoir parcouru les
deux tiers de cet article sans le lire. Je ne vous en veux pas. Passez une bonne
journée ! =D&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Comment renouveler le certificat SSL utilisé par Postfix</title><link href="https://desfontain.es/blogue/renouveler-certificat-ssl-postfix.html" rel="alternate"></link><published>2014-10-21T00:00:00+02:00</published><updated>2014-10-21T00:00:00+02:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2014-10-21:/blogue/renouveler-certificat-ssl-postfix.html</id><summary type="html">&lt;p&gt;Un mini-guide de renouvellement de certificat SSL pour Postfix.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;J'ai&lt;/strong&gt; dû renouveler le certificat SSL de mon serveur mail (qui tourne grâce à
Postfix) aujourd'hui. On trouve des tutoriels sur Internet pour configurer un
serveur mail, mais évidemment, un an plus tard, lorsqu'il s'agit de rebidouiller
parce que le certificat utilisé arrive à expiration, on passe un bon quart
d'heure à chercher et parcourir de longs tutoriels pour trouver un petit bout
d'information pertinente. Voilà donc le petit bout en question.&lt;/p&gt;
&lt;p&gt;L'autorité de certification qui vous a fourni un certificat vous a envoyé un
mail vous disant qu'il fallait le renouveler, vous avez cliqué sur le lien,
suivi les instructions, et obtenu un joli bloc de texte qui ressemble à :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gh"&gt;-----BEGIN CERTIFICATE-----&lt;/span&gt;
&lt;span class="s"&gt;MlfjmdCCA+2gAwIBAgVQQ7zoZN0GCSqGSIb3DQEBDDHNZUxkRQNOBgNVBAoTB1Jv&lt;/span&gt;
&lt;span class="s"&gt;[quelques&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;dizaines&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;lignes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;inintelligibles&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;du&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;même&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;genre]&lt;/span&gt;
&lt;span class="s"&gt;2gAwIBAgVQQ7zoZN&lt;/span&gt;
&lt;span class="gh"&gt;-----END CERTIFICATE-----&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et vous vous demandez ce que vous devez en faire. Allez donc voir dans le
fichier de configuration de Postfix (&lt;code&gt;/etc/postfix/main.cf&lt;/code&gt; sur Debian), et
cherchez la ligne qui commence par &lt;code&gt;smtpd_tls_cert_file =&lt;/code&gt;. L'emplacement
indiqué par cette valeur, c'est le fichier dans lequel il faut mettre le
certificat. Chez moi, ça ressemble à :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;smtpd_tls_cert_file = /etc/postfix/tls/server.crt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;il faut donc que je fasse une sauvegarde de ce fichier, et que je remplace son
contenu par le bloc de texte donné par l'autorité de certification. Après avoir
redémarré Postfix (&lt;code&gt;service postfix restart&lt;/code&gt;), pouf ça marche.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Remarque potentiellement importante : dans des configurations (comme la mienne)
où l'empreinte du certificat est stockée en dur sur un client particulier (par
exemple, j'ai un &lt;code&gt;tls_fingerprint 5D:7C:…&lt;/code&gt; dans mon &lt;code&gt;.msmtprc&lt;/code&gt;), il faut bien
entendu renouveler cette empreinte. On fait ça avec :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;openssl x509 -in /etc/postfix/tls/server.crt -sha1 -noout -fingerprint
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et l'on peut copier ce qui est renvoyé après le &lt;code&gt;=&lt;/code&gt; dans le morceau de
configuration en question.&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Stocker des Bitcoin de façon sûre</title><link href="https://desfontain.es/blogue/stockage-securise-de-bitcoins.html" rel="alternate"></link><published>2014-09-09T00:00:00+02:00</published><updated>2014-09-10T00:00:00+02:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2014-09-09:/blogue/stockage-securise-de-bitcoins.html</id><summary type="html">&lt;p&gt;Le système que j'ai adopté pour stocker des Bitcoin en minimsant les risques.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;J'ai&lt;/strong&gt; eu la chance d'entendre parler de Bitcoin assez tôt, et de m'y
intéresser assez pour être rapidement enthousiasmé par les possibilités et (à
mon humble avis) le potentiel disruptif de cette technologie. En conséquence,
j'ai acheté quelques Bitcoin à l'époque où ils ne valaient pas encore
grand-chose, et au fil des mois, je me suis rendu compte que vu leur valeur, il
faudrait peut-être que je les stocke (au moins en partie) de façon un peu
sécurisée. Je me suis renseigné et ce billet décrit la solution que j'ai
choisie, qui est assez peu commune pour que ça vaille la peine que je la
détaille en français, et assez élégante pour que je puisse l'exposer
publiquement sans avoir peur que l'on se serve de ces informations contre moi.&lt;/p&gt;
&lt;p&gt;Note : si vous ne connaissez pas bien le fonctionnement des Bitcoin, la seule
chose qu'il est nécessaire de savoir pour comprendre cet article est la
chose suivante. Les Bitcoin (qui ont de la valeur monétaire, donc que l'on
veut protéger contre les incendies et les pirates, et transmettre à nos
proches en cas d'accident) sont stockés sur des &lt;em&gt;adresses&lt;/em&gt;, et pour pouvoir les
utiliser, il faut en avoir la &lt;em&gt;clé privée&lt;/em&gt;. Stocker des Bitcoin se résume
donc à stocker une clé privée, qui est essentiellement une chaîne de
caractères — ou, parce que c'est plus pratique, un QR code :&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;img alt="QR code" src="https://i.imgur.com/C8JRQRu.png"&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;(pas la peine de vous embêter, il n'y a 
&lt;a href="https://blockchain.info/address/16XuZa7G1M2KXN8GKqeBQL7txG9yXoHdLX"&gt;rien dessus&lt;/a&gt;).&lt;/p&gt;
&lt;h1 id="le-probleme"&gt;Le problème&lt;/h1&gt;
&lt;p&gt;Je voulais que mon système réponde à trois critères essentiels :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;être &lt;em&gt;résistant aux attaques extérieures&lt;/em&gt; — par « attaques »,
    j'entends aussi bien un piratage d'un ou plusieurs de mes appareils qu'un
    possible vol de mes affaires ;&lt;/li&gt;
&lt;li&gt;être &lt;em&gt;sûr&lt;/em&gt;, c'est-à-dire que je veux minimiser les risques que je perde
    l'accès à mes Bitcoin — par exemple, en cas d'oubli de mot de passe, de mort
    d'un disque dur ou d'un autre type d'accident compromettant
    l'intégrité de mes données ;&lt;/li&gt;
&lt;li&gt;et être &lt;em&gt;résilient&lt;/em&gt;, c'est-à-dire que si je meurs, je veux être sûr que
    quelqu'un de confiance puisse y avoir accès.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Malgré ce que peuvent dire d'un ton emphatique les évangélistes du
monde du Bitcoin, c'est très loin d'être évident de trouver une solution qui
satisfasse tous ces critères d'un coup. La solution classique se base sur un
mot de passe complexe et un chiffrement de portefeuille (en général avec
&lt;a href="https://bitcoinpaperwallet.com/bip38-password-encrypted-wallets/"&gt;BIP-38&lt;/a&gt;),
mais je trouve que ça a un inconvénient assez majeur : si le mot de passe est
assez complexe pour qu'il ne soit pas devinable par un attaquant, il
faut soit le noter quelque part, soit devoir le retenir. &lt;/p&gt;
&lt;p&gt;Dans le premier cas, on prend le risque de se faire voler le papier en
question, ou bien qu'il soit détruit dans un accident — et si on l'écrit sur
plusieurs papiers, on diminue le second risque en augmentant le premier. Ou
alors, on fait appel à quelqu'un dont c'est le métier de garder des
documents précieux (dans un testament chez le notaire ou dans le coffre d'une
banque), mais ça tue un peu le principe d'une monnaie décentralisée que
l'on peut utiliser sans intermédiaire.&lt;/p&gt;
&lt;p&gt;Dans le second cas, il faut avoir une confiance absolue en ses propres capacités
de mémorisation, ce qui me semble un peu trop optimiste (un accident qui fait
subir un choc au mauvais endroit du cerveau est vite arrivé), et ça ne
satisfait pas mon troisième critère.&lt;/p&gt;
&lt;p&gt;La solution naturelle est de séparer l'information « clé privée chiffrée »
avec « mot de passe de la clé ». Mettre le QR code de la clé chiffrée à
plusieurs endroits sûrs, et retenir le mot de passe, en faisant aussi une
sauvegarde du mot de passe dans (au moins) un endroit sûr, &lt;em&gt;différent de
l'endroit où a mis la clé chiffrée&lt;/em&gt; (évidemment). En se débrouillant pour
qu'en cas d'accident, nos proches puissent avoir accès à ces deux
informations.&lt;/p&gt;
&lt;p&gt;Une politique classique en termes de sauvegardes considère que pour être sûr de
ne pas perdre une donnée, il faut en avoir trois copies à trois endroits
différents, sur au moins deux supports distincts. Dans notre situation où l'on
a deux informations qui ne doivent pas se « toucher », il faut donc &lt;em&gt;six&lt;/em&gt; lieux
de stockage entièrement séparés si on veut avoir une sécurité correcte. Aucun,
bien sûr, ne doit être connecté à Internet : on veut avoir la certitude que si
une donnée est compromise, on s'en rendra compte et on pourra prendre les
mesures qui s'imposent. Du coup, ça fonctionne et c'est théoriquement
solide, mais c'est pas très pratique à mettre en place.&lt;/p&gt;
&lt;h1 id="la-solution"&gt;La solution&lt;/h1&gt;
&lt;p&gt;Si on veut avoir une solution plus simple à mettre en place, il ne faut donc
pas séparer l'information « clé privée chiffrée » et « mot de passe » :
autrement dit, ne pas utiliser de mot de passe. Mais si l'on fait ça et que
l'on met la clé privée dans un unique endroit, ça n'est ni résistant aux
attaques ni sûr. Donc, on va séparer la clé privée en plusieurs
&lt;em&gt;morceaux&lt;/em&gt;, de telle sorte à ce que chaque morceau pris à part ne soit pas
suffisant pour reconstituer l'information complète.&lt;/p&gt;
&lt;p&gt;Un peu comme un puzzle… Sauf que pas vraiment. Un puzzle a une caractéristique
pénible : si l'on perd une pièce, on ne peut pas reconstituer le puzzle entier.
Et en plus, la connaissance d'une pièce donne une information non négligeable
sur le puzzle final : plus on dispose de pièces, plus c'est facile de
« deviner » (comprendre : bruteforcer) celle(s) qui manque(nt). Mais
ça tombe bien, le monde merveilleux de la cryptographie a une solution toute
prête à ce problème, et ça s'appelle SSSS, comme 
&lt;a href="https://fr.wikipedia.org/wiki/Partage_de_cl%C3%A9_secr%C3%A8te_de_Shamir"&gt;Shamir's Secret Sharing Scheme&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Avec ce système, on peut choisir deux entiers &lt;code&gt;t&lt;/code&gt; et &lt;code&gt;n&lt;/code&gt; (où &lt;code&gt;t≤n&lt;/code&gt;), une clé
secrète, et obtenir &lt;code&gt;n&lt;/code&gt; morceaux de la clé qui vérifient deux propriétés
sympa :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;si on dispose de &lt;code&gt;t&lt;/code&gt; morceaux différents (n'importe lesquels), on
    peut reconstituer la clé secrète ;&lt;/li&gt;
&lt;li&gt;et si on dispose de strictement moins de &lt;code&gt;t&lt;/code&gt; morceaux, alors on a &lt;em&gt;aucune&lt;/em&gt;
    information supplémentaire sur la clé (le problème « trouver la
    clé » est aussi difficile que si on n'a aucun morceau).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Une fois qu'on a nos morceaux, on les met à des endroits différents, et si
&lt;code&gt;1&amp;lt;t&amp;lt;n&lt;/code&gt;, on obtient toutes les propriétés voulues : en cas de perte ou de vol
d'un des morceaux, rien n'est compromis (puisqu'il faut au moins 2 morceaux
pour avoir accès aux données) et on a peut retrouver l'information de
départ (puisque l'on dispose toujours de &lt;code&gt;n-1&lt;/code&gt; morceaux, et &lt;code&gt;t≤(n-1)&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;En fait, si &lt;code&gt;2&amp;lt;t&amp;lt;(n-1)&lt;/code&gt;, on peut même se faire voler ou perdre &lt;em&gt;deux&lt;/em&gt;
morceaux sans que ça soit problématique. Et en fonction du niveau de
sécurité que l'on désire, on peut adapter le nombre de morceaux. &lt;code&gt;t=2&lt;/code&gt;
et &lt;code&gt;n=3&lt;/code&gt; est la solution « minimale », qui permet d'avoir une sécurité
raisonnable (le cas de figure « on se fait voler ou on perd 2 morceaux à la
fois » est extrêmement peu probable si ils sont dans des endroits
différents) et beaucoup plus plus simple à mettre en place et à maintenir que
la solution précédente. Si l'on veut plus de sécurité face aux attaques venant
de gens malicieux, il faut augmenter &lt;code&gt;t&lt;/code&gt; et &lt;code&gt;n&lt;/code&gt; en même temps ; et si
l'on veut plus de résilience face à l'éventualité d'une perte de données, il
faut augmenter &lt;code&gt;n&lt;/code&gt; tout seul.&lt;/p&gt;
&lt;h1 id="mise-en-pratique"&gt;Mise en pratique&lt;/h1&gt;
&lt;p&gt;La première chose à faire est de choisir &lt;code&gt;t&lt;/code&gt; et &lt;code&gt;n&lt;/code&gt;, ce qui dépend du nombre
d'endroits de stockage dont on dispose. Pour &lt;code&gt;t=2&lt;/code&gt; et &lt;code&gt;n=3&lt;/code&gt;, il suffira de
confier deux morceaux à deux personnes de confiance, et en garder un avec
soi. Ou bien, une seule personne de confiance, et deux endroits sûrs que
l'on a à notre disposition. Dans la suite, on va supposer que &lt;code&gt;t=2&lt;/code&gt; et &lt;code&gt;n=3&lt;/code&gt;,
c'est facile d'adapter à la solution choisie.&lt;/p&gt;
&lt;p&gt;Ensuite, il faut créer notre clé privée. On va faire ça sur un ordinateur
&lt;em&gt;déconnecté d'Internet&lt;/em&gt;, &lt;em&gt;depuis un Live-CD&lt;/em&gt; et qui dispose d'une imprimante.
Tout ce qui suit la génération de la clé privée doit être fait depuis une
machine complètement déconnectée du réseau, pour éviter qu'un virus ne puisse
envoyer à un attaquant les informations générées. De la même façon, si le modèle
de l'imprimante est récent et qu'elle est connectée à Internet, il faut
débrancher sa connexion (voire la réinitialiser avant et après aux paramètres
d'usine, si on a pas confiance).&lt;/p&gt;
&lt;p&gt;Prenez donc le Live-CD de votre choix (par exemple, 
&lt;a href="https://www.debian.org/CD/live/index.fr.html"&gt;Debian Live&lt;/a&gt;) et démarrez dessus.
On va avoir besoin de quelques paquets :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ssss&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;qrencode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;zbar&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ainsi que d'un logiciel de manipulation d'images (si il n'y en a pas de fourni
sur le Live CD, téléchargez votre préféré). Puis, ouvrez le navigateur du live
CD, allez sur
&lt;a href="https://www.offlineaddress.com/?n=1"&gt;offlineaddress.com&lt;/a&gt;, et débranchez votre
câble Ethernet (et désactivez votre carte wifi, si besoin) pour être sûr de ne
plus être connecté. Générez une adresse en utilisant la page du site. Mettez
l'adresse de gauche (la chaîne de caractères qui commence par un &lt;code&gt;1&lt;/code&gt;) dans un
fichier (disons, &lt;code&gt;~/publique&lt;/code&gt;), et celle de droite (qui commence par un &lt;code&gt;5&lt;/code&gt;)
dans un autre fichier (&lt;code&gt;~/privee&lt;/code&gt;, par exemple).&lt;/p&gt;
&lt;p&gt;On commence par couper les morceaux :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cat privee | ssss-split -t 2 -n 3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ce qui imprime trois lignes commençant par &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt; et &lt;code&gt;3&lt;/code&gt;, nos morceaux de clés
qu'on évoquait plus haut. Copiez-les quelque part (par exemple, dans trois
fichiers &lt;code&gt;morceau1&lt;/code&gt;, &lt;code&gt;morceau2&lt;/code&gt; et &lt;code&gt;morceau3&lt;/code&gt;). Faites-en des QR codes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cat morceau1 | qrencode -o &amp;quot;morceau1.png&amp;quot; 
cat morceau2 | qrencode -o &amp;quot;morceau2.png&amp;quot; 
cat morceau3 | qrencode -o &amp;quot;morceau3.png&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et vérifiez qu'ils fonctionnent bien : en en prenant deux au hasard, vous devez
être capable de retrouver la clé privée.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;zbarimg --raw morceau1.png | tr -s &amp;#39;\n&amp;#39; &amp;gt; partie1 
zbarimg --raw morceau3.png | tr -s &amp;#39;\n&amp;#39; &amp;gt; partie3 
cat partie1 partie3 | ssss-combine -t 2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ensuite, avec votre logiciel de manipulation d'images, faites une jolie image
contenant les QR codes (et les morceaux en format brut, au cas où on en aurait
besoin en situation d'urgence sans avoir accès à un appareil permettant de les
lire), imprimez-la et coupez-la en trois morceaux, que vous pouvez ensuite
protéger et stocker. Imprimez aussi la clé publique, pour savoir à quelle
adresse envoyer les Bitcoin que vous voulez stocker de cette façon.&lt;/p&gt;
&lt;p&gt;Il ne reste plus qu'à distribuer les différents morceaux à des gens ou des
endroits de confiance, et à indiquer sur votre testament quels sont les endroits
en question. Le critère de choix principal est « si quelque chose arrive à un
des morceaux, il faut qu'on puisse en être averti rapidement ».
C'est pourquoi utiliser du &lt;em&gt;papier&lt;/em&gt; est important : un disque dur ou une clé
USB qui meurt au fond d'un tiroir, ça ne prévient personne et ça ne fait pas de
bruit.&lt;/p&gt;
&lt;h1 id="derniers-details"&gt;Derniers détails&lt;/h1&gt;
&lt;p&gt;On pourrait améliorer certains points. Utiliser le client Bitcoin officiel
au lieu d'un service comme offlineaddress.com est vraisemblablement
une bonne idée, par exemple (mais c'est plus compliqué). Par ailleurs, si on
est vraiment paranoïaque, on peut faire en sorte que la machine utilisée
n'ait jamais été connectée à Internet, pas même &lt;em&gt;avant&lt;/em&gt; la génération de
l'adresse : un virus pourrait parvenir à truquer le processus… Mais j'ai beau me
creuser la tête, je ne vois pas trop (vu comment on génère l'adresse)
comment une telle attaque serait possible, et préparer tous les paquets à
l'avance est un peu pénible.&lt;/p&gt;
&lt;p&gt;Au niveau de la confidentialité, si les morceaux de clé secrètes doivent
bien sûr rester secrète, on peut avoir envie que la clé publique le soit
aussi. Ça ajoute des complications. On pourrait par exemple utiliser
plusieurs adresses (en faisant trois groupes de morceaux), et stocker les
adresses publiques en différents endroits, pour faire en sorte que quelqu'un qui
en découvre une n'ait qu'une idée partielle de la quantité de Bitcoin stockés…&lt;/p&gt;
&lt;p&gt;Au cas où ça soit utile de le préciser : je ne suis pas responsable de ce
que vous faites avec ces instructions ; et je ne garantis pas leur sécurité
absolue. No warranty for any of this, to the extent permitted by applicable
law, etc.&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Je n'ai pas de téléphone.</title><link href="https://desfontain.es/blogue/telephone.html" rel="alternate"></link><published>2014-08-09T00:00:00+02:00</published><updated>2014-08-11T00:00:00+02:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2014-08-09:/blogue/telephone.html</id><summary type="html">&lt;p&gt;Retour d'expérience sur le fait de vivre sans téléphone.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Je&lt;/strong&gt; n'ai pas de téléphone. Pas de fixe (comme une majorité d'étudiants), mais
surtout, pas de téléphone portable. Depuis que j'ai arrêté d'en avoir un, j'ai
dû m'expliquer et répondre aux questions de tout un tas de gens, généralement
ébahis, qui me demandaient pourquoi, et comment je faisais pour survivre.
J'étais bien conscient que c'était plutôt rare aujourd'hui (surtout parmi les
jeunes adultes) donc je m'y attendais un peu, mais je ne pensais pas que ce
serait &lt;em&gt;à ce point&lt;/em&gt; quelque chose d'inconcevable pour autant de gens (y compris
des adultes qui, dix ans auparavant, protestaient fermement contre la
généralisation de ces appareils).&lt;/p&gt;
&lt;p&gt;Du coup, il n'est peut-être pas inutile que je mette en ligne un petit
compte-rendu de mon expérience jusqu'à présent — en évoquant aussi bien les
raisons qui m'ont poussé à faire ce choix, les changements dans la vie
quotidienne que ça a engendré, et les problèmes qu'une telle décision peut
créer. Comme ça fait plus de 8 mois que ça dure, je crois que j'ai maintenant
une idée assez précise de ce à quoi ressemble une vie sans téléphone portable
pour pouvoir écrire un tel article.&lt;/p&gt;
&lt;p&gt;Ce billet peut aussi être vu comme un témoignage permettant à d'autres gens,
potentiellement tentés par l'idée de se débarrasser de leur téléphone portable,
de savoir ce qui les attend :-) &lt;/p&gt;
&lt;p&gt;D'avance, désolé pour la longueur du texte qui suit. Il semblerait que je sois
proprement incapable d'écrire des trucs courts.&lt;/p&gt;
&lt;h1 id="motifs"&gt;Motifs&lt;/h1&gt;
&lt;p&gt;En novembre dernier (2013), j'ai perdu mon portable. J'étais embêté. Du coup, je
me suis dit que ce serait une excellente occasion pour changer de forfait et
passer chez Free. Pour garder mon numéro de téléphone, il me fallait soit ma
carte SIM (que j'avais perdue), soit que je récupère mon numéro RIO. Et à cause
de détails administratifs stupides qui n'intéresseront personne, ça a commencé à
prendre un temps assez long — au bout de deux semaines, je n'avais toujours pas
ce numéro, et l'idée de forcer tous mes contacts à changer mes coordonnées
m'ennuyait un peu. &lt;/p&gt;
&lt;p&gt;À peu près au même moment, une fournée supplémentaire de révélations de Snowden
était publiée : en particulier, le 4 décembre, le public apprenait que la NSA
intercepte et stocke une quantité hallucinante de données de géolocalisation de
téléphones portables à travers le monde. &lt;em&gt;Plus de 5 milliards&lt;/em&gt; d'interceptions
de ce type par jour ! À cette fréquence, qui peut encore croire que le citoyen
moyen n'est pas concerné ? Qui peut être assez naïf pour imaginer que non, vu
qu'il n'a rien à se reprocher, personne ne stocke de données intimes le
concernant ?&lt;/p&gt;
&lt;p&gt;À la suite de ces révélations, j'ai fait en sorte de limiter au maximum les
opportunités, pour les agences gouvernementales aussi bien que pour les grandes
multinationales, d'obtenir des informations privées me concernant. Je me suis
mis à héberger mon propre serveur mail, à signer et chiffrer mes communications
dès que possible, à utiliser des adresses à usage unique lorsque je m'inscris
sur un site marchand… Mais l'idée que l'on sache en temps réel où je suis, et
que l'on puisse reconstituer mon itinéraire (donc mon emploi du temps, mes
habitudes de consommation, la liste de mes proches…), ça m'est proprement
insupportable. &lt;a href="http://youtu.be/n6XQX9pl22A"&gt;Ça devrait l'être aussi pour vous&lt;/a&gt;,
d'ailleurs (j'ai passé une bonne demi-heure à sous-titrer cette vidéo en
français, prenez donc trois minutes pour la visionner).&lt;/p&gt;
&lt;p&gt;Or, il n'existe pas beaucoup d'options pour se protéger contre ce type
d'intrusion dans sa vie privée. La géolocalisation d'un téléphone portable
éteint ou en mode avion 
&lt;a href="https://www.techdirt.com/articles/20130723/12395923907/even-powering-down-cell-phone-cant-keep-nsa-tracking-its-location.shtml"&gt;est possible&lt;/a&gt;
(en anglais), et puis trimballer un téléphone éteint n'a pas beaucoup d'intérêt.
Par ailleurs, au bout de deux semaines à vivre sans téléphone, je me suis rendu
compte que ne pas avoir de téléphone avait en fait un certain nombre
d'avantages, que les inconvénients n'étaient pas si terribles que ça, et que
c'était une expérience intéressante d'essayer de s'en passer.&lt;/p&gt;
&lt;p&gt;En résumé, c'est un mélange de hasard et de désir de protection de vie privée
qui m'ont poussé à ne pas racheter de portable, et j'ai continué par curiosité
et après avoir découvert les avantages que ça avait.&lt;/p&gt;
&lt;h1 id="inconvenients-et-problemes-rencontres"&gt;Inconvénients, et problèmes rencontrés&lt;/h1&gt;
&lt;p&gt;Je commence par les points négatifs, pour pouvoir finir sur une note positive :
ça correspondra mieux à mon expérience, qui est globalement enthousiasmante (je
ne compte pas racheter un téléphone de sitôt, tant que je n'en ai pas besoin
professionnellement).&lt;/p&gt;
&lt;h2 id="carte-bleue-et-achats-sur-internet"&gt;Carte bleue, et achats sur Internet&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Le&lt;/em&gt; gros morceau. Le système de paiement par carte bleue fonctionnant suivant
un protocole d'une stupidité profonde (sérieusement, devoir donner l'intégralité
des informations de sa carte au moindre site marchand, qui pourrait très bien
les utiliser pour vider le compte et disparaître dans la nature… 40 ans après
l'invention de la cryptographie asymétrique, c'est complètement absurde), les
banques et organismes de paiement forcent de plus en plus l'utilisation de
système d'authentification en deux temps. Entre autres, quand on paie par carte
bancaire via Internet, c'est maintenant devenu la norme de recevoir un SMS avec
un code de confirmation.&lt;/p&gt;
&lt;p&gt;C'est un cataplasme sur une jambe en fibre de carbone, mais il n'empêche que
c'est devenu une option non seulement par défaut, mais obligatoire. J'ai donc
augmenté la proportion de trucs payés par Internet avec
&lt;a href="https://www.weusecoins.com/fr/"&gt;Bitcoin&lt;/a&gt;, mais enfin, c'est encore loin de
suffire (un jour, peut-être…). Je suis donc allé voir ma banque en leur
demandant de supprimer cette option. Impossible. Je suis allé voir quelques
autres banques en leur demandant si c'était possible chez eux — les réponses se
partageaient entre « je n'en ai pas la moindre idée » et « non ». À chaque fois,
je passais pour un doux dingue et j'étais le premier à leur poser la question
(ce qui m'a fait réaliser qu'en fait, &lt;em&gt;tout le monde&lt;/em&gt; a un téléphone, au moins
en France, et que ceux qui n'en n'ont pas ne font pas non plus leurs achats sur
Internet).&lt;/p&gt;
&lt;p&gt;J'ai donc pris rendez-vous avec la personne qui s'occupe de mon compte à la
Banque Postale (au lieu de demander au hasard parmi les employé-e-s présents ce
jour-là), et partant du principe que ces gens-là sont payés en fonction de leur
capacité à garder leurs clients, j'ai menti et lui ai dit que s'il n'existait
pas de solution, j'allais changer de banque. Elle s'est activement creusé les
méninges, et a fini par me proposer l'option « e-carte bleue ». En gros, à
chaque transaction, je peux générer un nouveau numéro de carte à usage unique,
qui ne « contient » que la somme nécessaire à régler mes achats.&lt;/p&gt;
&lt;p&gt;Je ne comprends pas pourquoi un tel système n'est pas plus répandu (la preuve,
il a fallu à ma conseillère vingt bonnes minutes de recherche avant d'y penser),
si j'avais su avant que ça existait, je m'y serais inscrit sans hésiter (surtout
pour le prix minime de l'option, de l'ordre d'une dizaine d'euros par an). En
tous cas, ça a résolu mon problème : avec un code à usage unique, il n'y a plus
besoin d'une authentification en deux temps. Et je peux recommencer à faire des
achats sur Internet comme je veux, de façon bien plus sécurisée qu'avant.&lt;/p&gt;
&lt;h2 id="autres-systemes-utilisant-une-authentification-en-deux-temps"&gt;Autres systèmes utilisant une authentification en deux temps&lt;/h2&gt;
&lt;p&gt;Les fournisseurs de cartes bancaires ne sont pas les seuls à vouloir vous
envoyer des SMS de confirmation. Tout un tas de services en ligne font tout leur
possible pour que leurs utilisateurs utilisent ce type d'authentification. Sur
mon compte Google, par exemple, on me demande régulièrement d'entrer un numéro
de téléphone. Dans la majorité des cas, il suffit de répondre « non merci », et
même si le bouton n'est pas franchement mis en évidence, ça reste une
possibilité. Et la seule contrariété est que la question réapparaît à
intervalles réguliers.&lt;/p&gt;
&lt;p&gt;Parfois, ça n'est pas une option : je n'ai pas pu utiliser (enfin, tester)
Coinbase à cause de ça. Tant pis pour eux ! D'autres fournisseurs de services
« sensibles » (à qui l'on confie des mails, ou de l'argent) permettent
l'utilisation de mécanismes plus intelligents, comme une authentification en
deux temps basée sur 
&lt;a href="https://localbitcoins.com/forums/#!/general-discussion#paper-codes-based-two-facto"&gt;des codes à usage unique à imprimer&lt;/a&gt;
ou bien sur l'utilisation d'une clé PGP (un cookie pour le premier lecteur
capable de deviner le site que j'ai en tête et qui utilise cette méthode).&lt;/p&gt;
&lt;p&gt;En résumé, ça n'est pas un gros problème.&lt;/p&gt;
&lt;h2 id="ne-pas-pouvoir-remplir-les-formulaires-par-internet"&gt;Ne pas pouvoir remplir les formulaires par Internet&lt;/h2&gt;
&lt;p&gt;Ah oui, sites marchands et autres, j'ai un message pour vous : si vous demandez
un numéro de téléphone lors de l'inscription à votre système, sans expliquer à
l'utilisateur pourquoi vous en avez besoin ; ou pire, si vous lui interdisez de
laisser ce champ vide, allez faire de l'apnée nus dans le 
&lt;a href="https://fr.wikipedia.org/wiki/Kawah_Ijen"&gt;Kawah Ijen&lt;/a&gt;. Sérieusement.&lt;/p&gt;
&lt;p&gt;Donc, au cours des derniers mois, j'ai souvent dû entrer « 0000000000 » comme
numéro de téléphone pour pouvoir m'inscrire sur divers sites Web. Parfois,
« 0600000000 » lorsqu'ils vérifient que le numéro a l'air honnête. Du coup, je
suis désolé pour la personne qui a ce numéro, il est possible qu'il se soit fait
spammer un peu :D&lt;/p&gt;
&lt;p&gt;C'est un peu bête, mais ça ne m'a jusqu'ici rien causé d'autre qu'un léger
agacement — à chaque fois qu'il est question de se faire livrer un produit
quelconque, je précise avec ma commande « me contacter par e-mail uniquement,
je n'ai pas de téléphone ». Pour la petite histoire, ça m'est arrivé de remplir
un formulaire papier sous les yeux d'une employée pour une carte de fidélité
quelconque. Je lui ai dit que je n'avais pas de téléphone, elle m'a dit qu'elle
avait quand même besoin d'un numéro, j'ai rentré « 0000000000 » et je lui ai
demandé si elle comptait vérifier que c'était le bon. Elle a rentré ça dans
son ordinateur, qui n'a pas bronché, et j'ai eu ma carte de fidélité.&lt;/p&gt;
&lt;h2 id="ne-pas-pouvoir-joindre-facilement-administrations-et-entreprises"&gt;Ne pas pouvoir joindre facilement administrations et entreprises&lt;/h2&gt;
&lt;p&gt;On est en 2014, mais malgré ça, les services administratifs ou les entreprises
commerciales sont encore très rarement joignables efficacement par e-mail. Ce
qui est une honte, mais le problème reste entier : pour contacter un service
public, une boutique ou un support commercial quelconque, le téléphone reste le
moyen le plus sûr d'avoir une réponse. J'ai donc assez rapidement fini par
acheter du crédit Skype pour pouvoir passer des coups de fil au besoin.
Conclusion : ne le faites pas. Ça n'est pas très cher, mais le service est
&lt;em&gt;très&lt;/em&gt; mauvais, avec des temps de latence beaucoup trop grands. Il m'est arrivé
plusieurs fois que mon interlocuteur raccroche au bout de quelques secondes,
n'entendant personne au bout du fil, à cause du décalage audio.&lt;/p&gt;
&lt;p&gt;Je suis donc allé voir la concurrence et ai acheté du crédit Google Hangouts. Et
contrairement à Skype, là, ça marche parfaitement. Leurs prix sont &lt;em&gt;vraiment&lt;/em&gt;
honnêtes (2 centimes la minute vers les fixes, depuis n'importe où), et la
qualité de la communication est nickel — même, par exemple, de la Russie vers la
France. Le seul bémol est l'obligation de se créer du même coup un compte
Google+, mais comme un concours de programmation m'avait déjà obligé à le faire,
ça ne me gêne pas trop — et puis, je n'y publie rien et je n'ai quasiment pas de
contacts.&lt;/p&gt;
&lt;h2 id="ne-pas-etre-joignable"&gt;Ne pas être joignable&lt;/h2&gt;
&lt;p&gt;Voir la section « avantages ».&lt;/p&gt;
&lt;h2 id="non-mais-pour-de-vrai"&gt;Non, mais pour de vrai.&lt;/h2&gt;
&lt;p&gt;Non non, vraiment, ne pas être joignable est un vrai confort et c'est
principalement ça qui a amélioré ma qualité de vie. Mais soyons honnêtes, ça n'a
pas que des avantages : lorsque l'on a rendez-vous avec quelqu'un, c'est
pratique de passer un petit coup de fil lorsqu'on y est pour se retrouver. Il a
fallu m'adapter : donner des rendez-vous à des emplacements géographiques
beaucoup plus précis à mes amis, et arriver un peu en avance. Et lancer des
cailloux sur les amis susmentionnés lorsqu'ils ne sont pas à l'heure ^^&lt;/p&gt;
&lt;p&gt;C'est un peu gênant, mais je me suis adapté (et je suis plus ponctuel qu'avant).
Je me rends bien compte que le fait de ne pas avoir de téléphone est perçu comme
un caprice un peu gênant pour les gens que je dois retrouver quelque part à une
certaine heure ; mais en même temps, arriver à l'heure à l'emplacement précis
est quand même (théoriquement) normal, donc je n'ai pas l'impression de demander
l'impossible. Et en pratique, les gens s'adaptent bien et j'ai des amis (que je
ne nommerai pas :D) qui ne sont pas ponctuels en temps normal, et qui font un
effort lorsqu'ils ont rendez-vous avec moi. Victoire \o/&lt;/p&gt;
&lt;h2 id="ne-plus-pouvoir-avoir-de-longues-conversations-telephoniques-avec-ses-proches"&gt;Ne plus pouvoir avoir de longues conversations téléphoniques avec ses proches&lt;/h2&gt;
&lt;p&gt;Je n'ai jamais aimé les conversations téléphoniques, donc je n'ai jamais eu ce
type de conversations téléphoniques en y prenant du plaisir. Pour garder
contact, je communique par e-mail, par IRC, par cartes postales et par Skype
(oui, je sais, je devrais utiliser quelque chose de libre et de chiffré, mais
allez expliquer ça aux gens technophobes). Et j'aime mille fois mieux avoir une
longue discussion avec quelqu'un par visioconférence plutôt que par téléphone.&lt;/p&gt;
&lt;h2 id="ne-pas-pouvoir-inserer-ici-une-possibilite-quelconque-des-smartphones"&gt;Ne pas pouvoir [insérer ici une possibilité quelconque des smartphones]&lt;/h2&gt;
&lt;p&gt;Je n'ai jamais eu de smartphone, donc je ne me rends pas bien compte. J'ai
toujours bien vécu sans GPS, sans traducteur automatique, sans lampe torche,
sans boussole, etc. Pour ce qui est de se divertir lors d'un trajet, j'ai une
liseuse (qui peut même, en cas de besoin, se connecter à une borne Wi-Fi) et un
lecteur MP3.&lt;/p&gt;
&lt;h1 id="avantages-et-changements-positifs"&gt;Avantages et changements positifs&lt;/h1&gt;
&lt;p&gt;Si j'ai continué l'expérience et que j'ai l'intention de la poursuivre tant que
je peux, c'est que globalement, j'en suis content. J'ai déjà évoqué quelques
raisons. Je suis plus ponctuel et mes amis le sont aussi, mes paiements en ligne
sont significativement plus sécurisés qu'avant, et la motivation d'origine est
toujours aussi pertinente : je ne suis plus géolocalisable. Ça me donne une
réelle impression de liberté d'aller physiquement quelque part en me disant
qu'aucun algorithme, aucune base de données, aucune agence n'est au courant de
mes déplacements. Bien sûr, si quelqu'un voulait me cibler personnellement et me
filer, cela lui serait toujours possible, mais mon activité en ligne serait
compliquée à récupérer (et une partie significative de ma vie et de mes
interactions avec le monde extérieur passe par Internet), et je ne peux pas
vraiment lutter contre une filature physique. Mais il faudrait un mandat (un
vrai) pour faire ça légalement, donc c'est rassurant.&lt;/p&gt;
&lt;p&gt;Le second gros avantage, c'est au niveau du confort de vie. Avant de m'en
débarrasser, je n'avais jamais remarqué à quel point la présence permanente d'un
outil de communication dans sa poche était oppressant. En temps normal, on peut
être dérangé n'importe quand, même si on est au milieu de quelque chose
d'important, par une vibration dans sa poche (je suppose ici que le téléphone
est en mode vibreur ; les gens qui &lt;em&gt;en plus&lt;/em&gt; dérangent tous ceux dans leur
environnement immédiat devraient être jetés dans le lac acide susmentionné). Et
on a un besoin complètement irrationnel de savoir ce qui se passe, &lt;em&gt;tout de
suite&lt;/em&gt;. C'est peut-être important ! Qui sait ? Peut-être que je généralise — en
tous cas, en ce qui me concerne, je n'exagère pas.&lt;/p&gt;
&lt;p&gt;Lorsqu'on met le téléphone en mode silencieux, c'est pire : on pourrait &lt;em&gt;à
chaque instant&lt;/em&gt; recevoir un appel ou un SMS sans le savoir. Il faut donc
vérifier le plus souvent possible que ce n'est pas le cas. On perd probablement
un temps invraisemblable à jeter un œil torve à un écran vide de toute
notification, mais ça ne change rien.&lt;/p&gt;
&lt;p&gt;Sans téléphone… Pas de problème. Lorsque l'on fait une tâche quelconque — lire
un livre, réfléchir à la preuve d'un théorème, discuter avec quelqu'un, profiter
d'un bon repas, regarder un film, écrire un article de blog illisible car
beaucoup trop long et totalement inintéressant, on la fait &lt;em&gt;vraiment&lt;/em&gt;, sans une
possibilité toujours ouverte d'être déconcentré, ou de se déconcentrer tout
seul. C'est probablement quelque chose que tout le monde connaît déjà : quand on
fait du sport, ou qu'on va au cinéma ou au théâtre, on est pris à 100% par ce
qu'on est en train de faire (a priori, tout du moins), on est pas constamment en
communication potentielle avec l'extérieur. Imaginez ça, en permanence. Joie,
bonheur, Zen et qualité de vie significativement améliorée.&lt;/p&gt;
&lt;p&gt;Les gens ne peuvent plus, soudainement, décider de se manifester dans ma vie à
l'improviste. À part en venant chez moi, mais ça nécessite une plus grande
quantité de motivation, donc ça n'arrive qu'en cas d'urgence ou de bonne
surprise. De toute façon, lorsque je suis chez moi (ou que je travaille) et que
l'on m'envoie un mail (ou un message instantané), je le lis rapidement, donc ça
couvre déjà une bonne partie des cas d'utilisation du téléphone. En fait, après
en avoir parlé avec des gens, une très grande majorité de raisons pour
lesquelles on aurait besoin de me transmettre de l'information tombent dans la
catégorie « faisable par mail », ou bien « non urgent ».&lt;/p&gt;
&lt;p&gt;Oui oui, je suis parfaitement conscient de à quel point ce dernier paragraphe
doit me faire ressembler à un control freak, tant pis :D&lt;/p&gt;
&lt;p&gt;À part ça, quelques derniers trucs auxquels je pense, qui ne pèsent pas vraiment
dans la balance, mais que je mentionne par souci d'exhaustivité. Ne pas avoir de
téléphone économise du temps (si on met bout à bout toutes les fois où on jette
un coup d'œil sur son téléphone…), de l'argent et du poids à transporter. Ça
crée spontanément des conversations parce que ça n'est pas commun. C'est une
raison en moins de procrastiner (j'ai dû passer un temps absurde sur des jeux
débiles de téléphone portable, et pourtant, c'étaient loin d'être des &lt;em&gt;bons&lt;/em&gt;
jeux, je parle des trucs fournis de base avec les OS des vieux Nokia/Samsung).&lt;/p&gt;
&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Ne pas avoir de téléphone c'est bien :D Bon, faire du prosélytisme n'aurait
absolument aucun sens — pour des tas de gens, avoir et utiliser un téléphone
portable n'a rien d'un choix. Mais bon, mon expérience a l'air de montrer que ce
n'est pas le cas de tout le monde, que l'on peut s'en sortir sans et que ça peut
même être plutôt enthousiasmant. Bon, je pourrais écrire à peu près n'importe
quoi ici, parce que personne ne va lire cet article en entier de toute façon. Ça
tombe bien, je suis sacrément mauvais lorsqu'il s'agit d'écrire des conclusions.&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Que font les thésards en maths de leurs journées ?</title><link href="https://desfontain.es/blogue/que-font-les-thesards-en-maths.html" rel="alternate"></link><published>2014-07-24T00:00:00+02:00</published><updated>2014-09-10T00:00:00+02:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2014-07-24:/blogue/que-font-les-thesards-en-maths.html</id><summary type="html">&lt;p&gt;Traduction collaborative d'un chouette billet par Yasha Berchenko-Kogan.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Ce&lt;/strong&gt; texte est une traduction collaborative de &lt;a href="https://www.quora.com/Mathematics/What-do-grad-students-in-math-do-all-day"&gt;ce
billet&lt;/a&gt;
de &lt;a href="https://www.quora.com/Yasha-Berchenko-Kogan"&gt;Yasha Berchenko-Kogan&lt;/a&gt;, par
&lt;a href="http://a3nm.net/"&gt;a3nm&lt;/a&gt;, &lt;a href="http://milchior.fr/pmwiki/"&gt;Arthur&lt;/a&gt;, elarnon,
&lt;a href="http://www.eleves.ens.fr/home/dorel/"&gt;Ish&lt;/a&gt;, Lau,
&lt;a href="http://www.ludovicpatey.com/"&gt;Yap&lt;/a&gt; et &lt;a href="http://desfontain.es/"&gt;moi-même&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="que-font-les-thesards-en-maths-de-leurs-journees"&gt;Que font les thésards en maths de leurs journées ?&lt;/h1&gt;
&lt;p&gt;Quand vous êtes en thèse, vous passez une bonne partie de votre temps à lire des
livres et des articles pour tenter de comprendre leur contenu. Mais les maths,
ça ne se lit pas aussi bien qu'un roman policier. Ça ne se lit pas non plus
comme un livre d'histoire ou un article du Monde, à vrai dire.&lt;/p&gt;
&lt;p&gt;Le premier problème que vous rencontrez, lorsque vous arrivez à la frontière de
ce qui est connu en maths, c'est que les mots pour décrire les concepts
n'existent pas encore. Parler de ces idées, c'est un peu comme essayer
d'expliquer à quelqu'un qui n'en a jamais vu ce qu'est un aspirateur, en
n'utilisant que des mots de 5 lettres ou moins.&lt;/p&gt;
&lt;p&gt;Comment pourriez-vous formuler ça ?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;« C'est un outil qui pompe pour que le sol chez soi ne soit plus sale. »&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C'est certainement mieux que rien, mais ça ne vous dit pas tout ce que vous
pourriez vouloir savoir à propos des aspirateurs. Peut-on utiliser un aspirateur
pour laver les rayonnages d'une bibliothèque, ou un chat, ou un trottoir ?&lt;/p&gt;
&lt;p&gt;Les auteurs d'articles et de livres tentent de communiquer ce qu'ils ont compris
du mieux qu'ils peuvent, compte tenu de ces restrictions. C'est certainement
mieux que rien… Mais si vous voulez travailler à votre tour avec des
aspirateurs, vous avez besoin d'en savoir beaucoup plus.&lt;/p&gt;
&lt;p&gt;Heureusement, les mathématiciens ont un outil incroyablement puissant pour
transmettre des informations : l'écriture mathématique. Lorsqu'ils imaginent de
nouveaux concepts, ils utilisent — et inventent au besoin — des symboles et des
notations très explicites, ainsi que des règles logiques pour les manipuler.
C'est un peu l'équivalent d'une spécification technique et de schémas pour
fabriquer un aspirateur à partir de pièces détachées.&lt;/p&gt;
&lt;p&gt;L'avantage, c'est que désormais, vous pouvez (en théorie) savoir sans aucune
ambiguïté ce qu'un aspirateur peut ou ne peut pas faire. Le problème, c'est que
vous n'avez toujours aucune idée de ce à quoi les pièces servent ni de pourquoi
elles sont arrangées de cette manière, si ce n'est grâce à la phrase cryptique :
« C'est un outil qui pompe pour que le sol chez soi ne soit plus sale ».&lt;/p&gt;
&lt;p&gt;Maintenant, vous vous retrouvez en thèse, et votre directrice vous donne un
papier fondamental, « Un outil qui pompe des trucs ». L'introduction vous dit
que « C'est un outil qui pompe pour que le sol chez soi ne soit plus sale » et
tout un tas d'autres choses vagues mais qui ont l'air raisonnables. Le gros du
papier est composé de schémas et de descriptions de l'aspirateur. Puis viennent
quelques références : « De l'air qui pompe ce qui est sale », « Des pales qui
vont très vite », « Ce qu'on peut faire avec les trous dans le mur, à l'aide de
fils en métal ».&lt;/p&gt;
&lt;p&gt;Et ensuite ? En pratique, vous êtes à votre bureau, vous vous asseyez et vous
réfléchissez. Sauf que ce n'est pas si simple. D'abord vous vous dites que,
héhé, on dirait presque qu'il y a un sous-entendu graveleux dans ce titre. Puis
vous lisez l'introduction qui explique avec des mots simples ce dont ça va
parler — sans donner le moindre détail. &lt;/p&gt;
&lt;p&gt;Puis, vous passez aux schémas. Vous vous perdez un peu dans tous ces dessins,
mais vous passez du temps à les analyser, les uns après les autres. Vous
refaites certaines démonstrations, histoire de vérifier que vous les avez bien
comprises. De temps en temps, vous trouvez un résultat absurde, et vous cherchez
ce que vous avez mal compris, pour le relire et recommencer les calculs. Il
arrive parfois que la faute soit dans le papier, et que ça soit ça qui vous ait
induit en erreur.&lt;/p&gt;
&lt;p&gt;Au bout d'un moment, les pièces du puzzle s'assemblent et vous arrivez enfin à
avoir une compréhension intuitive de ce qu'est un aspirateur. En fait, vous êtes
maintenant l'un des experts en aspirateurs, en tout cas pour ce modèle précis,
et vous comprenez une bonne partie des détails de son fonctionnement. Vous en
êtes super fier, même si vous êtes encore loin du niveau de votre directrice de
thèse. Elle, elle connaît tout un tas d'autres genres de modèles d'aspirateurs,
même des récents comme des Roombas, et en plus, elle travaille sur un projet sur
la climatisation qui est un peu lié mais quand même très différent.&lt;/p&gt;
&lt;p&gt;Vous êtes ravi de pouvoir enfin parler d'égal à égale avec votre directrice, au
moins sur ce sujet-là, mais il reste un truc à faire… Remplir une thèse.&lt;/p&gt;
&lt;p&gt;Du coup, vous pensez à de nouvelles choses qu'on pourrait faire avec un
aspirateur. Au début, ça ressemble à : « On pourrait peut-être utiliser un
aspirateur pour nettoyer des étagères. Ça serait super utile !! ». Puis, vous
faites une recherche sur Google Scholar et il se trouve que quelqu'un d'autre
l'a déjà fait il y a une bonne dizaine d'années.&lt;/p&gt;
&lt;p&gt;OK, prochaine idée : « Et si on utilisait un aspirateur pour nettoyer des
chats ? » Ça aussi, ça serait super utile. Malheureusement, une petite recherche
dans la littérature révèle que quelqu'un d'autre a déjà essayé, mais qu'il n'a
pas eu de bons résultats. Mais vous êtes un jeune thésard confiant, et commencez
à avoir un petit peu d'expérience. Vous estimez donc que vous disposez de
quelques petites techniques nouvelles, qui pourraient permettre de contourner
les problèmes rencontrés par l'autre chercheur, et obtenir un aspirateur qui
nettoie aussi les chats. Vous passez plusieurs mois dessus, mais, hélas, vous
n'aboutissez pas au résultat voulu.&lt;/p&gt;
&lt;p&gt;Du coup, après un peu de réflexion et avoir fait un peu de recherche annexe en
rallonges électriques, vous pensez qu'il serait possible d'utiliser un
aspirateur pour nettoyer des trottoirs. Vous regardez la littérature, et il
semble que personne n'a jamais pensé à le faire. Chouette ! Vous annoncez
fièrement votre idée à votre directrice de thèse, mais elle griffonne sur un
bout de papier des calculs que vous ne comprenez pas vraiment, et vous répond
qu'aspirer à l'extérieur, c'est probablement inutile. Un aspirateur serait trop
petit pour gérer toute la surface extérieure, on dispose déjà d'autres outils
bien plus adaptés pour nettoyer les trottoirs, etc.&lt;/p&gt;
&lt;p&gt;Ça continue comme ça pendant pas mal d'années, et vous finissez par écrire une
thèse ayant pour sujet « Si on retourne un aspirateur et qu'on en submerge
l'embout, on peut faire des bulles ! ».&lt;/p&gt;
&lt;p&gt;Votre jury de thèse a du mal à voir dans quelles circonstances cela pourrait
bien être utile, mais ça a l'air plutôt cool et puis, les bulles, c'est joli. Du
coup, ils pensent qu'on pourrait peut-être en tirer quelque chose d'utile un
jour. Peut-être.&lt;/p&gt;
&lt;p&gt;Et, en effet, quelle chance ! Une petite centaine d'années plus tard, votre idée
(combinée avec pas mal d'autres) permettra de développer des pompes à air pour
aquariums, un outil qui se révélera essentiel pour un domaine de recherche en
plein essor : les habitats artificiels pour poissons rouges.&lt;/p&gt;
&lt;p&gt;Youpi !&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Gérer ses mails en local : étape 4, tout chiffrer avec GPG !</title><link href="https://desfontain.es/blogue/client-mail-4-gpg.html" rel="alternate"></link><published>2014-06-25T00:00:00+02:00</published><updated>2015-04-27T00:00:00+02:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2014-06-25:/blogue/client-mail-4-gpg.html</id><summary type="html">&lt;p&gt;On rend notre client mail capable de recevoir et d'envoyer des messages chiffrés.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ce billet fait partie d'une série d'articles présentant la façon dont je gère
mes mails en local. Si vous êtes arrivés là sans lire l'introduction, c'est
probablement une bonne idée de commencer par le début =)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Étape 0 : &lt;a href="client-mail-0-introduction.html"&gt;Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 1 : &lt;a href="client-mail-1-offlineimap.html"&gt;Synchronisation IMAP avec
  OfflineIMAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 2 : &lt;a href="client-mail-2-msmtp.html"&gt;Envoi d'e-mails avec msmtp et msmtpq&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 3 : &lt;a href="client-mail-3-mutt.html"&gt;Configuration de mutt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 3 bis : &lt;a href="client-mail-3bis-mutt.html"&gt;Dose supplémentaire de mutt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 4 : Chiffrement et signature avec PGP ← vous êtes ici !&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;span class='lettrine'&gt;N&lt;/span&gt;&lt;strong&gt;otre&lt;/strong&gt; configuration, jusqu'ici, n'est pas très
sécurisée. Le problème principal est que tous nos mots de passe sont stockés en
clair sur le disque dur : si quelqu'un y a accès, il peut non seulement lire nos
mails mais il a un accès direct à notre serveur IMAP et SMTP, tant qu'on ne
change pas la configuration. On pourrait rétorquer que si l'on fait attention,
on peut faire en sorte que personne n'ait un accès à la machine ; et dans la
majorité des situations, avec quelques précautions évidentes - verrouiller
l'écran de son laptop dès qu'on s'en éloigne, etc. - c'est un argument qui se
tient. Le problème, c'est que si le disque dur est non chiffré et que quelqu'un
a un accès physique et prolongé à la machine (par exemple, si on vous l'a volé,
ou que vous l'avez laissé sans surveillance pendant un temps suffisamment long
pour laisser le temps à un attaquant de lancer un Live CD), les données seront
compromises (et l'attaque peut très bien ne laisser quasiment aucune trace).&lt;/p&gt;
&lt;p&gt;Pour résoudre ce problème grave, on va installer GPG (Gnu Private Guard) et
modifier notre configuration pour planquer les données sensibles. Ça sera par
ailleurs une excellente occasion pour se servir du même logiciel pour signer
électroniquement les mails qu'on envoie, et les chiffrer quand c'est possible.&lt;/p&gt;
&lt;p&gt;Si vous n'avez jamais entendu parler d'OpenPGP (le protocole implémenté par
GnuPG) et que vous ne savez pas du tout ce que c'est qu'une paire de clés
publique/privée, c'est probablement une bonne idée d'aller lire quelques
ressources sur le sujet (par exemple, la 
&lt;a href="https://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique"&gt;page Wikipédia&lt;/a&gt;
consacrée au principe de la cryptographie asymétrique). Dans toute la suite, je
vais supposer que vous comprenez les notions de clé privée, clé publique, et que
vous comprenez l'idée de base que l'on va implémenter ici.&lt;/p&gt;
&lt;h1 id="premiers-pas"&gt;Premiers pas&lt;/h1&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;Pour l'installation, on installe GnuPG, ainsi qu'un autre paquet dont on va
détailler l'utilité plus tard. La commande qui invoque le logiciel est &lt;code&gt;gpg&lt;/code&gt;
mais le nom du paquet est gnupg :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;aptitude install gnupg gnupg-agent pinentry-gtk2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ensuite, il faut se créer (au minimum) une paire clé publique / clé secrète si
l'on veut pouvoir chiffrer quoi que ce soit. Lancez donc la commande :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gpg --gen-key
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et laissez-vous guider. Les choix par défaut sont en général très bien (même si
je pense que ça ne coûte pas grand-chose de toujours sélectionner la taille de
clé la plus grande disponible). On va vous demander une phrase de passe,
évidemment, parce que si la clé secrète (qui se trouve sur votre disque dur)
n'est pas elle-même chiffrée, quelqu'un qui vous vole votre disque dur pourra la
lire et déchiffrer ce qu'il veut avec. Inutile de préciser qu'il faut choisir
une phrase de passe solide, je recommande pour ça la 
&lt;a href="https://xkcd.com/936/"&gt;méthode XKCD&lt;/a&gt; (pour les non-anglophones : quelques (au
moins quatre) mots aléatoires de la langue française les uns à la suite des
autres - comme &lt;code&gt;correctchevalbatterieagrafe&lt;/code&gt; - forment un mot de passe à la fois
plus sûr et plus facile à retenir qu'un truc rempli de transformations bizarres
comme &lt;code&gt;Tr0ub4doUr&amp;amp;3&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;On a notre paire de clés, disons que son identifiant est EA627AA3. On peut
s'amuser à chiffrer et déchiffrer des documents :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;echo &amp;quot;Encryptons joyeusement un fichier inutile&amp;quot; &amp;gt; inutile.txt
cat inutile.txt
gpg --encrypt -r EA627AA3 --armor inutile.txt
cat document.txt.asc
gpg --decrypt document.txt.asc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;mais je ne m'étendrais pas sur l'étendue des possibilités de GPG ; ce tutoriel
cherche juste à expliquer comment se servir en pratique de GPG pour augmenter la
sécurité de sa configuration. Si vous voulez des informations plus détaillées,
vous pouvez allez jeter un œil du côté de la
&lt;a href="https://www.gnupg.org/gph/fr/manual.html"&gt;documentation officielle&lt;/a&gt;, qui est à
la fois complète et très lisible (et en français).&lt;/p&gt;
&lt;h2 id="configuration"&gt;Configuration&lt;/h2&gt;
&lt;p&gt;GnuPG requiert une quantité assez minime de configuration. Par contre, par
défaut, il va vous demander votre phrase de passe dès qu'il essaie d'accéder à
vos clés : en pratique, dès que vous envoyez un mail signé, que vous recevez un
mail chiffré, ou qu'il tente de déchiffrer un fichier - donc, tout le temps.&lt;/p&gt;
&lt;p&gt;Pour que ça ne soit pas trop pénible, on utilise gpg-agent, qui nécessite un peu
plus de configuration. Commencez par décommenter la ligne contenant &lt;code&gt;use-agent&lt;/code&gt;
dans le dossier &lt;code&gt;~/.gnupg/gpg.conf&lt;/code&gt; (si ce fichier n'existe pas, lancez &lt;code&gt;gpg&lt;/code&gt;
dans un terminal, puis appuyez sur &lt;code&gt;Ctrl-D&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Puis, créez et éditez le fichier &lt;code&gt;~/.gnupg/gpg-agent.conf&lt;/code&gt;, et entrez-y les
lignes suivantes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pinentry-program /usr/bin/pinentry-gtk-2
default-cache-ttl 43200
max-cache-ttl 43200
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;en remplaçant &lt;code&gt;43200&lt;/code&gt; par le temps, en secondes, pendant lequel vous voulez que
gpg-agent se souvienne de votre phrase de passe (donc la fréquence à laquelle il
va vous la redemander). Ici, toutes les 12 heures. Pour vérifiez que ça
fonctionne, lancez la commande suivante dans un terminal :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;eval &amp;quot;$(gpg-agent --daemon)&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et lancez une commande qui nécessite votre phrase de passe (par exemple,
chiffrez un fichier quelconque); vous allez pouvoir constater que c'est
gpg-agent qui s'occupe de vous la demander et que si vous faites ça plusieurs
fois de suite, il l'aura gardé en mémoire entre deux fois consécutives.&lt;/p&gt;
&lt;h1 id="ne-pas-stocker-ses-mots-de-passe-en-clair"&gt;Ne pas stocker ses mots de passe en clair&lt;/h1&gt;
&lt;p&gt;On a pour l'instant des mots de passe en clair dans les configurations de msmtp,
et de OfflineIMAP. À la place, on va plutôt les stocker dans des fichiers à
part, qui seront chiffrés. Commencez par créer un répertoire où vous voulez dans
votre système (&lt;code&gt;~/.mdp&lt;/code&gt;, par exemple), c'est là que l'on va les mettre.&lt;/p&gt;
&lt;h2 id="msmtp"&gt;msmtp&lt;/h2&gt;
&lt;p&gt;Dans la configuration de msmtp, pour l'instant, on a une ligne qui ressemble à :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;password gungjbhyqunirorraorggre
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;supprimez cette ligne, et copiez le mot de passe dans &lt;code&gt;~/.mdp/msmtp&lt;/code&gt;, par
exemple. Il faut que ce fichier contienne votre mot de passe et &lt;em&gt;rien d'autre&lt;/em&gt; :
pas d'espace ni de retour à la ligne. Chiffrez ce fichier, et supprimez-le de
façon sécurisée :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cd ~/.mdp/msmtp
gpg --encrypt -r EA627AA3 --armor msmtp
shred -z -v msmtp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;maintenant, à la place de la ligne qui contenait votre mot de passe, ajoutez la
ligne :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;passwordeval gpg --batch -d --use-agent --yes /home/votreidentifiant/.mdp/msmtp.gpg 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(évidemment, en changeant « votreidentifiant » par votre nom d'utilisateur).
Vous êtes en train de lui dire « pour trouver le mot de passe, exécute la
commande suivante » au lieu de directement « voilà le mot de passe ». À chaque
fois qu'il va avoir besoin du mot de passe, il va déchiffrer le fichier
&lt;code&gt;~/.mdp/msmtp.gpg&lt;/code&gt;, en utilisant gpg-agent pour ne pas vous demander votre mot
de passe si il s'en souvient.&lt;/p&gt;
&lt;p&gt;Votre mot de passe SMTP n'est donc plus disponible en clair sur votre disque
dur, mais mis à part un mot de passe que vous devez rentrer régulièrement (à
intervalles que vous choisissez), rien n'a changé dans l'utilisation quotidienne
de msmtp. Si vous utilisez msmtp avec plusieurs comptes différents, n'oubliez
pas de créer un fichier par mot de passe et de faire les modifications partout,
bien sûr.&lt;/p&gt;
&lt;h2 id="offlineimap"&gt;OfflineIMAP&lt;/h2&gt;
&lt;p&gt;Pour OfflineIMAP, on va faire essentiellement la même chose. Seulement, le
fichier de configuration n'a pas d'option aussi simple que le &lt;code&gt;passwordeval&lt;/code&gt; de
msmtp, mais permet à la place d'utiliser un script Python. Téléchargez donc 
&lt;a href=".offlineimap.py"&gt;le fichier suivant&lt;/a&gt;, enregistrez-le quelque part (par exemple,
comme &lt;code&gt;~/.offlineimap.py&lt;/code&gt;), et rectifiez la ligne contenant &lt;code&gt;votreidentifiant&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Puis, dans le fichier de configuration d'OfflineIMAP (&lt;code&gt;~/.offlineimaprc&lt;/code&gt;),
ajoutez la ligne&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pythonfile = ~/.offlineimap.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;dans la section &lt;code&gt;[general]&lt;/code&gt;, puis remplacez la ligne &lt;code&gt;remotepass&lt;/code&gt; par :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;remotepass = mailpasswd(&amp;quot;offlineimap&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;en supposant que, de façon similaire à tout à l'heure, vous aviez stocké votre
mot de passe dans le fichier &lt;code&gt;~/.mdp/offlineimap.gpg&lt;/code&gt;. Choisissez des noms plus
spécifiques si vous gérez plusieurs comptes à la fois, et stockez autant de mots
de passe que vous voulez de la même façon.&lt;/p&gt;
&lt;h2 id="cron-fait-des-siennes"&gt;Cron fait des siennes&lt;/h2&gt;
&lt;p&gt;Si vous êtes arrivés jusque là, tout devrait normalement bien marcher… Sauf
cron. En effet, on utilise gpg-agent pour mettre la phrase de passe de la clé
GPG en cache, gpg-agent a besoin de variables d'environnements pour fonctionner,
et cron n'a pas accès aux mêmes variables d'environnements que vous. Ça engendre
des situations qui sont un cauchemar à débugger, mais voilà la solution que j'ai
fini par trouver après avoir sué sang et eau pour faire marcher l'automatisation
de tout ça.&lt;/p&gt;
&lt;p&gt;Éditez le fichier de configuration de cron avec &lt;code&gt;crontab -e&lt;/code&gt;. Commencez par y
ajouter, au tout début, la ligne :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;DISPLAY=:0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;pour que lorsque gpg-agent aura oublié votre phrase de passe GPG, il sache sur
quel écran afficher sa petite fenêtre qui va vous la demander. Ensuite, pour
chacune des lignes où vous invoquez soit offlineimap, soit msmtp (ou
msmtp-queue), ajoutez au début de la commande :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;votreidentifiant&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;gpg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GPG_AGENT_INFO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;par exemple, la commande d'OfflineIMAP de quelques articles en arrière était :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;*/2 &lt;span class="gs"&gt;* *&lt;/span&gt; * * /usr/bin/offlineimap &amp;gt; /dev/null 2&amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et elle va devenir :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;*/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;votreidentifiant&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;gpg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GPG_AGENT_INFO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;offlineimap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb nb-Type"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb nb-Type"&gt;null&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(mais vous feriez mieux, dans un premier temps, de remplacer les &lt;code&gt;/dev/null&lt;/code&gt; par
des emplacements où vous pouvez lire les messages que renvoie la commande, pour
pouvoir débugger en cas de problème).&lt;/p&gt;
&lt;p&gt;Et comme ça, ça devrait fonctionner - on utilise un fichier créé par gpg-agent
qui contient la variable d'environnement qu'il faut, ce qui permet aux futurs
appels à gpg de savoir où trouver (ou demander) la phrase de passe.&lt;/p&gt;
&lt;h1 id="chiffrez-et-signez-vos-messages"&gt;Chiffrez et signez vos messages&lt;/h1&gt;
&lt;p&gt;Passons aux choses sérieuses : on va utiliser notre jolie paire de clés pour
signer tous les messages envoyés via mutt, et chiffrer ceux qui sont possibles.
Déjà, si vous avez des amis qui utilisent GPG, c'est le moment d'aller ajouter
leurs clés publiques dans votre trousseau :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gpg --search-keys lenomdevotrepote
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(suivez les instructions pour les ajouter à votre trousseau) et d'exporter la
vôtre sur le serveur officiel de GnuPG :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;gpg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="k"&gt;send&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;keys&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;EA627AA3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;remplacez bien sûr ici et dans toute la suite EA627AA3 par l'identifiant de
votre clé.&lt;/p&gt;
&lt;p&gt;Dans le fichier de configuration de mutt, ajoutez une ligne du style &lt;code&gt;source
~/.mutt/gpg&lt;/code&gt; pour mettre dans un même fichier tout ce qui concerne GPG (et si
vous comptez utilisez plusieurs clés différentes plus plusieurs comptes
différents, faites plusieurs fichiers, et sourcez-les au bon endroit). &lt;/p&gt;
&lt;p&gt;Dans le fichier en question, glissez donc tout un tas de commandes compliquées
pour dire quelles commandes utiliser : mutt connaît le principe d'OpenPGP, mais
est prévu pour pouvoir utiliser n'importe quel logiciel qui parle le même
protocole. Du coup, il faut lui indiquer à la main toutes les commandes de
chiffrement, de déchiffrement, de signature, etc. En pratique, recopiez tout
ça : à part l'identifiant de la clé, vous n'avez rien à changer.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Commandes à utiliser avec gpg&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;pgp_decode_command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gpg --no-verbose --batch --output - &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;pgp_verify_command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gpg --no-verbose --batch --output - --verify &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;pgp_decrypt_command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gpg --no-verbose --batch --output - &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;pgp_sign_command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gpg --no-verbose --batch --output - --armor --detach-sign --textmode %?a?-u &lt;/span&gt;&lt;span class="si"&gt;%a&lt;/span&gt;&lt;span class="s2"&gt;? &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;pgp_clearsign_command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gpg --no-verbose --batch --output - --armor --textmode --clearsign %?a?-u &lt;/span&gt;&lt;span class="si"&gt;%a&lt;/span&gt;&lt;span class="s2"&gt;? &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;pgp_encrypt_only_command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/usr/lib/mutt/pgpewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to 0xEA627AA3 -- -r &lt;/span&gt;&lt;span class="si"&gt;%r&lt;/span&gt;&lt;span class="s2"&gt; -- &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;pgp_encrypt_sign_command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/usr/lib/mutt/pgpewrap gpg --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u &lt;/span&gt;&lt;span class="si"&gt;%a&lt;/span&gt;&lt;span class="s2"&gt;? --armor --always-trust --encrypt-to 0xEA627AA3 -- -r &lt;/span&gt;&lt;span class="si"&gt;%r&lt;/span&gt;&lt;span class="s2"&gt; -- &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;pgp_import_command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gpg --no-verbose --import -v &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;pgp_export_command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gpg --no-verbose --export --armor &lt;/span&gt;&lt;span class="si"&gt;%r&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;pgp_verify_key_command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gpg --no-verbose --batch --fingerprint --check-sigs &lt;/span&gt;&lt;span class="si"&gt;%r&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;pgp_list_pubring_command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gpg --no-verbose --batch --with-colons --list-keys &lt;/span&gt;&lt;span class="si"&gt;%r&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; 
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;pgp_list_secring_command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gpg --no-verbose --batch --with-colons --list-secret-keys &lt;/span&gt;&lt;span class="si"&gt;%r&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; 
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;pgp_good_sign&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;^gpg: Good signature from&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ensuite vient la « vraie » configuration. Dans l'ordre, on va indiquer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;qu'on utilise gpg-agent,&lt;/li&gt;
&lt;li&gt;la clé qu'on utilise pour signer, &lt;/li&gt;
&lt;li&gt;qu'on veut signer tous les messages sortants,&lt;/li&gt;
&lt;li&gt;qu'on chiffre automatiquement les réponses à des messages signés (parce que
    quand on sait que quelqu'un signe ses mails, on va pouvoir chiffrer les
    messages qu'on lui envoie), &lt;/li&gt;
&lt;li&gt;qu'on chiffre aussi automatiquement les réponses à des messages chiffrés,&lt;/li&gt;
&lt;li&gt;et qu'on souhaite vérifier la signature de tous les messages reçus (ce qui, en
    supposant que vos contacts protègent suffisamment bien leurs clés secrètes,
    garantit que personne n'est en train d'usurper leur identité).&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set pgp_use_gpg_agent
set pgp_sign_as=0xEA627AA3
set crypt_autosign
set crypt_replyencrypt
set crypt_replysignencrypted
set crypt_verify_sig
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Voilà un bon début, et ça peut même vous suffire. Sachez quand même que certains
clients de messagerie (notamment des vieuuux Outlook) n'aiment pas recevoir des
messages signés, et n'affichent qu'une erreur lorsqu'ils en reçoivent (ce qui
est incroyablement stupide, vu qu'une signature n'est rien de plus qu'un petit
fichier texte joint à chaque mail, mais bon). Dans ce cas, on peut avoir envie
de rajouter des hooks du genre :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;~t @vetagro-sup\.fr&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;set crypt_autosign=no&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;dans la configuration de mutt. Notez que si vous mettez la ligne précédente
telle quelle et que vous envoyez un mail à un des destinataires concernés par le
hook, l'option &lt;code&gt;crypt_autosign&lt;/code&gt; vaudra &lt;code&gt;no&lt;/code&gt; pour toute la suite de cette
exécution de mutt. Il faut donc ajouter, &lt;em&gt;avant&lt;/em&gt; la ligne précédente, un hook
qui remet l'option dans son état désiré :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;send-hook . &amp;quot;set crypt_autosign=yes&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si après, ponctuellement, vous avez envie de ne pas signer un mail (ou de le
chiffrer, ou de façon générale de changer les paramètres sur un mail envoyé),
c'est la touche &lt;code&gt;p&lt;/code&gt; qui permet de faire ça, juste avant l'envoi d'un message.&lt;/p&gt;
&lt;p&gt;À part ça, il manque une fonctionnalité pourtant assez naturelle : le fait de
chiffrer automatiquement les messages lorsqu'on a la clé publique du
destinataire dans son trousseau. Il n'y a pas d'option pour ça, donc j'utilise
un hack très crade : un script qui génère automatiquement un fichier de
configuration mutt avec des lignes du type :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;!~l ~t machin\\.truc@bidule\\.wat&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;set pgp_autoencrypt pgp_autosign&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;pour chaque adresse &lt;code&gt;machin.truc@bidule.wat&lt;/code&gt; présente dans le trousseau. Le
script est trouvable &lt;a href="generate_pgp_auto.sh"&gt;par ici&lt;/a&gt;, et pour l'utiliser, il
suffit de le rendre exécutable, de l'exécuter et de sourcer le fichier obtenu
dans la configuration de mutt (il s'appelle par défaut &lt;code&gt;pgp_auto&lt;/code&gt;). Vous pouvez
aller jeter un œil au code du script si ça vous amuse, c'est du beau sed bien
violent. Lancez le script à nouveau de temps en temps, lorsque votre trousseau
grossit (demandez à cron de le faire une fois par semaine, par exemple).&lt;/p&gt;
&lt;h1 id="considerations-de-securite"&gt;Considérations de sécurité&lt;/h1&gt;
&lt;p&gt;Vous avez peut-être l'impression que vous avez fait dépendre plusieurs de vos
mots de passe d'un mot de passe unique, ce qui n'a pas vraiment l'air
d'améliorer la sécurité du système. C'est une remarque qui n'est pas totalement
infondée, c'est pourquoi la phrase de passe GPG est &lt;em&gt;extrêmement importante&lt;/em&gt;, et
doit donc être solide et n'être stockée à aucun endroit du système (si il y a
&lt;em&gt;un&lt;/em&gt; mot de passe que vous devriez retenir par cœur et ne recopier nulle part,
c'est celui-ci).&lt;/p&gt;
&lt;p&gt;Néanmoins, maintenant, si on vous vole votre disque ou qu'on pirate votre
ordinateur, l'attaquant n'a pas un accès direct aux mots de passe de vos comptes
de messagerie - et si votre phrase de passe GPG est bonne, il ne pourra pas
disposer des ressources matérielles nécessaires pour les trouver (ça lui est
totalement impossible sans votre phrase de passe). Vous me direz « mais
gpg-agent retient mon mot de passe, donc il doit bien être quelque part… » :
vous avez raison, mais gpg-agent stocke ce mot de passe dans la RAM : dès que
votre ordinateur est éteint, il disparaît en quelques secondes (à moins de
plonger ladite RAM dans de 
l'&lt;a href="https://en.wikipedia.org/wiki/Cold_boot_attack"&gt;azote liquide&lt;/a&gt; - mais ça
paraît raisonnable de supposer que le risque est minime). Pas de problème à ce
niveau-là non plus, donc !&lt;/p&gt;
&lt;p&gt;Si vous voulez faire les choses jusqu'au bout et suivre les conseils avancés des
professionnels de la sécurité des systèmes d'information, &lt;a href="https://help.riseup.net/en/security/message-security/openpgp/gpg-best-practices"&gt;cette
page&lt;/a&gt;
(en anglais) répertorie les pratiques à adopter pour limiter les risques au
maximum.&lt;/p&gt;
&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;C'est à peu près tout, je crois. Et comme je ne crois pas avoir raté quoi que ce
soit de majeur, j'imagine que ça conclut cette série sur la gestion locale de
ses mails avec des outils légers, bien conçus et configurables à l'infini ; le
tout avec une bonne couche de sécurité. N'hésitez pas à m'envoyer corrections et
suggestions pour améliorer cette série de tutoriels !&lt;/p&gt;
&lt;p&gt;&lt;sup&gt;Au risque de me répéter d'article en article, un grand merci à
&lt;a href="http://a3nm.net/"&gt;a3nm&lt;/a&gt; pour ses remarques et suggestions ayant permis de
compléter et d'améliorer ce billet.&lt;/sup&gt;&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Gérer ses mails en local : étape 0, introduction.</title><link href="https://desfontain.es/blogue/client-mail-0-introduction.html" rel="alternate"></link><published>2014-04-08T00:00:00+02:00</published><updated>2014-10-12T00:00:00+02:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2014-04-08:/blogue/client-mail-0-introduction.html</id><summary type="html">&lt;p&gt;Introduction et table des matières d'une série sur la façon dont je gère mes mails en local.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Ce&lt;/strong&gt; billet est le premier d'une courte série d'articles longs. Elle a pour
objectif de décrire la façon dont je gère mes courriels en local, sur mon
laptop, sous la forme d'un tutoriel que j'espère accessible pour quelqu'un de
débutant qui veut démarrer avec mutt.&lt;/p&gt;
&lt;p&gt;Depuis le logiciel utilisé pour se connecter en IMAP sur mon compte et récupérer
les nouveaux messages, jusqu'au client SMTP qui s'occupe de les envoyer, en
passant par tous les petits trucs de configuration que j'utilise pour gérer mes
différentes boîtes mail, je vais essayer d'être à peu près exhaustif.&lt;/p&gt;
&lt;p&gt;Précisons dès maintenant que le but de cette est de présenter une configuration
&lt;em&gt;faite pour fonctionner avec mutt&lt;/em&gt;. Elle est adaptable pour un autre client mail
minimaliste, mais si vous voulez utiliser un gros logiciel qui fait du
tout-en-un (comme Thunderbird), ça n'est pas du tout pertinent de suivre ce
tutoriel.&lt;/p&gt;
&lt;p&gt;Je vais commencer par les trucs simples et nécessaires pour finir sur les trucs
et astuces divers qui rendent mes fichiers de configuration longs et compliqués,
qui maximisent le confort d'utilisation et qui constituent un exemple de la
puissance potentielle de mutt (ou au moins d'une petite partie).&lt;/p&gt;
&lt;p&gt;Un détail technique : ce tutoriel décrit la configuration de mon laptop, qui
tourne sous Debian Sid. Il devrait cependant être adaptable sans problème pour
n'importe quelle machine sous Linux et probablement aussi sous d'autres systèmes
Unix : on ne manipule que des fichiers de config' dans le $HOME et tous les
logiciels utilisés sont disponibles sous n'importe quelle distribution.&lt;/p&gt;
&lt;p&gt;Donc, dans l'ordre.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Étape 0 : Introduction ← vous êtes ici !&lt;/li&gt;
&lt;li&gt;Étape 1 : &lt;a href="client-mail-1-offlineimap.html"&gt;Synchronisation IMAP avec
  OfflineIMAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 2 : &lt;a href="client-mail-2-msmtp.html"&gt;Envoi d'e-mails avec msmtp et msmtpq&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 3 : &lt;a href="client-mail-3-mutt.html"&gt;Configuration de mutt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 3 bis : &lt;a href="client-mail-3bis-mutt.html"&gt;Dose supplémentaire de mutt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 4 : &lt;a href="client-mail-4-gpg.html"&gt;Chiffrement et signature avec PGP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bonne lecture !&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Gérer ses mails en local : étape 1, sychronisation IMAP avec OfflineIMAP.</title><link href="https://desfontain.es/blogue/client-mail-1-offlineimap.html" rel="alternate"></link><published>2014-04-08T00:00:00+02:00</published><updated>2014-05-27T00:00:00+02:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2014-04-08:/blogue/client-mail-1-offlineimap.html</id><summary type="html">&lt;p&gt;Comment se connecter à un serveur IMAP et synchroniser ses mails avec OfflineIMAP.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;span class='notlettrine'&gt;C&lt;/span&gt;e billet fait partie d'une série d'articles
présentant la façon dont je gère mes mails en local. Si vous êtes arrivés là
sans lire l'introduction, c'est probablement une bonne idée de commencer par le
début.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Étape 0 : &lt;a href="client-mail-0-introduction.html"&gt;Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 1 : Synchronisation IMAP avec OfflineIMAP ← vous êtes ici !&lt;/li&gt;
&lt;li&gt;Étape 2 : &lt;a href="client-mail-2-msmtp.html"&gt;Envoi d'e-mails avec msmtp et msmtpq&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 3 : &lt;a href="client-mail-3-mutt.html"&gt;Configuration de mutt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 3 bis : &lt;a href="client-mail-3bis-mutt.html"&gt;Dose supplémentaire de mutt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 4 : &lt;a href="client-mail-4-gpg.html"&gt;Chiffrement et signature avec PGP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;span class='lettrine'&gt;D&lt;/span&gt;&lt;strong&gt;onc&lt;/strong&gt;, OfflineIMAP est un utilitaire qui va
aller se connecter à un serveur IMAP et copier tout ce qu'il y a dedans. En
fait, il va même faire mieux que ça : il va synchroniser tout ce qui se passe
d'un côté de l'autre, pour que ce soit toujours le même contenu qui soit sur le
serveur et sur le client. Par exemple, si je me connecte avec OfflineIMAP à une
adresse GMail, que je récupère un message non lu et que je l'ouvre avec un
client mail, à la prochaine exécution de OfflineIMAP, il va envoyer au serveur
« C'est bon, tu peux noter que ce mail a été lu ». De la même façon, si je
supprime un mail du côté client, ça va le supprimer sur le serveur - bien
entendu, ce comportement par défaut peut être changé.&lt;/p&gt;
&lt;p&gt;Donc, commençons par le début. &lt;/p&gt;
&lt;h1 id="installation-et-configuration"&gt;Installation et configuration&lt;/h1&gt;
&lt;p&gt;On installe OfflineIMAP :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;aptitude install offlineimap
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;on crée un dossier pour mettre les mails qu'on va récupérer :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mkdir ~/Mail
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et on modifie le fichier de config', &lt;code&gt;~/.offlineimaprc&lt;/code&gt; (en le créant si ça n'a
pas été fait automatiquement lors de l'installation).&lt;/p&gt;
&lt;p&gt;Le fichier de config' de OfflineIMAP est très simple à comprendre et à modifier.
Il commence par une section &lt;code&gt;[general]&lt;/code&gt; qui va contenir des morceaux de
configuration globale :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[general]&lt;/span&gt;
&lt;span class="na"&gt;accounts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;dam,spam,ddf&lt;/span&gt;
&lt;span class="na"&gt;ui&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;quiet&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ici, la ligne &lt;code&gt;accounts = dam,spam,ddf&lt;/code&gt; déclare les différents comptes auxquels
il va se connecter, et la ligne &lt;code&gt;ui = quiet&lt;/code&gt; signifie que lorsqu'on lance
&lt;code&gt;offlineimap&lt;/code&gt;, on ne veut pas qu'il pose de questions à l'utilisateur (ce qui
est logique, étant donné qu'on va exécuter cette commande automatiquement plus
tard). Changez &lt;code&gt;dam,spam,ddf&lt;/code&gt; en des noms (quelconques) pour reconnaître vos
différentes adresses mail avant de poursuivre.&lt;/p&gt;
&lt;p&gt;Pour chaque compte &lt;code&gt;c&lt;/code&gt; ainsi défini, on va ajouter trois sections : &lt;code&gt;[Account
c]&lt;/code&gt;, &lt;code&gt;[Repository c_local]&lt;/code&gt; et &lt;code&gt;[Repository c_remote]&lt;/code&gt;. Voici par exemple ce que
contient la section pour mon compte nommé &lt;code&gt;dam&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dam&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;
&lt;span class="n"&gt;localrepository&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;damien_local&lt;/span&gt;
&lt;span class="n"&gt;remoterepository&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;damien_remote&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Repository&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dam_local&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Maildir&lt;/span&gt;
&lt;span class="n"&gt;localfolders&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;Mail&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ikura_damien&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Repository&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dam_remote&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IMAP&lt;/span&gt;
&lt;span class="n"&gt;remotehost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;desfontain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;es&lt;/span&gt;
&lt;span class="n"&gt;remoteuser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;damien&lt;/span&gt;
&lt;span class="n"&gt;remotepass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nyyunvygbgururyvksbffvy&lt;/span&gt;
&lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;yes&lt;/span&gt;
&lt;span class="n"&gt;sslcacertfile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;certs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ca&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;certificates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;crt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;La plupart des lignes se comprennent immédiatement.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les trois premières sont juste des déclarations pour la suite.&lt;/li&gt;
&lt;li&gt;La section &lt;code&gt;[Repository dam_local]&lt;/code&gt; contient des informations comme le type de
  la boîte mail locale (« Veut-on stocker tous ses mails dans un seul gros
  fichier ou bien plutôt avoir un fichier par e-mail dans un gros dossier ? » -
  la bonne réponse à cette question est « un fichier par e-mail », d'où le type
  &lt;code&gt;Maildir&lt;/code&gt; et non pas &lt;code&gt;Mailbox&lt;/code&gt;), et le dossier qui va contenir les mails de ce
  compte.&lt;/li&gt;
&lt;li&gt;La section &lt;code&gt;[Repository dam_remote]&lt;/code&gt; contient le type de la connexion
  distante, l'adresse du serveur, l'utilisateur, le mot de passe, le fait qu'on
  utilise SSL et l'emplacement des certificats. Si votre adresse est
  &lt;code&gt;truc@machin.com&lt;/code&gt;, vous avez probablement envie de remplacer &lt;code&gt;damien&lt;/code&gt; par
  &lt;code&gt;truc&lt;/code&gt; et &lt;code&gt;desfontain.es&lt;/code&gt; par &lt;code&gt;imap.machin.com&lt;/code&gt;, ou &lt;code&gt;machin.com&lt;/code&gt;, ou encore
  autre chose suivant le nom du serveur IMAP auquel vous voulez vous connectez.
  Les noms des serveurs IMAP des principaux fournisseurs d'accès sont trouvables
  &lt;a href="http://www.commentcamarche.net/faq/893-parametres-de-serveurs-pop-imap-et-smtp-des-principaux-fai"&gt;par
  ici&lt;/a&gt;.
  Bien sûr, il faut aussi remplacer le mot de passe. Les deux commandes
  concernant SSL sont &lt;em&gt;importantes&lt;/em&gt;, sans ça, votre mot de passe va joyeusement
  voyager en clair jusqu'au serveur.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cette configuration marche si vous avez votre propre serveur IMAP, et fonctionne
pour à peu près tous les fournisseurs de mail… Sauf GMail, qui a une
configuration aussi bizarre que décriée par ceux qui programment des logiciels
comme OfflineIMAP. Pour synchroniser une adresse GMail, la section &lt;code&gt;remote&lt;/code&gt; doit
ressembler à :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Gmail&lt;/span&gt;
&lt;span class="nx"&gt;remoteuser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ddfontaines&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;gmail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt;
&lt;span class="nx"&gt;remotepass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;eryrnfrgursnyfrcebcurg&lt;/span&gt;
&lt;span class="nx"&gt;realdelete&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;no&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;où &lt;code&gt;realdelete&lt;/code&gt; vaut &lt;code&gt;no&lt;/code&gt; si l'on veut que supprimer un mail en local le mette
dans la corbeille de GMail, et &lt;code&gt;yes&lt;/code&gt; si on veut le supprimer du serveur « pour
de vrai ».&lt;/p&gt;
&lt;h1 id="automatisation-avec-cron"&gt;Automatisation avec cron&lt;/h1&gt;
&lt;p&gt;On n'a clairement pas envie de taper &lt;code&gt;offlineimap&lt;/code&gt; dans une console à chaque
fois que l'on veut récupérer ses mails. Il convient donc de dire au système de
faire ça tout seul comme un grand. Pour ça, on utilise &lt;code&gt;cron&lt;/code&gt;, installé de base
sous Debian et dérivés, programme qui lit un fichier de configuration et exécute
les commandes qu'il y a dedans à intervalles réguliers. Pour modifier ce
fichier, on tape dans une console :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;`crontab -e`
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et on rajoute une ligne ressemblant à ça :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;`*/2 &lt;span class="gs"&gt;* *&lt;/span&gt; * * /usr/bin/offlineimap &amp;gt; /dev/null 2&amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;en remplaçant les deux &lt;code&gt;/dev/null&lt;/code&gt; par les endroits où on veut logger ce que
renvoie la commande, si on a envie de le faire. Le &lt;code&gt;*/2 * * * *&lt;/code&gt; signifie
« toutes les deux minutes », et on peut le modifier pour changer la fréquence à
laquelle on veut que le système aille chercher les nouveaux messages. Pour plus
d'informations sur la syntaxe de cron, on peut aller voir &lt;a href="https://fr.wikipedia.org/wiki/Crontab"&gt;sa page
Wikipédia&lt;/a&gt;, par exemple.&lt;/p&gt;
&lt;p&gt;Il y aurait plus à dire sur OfflineIMAP, notamment la possibilité de ne
récupérer que certains dossiers d'un compte sur un serveur IMAP, mais ça sort du
cadre de ce billet.&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Gérer ses mails en local : étape 2, envoi d'e-mails avec msmtp et msmtpq.</title><link href="https://desfontain.es/blogue/client-mail-2-msmtp.html" rel="alternate"></link><published>2014-04-08T00:00:00+02:00</published><updated>2014-05-27T00:00:00+02:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2014-04-08:/blogue/client-mail-2-msmtp.html</id><summary type="html">&lt;p&gt;Comment envoyer des mails depuis son client local avec msmtp.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;span class='notlettrine'&gt;C&lt;/span&gt;e billet fait partie d'une série d'articles
présentant la façon dont je gère mes mails en local. Si vous êtes arrivés là
sans lire l'introduction, c'est probablement une bonne idée de commencer par le
début.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Étape 0 : &lt;a href="client-mail-0-introduction.html"&gt;Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 1 : &lt;a href="client-mail-1-offlineimap.html"&gt;Synchronisation IMAP avec
  OfflineIMAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 2 : Envoi d'e-mails avec msmtp et msmtpq ← vous êtes ici !&lt;/li&gt;
&lt;li&gt;Étape 3 : &lt;a href="client-mail-3-mutt.html"&gt;Configuration de mutt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 3 bis : &lt;a href="client-mail-3bis-mutt.html"&gt;Dose supplémentaire de mutt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 4 : &lt;a href="client-mail-4-gpg.html"&gt;Chiffrement et signature avec PGP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;span class='lettrine'&gt;D&lt;/span&gt;&lt;strong&gt;onc&lt;/strong&gt;, maintenant qu'on est arrivés à récupérer
nos e-mails, on aimerait bien en envoyer. Mutt, le client mail, ne sait pas
faire ça - ou pour être précis, depuis la dernière version, il sait faire ça,
mais l'implémentation est récente et ne permet pas de faire une file d'attente
de messages à envoyer lorsqu'on est hors ligne (on y reviendra). J'utilise donc
msmtp qui fait bien son travail, qui est simple à configurer et qui vient avec
une solution de queuing.&lt;/p&gt;
&lt;h1 id="configuration-de-base"&gt;Configuration de base&lt;/h1&gt;
&lt;p&gt;Sans surprise, on installe msmtp :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;aptitude install msmtp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et on ouvre le fichier &lt;code&gt;~/.msmtprc&lt;/code&gt; pour modifier la configuration.&lt;/p&gt;
&lt;p&gt;Tout en haut du fichier, on trouve la configuration qui dit qu'on veut utiliser
ssl (toujours pour ne pas envoyer son mot de passe en clair), qui précise qu'on
veut avoir la méthode d'authentification la plus sûre disponible, qui choisit le
fichier dans lequel msmtp va écrire des logs, et qui désactive les autres
méthodes d'enregistrement de logs.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;defaults
tls on
tls_starttls on
auth on
logfile /.msmtp.log
syslog off
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Puis, pour chaque compte SMTP auquel on veut se connecter, on ajoute un bloc de
configuration qui ressemble à ça :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dam&lt;/span&gt;
&lt;span class="k"&gt;host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;desfontain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;es&lt;/span&gt;
&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;465&lt;/span&gt;
&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;damien&lt;/span&gt;
&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gungjbhyqunirorraorggre&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;damien&lt;/span&gt;&lt;span class="nv"&gt;@desfontai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nes&lt;/span&gt;
&lt;span class="n"&gt;tls_trust_file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;certs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ca&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;certificates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;crt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;en remplaçant &lt;code&gt;smtp.desfontain.es&lt;/code&gt; et &lt;code&gt;465&lt;/code&gt; par l'adresse de votre serveur SMTP
et le port sur lequel il écoute (encore une fois, c'est trouvable &lt;a href="http://www.commentcamarche.net/faq/893-parametres-de-serveurs-pop-imap-et-smtp-des-principaux-fai"&gt;par
ici&lt;/a&gt;
pour les principaux fournisseurs de mails), &lt;code&gt;damien&lt;/code&gt; par ce qu'il y a à gauche
du @ dans votre adresse mail, et en changeant le mot de passe et l'adresse mail.
À partir de là, pour envoyer un mail écrit dans un fichier &lt;code&gt;f&lt;/code&gt;, la commande à
exécuter sera &lt;code&gt;msmtp -a dam &amp;lt; f&lt;/code&gt; pour utiliser le bloc de configuration qui
commence par &lt;code&gt;account dam&lt;/code&gt;. Ne le faites pas, il faudrait que vous écriviez les
headers à la main et ça serait un peu pénible =)&lt;/p&gt;
&lt;p&gt;On peut rajouter autant de blocs de ce type que l'on veut dans le &lt;code&gt;.msmtprc&lt;/code&gt;,
pour pouvoir appeller msmtp avec différents arguments (et ainsi pouvoir se
connecter à différents serveurs SMTP, ou au même serveur avec plusieurs comptes
différents). Ah oui, dernière chose importante : le fichier &lt;code&gt;.msmtprc&lt;/code&gt; doit
avoir des permissions fixes pour que msmtp accepte de le lire, donc vous
aurez peut-être besoin de lancer un &lt;code&gt;chmod 600 ~/.msmtprc&lt;/code&gt; pour que ça
fonctionne.&lt;/p&gt;
&lt;h1 id="faire-du-queuing-avec-msmtpq"&gt;Faire du queuing avec msmtpq&lt;/h1&gt;
&lt;p&gt;Donc, on a un système d'envoi de mails qui fonctionne. Maintenant, si on veut
répondre à un mail alors qu'on n'est pas connecté à Internet (dans un train, un
avion, une salle de cours au wifi pourri de Paris 7…), la seule solution est de
rédiger le mail, de l'enregistrer en brouillon dans le client mail, et de penser
à l'envoyer plus tard lorsqu'on sera connecté. C'est pénible et ça a l'air
automatisable… Ce qui me fait une excellente introduction pour msmtpq, un script
qui permet de mettre tous les mails envoyés dans un dossier (qui agit comme une
&lt;em&gt;queue&lt;/em&gt;, ou &lt;em&gt;file d'attente&lt;/em&gt; en bon français), et de les envoyer sur Internet
dès que c'est possible.&lt;/p&gt;
&lt;p&gt;Si vous avez installé msmtp par votre gestionnaire de paquets, vous avez déjà
msmtpq qui traîne sur votre machine à un endroit obscur :
&lt;code&gt;/usr/share/doc/msmtp/examples/msmtpq&lt;/code&gt;. On va donc se connecter en root,
mettre le script dans un endroit accessible pour l'utilisateur et changer
trois lignes pour le configurer correctement.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;su -
cd /usr/share/doc/msmtp/examples/msmtpq
cp msmtp* /usr/local/bin/
chmod +x /usr/local/bin/msmtpq /usr/local/bin/msmtp-queue
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On ouvre le fichier /usr/local/bin/msmtpq, toujours en root, avec son
éditeur préféré, et il y a deux lignes à modifier : celle qui commence par
&lt;code&gt;Q=&lt;/code&gt; et celle qui commence par &lt;code&gt;LOG=&lt;/code&gt;. Dans les deux cas, il faut remplacer la
valeur par défaut par (respectivement) le dossier dans lequel on a envie de
stocker les mails de la file d'attente, et le fichier dans lequel on veut
logger l'activité de msmtpq. Par exemple, chez moi :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Q=~/.msmtp.queue
LOG=~/.msmtp.queue.log
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;il faut créer le dossier et le fichier en question et leur donner les bonnes
permissions, en utilisateur normal cette fois-ci :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mkdir ~/.msmtp.queue
chmod 700 ~/.msmtp.queue
chmod 600 .msmtp.log
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et c'est tout ! Les derniers bouts de config' nécessaires pour utiliser
msmtpq en pratique concernent mutt, donc on y reviendra.&lt;/p&gt;
&lt;h1 id="automatisation-du-processus"&gt;Automatisation du processus&lt;/h1&gt;
&lt;p&gt;De la même façon que pour OfflineIMAP, on a envie de faire
régulièrement des appels à msmtpq pour lui dire « si la file d'attente n'est
pas vide, réessaie d'envoyer les mails qu'il y a dedans ». Ça se fait à la main
avec la commande &lt;code&gt;msmtp-queue -r&lt;/code&gt;, donc la ligne à rajouter dans le fichier
qui s'ouvre en tapant &lt;code&gt;crontab -e&lt;/code&gt; est :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;*/2 &lt;span class="gs"&gt;* *&lt;/span&gt; * * /usr/local/bin/msmtp-queue -r &amp;gt; /dev/null 2&amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et voilà le travail.&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Gérer ses mails en local : étape 3 bis, du rab' de mutt :D</title><link href="https://desfontain.es/blogue/client-mail-3bis-mutt.html" rel="alternate"></link><published>2014-04-08T00:00:00+02:00</published><updated>2015-04-27T00:00:00+02:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2014-04-08:/blogue/client-mail-3bis-mutt.html</id><summary type="html">&lt;p&gt;On trie, lit, et rédige des mails en local avec mutt.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;span class='notlettrine'&gt;C&lt;/span&gt;e billet fait partie d'une série d'articles
présentant la façon dont je gère mes mails en local. Si vous êtes arrivés là
sans lire l'introduction, c'est probablement une bonne idée de commencer par le
début.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Étape 0 : &lt;a href="client-mail-0-introduction.html"&gt;Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 1 : &lt;a href="client-mail-1-offlineimap.html"&gt;Synchronisation IMAP avec
  OfflineIMAP&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Étape 2 : &lt;a href="client-mail-2-msmtp.html"&gt;Envoi d'e-mails avec msmtp et msmtpq&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 3 : &lt;a href="client-mail-3-mutt.html"&gt;Configuration de mutt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 3 bis : Dose supplémentaire de mutt ← vous êtes ici !&lt;/li&gt;
&lt;li&gt;Étape 4 : &lt;a href="client-mail-4-gpg.html"&gt;Chiffrement et signature avec PGP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;span class='lettrine'&gt;D&lt;/span&gt;&lt;strong&gt;onc&lt;/strong&gt;, au cas où je ne vous ai pas convaincu
que mutt c'était le Bien™, que l'article précédent vous a laissé perplexes et
que vous êtes en train de vous dire que c'est quand même beaucoup de travail
pour avoir quelque chose de vraiment chouette à utiliser, je vais faire un
second essai pour vous convaincre. Entre autres, je vais essayer de vous
convaincre qu'on peut ajouter des fonctionnalités vraiment avancées et
personnalisées si on a envie, tout comme on peut émuler à peu près n'importe
quel avantage d'un client mail grand public.&lt;/p&gt;
&lt;h1 id="quelques-macros-pour-commencer"&gt;Quelques macros pour commencer&lt;/h1&gt;
&lt;p&gt;Quand j'ai commencé à recevoir un nombre de mails par jour qui se comptait en
dizaines et non plus en unités, il s'est vite posé le problème des mails
importants qui se font enterrer sous des piles de messages qui le sont moins. Je
me suis donc mis à utiliser la fonction « flag » (&lt;code&gt;F&lt;/code&gt; comme raccourci, pour
faire apparaître un message en surbrillance si on a un jeu de couleurs adapté)
pour marquer tous les mails auxquels je devais répondre, ou qui contenaient
quelque chose dont je devais m'occuper. Malheureusement, ça ne suffisait pas,
une fois que le message en question était trop loin dans ma liste de mails pour
apparaître, j'oubliais son existence.&lt;/p&gt;
&lt;p&gt;J'ai trouvé une solution qui me convient en utilisant des macros qui listent les
messages susceptibles d'être importants, et n'affichent que ceux-là. J'utilise
des raccourcis commençant par une virgule, parce que c'est la touche qui fait
office de &lt;code&gt;&amp;lt;Leader&amp;gt;&lt;/code&gt; dans ma configuration de vim, du coup j'ai l'habitude de la
combiner avec d'autres. Donc, les messages dont je suis susceptible de devoir
m'occuper sont les messages marqués comme importants, ceux que je n'ai pas
encore lus, ainsi que les récents auxquels je n'ai pas répondu alors qu'ils me
sont adressés personnellement. Ça donne :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;macro index ,r &amp;quot;l((~N|~O|~F)!~D!~P)|(~d&amp;lt;1w!~Q)\n&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ceux qui sont &lt;em&gt;systématiquement&lt;/em&gt; dignes d'intérêt sont les messages non lus, ou
ceux explicitement notés comme importants (avec la fonction de flag) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;macro index ,i &amp;quot;l((~N|~O|~F)!~D!~P)\n&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et on a besoin d'un raccourci facile pour revenir à la vue normale, où l'on voit
tous les mails :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;macro index ,, &amp;quot;l~A\n&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ce qui fait que cette astuce n'est pas juste un bout de config' dont je ne me
sers pas, c'est qu'en fait, j'exécute la commande &lt;code&gt;,r&lt;/code&gt; (qui montre les messages
potentiellement intéressants) à chaque fois que j'ouvre un dossier dans mutt :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;folder-hook . push &amp;#39;,r=*&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et cette vue-là contient (en pratique) toujours les mails marqués comme
importants, parce qu'elle cache tous les mails auxquels j'ai répondu ou ceux
dont je ne suis pas le destinataire.&lt;/p&gt;
&lt;h1 id="gerer-les-pieces-jointes-et-les-mails-en-html"&gt;Gérer les pièces jointes et les mails en HTML&lt;/h1&gt;
&lt;p&gt;Dans un client mail graphique, on peut en général naviguer dans un menu pour
indiquer au programme avec quoi on veut ouvrir les pièces jointes. Dans mutt,
cette configuration se fait via le fichier indiqué dans la variable
&lt;code&gt;maicap_path&lt;/code&gt; du &lt;code&gt;.muttrc&lt;/code&gt;. Dans le mien, il y a :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set mailcap_path = ~/.mutt/mailcap
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et dans le fichier en question, on met une ligne par type de fichier. Par
exemple, dans le mien, on trouve :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;application/pdf; chromium %s
image/*; feh %s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;pour dire d'ouvrir les PDFs avec &lt;a href="http://www.chromium.org/Home"&gt;Chromium&lt;/a&gt; (oui,
c'est ce que j'utilise comme lecteur PDF, faute de mieux), et les fichiers de
type « image » (jpg, png, etc.) avec &lt;a href="http://feh.finalrewind.org/"&gt;feh&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le fichier mailcap sert aussi à indiquer comment on veut lire les mails en HTML.
Ces atrocités ne devraient pas exister et les auteurs des clients mails qui en
envoient par défaut devraient mourir par le feu, mais dans la vraie vie, les
mails en HTML existent, on les reçoit et il faut bien en faire quelque chose.
J'utilisais une solution sale à base de &lt;a href="http://w3m.sourceforge.net/"&gt;w3m&lt;/a&gt; à une
époque, et puis &lt;a href="http://a3nm.net/"&gt;a3nm&lt;/a&gt; m'a soufflé la solution tout aussi
crade mais un peu plus efficace suivante :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;text/html; ~/.bin/mutt_bgrun firefox %s &amp;gt; /dev/null 2&amp;gt; /dev/null; nametemplate=%s.html
text/html; iconv -f %{charset} %s | elinks -dump %{charset} -dump -dump-color-mode 1 -dump-width 76 /dev/stdin 2&amp;gt;/dev/null | sed &amp;#39;s/ * $//&amp;#39; | sed &amp;#39;s/   //&amp;#39; ; copiousoutput
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;elle utilise links par défaut pour afficher le corps du message (ce qui donne en
général un résultat, heu, pas très beau, mais si le contenu n'est pas trop
bourré de CSS affreux, ça reste lisible, et ça permet d'afficher rapidement les
liens présents dedans). Si ça ne suffit pas, alors je tape &lt;code&gt;v&lt;/code&gt; pour ouvrir la
liste des fichiers constituant le mail, et si je sélectionne celui en &lt;code&gt;.html&lt;/code&gt;,
c'est Firefox qui me l'ouvre dans un nouvel onglet. C'est assez sale parce qu'il
faut un script supplémentaire (&lt;a href="mutt_bgrun"&gt;disponible ici&lt;/a&gt;, ce n'est pas moi
qui l'ai écrit) et que l'appel à ELinks est prévue pour fonctionner avec une
taille de fenêtre fixe (ici, 76 caractères de large).&lt;/p&gt;
&lt;p&gt;Le contenu complet de mon fichier &lt;code&gt;mailcap&lt;/code&gt; est disponible &lt;a href="mailcap"&gt;par ici&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="un-script-pour-les-etourdis-dans-mon-genre"&gt;Un script pour les étourdis dans mon genre&lt;/h1&gt;
&lt;p&gt;Ça va paraître absurde, mais une des choses qui m'a le plus manqué quand je suis
passé de l'interface Web de GMail à mutt, c'est la fonctionnalité (ou peut-être
est-ce une extension, je ne me souviens plus) « afficher un message de
confirmation lorsqu'on essaie d'envoyer un message dont le contenu a l'air de
sous-entendre qu'il faudrait qu'il y ait une pièce jointe, mais qu'il n'y en a
pas ». Parce que les mails suivis immédiatement d'un second mail « Oups, j'ai
oublié la pièce jointe, la voilà », ça ne fait pas très sérieux (surtout quand
on oublie la pièce jointe dans le second mail (ne riez pas)).&lt;/p&gt;
&lt;p&gt;Mais, magie des possibilités infinies de configuration de mutt, il suffit de
faire un script qui fait ça. J'en ai trouvé un sur le wiki de mutt, que je me
souviens d'avoir modifié à plusieurs reprises mais je ne me souviens plus
pourquoi exactement. La version que j'utilise est disponible &lt;a href="verifyattachment"&gt;par
là&lt;/a&gt;, et l'idée est de remplacer l'appel à msmtpq de la
variable &lt;code&gt;sendmail&lt;/code&gt; du &lt;code&gt;.muttrc&lt;/code&gt; par un appel à ce script. Si on l'appelle avec
des paramètres, il appellera msmtpq avec les mêmes paramètres, donc ça marche
bien (et ça m'a évité d'être ridicule un nombre de fois ridiculeusement élevé).
Il nécessite zenity pour afficher le message de confirmation.&lt;/p&gt;
&lt;h1 id="t-prot-pour-economiser-de-la-place-sur-lecran"&gt;t-prot, pour économiser de la place sur l'écran&lt;/h1&gt;
&lt;p&gt;Je n'ai rien contre les gens qui répondent aux mails en coupant le message
original en morceaux, et en répondant entre les morceaux : lorsque le mail
concerne plusieurs points distincts, c'est plutôt pratique et je fais moi-même
comme ça de temps en temps. Le problème, c'est que les informations moins utiles
(les anciens messages auxquels on répond, qui portent le joli nom de TOFU)
peuvent parfois prendre une place démesurée sur l'écran, si on ne prend pas la
peine de couper le passage cité et qu'il y a plusieurs réponses imbriquées. Sur
certaines mailing-lists, c'est un vrai problème, parce que six pages successives
pour un message où il n'y a qu'une vingtaine de lignes ajoutées par rapport aux
messages précédents, c'est pas du tout pratique.&lt;/p&gt;
&lt;p&gt;Et donc sans surprise, des gens ont écrit un script qui résout le problème, et
qui tronque le TOFU pour faciliter la lecture du nouveau contenu. Ça s'appelle
t-prot, c'est disponible &lt;a href="http://www.escape.de/~tolot/mutt/"&gt;par ici&lt;/a&gt; et
l'installation consiste juste à le mettre quelque part dans son &lt;code&gt;$PATH&lt;/code&gt; en le
rendant exécutable. Puis, dans le .muttrc, il faut ajouter quelques lignes pour
l'invoquer automatiquement… &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set display_filter=&amp;#39;t-prot -cemt --pgp-move-vrf --pgp-short --bigq=10,4 -Mmutt -S -s -w&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;… quelques macros pour s'en servir aisément (ici, 0 pour voir le message
original, et 1 pour réactiver le tronquage du TOFU)…&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;macro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;generic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;:unset display_filter\n&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Turn TOFU protection off&amp;quot;&lt;/span&gt;
&lt;span class="nt"&gt;macro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;generic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;:set display_filter=&amp;#39;t-prot -cemt --bigq=10,4 -M=mutt -S -s -w&amp;#39;\n&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Turn TOFU protection on&amp;quot;&lt;/span&gt;
&lt;span class="nt"&gt;macro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;pager&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;:unset display_filter; exec exit\n:exec display-message\n&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Turn TOFU protection off&amp;quot;&lt;/span&gt;
&lt;span class="nt"&gt;macro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;pager&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;:set display_filter=&amp;#39;t-prot -cemt --bigq=10,4 -M=mutt -S -s -w&amp;#39;; exec exit\n:exec display-message\n&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Turn TOFU protection on&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;… et un peu de couleurs pour qu'on voie quand t-prot a fait disparaître quelque
chose :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;color body      brightmagenta   black   &amp;quot;^\\[---.*&amp;quot;
color body      green           black   &amp;quot;^#v[-+]&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;si vous êtes inscrits sur des listes de diffusion, ce truc tout bête a le
potentiel de vous changer la vie :-)&lt;/p&gt;
&lt;h1 id="indexation-efficace-avec-notmuch"&gt;Indexation efficace avec notmuch&lt;/h1&gt;
&lt;p&gt;Une des choses qui a probablement fait le succès de GMail, c'est son outil de
recherche de messages : rapide, efficace et facile à utiliser. Mutt a aussi un
système de recherche utilisant des expressions régulières, et qui est donc très
puissant et permet de faire des requêtes qui correspondent exactement à ce qu'on
recherche. Le problème, c'est que lorsqu'on commence à vouloir rechercher un
terme présent dans le corps d'un message parmi une boîte mail en contenant
plusieurs milliers… Ça prend un temps linéaire en la taille de la boîte et donc
c'est un peu long.&lt;/p&gt;
&lt;p&gt;Mais joie, bonheur et allégresse : il existe un indexeur,
&lt;a href="http://notmuchmail.org/"&gt;Notmuch&lt;/a&gt;, qui permet de rendre le traitement de ce
type de requête instantanée. Ça prend un peu de place sur le disque dur (j'ai
4 Go de mails, et les bases de données de notmuch nécessitent 700 Mo), mais vu
le prix du Go de nos jours, c'est vraiment pas un problème. Donc, pour installer
cette petite merveille, on passe par les paquets :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;aptitude install notmuch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et on a un peu de configuration à faire une fois que c'est fait, mais il n'y a
même pas besoin de modifier le moindre fichier de configuration. Il suffit en
effet de lancer la commande :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;notmuch setup
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et de répondre gentiment aux questions permettant au programme de savoir quels
sont les mails qui viennent de nous, où ils se trouvent sur le système, etc.&lt;/p&gt;
&lt;p&gt;Une fois que c'est fait, on rajoute quelques macros dans mutt pour utiliser la
recherche par notmuch de la façon la plus naturelle possible :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;macro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;&amp;lt;enter-command&amp;gt;unset wait_key&amp;lt;enter&amp;gt;&amp;lt;shell-escape&amp;gt;notmuch-mutt --prompt search&amp;lt;enter&amp;gt;&amp;lt;change-folder-readonly&amp;gt;~/.cache/notmuch/mutt/results&amp;lt;enter&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;search mail (using notmuch)&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;macro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;&amp;lt;enter-command&amp;gt;unset wait_key&amp;lt;enter&amp;gt;&amp;lt;shell-escape&amp;gt;read -p &amp;#39;notmuch query: &amp;#39; x; echo \$x &amp;gt;~/.cache/mutt_terms&amp;lt;enter&amp;gt;&amp;lt;limit&amp;gt;~i \&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;\`&lt;/span&gt;&lt;span class="n"&gt;notmuch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;search&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;--output=messages \$(cat ~/.cache/mutt_terms) | head -n 600 | perl -le &amp;#39;@a=&amp;lt;&amp;gt;;chomp@a;s/\^id:// for@a;$,=\&amp;quot;|\&amp;quot;;print@a&amp;#39;\`\&amp;quot;&amp;lt;enter&amp;gt;&amp;quot; &amp;quot;show only messages matching a notmuch pattern&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ici, les touches S et L (respectivement « Search » et « Limit ») fonctionnent de
la même façon que leurs homologues en minuscules par défaut dans mutt, sauf
qu'ils utilisent le moteur de notmuch pour faire leur recherche. C'est aussi
simple que ça !&lt;/p&gt;
&lt;p&gt;On me signale dans l'oreillette que notmuch permet de faire des choses encore
plus cool que ça, par exemple de l'&lt;a href="http://notmuchmail.org/initial_tagging/"&gt;étiquetage de
messages&lt;/a&gt;, mais n'ayant jamais testé
cette fonctionnalité, je ne peux pas vous en dire grand-chose.&lt;/p&gt;
&lt;h1 id="conclusion-provisoire"&gt;Conclusion provisoire&lt;/h1&gt;
&lt;p&gt;Bon, cette fois, je ne crois pas avoir oublié grand-chose (mis à part
l'utilisation intensive de PGP qui mérite un article à part). Il faudrait
peut-être que je mentionne le réglage &lt;code&gt;sendmail_wait&lt;/code&gt; de mutt, qui est un
compromis relativement important entre le temps d'attente nécessaire pour mettre
un mail envoyé dans la file de msmtpq, et le temps que je me laisse pour
répondre « non » au script qui vérifie si je n'ai pas oublié une pièce jointe,
mais du coup, je ne sais pas trop dans quelle section en parler. Je verrai ça
plus tard.&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Gérer ses mails en local : étape 3, rendre le tout utilisable avec mutt !</title><link href="https://desfontain.es/blogue/client-mail-3-mutt.html" rel="alternate"></link><published>2014-04-08T00:00:00+02:00</published><updated>2014-05-27T00:00:00+02:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2014-04-08:/blogue/client-mail-3-mutt.html</id><summary type="html">&lt;p&gt;On trie, lit, et rédige des mails en local avec mutt.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;span class='notlettrine'&gt;C&lt;/span&gt;e billet fait partie d'une série d'articles
présentant la façon dont je gère mes mails en local. Si vous êtes arrivés là
sans lire l'introduction, c'est probablement une bonne idée de commencer par le
début.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Étape 0 : &lt;a href="client-mail-0-introduction.html"&gt;Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 1 : &lt;a href="client-mail-1-offlineimap.html"&gt;Synchronisation IMAP avec
  OfflineIMAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 2 : &lt;a href="client-mail-2-msmtp.html"&gt;Envoi d'e-mails avec msmtp et msmtpq&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 3 : Configuration de mutt ← vous êtes ici !&lt;/li&gt;
&lt;li&gt;Étape 3 bis : &lt;a href="client-mail-3bis-mutt.html"&gt;Dose supplémentaire de mutt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Étape 4 : &lt;a href="client-mail-4-gpg.html"&gt;Chiffrement et signature avec PGP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;span class='lettrine'&gt;O&lt;/span&gt;&lt;strong&gt;n&lt;/strong&gt; commence enfin à en avoir fini avec la
configuration « sous le capot », et on va enfin pouvoir voir directement les
conséquences de nos bidouillages. Je vous présente donc Mutt, le client mail
moins pourri que les autres. &lt;/p&gt;
&lt;p&gt;&lt;sub&gt;C'est même, à traduction approximative près, leur &lt;a href="http://www.mutt.org/"&gt;slogan
officiel&lt;/a&gt;.&lt;/sub&gt;&lt;/p&gt;
&lt;p&gt;Mutt est un client mail en mode console qui, conformément à la philosophie Unix,
a été conçu pour être &lt;em&gt;uniquement&lt;/em&gt; un client mail, c'est à dire qui lit un
dossier de types Maildir, et qui permet de gérer son contenu efficacement. Il
est très rapide, efficace, clair, et surtout, configurable à l'infini.&lt;/p&gt;
&lt;h1 id="installation-et-premiers-pas"&gt;Installation et premiers pas&lt;/h1&gt;
&lt;p&gt;Pour l'installer, sans surprise, &lt;code&gt;aptitude install mutt&lt;/code&gt; en root fera l'affaire.
Pour le lancer, il suffit de lui préciser le dossier que l'on veut qu'il lise.
Par exemple :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mutt -f ~/Mail/ikura_damien
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;vu que dans mon &lt;code&gt;.offlineimaprc&lt;/code&gt;, j'avais indiqué ce dossier comme destination
d'une de mes boîtes mail.&lt;/p&gt;
&lt;p&gt;Je laisse faire au lecteur ses premiers pas dans mutt. Globalement, c'est plutôt
intuitif - &lt;code&gt;j&lt;/code&gt;/&lt;code&gt;k&lt;/code&gt; ou les flèches directionnelles pour se déplacer, &lt;code&gt;Entrée&lt;/code&gt;
pour ouvrir un mail, &lt;code&gt;q&lt;/code&gt; pour revenir au menu précédent… Dès qu'on cherche à
faire une action, il suffit de taper &lt;code&gt;?&lt;/code&gt; au clavier pour obtenir la liste des
commandes disponibles avec une description courte. On s'y fait assez vite, il
n'y a pas besoin d'un tutoriel détaillé comme pour vim, par exemple. Par contre,
par défaut, la configuration n'est pas très utilisable. Modifions donc le
fichier de config', &lt;code&gt;~/.muttrc&lt;/code&gt;, pour en faire un mutt aux petits oignons qui
fait exactement ce qu'on veut.&lt;/p&gt;
&lt;p&gt;Évidemment, en pratique, devoir taper quelque chose d'aussi comme &lt;code&gt;mutt -f
~/Mail/ikura_damien&lt;/code&gt; quand on veut ouvrir sa boîte mail, c'est affreusement
long, donc j'ai un alias dans mon &lt;code&gt;~/.bash_aliases&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;alias dam=&amp;quot;mutt -f ~/Mail/dam&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;où &lt;code&gt;dam&lt;/code&gt; est un lien symbolique vers &lt;code&gt;~/Mail/ikura_damien&lt;/code&gt; (ce qui permet de
changer de dossier &lt;em&gt;dans mutt&lt;/em&gt; en cliquant &lt;code&gt;c&lt;/code&gt;, et en entrant &lt;code&gt;=dam&lt;/code&gt;, au lieu de
&lt;code&gt;=ikura_damien&lt;/code&gt;).&lt;/p&gt;
&lt;h1 id="reglages-internes"&gt;Réglages internes&lt;/h1&gt;
&lt;h2 id="alias"&gt;Alias&lt;/h2&gt;
&lt;p&gt;Mutt a un système d'alias minimaliste que je trouve pratique. L'idée est de
taper « maman » dans le champ « To: » d'un mail qu'on veut envoyer, au lieu de
adressedemamaman@gmail.com. Pour ajouter un alias, appuyer sur &lt;code&gt;a&lt;/code&gt; alors qu'un
mail de la personne en question est sélectionné.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set alias_file=~/.muttalias
source ~/.muttalias
set reverse_alias
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Je sais que d'autres utilisent des logiciels de carnet d'adresses plus complexes
(abook, ou des systèmes basés sur ldbd) mais en ce qui me concerne, ça me
suffit.&lt;/p&gt;
&lt;h2 id="cache"&gt;Cache&lt;/h2&gt;
&lt;p&gt;Mutt a une fonction, désactivée par défaut, pour mettre certaines données (des
en-têtes ou même le contenu de messages) en cache quelque part. Ça permet,
notamment, de charger beaucoup plus rapidement le contenu de boîtes de réception
récemment ouvertes. Pour activer cette fonction, on peut par exemple créer un
dossier &lt;code&gt;cache&lt;/code&gt; dans le &lt;code&gt;~/.mutt&lt;/code&gt; et ajouter :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set header_cache = ~/.mutt/cache/headers
set message_cachedir = ~/.mutt/cache/bodies
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;dans le &lt;code&gt;~/.muttrc&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="identites-alternatives"&gt;Identités alternatives&lt;/h2&gt;
&lt;p&gt;Le comportement de mutt dépend parfois de la condition « est-ce que le message
courant est un message &lt;em&gt;reçu&lt;/em&gt;, ou un message &lt;em&gt;envoyé&lt;/em&gt; » (par exemple, si on
essaie de « répondre » à un message qu'on a envoyé, on a pas envie de se
répondre à soi-même…). Et comme tout ce qu'il sait faire, c'est lire le contenu
de dossiers, il n'a pas de méthode infaillible pour ça. Il faut donc l'aider
avec un morceau de configuration dans lequel on lui dit quelles adresses e-mail
sont les notres.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;alternates&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;.*@desfontain.es|ddfontaines@gmail.com&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1 id="configuration-specifique-au-dossier-dans-lequel-on-se-trouve"&gt;Configuration spécifique au dossier dans lequel on se trouve&lt;/h1&gt;
&lt;p&gt;C'est bien beau, tout ça, mais on aimerait bien que mutt interagisse avec le
reste du système. Par exemple, qu'il sache quelle commande exécuter lorsqu'on
lui dit d'envoyer un mail. Le paramètre pour ça s'appelle &lt;code&gt;sendmail&lt;/code&gt;. Assez
logiquement, si on veut utiliser msmtpq, il faudrait entrer :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set sendmail = &amp;quot;/usr/local/bin/msmtpq&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;sauf que c'est plus compliqué que ça : on veut utiliser le contenu du &lt;code&gt;.msmtprc&lt;/code&gt;
pour envoyer les e-mails de plusieurs façons différentes, suivant si on est dans
une boîte ou dans une autre.&lt;/p&gt;
&lt;p&gt;On peut faire ça dans mutt, en utilisant des &lt;em&gt;hooks&lt;/em&gt;. Dans le &lt;code&gt;.muttrc&lt;/code&gt;, on met
quelque chose de ce type :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;folder-hook +dam &amp;quot;source ~/.mutt/damien&amp;quot;
folder-hook +ikura_damien/.* &amp;quot;source ~/.mutt/damien&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;pour chaque dossier en local. Le fichier indiqué, ici &lt;code&gt;~/.mutt/damien&lt;/code&gt;, contient
des morceaux de configuration qui ne seront pris en compte que si le dossier
courant est &lt;code&gt;~/Mail/ikura_damien&lt;/code&gt; ou &lt;code&gt;~/Mail/dam&lt;/code&gt;. Dans le morceau de
configuration en question, on met donc plein de choses.&lt;/p&gt;
&lt;p&gt;On précise à msmtp la section de sa configuration à utiliser quand on veut
envoyer un mail : &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set sendmail = &amp;quot;/usr/local/bin/msmtpq -a damien&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;on envoie les mails en mettant le bon champ « From: » :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;damien@desfontai.nes&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;on se met en copie de chaque mail envoyé (pas mal de gens avec qui j'ai discuté
trouvent ça bizarre, moi j'aime bien voir sur une même page les mails que
j'envoie et ceux que je reçois) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;my_hdr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;bcc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;damien&lt;/span&gt;&lt;span class="nv"&gt;@desfontai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;du coup, ça ne sert à rien de garder une copie des mails envoyés dans un autre
dossier :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;unset record
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et enfin, on indique l'endroit où on veut stocker les brouillons :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set postponed=+&amp;quot;ikura_damien/drafts&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1 id="affichage-et-interface"&gt;Affichage et interface&lt;/h1&gt;
&lt;h2 id="moins-de-questions-plus-defficacite"&gt;Moins de questions, plus d'efficacité&lt;/h2&gt;
&lt;p&gt;Pas besoin de demander confirmation avant de sauver un message dans un dossier
ou lorsqu'un message est déplacé par un script :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set noconfirmappend
set move = no
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;pas non plus besoin de poser cinquante mille questions sur les headers lorsqu'on
répond à un mail :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set fast_reply
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;pour envoyer un mail, appuyer sur « Entrée » après avoir fermé l'éditeur, ça
paraît naturel :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;compose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;Return&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;send&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;message&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;par ailleurs, ouvrir les boîtes mails compressées naturellement, ça permet de
gagner du temps le jour où on en a l'utilité :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;open-hook \\.gz$ &amp;quot;gzip -cd %f &amp;gt; %t&amp;quot;
close-hook \\.gz$ &amp;quot;gzip -c %t &amp;gt; %f&amp;quot;
append-hook \\.gz$ &amp;quot;gzip -c %t &amp;gt;&amp;gt; %f&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et d'un coup, ça va déjà plus vite :-)&lt;/p&gt;
&lt;h2 id="utiliser-lediteur-de-son-choix"&gt;Utiliser l'éditeur de son choix&lt;/h2&gt;
&lt;p&gt;Évidemment, une grande partie du temps qu'on passe sur un client mail consiste à
envoyer des mails, donc le choix (et la bonne configuration) de l'éditeur de
texte utilisé est aussi important que celui du client mail lui-même.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set editor=&amp;quot;vim -c &amp;#39;set tw=70 et&amp;#39;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;J'utilise vim, avec ma configuration habituelle (que je détaillerai dans un
prochain billet, peut-être, un jour), en lui indiquant en plus d'utiliser des
lignes de 70 caractères, pour être non seulement en règle vis-à-vis de la &lt;a href="https://tools.ietf.org/html/rfc2822#section-2.1.1"&gt;RFC
sur le sujet&lt;/a&gt; mais pour avoir
un peu de marge (et que les réponses, qui vont décaler chaque ligne de deux
caractères en rajoutant les &lt;code&gt;&amp;gt;&lt;/code&gt;, respectent toujours la RFC).&lt;/p&gt;
&lt;p&gt;En passant, on en profite pour afficher les en-têtes du mail dans l'éditeur
lui-même, ce qui permet de rajouter des destinataires ou de changer le sujet
plus facilement qu'en faisant ça à l'intérieur de mutt.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set edit_headers = yes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ah, et les signatures automatiques, je trouve ça horripilant, donc évitons.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;unset signature
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="avoir-un-joli-affichage-cest-important"&gt;Avoir un joli affichage, c'est important&lt;/h2&gt;
&lt;p&gt;Par défaut, mutt manque sacrément de couleurs, et n'a pas vraiment une
utilisation optimale de l'écran par défaut. Bien entendu, ses possibilités
infinies de configuration permettent facilement non seulement de combler les
lacunes de l'affichage par défaut, mais aussi d'obtenir une interface qui
convient exactement aux besoins de chaque utilisateur.&lt;/p&gt;
&lt;h3 id="le-pager-et-le-comportement-des-menus"&gt;Le pager, et le comportement des menus&lt;/h3&gt;
&lt;p&gt;Déjà, on utilise le &lt;em&gt;pager&lt;/em&gt; de mutt parce que généralement, on a de la place sur
l'écran : quand on consulte un message, on a une partie de l'écran qui permet de
voir quels sont les quelques mails précédents et suivants, comme un petit menu.
C'est très pratique.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set pager_context=5
set pager_index_lines=6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ensuite, j'ai horreur de l'affichage de la liste de mails « par pages », où
lorsqu'on descend plus bas que ce qui est déjà affiché, on se retrouve tout en
haut de la page suivante. C'est beaucoup moins fluide qu'avec le bout de config'
qui supprime ce phénomène.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set menu_scroll
set menu_context=6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Quand quelqu'un répond à un mail, on a envie de pouvoir accéder au mail original
rapidement, et c'est particulièrement vrai lors de grosses discussions avec
plein de ramifications. On va donc dire à mutt de trier les messages par fil de
discussion, et il va même nous afficher les discussions compliquées sous la
forme d'un joli arbre dans la liste.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set sort=threads
set sort_aux=&amp;quot;last-date-received&amp;quot;
set strict_threads
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="des-couleurs-vite"&gt;Des couleurs, vite !&lt;/h3&gt;
&lt;p&gt;Bon, ça va déjà mieux, mais ça manque d'un truc important : la couleur. Avec les
&lt;em&gt;hooks&lt;/em&gt; de mutt, on peut profiter de la puissance des expressions régulières
pour colorer n'importe quoi de n'importe quelle couleur. Ce morceau de config'
prend vite de la place, donc on peut le mettre dans un fichier à part, que l'on
appelle de la façon suivante :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;source ~/.mutt/colors
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;j'ai mis mon &lt;code&gt;~/.mutt/colors&lt;/code&gt; personnel &lt;a href="colors"&gt;en ligne&lt;/a&gt;. Je ne pourrais pas
me passer de la fonction qui colore les mails adressés &lt;em&gt;à moi personnellement&lt;/em&gt;
différemment (de façon beaucoup plus visible) que les mails reçus parce que je
suis sur une liste de diffusion : en général, ceux de la première catégorie sont
beaucoup plus importants.&lt;/p&gt;
&lt;h3 id="pour-une-interface-vraiment-aux-petits-oignons"&gt;Pour une interface vraiment aux petits oignons&lt;/h3&gt;
&lt;p&gt;Continuons avec quelques trucs moins importants, qui sont plus du confort
qu'autre chose. La genre de barre bleue en haut ne sert franchement à rien donc
enlevons-la :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set help = no
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;j'aime bien marquer visuellement la fin des e-mails par des tildes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set tilde
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;je n'ai pas envie de « voir » quand une ligne a été coupée en deux, c'est
moche :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set nomarkers
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;je n'ai pas envie de voir toutes les en-têtes d'un mail, mais seulement celles
susceptibles de m'intéresser :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ignore *
unignore From: Subject To Cc Date Reply Organization Newsgroup
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;j'ai envie que les lignes soient coupées intelligemment, entre les mots,
lorsqu'elles ne tiennent pas sur l'écran :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set smart_wrap
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;je suis content que les entrées du menu « alias » soient triés en fonction de
l'alias et non pas du nom ou de l'adresse réelle de la personne :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set sort_alias = alias
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et pour finir, afficher la version de mutt au démarrage, ça ne coûte rien et
c'est joli :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;show&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;joie, bonheur, allégresse, mon client mail ressemble exactement à ce dont je
rêvais quand j'étais petit.&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Faire fonctionner un tunnel IP over DNS</title><link href="https://desfontain.es/blogue/ip-over-dns.html" rel="alternate"></link><published>2014-02-05T00:00:00+01:00</published><updated>2014-09-10T00:00:00+02:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2014-02-05:/blogue/ip-over-dns.html</id><summary type="html">&lt;p&gt;Comment se connecter à Internet sans payer depuis un wifi mal protégé.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;J'ai&lt;/strong&gt; essayé de faire fonctionner une solution IP over DNS sur mon serveur
l'autre jour, et après avoir un peu galéré, j'ai fini par y arriver. J'ai été
assez désagréablement surpris de la qualité médiocre des tutoriaux disponibles
en ligne sur le sujet : la majorité donnent plein de détails inutiles (en
expliquant par exemple comment on installe un logiciel) et considèrent qu'une
fois qu'on a fait marcher la configuration de base, on a gagné et finissent là
le tutoriel (alors qu'en pratique, on a envie de faire autre chose que juste
envoyer des pings sur le serveur, et c'est pas évident si on ne sait pas comment
faire).&lt;/p&gt;
&lt;p&gt;Ce billet est donc une tentative d'expliquer le principe, la configuration et
l'utilisation d'un logiciel qui s'appelle iodine et qui fait de l'IP over DNS.&lt;/p&gt;
&lt;h1 id="principe-et-interet"&gt;Principe et intérêt&lt;/h1&gt;
&lt;p&gt;Vous pouvez sauter jusqu'au dernier paragraphe de cette section si vous vous
fichez de savoir ce qui se passe à « bas niveau » lors d'un tunnelling IP over
DNS et que vous voulez juste savoir comment on arrive à l'étape « se connecter à
Internet sans payer depuis un wifi mal protégé ». Ce qui suit est inspiré en
grande partie par &lt;a href="https://www.digitalbond.com/blog/2012/05/16/the-hidden-dangers-of-dns/"&gt;ce billet publié par Digital Bond sur le
sujet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Quand on utilise Internet, par exemple quand on navigue sur le Web, ce qui se
passe « en pratique », c'est que l'ordinateur qu'on utilise envoie des petits
paquets IP qui contiennent des informations (par exemple, « je veux récupérer le
contenu de cette page », « je veux envoyer tel mail à telle adresse », etc.).
Dans ces paquets, le morceau d'information « cette page » ou « telle adresse »
est différent de l'information que l'utilisateur a l'impression d'utiliser : il
ne s'agit pas d'une adresse web comme &lt;code&gt;https://desfontain.es/blog/&lt;/code&gt;, ou d'une
jolie adresse mail, mais d'une adresse IP (du genre &lt;code&gt;5.9.79.154&lt;/code&gt; ou
&lt;code&gt;2a01:4f8:161:9281:4000::beef&lt;/code&gt; selon si on utilise IPv4 ou IPv6). Pour
transformer la jolie adresse web qu'un humain peut retenir et communiquer
facilement en une adresse IP, c'est le protocole DNS qui est utilisé. Donc,
quand on tape &lt;code&gt;http://damien.desfontain.es&lt;/code&gt; dans un navigateur, le navigateur va
commencer par envoyer un paquet disant « je cherche l'adresse IP de
&lt;code&gt;damien.desfontain.es&lt;/code&gt; » à un serveur DNS local (dont il connaît déjà l'adresse
IP), et le serveur DNS en question transmettra cette information jusqu'aux
serveurs DNS responsable de la gestion de &lt;code&gt;desfontain.es&lt;/code&gt; (dans mon cas,
&lt;code&gt;dns102.ovh.net&lt;/code&gt; et &lt;code&gt;ns102.ovh.net&lt;/code&gt;). Ceux-là connaissent ma zone DNS, et
la réponse se trouve dedans.&lt;/p&gt;
&lt;p&gt;Lors de cette communication, des « données » sont échangées entre « la machine
qui a originellement émis la requête DNS » et les serveurs DNS gérant mon
serveur, ici les serveurs d'OVH. Je peux aussi choisir de ne pas déléguer tout
ou partie de ma zone DNS, pour que lors d'une requête spéciale, ça ne soit pas
les serveurs d'OVH qui soient interrogés mais le mien. Dans l'exemple qui suit,
je modifie ma zone DNS pour dire « toutes les requêtes concernant des adresses
finissant par &lt;code&gt;.dns.desfontain.es&lt;/code&gt; sont gérées par mon serveur »… Et c'est ça
qui permet de détourner l'utilité première du DNS pour faire des choses
intéressantes.&lt;/p&gt;
&lt;p&gt;En effet, supposons maintenant que la connexion qu'on utilise laisse passer
les requêtes DNS mais bloque le reste. Rien ne m'empêche de coder des
choses dans les données qui sont échangées par ce biais entre mon ordinateur
local et mon serveur… Par exemple, des paquets IP « normaux ». C'est le
principe de l'IP over DNS : on va envoyer depuis le client tout un tas de
requêtes DNS de la forme « envoie-moi l'adresse associée à
&lt;code&gt;nudhrpbhpbh.dns.desfontain.es&lt;/code&gt; », où le serveur va répondre « c'est [une
certaine adresse], et par ailleurs voilà un peu de données pour que le
paquet fasse la bonne taille : lbhwhfgybfggurtnzr », et ce
charabia correspond en fait à un échange contenant des données
« intéressantes » encodées de cette façon.&lt;/p&gt;
&lt;p&gt;Ça paraît tordu, mais en fait c'est utile : il est très fréquent (dans les
gares, hôtels, aéroports, et même chez les particuliers munis de certaines box)
de rencontrer des réseaux Wifi qui sont non protégés, mais qui redirigent toutes
les requêtes HTTP vers une page (« portail captif ») qui demande des
identifiants, ou propose de payer pour accéder à Internet par ce réseau. Ces
réseaux bloquent toutes les requêtes, à part les requêtes DNS, qui sont
nécessaires pour permettre la redirection des pages Web normales vers le portail
captif, et la résolution des adresses « autorisées » (par exemple, la page
d'authentification). Je crois. En fait, je ne suis pas certain de la raison
profonde pour laquelle il n'existe pas de système de portail captif qui bloque
les requêtes DNS sans embêter les utilisateurs normaux, mais vu que ça n'existe
pas, je suppose qu'il doit y avoir une raison profonde. Si quelqu'un la connaît,
ça m'intéresse.&lt;/p&gt;
&lt;p&gt;Donc, faire passer tous les paquets IP par des requêtes DNS, ça sert à se
connecter à Internet depuis un gros paquet d'endroits sans payer ni avoir les
identifiants de tous les grands fournisseurs d'accès à Internet qui mettent des
réseaux publics dans la box de leurs abonnés. Ça a l'air super cool comme ça
donc avant qu'un lecteur enthousiaste ne passe une demi-heure à configurer ça
et soit déçu à la fin, je préviens maintenant : même quand ça marche, c'est
vraiment très, très lent, et la connexion est très loin d'être stable. C'est
plus une solution d'appoint, et une démonstration de faisabilité intéressante.&lt;/p&gt;
&lt;h1 id="prerequis"&gt;Prérequis&lt;/h1&gt;
&lt;p&gt;Il faut pour utiliser cet outil, disposer d'un serveur sur lequel on peut
installer iodine, et posséder un nom de domaine sur lequel on peut manipuler les
entrées DNS. Je vais dans toute la suite supposer que les deux machines sont
sous Linux.&lt;/p&gt;
&lt;p&gt;On va dire que le serveur dont vous disposez a comme adresse coucou.com et que
son IP est &lt;code&gt;42.17.42.17&lt;/code&gt;.&lt;/p&gt;
&lt;h1 id="configuration"&gt;Configuration&lt;/h1&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;Installer &lt;code&gt;iodine&lt;/code&gt; sur le client et le serveur. Sous Debian et dérivés, on tape
dans une console root :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;aptitude install iodine
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et pour les autres systèmes, allez voir &lt;a href="http://code.kryo.se/iodine/"&gt;le site
officiel&lt;/a&gt; pour avoir les instructions
d'installation.&lt;/p&gt;
&lt;h2 id="modification-de-la-zone-dns"&gt;Modification de la zone DNS&lt;/h2&gt;
&lt;p&gt;Ajouter les entrées suivantes à la zone DNS du serveur :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;dns     IN  A   42.17.42.17
t       IN  NS  dns.coucou.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et attendre que ça se propage (sinon, on fait des tests et on comprend
pas pourquoi ça marche pas), quelques heures devraient être plus que
largement suffisantes. C'est utile pour dire plus tard à iodine quel genre
de requête écouter : en l'occurence, les requêtes sur t.coucou.com et non
pas juste sur coucou.com comme en temps normal. &lt;/p&gt;
&lt;p&gt;On peut remplacer "dns" par n'importe quoi, et "t" par n'importe quoi d'autre -
par contre, le fait que "t" ne fasse qu'un seul caractère est relativement
important, ça laisse plus de place pour les données et donc ça accélère la
vitesse de connexion du tunnel DNS.&lt;/p&gt;
&lt;h2 id="lancement-du-demon-sur-le-serveur"&gt;Lancement du démon sur le serveur&lt;/h2&gt;
&lt;p&gt;Lancer en root sur le serveur :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;iodined 10.0.0.1 t.coucou.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ce qui équivaut à lui dire « lance le démon d'iodine, donne l'adresse IP
&lt;code&gt;10.0.0.1&lt;/code&gt; au serveur, et fais-le écouter sur t.coucou.com ». Le programme
demande un mot de passe, qui peut être n'importe quoi jusqu'à 32 caractères.
Après cette commande, on peut vérifier notamment par :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ifconfig
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(en root, toujours) qu'une nouvelle interface est apparue dans la liste (elle
s'appelle en général &lt;code&gt;dns0&lt;/code&gt;), c'est à travers elle que va passer tout le trafic
géré par iodine.&lt;/p&gt;
&lt;h2 id="lancement-du-tunnel-sur-le-client"&gt;Lancement du tunnel sur le client&lt;/h2&gt;
&lt;p&gt;Lancer en root sur le client :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;iodine -f 42.17.42.17 t.coucou.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;l'option &lt;code&gt;-f&lt;/code&gt; permet de lancer ça au premier plan et donc, de savoir si jamais
ça plante. Évidemment, du coup, si on ferme le terminal dans lequel on a lancé
la commande, ça marche plus. Dans la liste des lignes qui s'affichent alors, il
devrait y avoir :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Setting IP of dns0 to 10.0.0.2
Server tunnel IP is 10.0.0.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(avec potentiellement &lt;code&gt;10.0.0.autrechoseque2&lt;/code&gt;). Et comme pour le serveur, une
catégorie de plus (aussi appelée &lt;code&gt;dns0&lt;/code&gt;) devrait être apparue dans ce que
renvoie (en root) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ifconfig
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Pour vérifier que tout va bien, on peut essayer de lancer :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ping 10.0.0.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;depuis le client, normalement ça devrait retourner quelque chose. De même, faire
un ping sur &lt;code&gt;10.0.0.2&lt;/code&gt; depuis le serveur devrait aussi retourner quelque chose.
Sinon, hmmm, il y a un problème, et il faut vraisemblablement essayer de
fouiller dans le manuel de iodine et de jouer avec les options.&lt;/p&gt;
&lt;h2 id="faire-passer-les-paquets-dune-interface-a-lautre"&gt;Faire passer les paquets d'une interface à l'autre&lt;/h2&gt;
&lt;p&gt;Si on a réussi à pinger &lt;code&gt;10.0.0.1&lt;/code&gt; depuis le client, ça veut dire qu'on arrive à
lui dire bonjour en passant par DNS : c'est bien ! Maintenant, on aimerait faire
un truc encore plus cool et accéder à l'extérieur. Par défaut, bien sûr, ça
n'est pas possible : du point de vue du serveur, tout ce qui passe par
l'interface &lt;code&gt;dns0&lt;/code&gt; n'a aucune raison d'être renvoyé sur autre chose. Il faut
donc activer (en root) le forwarding d'une interface à l'autre :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sysctl -w net.ipv4.ip_forward=1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;et lui dire plus précisément de renvoyer tout ce qui vient de &lt;code&gt;10.0.0.*&lt;/code&gt; (la
plage d'adresses IP associées à iodine) vers eth0, et pareil dans l'autre sens
(toujours en root) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si l'interface « normale » du serveur n'est pas &lt;code&gt;eth0&lt;/code&gt; (il faut aller voir dans
ce que renvoie &lt;code&gt;ifconfig&lt;/code&gt; pour le savoir), il faut bien sûr remplacer &lt;code&gt;eth0&lt;/code&gt; par
l'interface pertinente par laquelle on se connecte à Internet en temps normal.&lt;/p&gt;
&lt;h2 id="tester-si-on-arrive-a-dire-bonjour-a-internet"&gt;Tester si on arrive à dire bonjour à Internet&lt;/h2&gt;
&lt;p&gt;Normalement, à ce stade, on devrait atteindre l'extérieur en passant par notre
jolie configuration. Vérifier que tout marche toujours bien et relancer les
commandes &lt;code&gt;iodined&lt;/code&gt;/&lt;code&gt;iodine&lt;/code&gt; si besoin (la connexion peut mourir s'il ne passe
rien dessus pendant trop longtemps), et essayer d'envoyer un message vers
l'extérieur en passant par notre interface depuis le client :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ping -I dns0 google.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;si ça marche, joie, bonheur et allégresse.&lt;/p&gt;
&lt;h2 id="faire-passer-du-ssh-a-travers-notre-tunnel"&gt;Faire passer du SSH à travers notre tunnel&lt;/h2&gt;
&lt;p&gt;Bon, c'est bien gentil, mais on a envie de faire passer autre chose que ping par
notre système. Par exemple, on voudrait bien faire passer du SSH. Mais
contrairement à ping, il est impossible de dire à ssh « passe par telle
interface », ça se décide au niveau du noyau. Il faut donc bidouiller le routage
IP pour dire au noyau « envoie tout ce qui va vers telle machine par notre
serveur ». Ça se fait de la façon suivante, en admettant que l'adresse IP du
serveur SSH auquel vous vouliez vous connecter est &lt;code&gt;71.24.71.24&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ip route add 71.24.71.24 via 10.0.0.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(bien entendu, il faut faire ça en root, un utilisateur normal n'a pas le droit
de décider de ce genre de truc). Maintenant, si on essaie :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="mf"&gt;@71.24.71.24&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(ou bien l'URL du serveur et non pas son IP), ça va automatiquement passer par
le tunnel. Si ça marche, joie, bonheur, et désillusion lorsqu'on ce rend compte
à quel point ça lagge. C'est le prix de passer par des paquets DNS ! C'est pas
vraiment prévu pour ça. Si ça marche pas, il y a quelque chose qui ne va pas.&lt;/p&gt;
&lt;h2 id="faire-passer-une-connexion-au-web-a-travers-notre-tunnel"&gt;Faire passer une connexion au Web à travers notre tunnel&lt;/h2&gt;
&lt;p&gt;Pour aller plus loin que « se connecter à une machine en SSH », on peut ajouter
plus de choses dans la table de routage. Au lieu de router une machine en
particulier, on peut router une plage d'adresses IP. Pour lui dire « ne prends
en compte que les n premiers bits », on utilise la notation /n.  Par exemple,
la commande :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ip route add 71.24.0.0/16 via 10.0.0.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;signifie « fais passer tout ce qui vient d'une adresse en &lt;code&gt;71.24.*.*&lt;/code&gt; via
&lt;code&gt;10.0.0.1&lt;/code&gt; ». Ainsi, si un navigateur essaie d'accéder à un site appartenant à
cette adresse IP, la requête va passer par le système d'IP over DNS. Le problème
c'est qu'on ne veut pas que les requêtes DNS elles-mêmes passent par là (le DNS
over DNS, c'est relativement dénué d'intérêt). La solution la plus simple est
vraisemblablement de disposer d'un serveur SSH, et de passer par un tunnel SSH.
Pour ça, on fait comme au point 7) en faisant passer les requêtes envoyées à
l'adresse du serveur par &lt;code&gt;10.0.0.1&lt;/code&gt;, puis on lance :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3128&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="nv"&gt;@serveur&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;sur le client. Cette commande ne renvoie rien et c'est normal, on laisse la
fenêtre ouverte, on va régler les paramètres de proxy de son navigateur pour lui
dire d'utiliser le proxy localhost, sur le port &lt;code&gt;3128&lt;/code&gt;, en précisant que c'est un
proxy Socks version 5, et hop. Tout ce qui passe par le navigateur passera par
le tunnel SSH, qui lui-même passe par le pont formé par iodine. &lt;/p&gt;
&lt;p&gt;Magie ! On est essentiellement en train de faire de l'HTTP over SSH over DNS, ce
qui est quand même rigolo. &lt;/p&gt;
&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Bon, revenons sur Terre, tout ça rame quand même affreusement. Si vous êtes
arrivés jusqu'à ce stade, vous avez probablement eu l'occasion de réaliser que
c'était quand même très, très moyennement utilisable. La « bonne » façon
d'utiliser un tunnel DNS en pratique, c'est probablement de ne faire que du SSH,
et d'aller chercher les informations qu'on veut récupérer en utilisant
l'excellent &lt;a href="http://weboob.org/"&gt;Weboob&lt;/a&gt; ou bien un navigateur en mode texte. Ça
permet que ça soit le serveur qui fasse les « vraies » requêtes qui prennent
plein de bande passante, et que la seule chose qui passe du serveur au client,
ce soit les requêtes et le texte des pages transformées. Pour avoir testé ça
dans diverses situations, c'est généralement lent mais utilisable.&lt;/p&gt;
&lt;p&gt;&lt;sub&gt;&lt;sub&gt;Merci à &lt;a href="http://a3nm.net/"&gt;a3nm&lt;/a&gt; et &lt;a href="http://louis.jachiet.com/"&gt;louis&lt;/a&gt;
pour leur relecture et corrections.&lt;/sub&gt;&lt;/sub&gt;&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>De la configuration d'un serveur mail</title><link href="https://desfontain.es/blogue/serveur-mail.html" rel="alternate"></link><published>2014-02-04T00:00:00+01:00</published><updated>2014-09-10T00:00:00+02:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2014-02-04:/blogue/serveur-mail.html</id><summary type="html">&lt;p&gt;Autohéberger ses mails, c'est compliqué : retour d'expérience.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;J'ai&lt;/strong&gt; récemment installé un serveur mail sur mon serveur. Je voulais que tout
soit autohébergé : les mails eux-mêmes, le moyen d'y accéder, ainsi que le
serveur SMTP qui envoie les mails vers l'extérieur. Bien sûr, je tenais aussi à
ce que tout ce qui pouvait être chiffré le soit, en particulier que je ne risque
pas de me faire intercepter quoi que ce soit lorsque je me connecte au serveur.
Ça m'a pris un temps vraiment long, j'ai perdu pas mal de temps sur quelques
problèmes, et je n'ai trouvé nulle part une liste de toutes les choses qu'il
fallait que je fasse pour arriver à mes fins. &lt;/p&gt;
&lt;p&gt;Ce billet est donc une tentative d'établir cette liste, de mentionner chacun des
problèmes embêtants que j'ai rencontré, et la façon dont j'en suis venu à bout.
Ça ne sera &lt;em&gt;pas&lt;/em&gt; un tutoriel détaillé, ça prendrait trop de temps de le faire,
il aurait fallu que je note tout ce que j'ai fait au fur et à mesure pour ça.
Info potentiellement utile : j'ai fait tout ça sur une machine qui tourne sous
Debian Wheezy, avec un noyau &lt;code&gt;3.2.0-4-amd64&lt;/code&gt;.&lt;/p&gt;
&lt;h1 id="liste-de-trucs-quil-a-fallu-que-je-fasse"&gt;Liste de trucs qu'il a fallu que je fasse&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Installer les bons paquets Debian :&lt;ul&gt;
&lt;li&gt;&lt;code&gt;postfix&lt;/code&gt;, le serveur mail ;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dovecot-imapd&lt;/code&gt;, le serveur IMAP ;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;opendkim&lt;/code&gt; et &lt;code&gt;opendkim-tools&lt;/code&gt;, qui sert ajouter le protocole DKIM à ses
  mails sortants, ce qui évite de passer pour un spammeur aux yeux de
  certains grands serveurs mails comme Yahoo! ;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;postfix-tls&lt;/code&gt;, pour que le serveur mail sache utiliser TLS ;&lt;/li&gt;
&lt;li&gt;et enfin, &lt;code&gt;cyrus-common-2.2&lt;/code&gt; et &lt;code&gt;sasl2-bin&lt;/code&gt;, pour faire de
  l'authentification sécurisée au serveur SMTP.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Configurer ma zone DNS (sur le manager de la société qui me fournit mon nom de
domaine, ici OVH) pour :&lt;ul&gt;
&lt;li&gt;rajouter un champ MX pour le serveur mail pour dire quel sous-domaine 
  utiliser pour le SMTP sur desfontain.es (ici, &lt;code&gt;smtp.desfontain.es&lt;/code&gt;) ;&lt;/li&gt;
&lt;li&gt;et ajouter deux champs (un de type A et un de type AAAA, respectivement pour
  l'IPv4 et pour l'IPv6) pour lier &lt;code&gt;smtp.desfontain.es&lt;/code&gt; à la bonne IP.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Changer mon hostname en &lt;code&gt;smtp.desfontain.es&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ajouter un utilisateur par boîte mail que je veux créer.&lt;/li&gt;
&lt;li&gt;Configurer Postfix et dovecot pour envoyer mes premiers mails.&lt;/li&gt;
&lt;li&gt;Configurer les alias Postfix qui vont bien : j'ai envie que toutes les
adresses du type &lt;span class="baddirection"&gt;,&lt;code&gt;se.niatnofsed@retsamtsop&lt;/code&gt;&lt;/span&gt;
&lt;span class="baddirection"&gt;,&lt;code&gt;se.niatnofsed@retsamtsoh&lt;/code&gt;&lt;/span&gt; etc., atterrissent
dans ma boîte mail, mais sans créer un utilisateur par adresse.&lt;/li&gt;
&lt;li&gt;En profiter pour mettre des regex dans les alias en question : je veux que
n'importe quelle adresse de la forme 
&lt;span class="baddirection"&gt;&lt;code&gt;se.niatnofsed@iouqetropmin.maps&lt;/code&gt;&lt;/span&gt; soit reconnue
comme valide et redirigée vers une adresse spam maître. Ça permet de donner une
adresse &lt;em&gt;différente&lt;/em&gt; à chaque fournisseur de serveur ou site marchand sur
Internet, et si jamais des spammeurs la récupèrent, on peut savoir qui a vendu
mon adresse (et lancer des œufs sur leur maison) et la bloquer.&lt;/li&gt;
&lt;li&gt;Rajouter un champ SPF dans ma zone DNS pour ne pas passer pour un spammeur.&lt;/li&gt;
&lt;li&gt;Configurer OpenDKIM pour encore moins passer pour un spammeur.&lt;/li&gt;
&lt;li&gt;Rajouter un champ DKIM dans ma zone DNS pour que mes signatures DKIM
puissent être vérifiées par les destinataires de mes messages.&lt;/li&gt;
&lt;li&gt;Ajouter un reverse DNS IPv4 &lt;em&gt;et&lt;/em&gt; IPv6 pour ne pas passer pour un spammeur
aux yeux de Google, qui vérifie spécifiquement (pour une raison qui m'échappe,
mais alors, complètement) que le DNS et que le reverse DNS correspondent. C'est
un truc qui se configure dans les options de mon hébergeur, pas sur mon serveur
lui-même.&lt;/li&gt;
&lt;li&gt;Créer et mettre en place un certificat SSL signé par une autorité externe
(StartSSL) sur &lt;code&gt;desfontain.es&lt;/code&gt;. (Non, ça n'a aucun rapport avec le reste.)&lt;/li&gt;
&lt;li&gt;Créer un certificat SSL pour &lt;code&gt;smtp.desfontain.es&lt;/code&gt;, ici sur CAcert : autant
c'est important d'avoir un certificat signé par une autorité reconnue par tout
le monde pour mon site Web (je ne veux pas que les visiteurs de mon site
reçoivent un message d'erreur lorsqu'ils essaient de s'y connecter en HTTPS),
autant ça l'est beaucoup moins pour mon serveur SMTP où je suis a priori le seul
à me connecter.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Normalement, avec ça, trouver les mots à googler pour chaque détape ne devrait
pas être difficile. Comme d'habitude, si vous trouvez que quelque chose n'est
pas clair et que vous avez des questions, n'hésitez pas à m'envoyer un mail.&lt;/p&gt;
&lt;h1 id="problemes-rencontres"&gt;Problèmes rencontrés&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;À l'étape d'ajout du champ SPF, j'ai mis du temps à comprendre qu'il fallait
  impérativement cliquer sur « Type SPF » dans le manager d'OVH, parce que même
  si en théorie ça Devrait Marcher™, ça ne fonctionnait pas lorsque je rajoutais
  un champ TXT comme l'indiquait mon tutoriel.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exactement la même chose à l'étape d'ajout du champ DKIM. C'est très foireux
  parce qu'en plus, lorsque ça ne marche pas directement lorsqu'on change le
  DNS, c'est &lt;em&gt;normal&lt;/em&gt;, il faut le temps que ça se propage, du coup on ne
  s'alarme pas, et on perd plein de temps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La plus grosse prise de tête que j'ai eue était probablement pour établir une
  communication entre Postfix (qui forme et envoie les messages) et OpenDKIM
  (qui les signe avec la clé globale du serveur). Dans la majorité des tutoriaux
  que j'ai trouvé sur le sujet, les deux communiquent en passant par un port
  particulier de localhost. Pour une raison qui m'échappe toujours (un ami m'a
  après suggéré que c'était potentiellement parce qu'il y avait peut-être un
  localhost IPv4 et un localhost IPv6 ?), ça ne fonctionnait désespérément pas,
  alors même que les deux démons tournaient : &lt;code&gt;netstat&lt;/code&gt; renvoyait bien opendkim
  qui écoutait sur le bon port, et les logs de postfix indiquaient désespérément
  « Connection refused ». Je m'en suis sorti en les faisant communiquer par un
  fichier de socket :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;dans &lt;code&gt;/etc/defaults/opendkim&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;SOCKET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;local:/var/spool/postfix/var/run/opendkim/opendkim.sock&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;et dans &lt;code&gt;/etc/postfix/main.conf&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;smtpd_milters&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;unix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opendkim&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opendkim&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;
&lt;span class="n"&gt;non_smtpd_milters&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;unix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opendkim&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opendkim&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ah oui, et évidemment, au début, j'avais mis le même chemin dans les deux cas
  et ça ne marchait pas, parce que postfix est lancé dans un chroot.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Au moment où je voulais faire des tests d'authentification à mon serveur SMTP
  par SASL, la majorité des tutoriels utilisent la commande :&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;telnet smtp.serveur.ext 25
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;et il m'a fallu un certain temps pour piger que si ça ne fonctionnait pas, ça
  n'était pas à cause de mon serveur mais de mon fournisseur d'accès à Internet
  local qui bloquait le port 25. Pour pouvoir non seulement faire des tests mais
  aussi utiliser msmtp (mon client smtp local) depuis chez moi au quotidien,
  j'ai dû utiliser le port 465 à la place. Il a fallu que j'indique ça dans la
  configuration de msmtp en utilisant l'option &lt;code&gt;port&lt;/code&gt; (incroyable), et que je
  décommente la ligne commençant par &lt;code&gt;smtps&lt;/code&gt; dans &lt;code&gt;/etc/postfix/master.cf&lt;/code&gt;.&lt;/p&gt;
&lt;h1 id="liens"&gt;Liens&lt;/h1&gt;
&lt;p&gt;J'ai pas noté au fur et à mesure ce que j'ai fait, j'aurais pu écrire un
tutoriel bien mieux foutu si j'y avais pensé. Par contre, j'ai quand même
l'habitude de mettre des liens en commentaire de mes fichiers de configuration,
pour me souvenir de l'origine d'un bout de code. En général, le lien comporte
des explications, donc ça aide à se souvenir de ce que telle ligne fait à cet
endroit-là. Voilà donc la liste des liens présents dans mes fichiers de
config' :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.startssl.com/?app=42"&gt;un article sur le site de StartSSL&lt;/a&gt; pour
  faire fonctionner nginx (mon serveur Web) avec SSL ;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tipstricks.itmatrix.eu/?p=1494"&gt;un tutorial&lt;/a&gt; pour l'installation de
  OpenDKIM ;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.isalo.org/wiki.debian-fr/Configuration_d%27un_serveur_mail_avec_Postfix"&gt;une page de wiki&lt;/a&gt;
  pour la configuration « de base » du serveur mail - c'est en français, ce qui
  vaut la peine d'être mentionné ;&lt;/li&gt;
&lt;li&gt;et &lt;a href="http://rene.bz/setting-smtp-authentication-over-tls-postfix/"&gt;un tutorial&lt;/a&gt;
  pour la configuration d'une authentification chiffrée via TLS au serveur SMTP.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;C'était &lt;em&gt;vraiment&lt;/em&gt; long de faire tout ça, de l'ordre de quelques dizaines
d'heures. Une partie importante du travail que j'ai eu (et des soucis que j'ai
rencontrés) vient du fait que je voulais avoir mon propre serveur SMTP, donc non
seulement héberger le stockage de mes mails et la gestion de mon nom de domaine,
mais aussi leur envoi vers l'extérieur. Il aurait probablement été plus simple
d'utiliser un SMTP externe, par exemple celui de l'ENS. Mais j'ai appris plein
de choses sur le fonctionnement du système d'e-mails, donc je ne regrette pas
d'y avoir passé du temps.&lt;/p&gt;
&lt;p&gt;J'ai fait tout ça dans le but de me rendre aussi indépendant que possible des
services centralisés qui s'occupaient des mails auparavant, et pour avoir plus
de contrôle sur le caractère privé de mes données. En pratique, l'immense
majorité de mes mails est toujours interceptable (et, selon toute probabilité,
&lt;a href="http://arstechnica.com/tech-policy/2013/06/use-of-tor-and-e-mail-crypto-could-increase-chances-that-nsa-keeps-your-data/"&gt;interceptée&lt;/a&gt;)
car une part infime de mes contacts utilise des méthodes de chiffrement comme
GPG. Et comme le protocole d'envoi d'e-mails n'est clairement pas conçu pour la
sécurité, les métadonnées sont toujours interceptables au moment où elles
passent sur le réseau.&lt;/p&gt;
&lt;p&gt;Néanmoins, je vois quelques différences importantes : d'une part, le contenu de
mes correspondances n'est pas utilisé pour faire des statistiques ou de la
publicité ciblée. D'autre part, si quelqu'un veut lire et surveiller mes mails,
il faut qu'il intercepte ce que j'envoie et reçois en permanence, ça devient
impossible d'aller juste voir mon fournisseur de messagerie électronique pour
lui dire « tiens, fais-nous une copie des messages dans la boîte aux lettres de
telle personne ». Ça me semble être une amélioration significative qui valait le
coup d'y passer autant de temps.&lt;/p&gt;
&lt;p&gt;En revanche, il faut admettre que le gain en terme de vie privée entre « avoir
son propre serveur SMTP » et « utiliser un serveur SMTP externe de confiance
(celui d'une université, par exemple) » est quasi-nul, et c'est pourtant ça qui
m'a pris le plus de temps. Le seul avantage que je vois, c'est qu'on ne peut
jamais être sûr qu'un serveur SMTP que l'on ne contrôle pas n'est pas compromis
(c'est évident si on parle de ceux de multinationales américaines, mais après
tout, ça n'est pas délirant d'imaginer que ceux des universités, points
stratégiquement importants s'il en est, aient des backdoors de services de
renseignements divers).&lt;/p&gt;
&lt;p&gt;&lt;sub&gt;&lt;sub&gt;Merci à &lt;a href="http://a3nm.net/"&gt;a3nm&lt;/a&gt; pour sa relecture et ses propositions
d'améliorations.&lt;/sub&gt;&lt;/sub&gt;&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Bienvenue !</title><link href="https://desfontain.es/blogue/bienvenue.html" rel="alternate"></link><published>2014-02-03T00:00:00+01:00</published><updated>2014-02-03T00:00:00+01:00</updated><author><name>Damien Desfontaines</name></author><id>tag:desfontain.es,2014-02-03:/blogue/bienvenue.html</id><summary type="html">&lt;p&gt;Premier article !&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Ici&lt;/strong&gt; commence mon blog. Je n'ai qu'une vague idée de ce que je vais mettre
dedans, ça va probablement être principalement constitué de morceaux de
configuration, de compte-rendus de bidouillages, de coups de gueule divers et,
soyons réalistes, d'une bonne dose de chaos. Il sera vraisemblablement écrit en
français, parce que la majorité des articles que j'ai envie d'écrire pour
l'instant existent déjà ailleurs, et en mieux, en anglais. Quand ce n'est pas le
cas et que j'ai l'orgueil de penser que ce que je raconte est susceptible
d'intéresser un plus large public, il est possible que j'écrive en anglais.&lt;/p&gt;
&lt;p&gt;Je vais déjà commencer par faire une section « À propos » comme il est
d'usage, puis je vais évoquer la licence sous laquelle ce blog est placé.&lt;/p&gt;
&lt;h1 id="a-propos"&gt;À propos&lt;/h1&gt;
&lt;p&gt;Je m'appelle Damien Desfontaines, et les informations que vous pourriez avoir
envie de connaître sur moi se trouvent sur &lt;a href="http://desfontain.es/serious.html"&gt;la version sérieuse de ma page
personnelle&lt;/a&gt;. Allez jeter un coup d'œil à &lt;a href="http://desfontain.es"&gt;la
version plus funky&lt;/a&gt;, elle est plutôt originale et vous
amusera peut-être. &lt;/p&gt;
&lt;p&gt;Je parle en mon nom propre seulement, toutes les divagations postées sur ce blog
n'engagent que moi, et sauf mention contraire, je suis l'auteur de tous les
billets.&lt;/p&gt;
&lt;h1 id="la-licence"&gt;La licence&lt;/h1&gt;
&lt;p&gt;Je profite de ce premier billet pour présenter la licence que j'utilise pour mon
blog. Il s'agit de la CC0, plus connue sous le nom de « domaine public ». Un
résumé en français est disponible &lt;a href="https://creativecommons.org/publicdomain/zero/1.0/deed.fr"&gt;par
ici&lt;/a&gt;, et le texte
légal en anglais peut se trouver &lt;a href="https://creativecommons.org/publicdomain/zero/1.0/legalcode"&gt;par
là&lt;/a&gt;. Ça signifie
que j'abandonne tous mes droits sur ce que je publie ici : n'importe qui peut
copier, modifier, ou distribuer tout ce que je raconte, sans avoir besoin de me
demander ni même d'être obligé de me citer.&lt;/p&gt;
&lt;p&gt;Ça me paraît un choix naturel, mais l'expérience montre que c'est une licence
qui est rarement utilisée en pratique, même par les barbus libristes qui
militent contre la propriété intellectuelle. Je vais tenter d'expliquer les deux
propriétés principales de cette licence.&lt;/p&gt;
&lt;p&gt;La première, c'est que le monde extérieur peut faire absolument n'importe quoi
de ce mes travaux sans me demander mon avis. Le raisonnement derrière ça est
simple : j'ai envie que le plus de monde possible aie un accès à ce que je peux
publier, je n'ai pas la moindre intention de gagner des sous avec, et si
quelqu'un a envie de réutiliser une partie de ce que j'ai fait (que ça soit pour
une utilisation commerciale ou non - je ne pense pas que vouloir gagner de
l'argent soit une motivation intrinsèquement mauvaise), je n'ai pas envie de
l'embêter avec des obligations légales à me demander mon avis. Si il veut en
faire quelque chose que je désapprouve, eh bien tant pis, il est libre de le
faire. Je ne vois pas quelle légitimité j'aurais à dire « hé, non, je suis pas
d'accord avec ce que tu dis là, donc vu que j'ai une possibilité légale de
t'interdire de le dire (parce que tu réutilises une partie de mes travaux), je
vais faire usage de cette possibilité pour te censurer », tout en continuant par
ailleurs de militer pour une liberté d'expression la plus large et la plus
exempte d'exceptions possible.&lt;/p&gt;
&lt;p&gt;La seconde, et c'est celle que j'ai le plus de mal à expliquer aux gens, c'est
que je ne considère pas que ce soit légitime de ma part d'exiger, en le
précisant dans la licence sous laquelle je place mes textes, que l'on me cite à
chaque fois que l'on réutilise mes travaux. Même les barbus les plus convaincus
ont l'air de tenir à ce qu'on les crédite lorsqu'on réutilise ce qu'ils ont
produit : toutes les licences utilisées en pratique (la BSD, la MIT, toutes les
Creative Commons autres que CC0, la GPL…) comprennent cette obligation. Je suis,
pour ma part, convaincu que ne pas citer l'auteur original des productions que
l'on réutilise ou que l'on redistribue, c'est essentiellement se conduire comme
un malpropre de la pire espèce, et que ce type de comportement est antisocial et
malhonnête. Néanmoins, je ne pense pas que ça soit pertinent de faire appel - ou
même de considérer l'éventualité de faire appel - à la Grande Machine Étatique
pour aller geindre « le méchant pas beau, là, il a réutilisé ce que j'ai écrit
en prétendant que c'est lui qui l'avait écrit ». À l'ère d'Internet, si ça se
produit, j'en entendrai parler un jour ou l'autre, et je pense que lui pourrir
sa réputation en informant ses lecteurs (ou ses clients) de la malhonnêteté dont
il fait preuve est un châtiment beaucoup plus logique que d'aller embêter des
juges payés par le contribuable pour essayer de lui grapiller trois sous. &lt;/p&gt;
&lt;p&gt;Par ailleurs, la question de la Postérité™ (et d'une façon générale, le concept
de lier pour l'éternité son nom à son œuvre) est à des kilomètres de mes
préoccupations ; j'aime l'idée de laisser une trace positive sur le reste du
monde après ma mort (j'espère qu'elle sera constituée d'idées intéressantes, de
concepts fertiles et d'apports positifs à mon entourage et à la société en
général), mais je me fiche complètement qu'elle soit reliée à mon nom et à
l'individu que j'incarne. Si je signe de mon nom ce que je publie, c'est que
c'est &lt;a href="http://untraceableblog.com/"&gt;beaucoup plus simple&lt;/a&gt; en pratique que
d'essayer d'être anonyme, et puis que je serais ravi que ça puisse m'apporter
des choses chouettes en pratique (que des gens trouvent intéressant ce que
j'écris et viennent en discuter avec moi, que des gens me remercient pour un
article, que mes pauvres réflexions soient moins banales que ce j'imagine et
m'ouvrent des opportunités quelconques, que sais-je encore). En fait, en y
réfléchissant, même en mettant tout ce qu'on raconte dans le domaine public, on
continue à se conduire de façon égoïste rien qu'en ayant l'orgueil d'apposer sa
signature sur sa production =)&lt;/p&gt;
&lt;p&gt;Bon, j'ai écrit un pavé beaucoup trop gros sur ce sujet, et j'ai probablement
perdu la moitié de mes lecteurs en route, un peu comme quand j'envoie des mails
pour donner des nouvelles à ma famille. En même temps, c'est un défaut dont je
ne pense pas pouvoir me débarrasser facilement, donc autant que mes éventuels
lecteurs commencent tout de suite à s'y habituer.&lt;/p&gt;</content><category term="misc"></category></entry></feed>