Catégories
Développement informatique javascript Sécurité informatique

Une histoire de dépen­dances

Le main­te­neur d’un paquet NPM n’a plus eu envie et a donné la main à un tiers. Ce tiers a injecté un code mali­cieux dans une version publique et poten­tiel­le­ment infecté pas mal de monde. Ça n’a été détecté qu’au bout de deux mois et demi alors que le paquet est utilisé un peu partout.


J’en vois qui lancent des blâmes ou qui se moquent sur l’ac­tua­lité du paquet NPM mali­cieux. Ça défoule mais : Faites-vous mieux ? Permet­tez-moi d’en douter très très forte­ment.

Le moindre projet React, Symfony ou Rails, c’est une centaine de dépen­dances directes et indi­rectes, certaines proviennent de sources dont vous n’avez jamais entendu parler. J’ai listé trois frame­works mais c’est bien la même chose sur les autres langages/tech­nos.

C’est bien le sujet : Sauf si vous avez la taille d’un Face­book/Google ou la criti­cité d’un Thalès ou d’un état, vous n’avez ni les moyens de passer des années-homme à tout reco­der en interne, ni les moyens d’au­di­ter chaque source à chaque mise à jour (si tant est que ça suffise).

Même ceux que j’ai nommé, je ne suis pas certains qu’ils le fassent toujours, sur tous les types de projet. Je suis même assez convaincu du contraire. Le ratio béné­fice/risque n’est juste pas assez impor­tant pour ça. Les moyens et les délais ne sont pas dimen­sion­nés pour.


Alors moquez-vous, de ceux qui utilisent NPM, de ceux qui ne contrôlent pas l’en­semble des dépen­dances, mais vous ne faites proba­ble­ment pas mieux. Il y a pas mal d’hy­po­cri­sie dans les réac­tions que je vois passer.

Ne blâmez pas non plus le main­te­neur d’ori­gine. Lui ne vous a jamais rien promis. C’est même dit expli­ci­te­ment dans la licence « aucune garan­tie d’au­cune sorte ». Ce n’est pas parce que d’autres utilisent son code gratui­te­ment qu’il aurait magique­ment des comptes à rendre. En fait avoir passé la main est plutôt quelque chose d’en­cou­ragé dans l’open source. S’il n’y avait pas eu cette issue, il aurait plutôt fallu le remer­cier.


Alors quoi ? Alors rien.

Le problème a été résolu. Si ça arrive trop souvent alors ça chan­gera le ratio béné­fice/risque et la commu­nauté évaluera le fait d’avoir trop de dépen­dances tierces un (tout petit) peu plus néga­ti­ve­ment, et ainsi de suite.

La ques­tion inté­res­sante que personne ne semble poser c’est celle de l’hon­nê­teté du main­te­neur d’ori­gine. A-t-il vrai­ment passé la main ? et s’il l’a fait, est-ce qu’il en a tiré un béné­fice tout en soupçon­nant ce qui pouvait se passer ? C’est à peu près la seule chose qui pour­rait à mon sens lui faire porter une quel­conque respon­sa­bi­lité.

Catégories
Geek navigateurs et API Vie privée

Fire­fox, « anonyme par défaut »

J’ai­me­rais avoir un Fire­fox confi­guré en « anonyme par défaut ». Ça veut dire deux choses :

  1. Un site ne doit pas pouvoir parta­ger ou croi­ser les données avec un autre ;
  2. Un site ne doit pas pouvoir faire persis­ter des données plus long­temps que la session en cours.

Si je veux garder une authen­ti­fi­ca­tion perma­nente ou auto­ri­ser des croi­se­ments (par exemple pour des SSO), c’est à moi de le deman­der expli­ci­te­ment.

Ça pour­rait être fait par une double préfé­rence liée à chaque domaine, quelque chose du type « auto­ri­ser le domaine X à stocker des données persis­tantes dans ce contexte » et « ne pas isoler le domaine X en fonc­tion de l’ori­gine de la page prin­ci­pale ».


Un site ne doit pas pouvoir parta­ger ou croi­ser les données avec un autre

Ce premier point est rela­ti­ve­ment bien couvert. L’ex­ten­sion first party isola­tion fait exac­te­ment ça. En gros tout le stockage (cookies, local­sto­rage, indexeddb) est segmenté par l’ori­gine de la page prin­ci­pale dans l’on­glet.

Le compo­sant Face­book inclut dans les pages de LeMonde ne parta­gera aucune données avec celui inclut dans les pages du Figaro. Il restera l’adresse IP et diverses tech­niques de finger­prin­ting, mais ça va un peu limi­ter.

Je navigue avec depuis des mois, plutôt avec succès. Il y a encore du boulot. Il faut le désac­ti­ver tempo­rai­re­ment pour faire la confi­gu­ra­tion initiale de Pocket dans Fire­fox, ou pour le SSO « se connec­ter avec google » de quelques sites (pas tous, d’autres fontionnent bien) mais globa­le­ment ça passe très bien.

Une fois corri­gées les anoma­lies et ajou­tée une façon de désac­ti­ver l’iso­la­tion site par site, ça sera parfait.


Un site ne doit pas pouvoir faire persis­ter des données plus long­temps que la session en cours

Ce second point est plus compliqué.

J’ai tenté initia­le­ment d’uti­li­ser les conte­neurs de Fire­fox pour ça mais tout ce que je peux faire c’est isoler des sites les uns des autres. Au final je me retrouve avec un conte­neur par défaut qui contient la majo­rité du trafic et qui conti­nue à garder mes traces de session en session.

Il y a peu j’ai trouvé l’ex­ten­sion tempo­rary contai­ners. L’idée c’est que, par défaut, le navi­ga­teur charge un nouveau conte­neur tempo­raire dédié à chaque fois qu’on navigue vers un nouveau domaine. Ce conte­neur et ses données sont détruits dès qu’on ferme l’on­glet.

Globa­le­ment ça fonc­tionne mais il y a quelques soucis de perfor­mance ressen­tie (au moins des ferme­ture/réou­ver­ture visibles d’on­glet lors des navi­ga­tions) et si on affecte un site à un conte­neur fixe pour éviter de se retrou­ver à chaque fois sur une page non authen­ti­fiée, on perd la capa­cité de l’uti­li­ser en paral­lèle dans plusieurs conte­neurs diffé­rents.

J’ai globa­le­ment l’im­pres­sion d’abu­ser des conte­neurs pour quelque chose qui n’est pas fait pour.

L’ex­ten­sion cookie auto­de­lete a une autre approche. On garde le fonc­tion­ne­ment normal des conte­neurs mais, par défaut, l’ex­ten­sion supprime les cookies d’un site dès qu’on ferme tous les onglets qui y mènent. Charge à l’uti­li­sa­teur de faire des excep­tions expli­cites site par site. Globa­le­ment ça fait le job mais ça n’ef­face ni le local­sto­rage ni l’in­dexeddb, ne parlons même pas du tracking par cache HTTP.

Je trouve ça dommage. Intui­ti­ve­ment j’au­rais pensé que suppri­mer des données était plus facile à faire pour le navi­ga­teur que créer une isola­tion supplé­men­taire entre les sites.

Suis-je le seul à cher­cher un tel niveau d’iso­la­tion ?

Catégories
Droit d'auteur Livre PHP Vie personnelle

« PHP 5 avancé » en chiffres

Je vois les auteurs racon­ter leur histoire, leurs rému­né­ra­tions. Je n’ai pas trop envie de m’y mélan­ger vu que je n’ai jamais été auteur profes­sion­nel ni n’ai jamais cher­ché à l’être. Mes enjeux d’au­teur du dimanche sont bien diffé­rents. Ajou­tez y que j’ai écrit dans à propos de tech­nique infor­ma­tique, très loin des auteurs de romans et de bande dessi­née.

Pour autant, c’est aussi l’oc­ca­sion parce que je ne crois pas avoir déjà fait un tel bilan. Peut-être que ça inté­res­sera certain d’entre vous. Dites-moi s’il y a des ques­tions auxquelles je ne réponds pas.

Atten­tion, ce n’est repré­sen­ta­tif de rien d’autre que de mon cas person­nel. J’ai même tendance à penser que mon histoire entre dans l’ex­cep­tion à plus d’un titre. Le fait qu’il y ait des gros chiffres dans la suite ne doit certai­ne­ment pas vous amener à penser que les auteurs roulent habi­tuel­le­ment sur l’or.

Six éditions et quatre colla­bo­ra­teurs

Travail à quatre mains avec Cyril Pierre de Geyer. Le premier chapitre a été fait en février 2003 pour une publi­ca­tion de 700 pages en juin 2004.

PHP a pas mal évolué et le livre serait rapi­de­ment devenu obso­lète. Nous avons du mettre à jour le livre régu­liè­re­ment. Il y a eu une édition par an jusqu’en 2008 puis une sixième de 870 pages en 2012.

La troi­sième édition a été reti­rée sur un format « best-of » en 2007, en paral­lèle de la vente de la quatrième dans son format d’ori­gine. J’avoue que ça me semble toujours étrange, d’au­tant que si nous en avons fait une quatrième édition plutôt qu’un reti­rage c’est que l’évo­lu­tion de PHP rendait l’an­cienne version moins perti­nente.

Nous avons été épaulé par Hugo Hamon pour les relec­tures et l’in­dexa­tion de la cinquième édition. La sixième édition a été parta­gée avec un troi­sième auteur, Frédé­ric Hardy. Il est en petit sur la couver­ture, je le regrette aujourd’­hui.

Les tirages et les ventes

Le premier tirage était prévu à 3000 exem­plaires. Vus les chiffres de vente je suppose qu’il en a plutôt été tiré 3200 (ou alors on a vendu des livres qui n’exis­taient pas). Les chiffres des éditions suivantes ne tombant même pas proches de multiples de 250, j’ima­gine qu’on en imprime toujours un peu plus au cas où et que le chiffre final n’est pas tota­le­ment maitri­sable.

La seconde édition a été tirée à envi­ron 3700 exem­plaires, la troi­sième et la quatrième ont toutes les deux fait entre 3200 et 3300 exem­plaires, plus envi­ron 4000 exem­plaires pour la best-off. La cinquième a béné­fi­cié de deux tirages, proba­ble­ment respec­ti­ve­ment 3400 et 2000 exem­plaires. La dernière a été tirée à quelque chose comme 3800 exem­plaires, proba­ble­ment en deux fois.

Au total j’ai quelque chose comme 26 500 ventes sur les 12 ans de vie du livre.

Le travail d’écri­ture

Diffi­cile d’es­ti­mer le temps passé en écri­ture tant il était très frac­tionné, d’au­tant que ce n’était pas mon acti­vité prin­ci­pale. Sur les 16 mois de travail de l’édi­tion initiale, j’ai quand même du y passer une bonne majo­rité des soirs et week-end, et quelques mois quasi­ment à temps plein. À cela il faut bien entendu ajou­ter le travail de mon co-éditeur.

Chose éton­nante pour moi, nous n’avons pas utilisé de logi­ciel ou de format de fichier spéci­fique à l’édi­tion, juste du Micro­soft Word avec une feuille de styles interne : un fichier par version et par chapitre nommé d’après l’au­teur a avoir créé la version, le tout dans un FTP.

Les autres éditions ont été un effort variable, plus fort pour les premières que pour les dernières. On parle quand même géné­ra­le­ment de plusieurs mois pendant des soirs et des week-ends.

Je n’ai aucune idée du travail total en équi­valent temps plein 35h sala­rié. Si je devais donner un chiffre je dirais proba­ble­ment un an équi­valent temps plein sala­rié, mais en réalité ça peut faci­le­ment être la moitié moins ou moitié plus.

Malgré la moti­va­tion des premiers temps, faire ça en paral­lèle d’un job très prenant n’est pas aisé, surtout au moment des relec­tures. La colla­bo­ra­tion entre auteurs n’a pas toujours été évidente non plus. Ça parait évident après coup mais écrire à deux quand on ne se connait pas vrai­ment et qu’on ne se voit jamais en face à face, c’est forcé­ment un peu diffi­cile.

La rému­né­ra­tion

La rému­né­ra­tion est de 10% du hors taxe pour les ventes françaises grand format (4% sur les ventes à l’étran­ger, 5% sur le format poche — l’édi­teur a souhaité en sortir un une année, nous avons refusé), à parta­ger entre les auteurs initiaux, sans aucune avance, sur des livres qui ont varié de 35 à 45 € pour la collec­tion prin­ci­pale, 25 € pour le best-of.

Même en allant cher­cher dans les archives, je suis encore aujourd’­hui inca­pable de dire combien j’ai gagné que ce soit en net ou en brut. J’ai des comptes de vente, des détails de coti­sa­tions, des avis de paie­ment et des résu­més de sommes à décla­rer au fisc. Rien ne se recoupe vrai­ment, quand je n’ai pas deux docu­ments d’un même type tota­le­ment diffé­rents pour une même année.

Disons que la somme encais­sée avant impôts sur le revenu doit être entre 40 et 47 000 euros nets depuis le premier verse­ment en 2005. Précis hein ?

Ramené à un an de travail c’est effec­ti­ve­ment très bien payé, surtout par rapport à ce que je lis à propos de auteurs en litté­ra­ture, en jeunesse ou en bande dessi­née. Même dans la four­chette haute, en comp­tant deux ans de travail en équi­valent temps plein, ça reste bien au dessus du SMIC. Cela dit il était loin d’être dit que ça rému­nè­re­rait autant, et ce que ça m’a apporté a large­ment dépassé le finan­cier. Je ne pensais pas à l’argent. Je ne m’étais en fait même pas fait de prévi­sion quand j’ai dit oui, et je n’au­rais pas su dire si je m’at­ten­dais à 1 000 ou 10 000 euros.

Cette somme est après paie­ment de la TVA, de la CSG et CRDS, ainsi que d’une coti­sa­tion de 1% à l’Agessa. Tout ça est prelevé pour moi en amont par l’édi­teur. Pas de retraite, pas de prévoyance, et avec dans les 4000€ par an en moyenne je n’au­rais proba­ble­ment eu aucune couver­ture sociale si je n’avais pas eu un emploi sala­rié en paral­lèle.

Pour l’im­pôt sur le revenu je déclare ce que l’édi­teur me dit en trai­te­ments et salaires. C’est peut-être idiot ou anor­mal, je n’ai jamais su (on m’a donné des réponses diffé­rentes à chaque fois que je deman­dais ce que devait faire un auteur de loisir) mais du coup c’est imposé sur le barème progres­sif.

Autant Hugo (en relec­teur) que Frédé­ric (en co-auteur sur la dernière mise à jour) ont été rému­né­rés sur une base fixe, payée par l’édi­teur en plus de nos droits d’au­teur.

L’édi­teur

J’en­tends beau­coup de choses sur les éditeurs. Person­nel­le­ment moi j’ai plutôt eu une très bonne expé­rience d’Ey­rolles. Muriel, tu as été vrai­ment super, Karine aussi, et j’ou­blie certai­ne­ment des gens. Je n’ai eu à me plaindre de personne, au contraire.

Si je devais repro­cher quelque chose, c’est le refus total de consi­dé­rer une durée limi­tée pour la version numé­rique du livre. Je crains cepen­dant qu’il en soit de même pour l’es­sen­tiel des éditeurs et mon co-auteur a de toutes façons refusé toute vente numé­rique par peur du pira­tage (qui a tout de même eu lieu, visi­ble­ment par des fuites des PDF internes desti­nés à l’im­pri­meur, avec les marques de découpe). Oh si, si je devais pinailler, il y a briè­ve­ment eu une mise en vente de la quatrième édition sous forme numé­rique malgré le refus expli­cite au contrat, mais ils y ont mis un terme quand on l’a fait remarquer.

Je ne m’éten­drai pas sur ce point mais on a même eu une diffi­culté de répar­ti­tion des droits entre co-auteurs à un moment. Non seule­ment l’édi­teur a aidé à sa réso­lu­tion mais il a aussi pris le diffé­ren­tiel à sa charge pour solder le passé. Ok, vu les ventes ils pouvaient se le permettre, mais rien ne les y obli­geait non plus.

PHP 7 avancé

Aujoud’­hui PHP 5 avancé n’existe plus. Il y a eu réécri­ture partielle pour construire PHP 7 avancé mais consi­dé­rant les diffi­cul­tés de colla­bo­ra­tion, on a décidé de ne pas forcé­ment le refaire ensemble. Je suis toujours sur la couver­ture en grisé mais j’ai passé la main aux excel­lents Pascal Martin et Julien Pauli, au moins pour les deux premières éditions (la seconde arrive parait-il sous peu).

Catégories
navigateurs et API Web

Après la seconde guerre, le web et le mobile

La seconde guerre des navi­ga­teurs est sur le point d’être termi­née.

Pour sché­ma­ti­ser, les gens utilisent Safari sur iPhone et iPad — ils n’ont pas le choix. Partout ailleurs il n’y a quasi­ment plus que Chrome. Objec­ti­ve­ment il faut avouer que le logi­ciel est excep­tion­nel, et évolue constam­ment.

Fire­fox est en baisse lente mais constante, avec désor­mais moins de 10 % du trafic en Europe. Même le fleu­ron de Micro­soft installé par défaut sur plus de 80 % des postes de travail récents, Edge, ne dépasse pas les 3 %.

On en est au point où quand vous lancez une appli­ca­tion mobile, c’est en réalité parfois les moteurs de Chrome ou de Safari qui fonc­tionnent en arrière plan. Même les versions légères de Fire­fox mobile sont de simples surcouches à Chrome et Safari.


La guerre des navi­ga­teurs est termi­née et nous l’avons perdue.

Nous l’avons perdue parce que nous avons aban­donné le futur de l’in­for­ma­tique person­nelle — le web et le mobile.

L’es­sen­tiel du parc est contrôlé par une régie publi­ci­taire dont le modèle écono­mique est de surveiller et régen­ter tout ce que vous faites sur vos appa­reils. Google et Chrome c’est ça.

Les 15 à 20% restant sont des appa­reils premium, pour une élite qui peut se les offrir. En échange d’un peu de vie privée, l’en­tre­prise contrôle tota­le­ment les appa­reils et ce qu’elle nous y auto­rise à faire ou non, en fonc­tion de ses inté­rêts commer­ciaux et de la morale nord-améri­caine. Il n’y aura pas d’al­ter­na­tive.


Aujourd’­hui nous avons déjà plus ou moins aban­donné notre vie privée et/ou notre liberté d’ac­tion sur nos appa­reils. Nous avons aban­donné tout ça mais nous savons que nous avons des portes ouvertes : Il existe des alter­na­tives, au cas où.

Le problème c’est que nos navi­ga­teurs ont tous 20 ans. Les moteurs on telle­ment évolué qu’ils n’ont proba­ble­ment plus grand chose à voir avec le code de 1998 mais ce qu’on y a fait est telle­ment complexe et demande de telles ressources que personne n’a rien créé de tota­le­ment neuf depuis.

Même aujourd’­hui, évoluer à la même vitesse que Chrome est loin d’être facile. Il faut des compé­tences diffi­ciles à trou­ver, des ressources finan­cières signi­fi­ca­tives et quasi­ment impos­sible à renta­bi­li­ser.

Si demain Chrome ou Safari décident d’im­plé­men­ter plus de choses derrière leurs murs sans les parta­ger en open source, cloner un ancien moteur et rattra­per tout ce qu’ils auront fait entre temps risque d’être mission impos­sible.

Ne parlons même pas du jour où Chrome aura réel­le­ment 80 % du marché et où ils se permet­tront d’avan­cer sans coor­di­na­tion avec quiconque. On n’en est déjà pas si loin d’une certaine façon.

Le résul­tat c’est que nous avons besoin d’Opera, Fire­fox et Edge, aujourd’­hui, même si ce n’était que pour forcer Chrome et Safari à conti­nuer à jouer le jeu. Ceux qui ont connu la première guerre des navi­ga­teurs savent de quoi on parle. On joue un peu l’ave­nir du web et du mobile. Rien que ça.


Pourquoi dis-je tout ça ? Parce qu’aujourd’­hui vous utili­sez Chrome, peut-être Safari. Je comprends : Ça fonc­tionne (très bien). C’est confor­table (très).

Et si vous tentiez de nouveau Fire­fox ?

Oui, par le passé c’était plus lourd que Chrome. Je ne vous garan­tis pas que le ressenti sera exac­te­ment le même mais la perfor­mance et la consom­ma­tion en ressources est désor­mais objec­ti­ve­ment simi­laire, assez pour que ce ne soit pas la vraie ques­tion.

Oui, parfois il y a des sites qui fonc­tionnent mieux sous Chrome, ou qui n’im­plé­mentent pas telle ou telle fonc­tion­na­lité annexe ailleurs que sous Chrome. C’est rare mais ça arrive. Il reste que c’est la poule et l’œuf, ils se le permettent parce que vous utili­sez Chrome. Votre vie privée et votre liberté méritent bien un peu de mili­tan­tisme, non ?

Bref, je ne dis pas que c’est mieux, mais au moins ce n’est pas signi­fi­ca­ti­ve­ment moins bien. Les diffé­rences sont surtout dans les préju­gés et les habi­tudes.

Le vrai problème c’est le chan­ge­ment. Quand on change, la moindre micro diffé­rence sans impor­tance peut prendre des propor­tions gigan­tesques pour vous convaincre que non, ça ne le fera pas. Il faut résis­ter, deman­der de l’aide si besoin (parce que non, s’il y avait des problèmes sérieux ça se saurait, et ce n’est pas le cas), et tenter de ne pas lancer Chrome pendant un mois. Pas du tout, pour être en immer­sion, sinon la résis­tance au chan­ge­ment pren­dra l’avan­tage.

N’al­lez pas me dire que vous êtes vieux et sclé­rosé intel­lec­tuel­le­ment au point de ne pas vaincre cette résis­tance au chan­ge­ment… Et si vous essayiez ?

Catégories
Équipes Méthodes agiles Objectifs

Story points

Points de complexité, points d’ef­fort, tailles de tshirt… J’ai vu des équipes travailler avec des comp­tages allant d’une mesure en heures de travail à des mesures au simple nombre de tickets.

Je n’ai pas trouvé de réelle corré­la­tion entre la réus­site des équipes et leur façon d’es­ti­mer, ou même avec l’exis­tence ou non d’es­ti­ma­tions.

Si je devais trou­ver un critère commun à la majo­rité des équipes que j’ai vu bien fonc­tion­ner, le voilà :

Les esti­ma­tions de tâches indi­vi­duelles sont réali­sées au lance­ment du travail. Elles ne sont pas utili­sées au-delà de la courte période de travail concer­née pour laquelle elles étaient prévues. Elles ne sont pas utili­sées en dehors de l’équipe ou de son fonc­tion­ne­ment interne.


Déci­der. On estime les epic, ces gros blocs qui recoupent géné­ra­le­ment plusieurs semaines voire plusieurs mois. Ces epic servent à faire des choix, déci­der de l’op­por­tu­nité de réali­ser, confron­ter les prio­ri­tés, savoir s’il est réaliste d’at­teindre l’objec­tif avant un événe­ment parti­cu­lier. Dans tous les cas on parle de stra­té­gie et de tactique.

Les points de complexité n’ont aucun sens à ce niveau. On a juste besoin d’un ordre de gran­deur. Les esti­ma­tions se font au doigt mouillé et c’est très bien comme ça. 30% de marge d’er­reur c’est presque de la surqua­lité.

Ces esti­ma­tions n’ont aucune valeur en dehors de la prise de déci­sion. Le péri­mètre n’est pas vrai­ment défini, la tech­nique en est à l’étude de faisa­bi­lité et aux pistes tech­niques crédibles ou non.


Réagir. Et puis à partir de là on passe éven­tuel­le­ment en réali­sa­tion. Mesu­rer l’avan­ce­ment permet de ne pas se perdre, d’iden­ti­fier les blocages, de se rendre compte quand on patauge. C’est ce qui permet éven­tuel­le­ment de dire « on a un problème, il faut chan­ger quelque chose » ou « l’ordre de gran­deur qui a mené à la déci­sion de réali­sa­tion se révèle faux, est-ce qu’on conti­nue ou pas ? ».

On peut mesu­rer en fonc­tion d’es­ti­ma­tions de travail ou en fonc­tion de ce qui est livré à la sortie. Les deux ont du sens et je vous invite à faire les deux. Côté scrum on parle de la burn-down qui trace le travail, limité à une itéra­tion ou à une date butoir, et la burn-up qui trace la valeur produite sur du plus long terme.

Ces esti­ma­tions ne servent qu’à ça, iden­ti­fier d’éven­tuels problèmes pour agir en fonc­tion. Elles ne servent pas à savoir si l’équipe travaille bien ou pas. Ce sont de sacré­ment mauvais indi­ca­teurs pour ça.


Et donc les problèmes arrivent quand on croise les deux.

Les esti­ma­tions et les plans ne sont pas faits pour mesu­rer le succès et le travail d’une équipe. Il sont faits pour déci­der et réagir. Rien de plus.

Un plan long terme ne se construit pas en jouant au puzzle à agen­cer plein de petits blocs ensemble pour les caser dans l’agenda. Ça ne fonc­tionne déjà pas pour les tâches de pure exécu­tion, parce que 18 tâches de 10 minutes ne prennent pas le même temps qu’une tâche de 180 minutes.

Ça fonc­tionne encore moins dès qu’il y a une acti­vité de réflexion, de créa­tion, ou simple­ment l’in­ven­tion de quelque chose qui n’existe pas. On ne connait pas tout à l’avance, le puzzle sera explosé avant d’avoir atteint le premier quart. C’est vrai autant d’un point de vue fonc­tion­nel que tech­nique.

Mais surtout, le plan est fait pour être changé. Mesu­rer la réalité par rapport au plan c’est dire que le chan­ge­ment et l’im­prévu doivent être vali­dés en amont, qu’ils sont anor­maux, qu’en que si la réalité ne corres­pond pas au plan c’est la réalité qui a tort et que le problème se situe donc au niveau de ceux qui suivent le plan.

Malheu­reu­se­ment essayer de tordre ou de contes­ter la réalité ne fonc­tionne que à ma connais­sance que dans les livres et les films de science-fiction (et encore : même là, en géné­ral, on a les problèmes qui nous sautent au visage dès qu’on essaie).

Par­fois il y a aussi des problèmes au niveau de ceux qui suivent le plan, mais savoir si la réalité est conforme au plan est tout sauf le bon indi­ca­teur pour ça.

Catégories
Architectures ouvertes Geek Système informatiques

7 milliards et demi

Github est un concen­tré de tech­no­lo­gies. On ne refera pas Github de zéro avec juste une poignée de déve­lop­peurs dans un garage.

Mais… 7 milliards et demi de dollars. Vous comp­tez comme vous voulez mais la tech­no­lo­gie seule en vaut diffi­ci­le­ment un centième. Multi­pliez par 10 parce que c’est prêt et qu’on évite du risque et du délai, il y aura encore au moins un zéro de trop. Les divi­dendes à venir ne valent pas cette diffé­rence.

Ce que Micro­soft achète ce n’est pas Github, le logi­ciel et les équipes, c’est vous, clients. Vous et vos projets. On vient de vous vendre comme une marchan­dise. Vous n’en avez même pas touché des miettes.

Moi non plus.

Catégories
Architectures ouvertes Geek

Gérer son pota­ger

Propo­ser de l’auto-héber­ge­ment c’est comme recom­man­der aux gens de faire leur propre pota­ger quand ils te parlent des problèmes de la chaîne de distri­bu­tion alimen­taire (*).


Oui l’auto-suffi­sance alimen­taire est un énorme pas dans le bon sens. Non tout le monde n’a pas les connais­sances ou les compé­tences pour main­te­nir son pota­ger, les moyens finan­ciers d’avoir un terrain et le maté­riel perti­nent, ou simple­ment le temps à y consa­crer.

Même quand on a tout ça, on peut vite se retrou­ver avec une récolte à vide, ou obligé de déver­ser plus de pesti­cide et plus d’eau que ne le ferait une culture inten­sive.

Bref, c’est super, mais ce n’est pas la solu­tion magique à tout et pour tout le monde. Pas ainsi.

Certains feront leur pota­ger, mais plus par plai­sir ou convic­tion que comme source d’ap­pro­vi­sion­ne­ment. D’autres iront dans des AMAP, dans des circuits courts, au super­ma­ché bio ou soli­daire, à la supé­rette du coin, ou même au super­mar­ché en faisant atten­tion à ce qu’ils achètent, en fonc­tion de leurs moyens, de leurs contraintes et de leurs besoins.


L’auto-héber­ge­ment c’est pareil. Il vous faut un maté­riel adapté, une connexion Inter­net stable et suffi­sante, des compé­tences non négli­geables, et surtout pas mal de temps et d’at­ten­tion.

Main­te­nir un service en fonc­tion­ne­ment n’est qu’une petite partie du problème. Combien de ceux à qui on aura conseillé l’auto-héber­ge­ment vont se retrou­ver sans sauve­garde fonc­tion­nelle au premier inci­dent ? Combien vont faire une erreur et perdre leurs données ? Combien auront une qualité de service accep­table ? Et surtout, combien vont gérer correc­te­ment la sécu­rité ?

Genma parle d’éli­tisme. C’est un peu vrai mais il n’y a pas que ça. Même pour quelqu’un du métier, qui a les moyens finan­ciers et du temps à y consa­crer, une sécu­rité correcte demande désor­mais un inves­tis­se­ment déme­suré pour la plupart des besoins person­nels.


Je ne dis pas que c’est forcé­ment une mauvaise idée. La centra­li­sa­tion et la dépen­dance sont de vrais enjeux, la vie privée aussi, mais ne résu­mons pas ça à l’auto-héber­ge­ment.

Faites-le pour vous amuser, pour apprendre, pour tester, pour bidouiller. Faites-le si vous en avez envie, tout simple­ment. Aidez ceux qui veulent le faire.

Arrê­tez par contre d’as­sé­ner ça comme une solu­tion facile et univer­selle. Arrê­tez de faire culpa­bi­li­ser ceux qui délèguent et font confiance à un pres­ta­taire. Vous ne rendez service à personne, pas même à vos amis et votre famille à qui vous êtes en train de dire « mais si, sois dépen­dant de moi et mets-moi admi­nis­tra­teur sur toutes tes données, tu verras ce sera génial ».


(*) L’ana­lo­gie n’est pas de moi, je l’ai croi­sée récem­ment chez Clochix, merci à lui.

Mise à jour : Depuis, l’ex­cellent Aeris a parlé de ça en détail et avec bien plus de brio que moi. Allez lire.

Catégories
Hygiène numérique Sécurité informatique Vie privée

Un serveur email chif­fré

J’amorce mon départ de Gmail, dans la lignée de la reprise de contrôle sur mes données. Le problème avec les emails c’est qu’on est dans un écosys­tème où tout est échangé en clair.

J’ai aban­donné l’idée de conver­tir tout le monde à GPG. En fait j’ai même aban­donné l’idée de m’y conver­tir moi-même. J’ai long­temps eu des clefs expo­sées sur mes profils en ligne et malgré un réseau très geek sensible à ces ques­tions, je crois que je n’ai jamais reçu un seul email chif­fré.

Bref, vous échan­gez les emails en clair avec l’ex­té­rieur et vous ne pour­rez rien faire contre ça. Vous pouvez cepen­dant chif­frer vos archives et tout email dès sa récep­tion. C’est ce que font Proton­mail, Tuta­nota et Mail­den.

Mail­den ce sont des versions modi­fiés de Post­fix et Dove­cot qui chiffrent et déchiffrent les emails à la volée pour vous. Le serveur a donc accès à vos clefs quand vous vous y connec­tez mais promet de les oublier dès que la connexion prend fin. L’avan­tage c’est que de votre point de vue vous avez un serveur email tout ce qu’il y a de plus clas­sique.

Proton­mail et Tuta­nota gèrent eux un vrai chif­fre­ment de bout en bout. Le serveur ne voit jamais passer votre clef de déchif­fre­ment. Seul vous pour­rez lire vos email une fois qu’ils ont été chif­frés. En échange il vous faudra des appli­ca­tions email spéci­fiques ou un proxy de déchif­fre­ment inter­mé­diaire.

Aucun des deux modèles n’est parfait. Tuta­nota me tente mais ça reste assez spar­tiate et j’ai peur que leur approche de la recherche m’em­pêche d’y indexer toutes mes archives. Disons que ça sera à tester avant de s’en­ga­ger.

Mail­den pour­rait être une option mais si c’est pour faire confiance au serveur lors de la récep­tion des emails, lors de l’en­voi des email, lors de chaque accès, et que contacts comme calen­driers devront être gérés tota­le­ment en clair chez un autre héber­geur…

… Je commence à me deman­der si tout ça vaut le coup et si je ne devrais pas juste sous­crire à la gamme complète chez Fast­mail. Ce ne sera pas chif­fré mais c’est un bon choix et je leur fais confiance pour ne pas exploi­ter mes données privées. Ce pour­rait être un compro­mis perti­nent le temps que Tuta­nota et les offres simi­laires soient un peu plus abou­ties.


Pourquoi pas Proton­mail plutôt que Tuta­nota ?

Sécu­rité : Tuta­nota chiffre les contacts et le sujet des emails, pas Proton­mail. Tuta­nota propose aussi ses appli­ca­tions clientes en open source, ce qui apporte un peu plus de garan­tie ou permet d’hé­ber­ger soi-même le webmail.

Utili­sa­tion : Proton­mail a la bonne idée d’of­frir un proxy pour utili­ser un vrai client email sur le poste fixe mais en échange l’app mobile ne saura pas faire de recherche dans le contenu des emails, ce qui me parait un défaut très sérieux.

Prix : Au delà de 5 Go, Proton­mail est prohi­bi­tif. On parle de 1€ le Go par mois.

Pour mon usage, avec un gros quota et un usage mobile complet, le choix est vite fait.

Catégories
Geek Sécurité informatique Système informatiques

Mes données dans une parti­tion chif­frée sous Linux

Je cherche essen­tiel­le­ment à me proté­ger de quelqu’un qui vole­rait mon disque après s’être intro­duit chez moi. Je garde donc une parti­tion en clair pour le système prin­ci­pal et je mettrai les données sur une parti­tion chif­frée que je monte manuel­le­ment.

Certaines docu­men­ta­tions proposent de mettre la clef de chif­fre­ment sur un petit stockage USB mais ça ne me semble pas perti­nent pour la menace dont je cherche à me proté­ger.

J’ai une pass­phrase dans mon gestion­naire de mots de passe et ça me suffira. Je ne compte pas m’en servir souvent de toutes façons. Avan­tage supple­men­taire par rapport à la version sur USB : Je peux me connec­ter en SSH et monter la parti­tion à distance pour peu que je ne craigne pas que quelqu’un se soit intro­duit sur ma parti­tion système entre temps.

Des docu­men­ta­tions je retiens le chif­fre­ment de blocs avec luks, et le fait de bien passer par crypt­se­tup plutôt que de tout gérer à la main.

Je reco­pie ici mes quelques commandes mais c’est tout bien expliqué sur la docu­men­ta­tion crypt­se­tup du wiki Ubuntu.

Créa­tion

sudo apt install cryptsetup
sudo cryptsetup luksFormat -c aes -h sha256 /dev/sda4
sudo cryptsetup luksOpen /dev/sda4 data
sudo mkfs.ext4 -L data /dev/mapper/data
sudo mkdir /mnt/data
sudo echo "data /dev/sda4 none luks,noauto,quiet" >> /etc/crypttab
sudo echo "/dev/mapper/data /mnt/data ext4 rw,nosuid,exec,noauto,async,user,noatime,nodiratime 0 0" >> /etc/fstab
sudo mount /mnt/data

La pass­phrase vient du géné­ra­teur aléa­toire de mon gestion­naire de mot de passe. J’ai cher­ché un inter­mé­diaire entre « le plus long possible » et « si ça se trouve j’au­rais à la taper à la main un jour ». En temps normal ce ne sera que des copier/coller donc ça ira.

Script de montage

#!/bin/bash
# /usr/local/sbin/mount.data
cryptsetup luksOpen /dev/sda4 data
mount /mnt/data

Script de démon­tage

#!/bin/bash
# /usr/local/sbin/umount.data
umount /mnt/data
cryptsetup luksClose data

Je l’ai créé mais j’avoue que je vois mal dans quel cas je vais avoir envie de démon­ter ma parti­tion sans arrê­ter tota­le­ment le système (et dans ce cas ça sera fait tout seul sans mon inter­ven­tion de toutes façons).

Catégories
javascript navigateurs et API Sécurité informatique

Comment on fait de la crypto dans le navi­ga­teur ?

Faire de la cryp­to­gra­phie dans le navi­ga­teur se révèle bien plus simple que prévu.

Lais­sez tomber les portages de libso­dium & co. Quasi­ment tous les navi­ga­teurs supportent désor­mais une API native dédiée. Seul IE11 ne le fait pas tota­le­ment mais il a au moins le mini­mum qu’est la géné­ra­tion de nombres réel­le­ment aléa­toires. Ceux qui veulent vrai­ment pour­ront complé­ter l’im­plé­men­ta­tion d’IE11 avec un poly­fill sans risquer de problème de sécu­rité.

Il y a plein de jolis exemples sur qnimate mais certaines choses datent un peu. J’ai tenté de résu­mer ici pour ceux que ça inté­resse. Ici pour du déchif­fre­ment à partir d’une clef secrète.

Avant-propos

Je ne suis pas un expert en chif­fre­ment et ce genre de choses est toujours à manier avec précau­tion. Si vous faites quelque chose de sérieux, ne vous conten­tez pas d’exemples et embau­chez quelqu’un qui sait.

Rien que choi­sir l’al­go­rithme perti­nent demande de savoir ce qu’on fait. AES-CTR semble perti­nent pour mon cas d’usage où n’ai pas besoin de véri­fier l’au­then­ti­cité du message, où je n’ai pas envie de me colti­ner les ques­tions de padding, et où je serai heureux de profi­ter des multiples cœurs des smart­phones.

Si l’al­go­rithme choisi ou autre chose vous dérange et que vous en savez plus que moi, n’hé­si­tez pas à commen­ter.

Récu­pé­rer une clef

Le plus simple est de récu­pé­rer direc­te­ment une clef au format JSON Web Key (en gros la clef en base64url plus un peu de méta­don­nées). Dans ce cas il suffit de passer par importKey :

const crypto = window.crypto.subtle;

const jwk = {
  "kty": "oct",
  "use": "enc",
  "k": "SDRSTgdOpUGfgn3iAwiC1cpzsevLM98r_6ehMXlK1Gk",
  "alg": "A256CTR"
};
const algo = {name: "AES-CTR"};
const exportable = false;
const usage = ["decrypt"];

const key = await crypto.importKey("jwk", jwk, algo, exportable, usage);
Déri­ver une clef

Si on veut partir d’une phrase secrète mémo­ri­sable et non d’une clef complète, on commence par créer une clef tempo­raire et on utilise un algo­rithme de déri­va­tion comme PBKDF2.

Malheu­reu­se­ment pour créer cette première clef il faut passer par un TextEn­co­der et ArrayBuf­fer. peut toujours déri­ver la clef à partir de là. TextEn­co­der n’existe pas sous Edge et IE11, il vous faudra utili­ser une fonc­tion comme uniba­bel qui fait ça pour vous.

const crypto = window.crypto.subtle;
const encoder = TextEncoder();

const passphrase = "l'eau ça mouille, le feu ça brûle";
const buffer = encoder.encode( passphrase );
const d_algo =  {name: 'PBKDF2'};
const d_exportable = false;
const d_usage = ['deriveBits', 'deriveKey'];
const d_key = await crypto.importKey('raw', buffer, d_algo, d_exportable, d_usage);

const deriv = { 
  name: 'PBKDF2',
  salt: encoder.encode( "c'est le week-end !" ),
  iterations = 25,
  hash: 'SHA-256',
};
const algo = {name: "AES-CTR", length: 256}; 
const exportable = false; 
const usage = ["decrypt"];

const key = await crypto.deriveKey(deriv, d_key, algo, exportable, usage);

La sécu­rité de tout ça dépend de la longueur et de l’uni­cité de votre phrase secrète initiale. À vous de trou­ver le bon compro­mis entre la sécu­rité et la puis­sance des smart­phones qui risquent d’uti­li­ser votre code. Le 25 ici est pure­ment arbi­traire et le temps de calcul néces­saire est propor­tion­nel.

Déchif­frer

Déchif­frer n’est pas plus diffi­cile.

Le vecteur d’ini­tia­li­sa­tion (iv) et la donnée chif­frée (encryp­ted) sont atten­dus sous forme d’Ar­rayBuf­fer. Il faudra de nouveau passer par uniba­bel ou une autre solu­tion si vous avez ça sous forme de chaîne binaire ou codé en base64.

Le résul­tat de decrypt() vous est retourné sous la même forme. S’il est petit le plus simple est d’uti­li­ser TextDe­co­der ou uniba­bel. Si vous avez quelque chose de plus volu­mi­neux vous pouvez aussi passer par un Blob et un FileRea­der.

const crypto = window.crypto.subtle;
const decoder = TextDecoder

const key = ...
const iv = ...
const encrypted = ...

const algo = { name: 'AES-CTR', iv: iv }
const buffer = await crypto.decrypt(alg, key, encryted);