Samedi passé, la vidéo youtube du court métrage Sintel a été bloqué. La raison de ce blocage est une détection de contenu appartenant à Sony dans la vidéo.

Pour ceux qui l’ignorent, Sintel est un film de la Blender Foundation, une association à but non-lucratif développant le logiciel de 3D Blender. Ce film est réalisé principalement à partir de logiciels libres et publié sous licence Creative Commons ainsi que toutes les ressources étant été créées. Ce film est donc loin, très loin d’être la propriété de Sony !

sintel-youtube

Sans surprise, cette censure déclencha un clash sur le web. Comme le dit TorrentFreak, Sony a réussi l’exploit de se mettre à dos les fan de logiciels libres, adeptes de Creative Commons, mouvement anti abus de copyright et groupes de protections contre la censure en un seul coup. Ça mériterait un prix.

Après un weekend de lynchage virtuel et reprise de l’info sur les grands sites d’info, la vidéo est de retour ! Suite à ce coup de pub, Sintel vient même de passer les 4 millions de vues sur Youtube. Houra, faites péter le champomi, on a gagné ?

Non.

Sintel_poster

Si le retour de la vidéo va un peu calmer les foules, le problème de fond reste inchangé. Une compagnie a la possibilité, sans aucune difficulté, justification ou contrôle a priori de censurer du contenu sur lequel elle n’a aucun droit. Un système qui devient la norme sur tous les sites de partage de contenu. Erreur ou choix de nuire à un concurrent ? Quelle que soit la cause, il est anormal que cela puisse se passer sans répercussion (même pas un “désolé”). On imagine facilement les très nombreux autres “faux-postifs” n’ayant pas la chance de bénéficier d’un tel coup médiatique.

De tels évènements montrent à quel point le système actuel ne fonctionne pas et doit changer. Peut-on espérer un changement du coté politique ? Supporter des projets comme MediaGobelin ou Gooseberry est plus que jamais important.

Télécharger Sintel (de façon propre et légale)

PS: ce titre ne veut rien dire, et alors ?

Faut-il encore présenter StatusNet ? Il est généralement considéré comme le clone libre et décentralisé de Twitter de référence. Une réussite toute relative comparé au nombre d’utilisateurs sur la version propriétaire mais un bon succès quand même par rapport aux autres projets libres du genre. Cependant, pour Evan Prodromou, son créateur, il était temps d’avoir quelque chose de nouveau et plus moderne. Il est donc passé de PHP à NodeJS, de MySQL à NoSQL, de Gitorious à Github et a créé Pump.io. Les concepts de fonctionnement sont légèrement différents : StatusNet est clairement calqué sur Twitter avec la limite de 140 caractères alors que Pump utilise un formatage riche en wysiwyg sans limite de taille, le tout à la sauce Bootstrap. Cependant le public StatusNet est visé puisqu’une migration forcée d’identi.ca (instance de StatusNet rassemblant une très grosse partie des utilisateurs) vers Pump est prévue en avril. La messe étant dite, faisons une présentation de ce nouveau venu.

pompe rouillée

Avec un nom pareil, je trouve quand même que ça part mal.

Protocole

J’avais parlé de ce problème dans mon article précédent : Pump n’utilise pas OStatus (le groupe de protocoles utilisé par StatusNet) et ne sera donc pas compatible avec ce dernier. C’est nul, je sais. Cependant les standards utilisés ne diffèrent pas trop non plus. Les activity streams sont au cœur du réseau (déjà présents dans OStatus sous forme XML mais l’on va encore plus loin cette fois). Activity Stream est un standard initié par Facebook, Google, Microsoft (et plein d’autres gens bien) pour unifier la façon de représenter des actions sur les réseaux sociaux et faciliter l’interopérabilité. Un message d’un serveur Activity Stream à un autre est par exemple :

    {
        "id": "http://coding.example/api/activity/bwkposthw",
        "actor": {
            "id": "acct:bwk@coding.example",
            "displayName": "Brian Kernighan",
            "objectType": "person",
            "url": "http://coding.example/bwk"
        },
        "verb": "post",
        "object": {
            "id": "http://coding.example/api/note/helloworld",
            "content": "Hello, World!"
            "objectType": "note"
        },
        "published": "1973-01-01T00:00:00"
    }

Dans pump, une activité est authentifiée via OAuth, ce qui permet de séparer complètement l’authentification du contenu

POST /api/user/bwk/feed HTTP/1.1
Host: coding.example
Authorization: OAuth oauth_consumer_key="[...]",
    oauth_token="[...]", [...]
Content-Type: application/json

{
    "verb": "follow",
    "object": {
        "id": "acct:ken@coding.example",
        "objectType": "person"
    }
}

C’est simple et clair. Un exemple assez sympa de proof of contest est openframgame.com. C’est un site très simple de simulation de ferme. Vous avez de l’argent avec lequel vous achetez des parcelles, des semences et de l’eau. Vous plantez des semences, vous arrosez vos plantes et les revendez une fois atteinte la maturité. Rien de très intéressant dans le fonctionnement interne mais là où ça peut être intéressant est qu’il communique avec un compte Pump via des activty streams. Le fait que votre plante ait soif ou que vous ayez revendu une parcelle de tomates est une activité envoyée au serveur. Vous pourriez ainsi prévoir des réactions automatisées comme l’envoi de l’action d’arroser lorsque une plante a soif ou poster un message de victoire dès votre premier million amassé. On peut facilement imaginer les nombreuses possibilités si certains services utilisaient le couple activity streams – PubSubHubbub. En parlant de PuSH, Evan a annoncé dans un status vouloir l’intégrer dans pump.io.

Pourquoi pas du RSS (l’enfant pauvre et délaissé du web actuel) me diriez-vous ? Je ne suis pas dans la tête d’Evan mais il a un jour fait une réflexion disant que si Google abandonnait Google Reader (et donc le RSS), c’était sans doute car le RSS est très primitif. Pas de principe de conversation, on reste dans un schéma de producteur-consommateur qui ne correspond pas web social actuel. Personnellement, je ne pense pas que le RSS soit dépassé (car le schéma producteur-consommateur convient très bien à certains types de contenu) mais le rejoins sur le fait qu’il n’est pas adapté aux réseaux sociaux. Un flux public en RSS pour suivre les messages d’une personne peut être utile (je l’avais suggéré) mais ne doit pas être le protocole central pour l’interaction (ce qui était le cas dans StatusNet).

Ce qui est génial avec cette utilisation des activity streams est qu’il n’y a plus de formats différents pour l’API publique, la communication entre serveurs ou le flux d’un utilisateur : tout est activité (ou liste d’activités) au format JSON. J’envoie une activité (après authentification avec OAuth) avec le verbe « follow » à mon serveur pour donner l’ordre de suivre quelqu’un et je reçois en réponse, en cas de succès, l’activité qui apparaîtra dans mon flux. Même l’interface web est en fait un client web utilisant des activités avec le serveur. La plupart des actions (par exemple l’enregistrement d’un nouvel utilisateur) se fait via des activités.

Je vous laisse lire la page API.md pour plus de détails mais cela explique bien le fonctionnement général. C’est simple et propre, j’aime.

Tester

À quoi ressemble ce service ? C’est très facile, allez sur la page Try it qui vous redirigera aléatoirement vers une des 10 instances déployées par Evan. Contrairement à StatusNet qui avait identi.ca comme point central du réseau (au point où les gens confondaient parfois les deux et certains clients ne supportaient qu’identi.ca), Evan a voulu que Pump fonctionne réellement comme une fédération d’instances décentralisées.

pump-e homepage

Inscrivez-vous sur une instance, suivez d’autres gens (en passant par Login -> Account on another server? dans le cas d’utilisateurs sur d’autres serveurs), envoyez des messages et des images. On n’a pas encore toutes les fonctionnalités de StatusNet mais ce n’est pas loin.

Installation

Bon fini de rire, comment on déploie son instance sur son serveur ? Bonne nouvelle : il est assez simple de faire tourner un site en NodeJS. Mauvaise nouvelle : pour ceux qui font tourner plusieurs services sur une même machine via Apache ou Nginx, déployer Pump risque de vous poser des problèmes. Votre serveur web habituel écoutant sur le port 80 ou 443, il y a conflit avec NodeJS voulant écouter sur le même port.

Plusieurs possibilités s’offrent à vous :

  • utiliser pump seul sur le port 80 ou 443 (pas pratique)
  • utiliser pump sur une IP interne ou différente de celle utilisée par Apache/Nginx (pas facile, peut être fait en utilisant une machine virtuelle par exemple, configuration ici pour apache et ici pour nginx)
  • utiliser un port différent pour NodeJS avec un proxy redirigeant vos connexions vers le port 80 (perte de performance)

Il faut savoir que NodeJS a une bonne gestion de la concurrence ce qui lui permet, entre autres, de si bons benchmark. En utilisant un proxy, vous empêchez cette concurrence et réduisez les performances de Node à celles d’Apache. C’est dommage mais pas insurmontable non plus.

Après recherche, j’ai finalement trouvé deux systèmes fonctionnant pas trop mal avec Varnish (système de cache) et Apache : soit tout fonctionnant sur le port 80 avec Varnish servant de proxy, soit avec Pump écoutant sur le port 443 et Apache sur le port 80. Voulant utiliser du SSL pour pump, j’ai choisi la deuxième solution avec un certificat CaCert. Ci-dessous les explications des deux méthodes :

Tout sur le port 80

Première méthode : on n’utilise pas de SSL et fait tout tourner sur le port 80. Pour cela, j’utilise Varnish pour faire la différence, en m’aidant de ce tutoriel.

Configurez Varnish pour écouter sur le port 80 en modifiant le fichier /etc/default/varnish

DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s malloc,256m"

Créez le fichier /etc/varnish/default.vcl pour indiquer la redirection

backend apache {
    .host = "127.0.0.1";
    .port = "6001";
}
backend node {
    .host = "127.0.0.1";
    .port = "6002";
}
sub vcl_recv {
    if(req.http.host == "pump.mart-e.be") {
        set req.backend = node;
    } else {
        set req.backend = apache;
    }

    if (req.http.Upgrade ~ "(?i)websocket") {
      return (pipe);
    }
}
sub vcl_pipe {
  if (req.http.upgrade) {
    set bereq.http.upgrade = req.http.upgrade;
  }
}

En cas de domaine contenant « pump.mart-e.be », on redirige vers le port 6002, autrement vers le port 6001. Les commandes avec « pipe » étant pour permettre le fonctionnement des websockets à travers Varnish. Il vous faudra ensuite faire écouter Apache sur le port 6001 au lieu de 80 en modifiant le fichier /etc/apache2/ports.conf.

NameVirtualHost *:6001
Listen 6001

et en changent tous vos <VirtualHost *:80> par <VirtualHost *:6001> dans la configuration des sites.

En ce qui concerne pump en lui même ce n’est pas trop compliqué. Le fait qu’on utilise le port 6002 pour pump vous permet de lancer node avec un utilisateur non-root. Pump ne fonctionne pas (encore) bien avec la version 0.10 de NodeJs (il manque même certaines dépendances je pense), préférez donc la 0.8. Comme pump.io est encore en développement actif, on préférera la version git à mettre à jour régulièrement. Les explications ci-dessous utilisent mongodb mais vous pouvez utiliser un autre service tel que Redis ou même laisser le « disk » par défaut pour ne pas avoir de base de donnée (attention aux performances).

# mkdir /var/www/pump && cd /var/www/pump
# git clone https://github.com/e14n/pump.io
# cd pump.io
# npm install
# cd node_modules/databank
# npm install databank-mongodb

Utilisez le fichier pump.io.json.sample pour créer le fichier /etc/pump.io.json. Voici le mien :

{
    "driver": "mongodb",
    "params": {"host": "localhost", "port": 27017},
    "secret": "azerty12345",
    "noweb": false,
    "site": "pump-e",
    "owner": "mart-e",
    "ownerURL": "http://mart-e.be",
    "port": 80,
    "serverUser": "www-data",
    "hostname": "pump.mart-e.be",
    "address": "127.0.0.1",
    "nologger": false,
    "uploaddir": "/var/www/pump/uploads",
    "debugClient": false,
    "firehose": "ofirehose.com"
}

Installez bien le paquet mongodb et démarrez le démon (ici sur le port 27017). N’oubliez pas non plus de créer le dossier uploaddir mentionné. Lancez pump via

$ node bin/pump &> pumpd.log

ou utilisez la commande forever (npm install -g forever) pour quelque chose de plus stable. Si vous sauvegardez les logs dans un fichier, vous pouvez les consulter via bunyan (npm install -g bunyan et puis tail -f pumpd.log | bunyan), ça en facilitera grandement la lecture.

Et ceci était un des premiers services à interagir avec pump, c'est beau !

Et ceci était un des premiers services à interagir avec pump, c’est beau !

Pump en SSL

La config précédente est bien, mais c’est encore mieux si on utilise du HTTPS ! Trouvez-vous donc un certificat SSL (openssl req -nodes -new -keyout server.key -out server.crt) et envoyez-le sur votre serveur. Comme on ne veut pas produire de page d’erreur quand les gens essayent d’accéder à pump en HTTP, on va utiliser Varnish pour faire une redirection, status HTTP 302. Le fichier /etc/varnish/default.vcl devient donc :

backend apache {
    .host = "127.0.0.1";
    .port = "6001";
}
sub vcl_recv {
    if(req.http.host == "pump.mart-e.be" && req.http.X-Forwarded-Proto !~ "(?i)https") {
        set req.http.x-Redir-Url = "https://pump.mart-e.be" req.url;
        error 750 req.http.x-Redir-Url;
    } else {
        set req.backend = apache;
    }

    if (req.http.Upgrade ~ "(?i)websocket") {
      return (pipe);
    }
}
sub vcl_error {
  if (obj.status == 750) {
    set obj.http.Location = obj.response;
    set obj.status = 302;
    return(deliver);
  }
}
sub vcl_pipe {
  if (req.http.upgrade) {
    set bereq.http.upgrade = req.http.upgrade;
  }
}

Attention, si vous avez la version 3 ou plus de Varnish (dans Debian stable c’est encore la 2), la concaténation se fait avec un +, la ligne de calcul d’URL devient donc : set req.http.x-Redir-Url = "https://pump.mart-e.be" + req.url;

Varnish ne gère pas le trafic SSL donc on est obligé de rester sur le port 80 pour ce dernier.

Rien de change du coté d’apache (par contre faites bien attention dans le fichier ports.conf de ne pas écouter sur le port 443) mais le fichier de config de pump devient :

{
    "driver": "mongodb",
    "params": {"host": "localhost", "port": 27017},
    "secret": "monkey1",
    "noweb": false,
    "site": "pump-e",
    "owner": "mart-e",
    "ownerURL": "http://mart-e.be",
    "port": 443,
    "serverUser": "www-data",
    "hostname": "pump.mart-e.be",
    "address": "pump.mart-e.be",
    "nologger": false,
    "uploaddir": "/var/www/pump/uploads",
    "debugClient": false,
    "firehose": "ofirehose.com",
    "key": "/etc/ssl/server.key",
    "cert": "/etc/ssl/server.crt"
}

Notez que le champ « address » est passé de 127.0.0.1 à pump.mart-e.be. Sans cela, je n’ai pas réussi à accéder à mon serveur depuis l’extérieur. Ajoutez également l’URL de votre serveur pump (pump.mart-e.be ici) dans le fichier /etc/hosts pointant vers 127.0.0.1. Ainsi, la boucle est bouclée pour l’accès en local.

Via mes tests, j’ai noté que les serveurs semblaient retenir les précédentes informations de connexion. C’est-à-dire que les serveurs avec lesquels j’avais interagi à l’époque de mauvaises configs ou lorsque je tournais sur le port 80 semblent avoir retenu ces infos et je n’arrive plus à les contacter. J’ai ouvert un bug report à ce sujet. En attendant que cela soit réglé, faites bien attention de choisir votre mode de connexion et de vous y tenir.

Les clients

C’est bien beau d’avoir une bonne API mais qu’en est-il des clients externes ? Hélas, on n’en est qu’aux débuts. Il existe actuellement une librairie en python PyPump, utilisée par Muon, un client ncurse l’utilisant. C’est tout à ma connaissance…

Le fonctionnement de l’API semblant assez simple, ça ne devrait qu’être une question de temps avant l’apparition de plus de clients mais actuellement c’est un frein certain à l’adoption de pump. Si vous voulez recevoir la reconnaissance de toute une communauté (1170 personnes aux dernières nouvelles), c’est l’occasion rêvée pour faire un peu de développement !

Les services externes

Si vous voulez passer à Pump, une fonctionnalité intéressante est les bridges avec les autres réseaux. C’est dans ce but que pump2status a été créé. Pour l’instant, ce site vous permet de lier votre compte pump à votre compte StatusNet et vous permet de découvrir les gens ayant fait la transition (comme moi !). Dans le futur, ce site vous permettera de publier sur StatusNet vos activités Pump. Sont également prévus, par ordre de priorité et hackerliness Google+, Twitter, Facebook sans doute même des Foursquare, LinkedIn et Instagram plus tard. En raison du bug des anciennes configs mémorisées, pas certain que vous me trouverez (si vous voyez mart@pump.jpope.org, c’est mon compte de test, je ne devrais plus l’utiliser).

Là où Status.Net englobait un maximum de fonctionnalités, le but de Pump.io est d’être beaucoup plus minimaliste dans son mode de fonctionnement et de se baser sur des services externes. Les fonctionnalités de gestion du spam sont par exemple déléguées à activityspam (dont spamicity.info est une instance, wiki) ou le service OFireHose est utilisé pour faciliter la fédération du contenu public (dont ofirehose.com est une instance).

Les passerelles fonctionneraient avec ce même principe. On pourrait ainsi avoir une application externe s’occupant de récupérer du contenu venant de Twitter et de le convertir en activités poussées vers un compte pump. C’est une des possibilités parmi d’autres mais le principe reste d’utiliser des services externes.

L’idée (pas mauvaise) est de garder le coeur de Pump.io minimale pour avoir quelque chose de robuste et hack-friendly. Mon seul regret est l’absence d’extensions, je ne suis pas certain que le modèle de services externes fonctionne dans tous les cas de figure (pour une modification des templates par exemple).

Le futur

Dans une présentation datant de février dernier, Evan annoncait vouloir migrer les serveurs identi.ca de Status.Net vers pump.io en avril 2013. Les inscriptions sur identi.ca sont bloquées depuis quelques jours. On verra si ça pourra se faire mais je pense que le logiciel n’est clairement pas encore assez mature pour faire la transition aujourd’hui.

Vous l'avez rêvé, e14n n'a fait : le bouton « Je n'aime pas » !

Vous en avez rêvé, e14n n’a fait : le bouton « Je n’aime pas » !

Un des soucis potentiel est que la transition casserait tous les clients Status.Net (n’utilisant plus l’API à la Twitter). Une possibilité serait de maintenir une compatibilité avec un bridge entre les deux. J’avais vu cette suggestion faite par Evan (mais n’arrive plus à retrouver le lien). Cela faciliterait grandement les choses le temps de la transition.

Si la sauce prend bien, Evan espère voir les gens adopter massivement pump.io et développer pour celui-ci. Les possibilités d’utilisation du réseau sont assez larges et intéressantes. Openfarmgame était une démo simple. Ih8.it en est une autre. On pourrait même imaginer des analyses globales des comportements via les publications poussées sur ofirehose (de la pub ?). Les principes de fédérations semblent bien réfléchis, et l’on devrait éviter les travers rencontrés avec StatusNet et identi.ca.

Si vous ne voulez pas passer à Pump.io (parce que ça ne correspond pas à ce que vous cherchez), faites une sauvegarde de votre compte identi.ca et utilisez Status.Net sur une autre instance (c’est le moment de passer à l’auto-hébergement). N’oubliez pas, ce n’est pas parce qu’identi.ca et Evan passent à Pump.io que la communauté est obligée de suivre. C’est du libre après tout.

Pump est encore un peu jeune mais néanmoins déjà utilisable. Essayez-le, faites-vous un avis et choississez ensuite si vous voulez rester sur StatusNet ou passer à Pump (ou utiliser les deux ou aucun). Je ne compte pas encore remplacer mon compte StatusNet par Pump mais ça sera sans doute le cas un jour (et me permettra d’abandonner définitivement mon compte Friendica inutilisé). En tout cas, espérons que ce réseau ne soit pas encore « un parmi tant d’autres ».


Les souvenirs et les regrets aussi.
Mais mon serveur silencieux et fidèle sourit toujours et remercie la vie.
Je t’aimais tant, tu étais si standardisée, comment veux-tu que je t’oublie ?

– Jacques Prévert.

Les réseaux libres et décentralisés c’est beau, pas de censure ou exploitation de vos données, bel exemple de liberté d’expression. Chacun choisissant son serveur, on évite les problèmes de points de passage uniques et diminue les problèmes en cas de défaillance d’un nœud. Enfin dans la théorie parce qu’en réalité c’est complètement le bordel. Les réseaux sociaux libres fleurissent un peu partout mais il n’y a pas moyen de s’entendre.

La semaine passée, pump.io venait de sortir sa version 0.2, une première release après 4 mois de développement (c’est là qu’on se rend compte que Diaspora avec ses 2 ans de développement s’est bien foutu de nous). Pump est un projet de Evan Prodromou, le créateur de StatusNet, et présenté comme la succession de ce dernier (prévu pour la 0.3, en avril 2013, les inscriptions sur identi.ca sont d’ailleurs désormais gelées). StatusNet continuera a vivre et être maintenu mais il ne faut pas s’attendre a voir de grandes nouveautés apparaître. Pump est écrit en NodeJS et avec une base de donnée NoSQL (MongoDB & co). Je n’ai aucun problème avec le fait d’abandonner le couple vieillissant PHP/MySQL (au contraire). Le point problématique est un aspect que l’on voit apparaître très souvent avec les réseaux sociaux libres : il n’utilise pas OStatus mais une nouvelle API. OStatus est une suite de protocoles (Atom, Activity Streams, PubSubHubbub, Salmon et Webfinger) qui permet de se mettre d’accord sur la façon dont deux serveurs OStatus peuvent communiquer. C’est grâce à OStatus que je ne suis pas obligé d’utiliser StatusNet pour communiquer avec quelqu’un l’utilisant, je peux utiliser Friendica par exemple. Cependant Friendica est un peu l’exception qui confirme la règle, a part lui qui met un point d’honneur a être compatible avec plusieurs réseaux, les autres utilisent systématiquement des manières propre pour communiquer.

Prenons l’exemple de Tent, un nouveau protocole décentralisé assez sympa (dont TentStatus est la partie permettant le microblogging). La façon de voir les choses est intéressante et suis convaincu qu’on puisse voir de chouettes projets apparaître (comme la page Related Projects le montre). Cependant ils ont fait le choix de recommencer from-scratch et cassant toute compatibilité. Les serveurs Tent ne peuvent parler qu’avec des serveurs Tent. Les raisons avancées pour ne pas utiliser OStatus sont discutables : pas de messages prives, impossible de changer de serveur en gardant les relations, pas d’API standard pour l’interaction. Mais comme mentionné dans un commentaire, c’est plus drôle de partir de zéro.

installation-parabole

Avec cette parabole Turbo+ 2.0, nous devrions enfin a comprendre leurs messages codés avec ce mystérieux « XMPP »

Vous vous souvenez de Diaspora ? Belle levée de fond, beaucoup d’espoirs, deux ans de développement pour finalement abandonner le projet a la communauté. Les créateurs décident de se concentrer sur leur sorte de générateur de meme (qui utilise ironiquement Facebook-connect, un bel aveu d’échec). Il semble avoir une bonne relève et il est possible que ce projet aboutisse a quelque chose mais Diaspora part avec une mauvaise base : un protocole interne quasi inexistant (qu’on pourrait presque qualifier de propriétaire). Diaspora avait été conçut sans trop savoir où aller puisque l’API n’était pas documentée et changeait tout le temps. Le projet Friendica a essayé d’être compatible avec celui ci mais a rencontre de nombreuses difficultés. Il semblerait que la communauté a prit conscience de ce problème puisqu’ils essayent d’être compatible avec d’autres réseaux. Personnellement, j’ai abandonné mais espoirs concernant Diaspora mais je peux changer d’avis, wait and see… ou pas.

Ces deux exemples ne sont pas les seuls, dans les plus connus on a aussi Movim (a base de XMPP, pas d’interopérabilité avec d’autres API type OStatus) ou SalutAToi (utilise une API basée sur XMPP documentée mais de leur cru quand même). Notons les bons élèves que sont Friendica et BuddyCloud puisqu’ils supportent plusieurs standards.

Pour revenir a Pump, Evan avait sans doute de bonnes raisons de changer la façon d’interagir entre serveurs, il s’y connaît en réseaux décentralisés et API. En raison de quelques problèmes avec StatusNet, il a préféré repartir sur une nouvelle base. Il annonçait quand même qu’un effort serait fait pour être compatible avec StatusNet. Cependant, l’API de base reste différente, toutes les fonctionnalités devront être adaptées pour faire la transition.

Pour se rendre compte du problème, imaginons maintenant que StatusNet ou Diaspora soient complètement abandonnés par les développeurs et ne soient plus maintenus. Les logiciels ont amassés une bonne base d’utilisateur mais ces utilisateurs vont lentement migrer vers des solutions plus modernes et maintenues. Sans l’émergence d’une solution supérieure, ils vont se diviser, se tournant peut être même vers une solution propriétaire. Cette migration se fera petit a petit, avec une base d’utilisateur ne voulant pas faire de migrer en raison de la communauté déjà présente sur son vieux réseau. Si ces logiciels ne sont plus maintenus, des Pump ou Friendica seront sans doute moins tentés de continuer a maintenir un niveau de compatibilité vers eux. Les nouvelles fonctionnalités ne seraient pas portées en OStatus. La communauté se retrouverait encore plus fragmentée. C’est évidement un scénario peu probable (déjà car OStatus n’est pas utilisé que par StatusNet) mais cela montre le problème des multiplications de standards : division de la communauté encore plus accentuée en cas d’abandon de projets.

Se mettre d’accord sur un protocole standard c’est une condition essentielle pour le succès des réseaux libres décentralisés. Sans cela, je ne pense pas que l’on pourra dominer les réseaux propriétaires centralisés ayant l’avantage de ne pas avoir a se soucier de ce problème. Je ne critique pas un standard en particulier (je ne me permettrais pas d’en désigner un supérieur aux autres), que ce soit OStatus, Pump, Tent, Diaspora ou un autre à base de XMPP, il faut se mettre d’accord sur une API commune et il faut arrêter d’en développer une nouvelle pour chaque logiciel. Toutes les API ne sont sans doute pas compatibles avec tous les cas de figure (sans parler de l’école HTTP vs XMPP) mais il y a sûrement moyen de dégrossir. Créer c’est bien, améliorer l’existant, c’est mieux.

CC-BY-NC XKCD

CC-BY-NC XKCD

Dans mon article précédent C’est décidé, je retourne sous Linux, je me moquais gentiment sur le Windows livré sur mon nouveau pc (un Dell Vostro 3360, comme ça vous saurez tout). Après tant d’amusement trollesque, j’ai voulu installer un système Archlinux aux petits oignons qui me convenait. Comme je trouve que la ligne de commande reste le moyen le plus efficace et rapide de faire du peaufinage de système, on va en bouffer ! La procédure ci-dessous explique comment obtenir une installation d’Archlinux dans un conteneur LVM chiffré avec dm-crypt et LUKS (système et SWAP) avec l’activation de TRIM pour SSD et une utilisation de Enlightenment E17 comme windows manager.

Kwa ? G rien compri !

Voici ce dont on parle :

  • Archlinux : mon coup de coeur dans les distributions de linux, les explications devraient pouvoir être adaptable à d’autres systèmes tant que vous avez un terminal à disposition.
  • LVM : méthode de gestion de partitions non continues. On peut ajouter, supprimer, modifier les partitions un peu comme on veut, plus besoin de rester 3h devant GParted en priant le dieu Bécup.
  • LUKS : norme de chiffrement par blocs, idéal sous linux pour chiffrer une partition (en opposition à par exemple à eCryptfs qui sert à chiffrer un dossier comme le propose Ubuntu avec le dossier home)
  • dm-crypt : sous-système permettant de gérer le chiffrement LUKS (où se trouvent les clefs…) utilisé par le noyau Linux. Propose notamment cryptsetup que l’on utilise ici.
  • SSD : nouvelle génération de disques remplaçant les vieux HDD. Plus rapides, silencieux, économes en énergie et surtout plus chers. Mon Vostro est équipé d’un SSD de 128GB (pas de HDD en hybride)
  • TRIM : sur un HDD, lorsque l’on écrit là où se trouvaient des données “supprimées”, on écrase l’ancienne valeur par la nouvelle. Avec un SSD, on doit d’abord supprimer le contenu du secteur puis écrire la nouvelle (perte de performances). TRIM permet d’indiquer au système lorsque l’on n’a plus besoin de certaines données, l’autorise à les supprimer et l’on gagner du temps pour la future réécriture. Une sorte de garbage collector. De par son mode de fonctionnement, TRIM rend aussi inefficace toute tentative de récupération de données en cas de rm mal placé.
  • SWAP : espace du disque dédié à soulager la RAM lorsque celle-ci se retrouve surchargée. Il est nécessaire de la chiffrer pour éviter les fuites d’information (des mots de passe pouvant être chargé dans la RAM).
  • E17 : window manager léger et hyper personnalisable (*tousse*opposé de GNOME*tousse*). Une version stable vient de sortir après 12 ans de développement. Au passage ne venez pas m’ennuyez sur le window manager vs desktop environment, on met un peu n’importe quoi dans les deux catégories et puis c’est moi qui décide ici, na !

Voici une image permettant de mieux comprendre ce que l’on va réaliser :

luks-graph

Le /boot est sur une petite partition séparée (on a besoin d’un certain nombre de modules pour déchiffrer la partition), le reste du système se trouvant dans une partition chiffrée. En déchiffrant cette partition, on ouvre un conteneur LVM. Cela permet d’avoir toutes les partitions chiffrées avec la même clef. Si l’on voulait chiffrer une seule partition (ou plusieurs avec des clefs différentes), l’on aurait fait le contraire (LUKS dans LVM). Dans mon cas, n’ayant qu’Archlinux sur un petit disque, j’ai préféré utiliser uniquement une SWAP et une partition pour le système. Libre à vous de diviser le conteur LVM en plus de parties pour un home séparé ou pour du multiboot.

La manipulation va donc permettre de chiffrer sa machine, cela ne rendra pas la machine invisible contre tout types d’attaque. Les implications exactes en termes de sécurité sont mentionnées dans la conclusion, lisez là bien avant de commencer toute manipulation si vous n’êtes pas certains de bien comprendre.

Préparation

Attention, cette procédure va écraser lamentablement vos précédentes données tel le scarabée rhumatisant sous la patte du vaillant hippopotame. Si vous voulez conserver une copie de votre disque, je vous conseille de suivre cette procédure. Suumitsu a donné une procédure permettant de convertir un disque en machine virtuelle. J’ai testé mais perso la machine virtuelle ne fonctionne pas chez moi (récup système qui échoue).

Créez un live CD ou USB, démarrez dessus jusqu’à obtenir un terminal utilisable (je passe cette étape, pour arch c’est ici que ça se passe, jusqu’au 2.2). Fait ? Maintenant on efface le tout. D’abord on met de l’aléatoire pour maximiser la sécurité (on ne peut pas différencier les données aléatoires des données chiffrées). Note : l’activation de TRIM réduit l’intérêt de cette manipulation, lisez la dernière section sur les limites pour vous faire une opinion. Si vous jugez cela inutile, passez cette étape (je la laisse sans être certain à 100% de ce que j’avance). Si vous avez un HDD, faites le.

$ dd if=/dev/urandom of=/dev/sda

Ouille pauvre disque, ça prend du temps (6 MB/s sur mon disque de 128GB, soit 6 heures, glups). C’est pas le mode le plus parano du monde mais ça suffit. Faire plusieurs réécritures a été montré comme superflu. En parlant de suppression efficace, n’utilisez pas non plus des outils comme shred en pensant bien effacer vos fichiers, c’est inefficace sur un SSD.

Partitions

On crée ensuite une nouvelle table de partition. J’ai utilisé cfdisk, c’est très facile et interactif, même pas besoin de lire la man page pour comprendre. Les partitions sont à définir selon vos gouts mais comme je vous le disais plus haut, je vais uniquement séparer /boot du reste. 200MB pour /boot sur sda1, le reste sur sda2.

# cfisk /dev/sda
# mkfs.ext4 /dev/sda1 -L boot # EXT4 est bien mais c’est un choix personnel après

Pour chiffrer sda2, on a plusieurs choix d’algorithmes, de modes de stockage de clef, etc. On peut par exemple utiliser une suite de bytes aléatoires qui sont stockés sur une clefs USB chiffrée avec GPG (not bad). Mais nous, on ne vise pas la top sécurité (trop contraignant je trouve), on va faire au plus simple : un mot de passe à entrer au boot. Lisez la man page ou ce wiki pour des variations. (désolé pour cet idiot de wordpress qui me remplace les doubles tiret par un caractère spécial)

# cryptsetup –cipher aes-cbc-essiv:256 –key-size 256 –hash sha256 –iter-time 1000 –use-random –verify-passphrase luksFormat /dev/sda2

On choisi un super mot de passe (que vous irez écrire sur un post-it collé à l’écran) et on confirme (n’oubliez pas les majuscules pour le “yes”).

Pour ouvrir le conteneur, on utilise la commande suivante (très important, c’est cette commande que vous allez utiliser si jamais vous crachez votre système et devez faire la réparation avec un live cd, notez la aussi sur le post-it) :

# cryptsetup luksOpen /dev/sda2 sda2_crypt

La partition est maintenant accessible à /dev/mapper/sda2_crypt (vous pouvez évidement choisir un autre nom).

La partition sda2_crypt va être convertie en Primary Volume LVM contenant la swap et /. Je conseille encore une fois la doc archlinux pour les variations mais dans mon cas :

# modprobe dm-mod
# pvcreate /dev/mapper/sda2_crypt
# vgcreate MyGroup /dev/mapper/sda2_crypt
# lvcreate -C y -L 1G MyGroup -n lvswap
# lvcreate -l +100%FREE MyGroup -n lvarch
# mkswap /dev/mapper/MyGroup-lvswap
# mkfs.ext4 /dev/mapper/MyGroup-lvarch -L arch
squelette à un bar

Kevin attend patiemment que son algorithme de brute force trouve votre clef LUKS

Installation

Maintenant on peut continuer normalement l’installation comme n’importe quel système. Dans le cas d’Archlinux avec arch-chroot, il faut d’abord monter les partitions dans /mnt.

# mount /dev/mapper/MyGroup-lvarch /mnt
# swapon /dev/mapper/MyGroup-lvswap
# mkdir /mnt/boot
# mount /dev/sda1 /mnt/boot

Dans le beginner’s guide d’archlinux, on peut reprendre au point 2.6. select a mirror. Les partitions montées étant déchiffrées, la génération du fichier fstab devrait donner les bons UUID.

Dans le cas de mon Dell Vostro 3360, le wifi était reconnu nativement mais pas ethernet, la faute à l’Atheros AR8161. J’ai expliqué la marche à suivre mais à ce jour (à adapter à sa version du noyau, deviendra compat-driver dès linux 3.7), les commandes sont :

# wget http://www.orbit-lab.org/kernel/compat-wireless-3-stable/v3.6/compat-wireless-3.6.8-1-snpc.tar.bz2
# tar xjf compat-wireless-3.6.8-1-snpc.tar.bz2
# cd compat-wireless-3.6.8-1-snpc
# ./scripts/driver-select alx
# make
# make install
# modprobe alx

Avant que vous ne redémarriez, il faut faire quelques modifications pour activer le déchiffrement et TRIM. Dans le fichier /etc/mkinitcpio.conf, on défini les modules à charger dans le noyau au démarrage. Voici ce qu’il faut dans notre cas :

MODULES="... sd_mod .."
...
HOOKS="... keymap encrypt lvm2 resume filesystems ..."

sd_mod étant pour LVM, keymap pour charger la disposition du clavier que vous aurez spécifié dans /etc/vconsole.conf (attention, si pas présente, vous devrez déchiffrer votre partition en qwerty), encrypt pour LUKS, LVM2 pour LVM (inattendu je sais), resume pour sortir de l’hibernation et tout cela devant se trouver avant filesystems. Vous pouvez également faire un nettoyage ici en supprimant et déplaçant quelques modules. Je ne suis pas spécialiste de cette partie donc ne vais pas trop m’aventurer là dedans de peur de dire des conneries. Si ça vous intéresse Postblue en donne quelques unes (des optimisations, pas des conneries).

On régénère l’image à charger avec :

# mkinitcpio -p linux

(ou autres paramètres en cas de noyau différent ou optimisation)

Pour indiquer à GRUB la marche à suivre, on va modifier le fichier /etc/default/grub à la ligne GRUB_CMDLINE_LINUX pour mettre :

GRUB_CMDLINE_LINUX="cryptdevice=/dev/sda2:sda2_crypt:allow-discards resume=/dev/mapper/MyGroup-lvswap pcie_aspm=force elevator=noop"

N’oubliez pas de regénérer un nouveau fichier grub.cfg avec grub-mkconfig. Le allow-discards permettant d’activer TRIM. On va d’ailleurs également modifier le fichier /etc/fstab qui chez moi ressemble à ça :

# /dev/mapper/MyGroup-lvarch LABEL=arch
UUID=8f42... / ext4 defaults,noatime,nodiratime,discard 0 1

# /dev/sda1 LABEL=boot
UUID=dd30... /boot ext4 rw,relatime,data=ordered 0 2

# /dev/mapper/MyGroup-lvswap
UUID=2142... none swap defaults,noatime,nodiratime,discard 0 0

J’avoue ne pas être certain à 100% des paramètres en dehors du discard, les nomachin permettant de réduire le nombre d’écriture nécessaire (mais peut poser des problèmes dans certains cas de figure). Lisez SSD Tuning For Linux ou Archlinux SSD pour plus d’info.

Démarrage et E17

J’ai choisi d’installer E17 comme environnement de bureau. C’est très léger et très personnalisable. Tellement personnalisable que je n’ai pas encore réussi à l’adapter complètement à mes envies mais je suis sur que ça arrivera (j’ai commencé à mettre une série d’astuces ici). Voila à quoi ça ressemble chez moi après installation.

bureau-e17

Sobre et léger, moi j’aime ( fond d’écran)

Il suffit d’installer le paquet enlightenment17 pour obtenir le bureau ainsi que tous vos programmes favoris et légers pour les tâches voulues (connman pour la gestion du wifi, mirage pour les images, 7-zip pour les archives… à vous de voir). Comme pour n’importe quel environnement de bureau en somme.

Là par contre où une modification devient intéressante est la connexion automatique. Si l’on chiffre le disque, l’intérêt de demander le mot de passe de l’utilisateur directement après est diminué. L’optimisation vient de chez postblue qui la tient du wiki Archlinux. Connexion automatique sur votre utilisateur qui va lancer Enlightenment avec un exec enlightenment_start dans le fichier ~/.xinitrc.

Grâce à ces optimisations, sur mon Vostro, une fois le mot de passe LUKS entré, j’ai besoin de 3 secondes pour être sur un bureau prêt à l’utilisation, c’est moins que ce qu’il me fallait pour sortir d’hibernation sur mon ancienne machine !

Vérification TRIM

Alors là, pour être honnête, j’ai une incertitude. Cela a été le sujet d’une discussion sur les forums Archlinux (ici) sans arriver à de solution convenant tout le monde. De nombreux sites affirment que le flag “allow-discards” suffit à activer TRIM. On peut le vérifier ainsi :

# dmsetup table /dev/mapper/sda2_crypt –showkeys
0 249583634 crypt aes-cbc-essiv:sha256 f7[... ]95 0 8:2 4096 1 allow_discards

Si on leur fait confiance (ce que j’ai envie de faire), cela devrait suffire.

Seulement “discard” indique que l’on active TRIM, pas que TRIM fonctionne (vous voyez la subtilité ?). Un test un peu plus sophistiqué est donné ici. Cela consiste en la création d’un fichier, regarder où il se trouve en mémoire, le supprimer et vérifier que le registre a bien été vidé (les commandes sont dans le lien). Cependant lors du test, je découvre que les secteurs en questions sont vides avant d’avoir supprimé le fichier.

Avec un peu de recherche, j’ai trouvé ce blog donnant une piste de réponse. Il faudrait en réalité faire une addition sur l’alignement des partitions pour obtenir la bonne valeur. J’ai réalisé l’exercice ici avec un résultat différent mais tout autant décevant : une série de bytes aléatoires dans le secteur calculé mais pas supprimés à la suppression du fichier. Erreur de calcul ? Non activation de TRIM ? Problème avec la couche d’abstraction LUKS+LVM ? Mystère. Si quelqu’un a plus d’idées, je suis sur que ça en intéressera certains.

Conclusion et limites du chiffrement

La sécurité obtenue n’est pas absolue mais est déjà très raisonnable. Chiffrer votre disque ne vous protègera pas complètement. Il n’y a pas de problèmes si vous perdez votre machine hors ligne (pas de logiciels types Prey donc, pas grave, je préfère) mais il existe des cas plus problématiques. Le fait d’entrer votre mot de passe signifie qu’un attaquant ayant accès à votre PC est potentiellement capable de modifier vos fichiers de boot pour y ajouter un keylogger par exemple. Le cas de la clef sur une clef USB diminue un peu ce risque mais est assez contraignant (à vous de voir votre besoin de sécurité).

L’activation de TRIM réduit également la sécurité. Lisez cet article par un développeur de cryptsetup pour comprendre le problème. En autorisant le système à vider tous les secteurs inutilisés, l’on va permettre la détection des secteurs utilisés et ceux qui ne le sont pas. C’est pour cela que j’affirmais plus haut que le remplissage du disque de random était sans doute inutile. Cela ne me pose pas de problème pour mon utilisation de la machine mais il faut le savoir.

Une fois la partition déchiffrée, LUKS ne sert plus à rien évidement. Le chiffrement ne vous protègera pas contre les failles de sécurité dans vos logiciels. Il est par exemple important de verrouiller votre machine en veille. Il n’est pas à ma connaissance possible d’accéder au contenu d’une machine verrouillée sans faire d’attaque physique (contenu de la RAM par ex), vous devriez donc être à l’abri des script-kiddies si vous n’avez pas laissé de failles grosse comme une maison (si vous voulez vous protégez contre des gouvernements, pensez qu’ils possèdent d’autres moyens d’obtenir les clefs que de pirater votre machine).

Au passage, je conseille vivement de ne pas choisir le même mot de passe pour LUKS et votre utilisateur. Il est beaucoup plus facile d’avoir un keylogger ou d’accéder aux hash de votre mot de passe lorsque votre machine fonctionne.

Bonus : détectez les modifications de /boot

Je disais plus haut que le problème sécurité le plus préoccupant avec cette configuration était qu’une manipulation offline pouvait tout foutre en l’air. Si l’attaquant arrive à bidouiller les fichiers dans /boot, il peut faire beaucoup ; même une clef présente sur une clef USB peut se faire enregistrer avec un script malveillant. Heureusement, une publication dans ct-magazine donne une solution : vérifier le hash du MBR et des fichiers une fois la partition déchiffrée (les hash sont chiffrés évidement). Si une modification est détectée, grosse alerte !

Téléchargez l’archive suivante 1203-146.zip par l’auteur de l’article ou ma version qui utilise sha256 plutôt que sha1 (qui, si toujours sécurisé aujourd’hui, risque de ne plus l’être très longtemps, surtout depuis cette nouvelle attaque), ajoute le fichier de config systemd, enlève un espace au début de chkboot.sh (plantait le lancement de systemd) et ajoute un fichier .desktop pour chkbook_user.sh. Si je suis pas trop sympa quand même !

# cp chkboot.sh /usr/local/bin/chkboot.sh
# chmod +x /usr/local/bin/chkboot.sh
# cp chkboot_user.sh /usr/local/bin/chkboot_user.sh
# chmod +x /usr/local/bin/chkboot_user.sh
# cp chkboot@.service /etc/systemd/system/chkboot@.service
# systemctl enable chkboot@.service
# mkdir /var/chkboot
# /usr/local/bin/chkboot.sh

Le script chkboot_user.sh utilise zenity pour les alertes. Veillez à ce qu’il soit installé. Démarrez ce script au démarrage de votre session. Cela peut se faire via l’interface graphique de window manager préféré ou en ajoutant un fichier .desktop (comme celui dans l’archive que je vous donne par exemple) dans le dossier ~/.config/autostart/. Dans le cas de E17, le dossier autostart n’est pas utilisé (juste pour GNOME, KDE et XFCE). À la place, placez le fichier .desktop dans ~/.local/share/applications/ et allez ensuite dans settings > apps > startup applications >
applications
et activez l’application Chkboot.

alert-changes-detected-boot

Avec la liste des fichiers ayant changé de hash

Attention, le script chkboot.sh est à faire tourner à chaque modification du dossier /boot. Cela peut arriver souvent sous Archlinux (à chaque mise à jour du noyau ou de grub par exemple). Si vous trouvez cela trop contraignant, n’hésitez pas créer un alias type alias sysupdate="/usr/local/bin/chkboot_user.sh && yaourt -Syua && /usr/local/bin/chkboot.sh".

PS : j’ai commencé la rédaction de la page en français au sujet de LUKS sur le wiki archlinux.fr. N’hésitez pas à venir contribuer, c’est encore bien vide.

J’ai fait l’acquisition d’un ultrabook Dell, un très bel objet (j’en ai même fait un déballage). Dessus était préinstallé le système d’exploitation d’une startup qui monte pas mal ses derniers temps : Microsoft avec son Windows. Si j’ai bien compris, Microsoft fait payer son OS, un business model qui me semble assez bancal mais pourquoi pas, s’ils apportent une vraie innovation. Toujours curieux de découvrir des nouvelles choses et étant donné que je l’ai payé à l’achat de la machine, j’ai voulu tester ce système. Voici donc mon retour d’expérience.

Livreur d'UPS qui est plus rapide pour faire Chine - Kazakhstan que Bruxelles - monbled

Livreur d’UPS qui est plus rapide pour faire Chine – Kazakhstan que Bruxelles – monbled

Première petite déception, Dell m’a fourni la version 7 de Windows alors que j’ai entendu tellement de bien de leur 8eme version, soit, je regarderai pour faire une upgrade plus tard. J’allume la machine et me retrouve devant une série d’écrans étranges. Plutôt que le processus d’installation habituel (langue, heure,…), on me donne de longs textes aussi imbuvable que la GPL à lire. Je relève des passages surprenants. Je ne suis autorisé qu’à faire tourner le logiciel que sur deux cœurs maximum (heureusement que je n’avais pas prévu d’upgrade du matériel), interdiction de faire tourner la version 32 et 64 bits en même temps (je ne sais pas comment j’aurais fait de toute façon), autorisation de télécharger les polices inclues uniquement le temps d’imprimer un document ainsi qu’une limitation d’utilisation à 20 dispositifs “pour utiliser les services de fichiers, services d’impression service internet, partage de connexion internet et service de téléphonie uniquement” (dois-je commencer à compter mes clefs USB ?). Peu de choix de langue également (français ou anglais-us), ils n’ont peut être pas encore eu le temps de le traduire (c’est le problème d’avoir des effectifs limités). Je tique un peu sur l’obligation de mettre un indice pour retrouver le mot de passe. Je pensais qu’il avait été démontré que c’était une mauvaise pratique. Dell me pose également des questions pour savoir si je veux bien lui envoyer des données systèmes pour ses partenaires commerciaux, désolé Dell mais non.

Après ce long processus d’installation, où l’on ne m’a posé aucune question intéressante, quelques mises à jour à faire et … demande de redémarrage. Une mise à jour du noyau sans doute, pas très agréable mais il faut ce qu’il faut. Ça y est, je chipote enfin sur mon nouvel OS ! Pas trop moche à première vue, je sens que je vais aimer. Le navigateur préinstallé (digression : et il est où mon BrowserChoice ?) ne m’inspire pas trop confiance. Heureusement, l’équipe de Mozilla a prévu un build de Firefox pour ce système. Enfin, j’ai du me rendre sur leur site pour le découvrir. J’ai longtemps cherché leur gestionnaire de paquets avant de me rendre à l’évidence : ils n’en ont pas. Heureusement qu’ils n’ont pas d’assez grosses part de marché que pour intéresser les pirates. Avec un système pareil, c’est la porte ouverte au phishing et logiciels malveillants.

Même pas à jour tes crasses

Même pas à jour tes crasses

L’installation de nouveaux logiciels est vraiment contraignante : télécharger un binaire, encore une série de question inutiles, une demande de confirmation administrateur (pas très sécurisé, ils ne demandent même pas de mot de passe root). Pire, avec certains programmes, j’ai des dépendances étranges qui s’installent. Je cherchais à installer un client torrent (on m’a conseillé µTorrent) pour télécharger une iso d’archlinux et je me retrouve avec une série de dépendances comme une toolbar ou un changement de ma page d’accueil dans Firefox. Je ne comprend vraiment pas pourquoi c’est nécessaire et pourquoi tout le monde trouve ça normal.

Admirez la richesse des effets proposés à droite

Admirez la richesse des effets proposés à droite

Les logiciels ne me semblent pas très stables non plus. J’ai voulu tester la webcam et ai reçu directement quelques popups avec une fenêtre d’erreur. Non seulement ça fait pas très pro de vendre des logiciels buggés mais en plus cette agression à coup de popup montre un manque flagrant d’étude de l’interface. Heureusement que je m’y connais un peu en informatique parce qu’un utilisateur non averti aurait vite fait de tout fermer (ce qui est exactement ce que j’ai fait après réflexion).

Quand je démarre mon PC, c'est pas par ça que j'ai envie d'être accueilli

Quand je démarre mon PC, c’est pas par ça que j’ai envie d’être accueillit

En continuant sur le sujet des popups, j’en ai également une série me proposant des versions d’essais ou des mises à jours automatiques de logiciels dont je n’ai aucune idée de l’utilité. On me parle même d’un système de protection contre les menaces internet et virus. Je ne vois pas trop l’utilité, si un logiciel est bien fait, les failles sont corrigées dès qu’elles sont découvertes, pas besoin de venir rajouter une couche de protection intermédiaire, c’est juste bon à ralentir la machine.

Bon je commence à en avoir assez de tout cela. J’ai voulu ouvrir le traitement de texte préinstallé (Microsoft Office, le LibreOffice local je crois). On me demande de me connecter à un compte pour prouver ma licence. Si tu me donnes pas de licence, pourquoi tu me préinstalles ça !

Y a pas que MS Office de logiciel inutilement préinstallé...

Y a pas que MS Office de logiciel inutilement préinstallé…

Et puis la gestion des fichiers est épouvantable. Comment les gens peuvent travailler là dessus ? Le nom d’un même dossier est parfois traduit en français, parfois en anglais, il y a des liens symboliques dans tous les coins. Je n’arrive pas à comprendre la hiérarchie. A la place du simple dossier /home/mart pour mon utilisateur, dans le dossier C:Users, je trouve mart, All Users, Default, Default Users et Public. Mais ça ne s’arrête pas là ! Dans chacun de ces dossiers, j’ai des sous dossiers qui me semble redondants comme AppData, ApplicationData ou Local Settings. Est-ce que je dois stocker mes documents dans le dossier Documents ou Mes documents ? Le Mes documents n’étant d’ailleurs visiblement pas uniquement pour les documents puisqu’il contient des liens symboliques vers les dossiers présents un niveau supérieur de contenu multimédia (Ma musique pointe vers ../Music, idem pour les images et les vidéos). Je suis vraiment perdu là dedans.

Dell m’a gentiment fourni des CD contenant les drivers pour des périphériques comme le lecteur d’empreinte digital. Par contre il est pas très malin puisqu’il y a pas de lecteur CD sur cet appareil. Bon de toute façon un lecteur d’empreinte est un peu de l’anti-sécurité, je ne l’utiliserai pas. Je découvre avoir pas mal de programmes qui tournent en arrière plan au point de que ma barre d’outil est assez bordélique.

Et encore j'avais déjà fait un peu de nettoyage à ce moment là

Et encore j’avais déjà fait un peu de nettoyage à ce moment là

Après quelques heures d’utilisation, je me retrouve avec des popups dans tous les sens, des alertes de sécurité et invitations de tests, plusieurs toolbars sur mon Firefox. Je n’arrive plus à retrouver les fichiers que je venais de créer (c’est plus tard que j’ai compris que le dossier “Téléchargement” et “Download” étaient le même). Je me rend compte que j’ai des dizaines d’utilitaires préinstallés et même pas un pour ouvrir les .tar.gz. À chaque démarrage, j’ai des popups (dont une d’erreur Intel) désagréables. Pour toute nouvelle clef USB insérée, le système doit d’abord installer les drivers (pour une clef USB!) et veut me faire toute une série d’opérations d’importation (même un formatage quand j’ai inséré une clef en EXT, et puis quoi encore ?). Chaque installation de programme n’est vraiment pas une sinécure, j’ai des binaires d’installation qui traines dans tous les coins. Les forums sur internet me conseillent plein d’outils pour augmenter tel ou tel niveau de protection, pour faire de la maintenance et désinstaller tel ou tel programme préinstallé. Et la goutte qui fait déborder le vase était quand je découvre qu’il faut faire tourner régulièrement un outil pour défragmenter le disque en raison d’un système de fichier mal conçu.

Non, non et non. Je veux bien être ouvert d’esprit et encourager les startup innovantes et même payer si le logiciel est bien fait mais là franchement c’est raté. Je veux pas être pessimiste Microsoft mais si vous ne vous remettez pas sérieusement en question, vous n’allez jamais percer sur le marché si concurrentiel des OS de bureau, surtout avec un business model pareil. Après quelques heures d’utilisation, c’est décidé, je retourne sous Linux ! Tient j’ai entendu parler d’une autre startup montante : Apple, il faudra que je teste ça un jour.

On considère souvent que StatusNet est un échec. Communauté trop petite, peu d’interaction, plateforme non agréable,… On voit de nombreuses personnes abandonner leur instance, @clochix étant le dernier à déclarer son intention de quitter StatusNet. Et pourtant Twitter est loin de faire des heureux, la version 1.1 de son API entrant en activité le mois prochain, de nombreux clients devraient fermer, ne respectant plus les nouvelles conditions draconiennes (nombre d’appel vers l’API fortement réduit ou interdiction de mixer les flux de Twitter et un autre réseau social par exemple). Il semblerait logique de déménager vers des cieux plus libres et cléments et pourtant… J’avais eu il y a quelques mois une réflexion concernant app.net, clone payant de Twitter, comme étant une réponse surprenante et assez déprimante (l’aspect libre n’intéresserait-il pas grand monde ?). J’ai personnellement créé un compte StatusNet sur une instance perso (mart@dotzero.me) début 2012. Après un an d’utilisation (et comme il est de bon gout de faire des récapitulatifs à la nouvelle année), voici quelques stats personnelles de mon utilisation des deux réseaux.

J’ai fait un script python pour récupérer ses stats (digression: c’est vraiment pas pratique à utiliser les API OAuth) et ai réussi avec, pas mal de difficultés avouons le, a récupérer quelques chiffres. J’aurais voulu obtenir quelques statistiques supplémentaires comme le nombre de messages favoris, répétés etc. mais l’API StatusNet ne le permet pas. Le nombre de personne suivie est également un peu faussé car est le total, pas spécifiquement pour 2012 (pas trouvé comment filtrer cette info sur aucun des deux réseaux). J’aurais aimé connaitre le nombre de personnes présentes sur les deux réseaux mais cela nécessiterait un passage en revue manuel des deux listes (peut être plus tard). Donc sur l’année 2012 nous avons eu :

Status postés : 1174 StatusNet, 796 Twitter
…dont sont des répétitions (aka RT) : 112 StatusNet, 205 Twitter
Mentions directes : 591 StatusNet, 90 Twitter
Nombre de personnes suivies : 98 StatusNet, 203 Twitter
Nombre de personnes me suivant : 67 StatusNet, 49 Twitter
…dont suivi réciproque : 45 StatusNet, 28 Twitter

dancing

Moi à chaque alerte d’un nouveau follower

Le seul point où Twitter fait vraiment mieux que StatusNet chez moi est le nombre de personnes que je suis. On peut expliquer cela par :

  • il y a plus de monde sur Twitter
  • StatusNet, de par sa nature décentralisée, rend également plus difficile la découverte de personnes à suivre (où chercher un pseudo connu ?)
  • les suggestions sur Twitter aident bien

Par contre, il n’y a pas photo, je poste plus et il y a plus d’interaction sur StatusNet que sur Twitter. J’ai plus souvent tendance à avoir une discussion de quelques status avec des gens sur StatusNet (cela peut sans doute s’expliquer à la limite de 140 caractères sur Twitter que j’ai augmenter à 256 sur StatusNet). Le taux de suiveurs réciproques (personnes que je suis et qui me suivent) est beaucoup plus faible sur Twitter. Je vois plusieurs explications :

  • plus de sociétés ou personnalités sur Twitter (personnes qui auront moins tendance à me suivre en retour)
  • plus de spammeurs sur Twitter (que je ne suivrai pas en retour)
  • je souvent de sujets geek ou libres qui intéresse un plus fort public sur StatusNet

Le nombre de répétition de status supérieur sur Twitter peut s”expliquer par le fait que j’aurai plus tendance à répéter un message d’une société, organisation ou personnalité qui sont plus présents sur Twitter.

Le troisième point soulève quand même un problème : StatusNet est une communauté peuplée principalement de geeks et libristes quand Twitter est plus généraliste. @Lydie_F a mentionné hier sur Twitter que 75% des chefs d’Etat disposent d’un compte Twitter. Combien possède un compte StatusNet ? Sans doute zéro. Combien savent ce qu’est StatusNet ? Sans doute zéro également. StatusNet n’arrive toujours pas à capter le grand public.

Évidement ceci n’est que mon expérience personnelle, d’autres auront surement des retours différents. Mes sujets de conversations sont sans doute plus orientés geek-libriste mais l’expérience StatusNet est une réussite pour moi. A l’heure actuelle, je ne pense pas supprimer un compte sur aucun des deux réseaux en raison de leur utilisation différente que j’en fais. Twitter reste plus orienté actualité/découverte de nouvelles choses tandis que StatusNet a plus un aspect communautaire. Si Twitter venait à m’obliger d’utiliser son site internet, il se pourrait cependant que je ferme mon compte sur ce dernier mais c’est clairement se couper un public différent (il reste des personnes avec qui j’ai envie de continuer à avoir un contact). Attendons de voir comment vont évoluer ces réseaux, tout cela sera surement fort différent dans un an, il ne s’agira sans doute même plus des même réseaux (pump ?).

Mise à jour: le script a été mit à jour, les possibilités et commandes ont légèrement changé, lisez le README pour plus de détail ou suivez mes annonces avec le tag smailarchiver.

Faisant un peu le nettoyage dans mes boites à emails, j’ai voulu sauver tous mes vieux messages avant suppression. Cependant, je voulais un moyen de faire cela de manière automatisée (possible d’utiliser cron), incrémental (ne pas tout retélécharger à chaque fois), supportant la compression et surtout garder une certaine confidentialité (chiffrement).

J’ai trouvé des bouts de codes pour faire chaque partie séparément (ici et ici par exemple) mais pas de programme permettant de faire tout cela ensemble. A que cela ne tienne, j’ai donc créé un petit script python contentant mes besoins. Ainsi est né SMailArchiver (avec S pour Secured ou Suicide, question de point de vue) que je partage ici.

Ce petit bout de code (approchant des 400 lignes de python) permet facilement de faire des backup de plusieurs comptes emails avec toute une série d’option comme la compression des mails avant le chiffrement (une compression après le chiffrement pourrait également être utile mais est moins efficace) ou le choix d’une clef constituée uniquement de bytes aléatoires ou renforcée par un mot de passe de votre choix. Le chiffrement se fait avec AES 256 avec une signature HMAC-SHA256 histoire d’empêcher les manipulations. C’est pas Truecrypt mais ça suffit pour cacher les conversations avec votre maitresse des yeux indiscrets de madame votre femme (ou inversement).

big mess

Avant d’utiliser SMailArchiver, ma gestion des emails ressemblait à ça… et mes cheveux étaient secs et cassants.

Le programme peut recevoir les paramètres nécessaires par la console, via des arguments ou via un fichier de config (regardez le fichier d’exemple dans le dépot).

$ python smailarchiver.py 
Enter your email username: foo@bar.com
Enter your imap server: imap.bar.com
Enter your password: 
Enc key: 6MIiWqNiJ4h1qDmp5Z4OpWKRLst7eAbirWOPHIm9zqk=
Sig key: 9JmR0593CWwtnJhRWqdLHk7tXvX/h6l6A2GLKA4iVq4=
$ python smailarchiver.py --user foo@bar.com --imap imap.bar.com --passwd monkey1 --key foo@bar.com.keys --promp --compress
Enter your encryption/signature password: 
Enc salt: KNwhv7kuNs0/iCZZTUyd05IuOylzG/n2oBALj1UMJ0c=
Sig salt: A99CxfzwRbU4P4lse6eN5O+g2wethRzL4gMH7xqFkgE=
Hash: oNcX7GAyHsS+bNOT8UCYAYM/ltCmx34E9Gmmpky02AE=
$ python2 smailarchiver.py -c config.json
Enter your encryption/signature password: 
Enc salt: m87TeE9fmr5XPf7yvN0w3PYOv3ivlNKpKGp35hC+N/k=
Sig salt: 2k9Wu5HBEo7G0J0EzlglOqV0Zko1LmhfiGnxD2QEzhE=
Hash: FA3TdkhWNZqy9BjGOk2UVZ6AeqgHSrparH3ynHdvj38=
$ python2 smailarchiver.py --decrypt foo@bar.com/ --key foo@bar.com.keys --promp
Enter your encryption/signature password: 
Decrypting 16.gz.mbox
Decrypting 11.gz.mbox
Decrypting 45.gz.mbox
...

Code évidement open source que vous pouvez trouver le code sur mon dépot gitorious. C’est compatible python 2.7 et plus (python 3 c’est l’avenir !) et nécessite pycrypto (qui est compatible python 2.1 et 3.2, j’imagine même pas le bordel que ça doit être). Mes tests très scientifiques type àvuedenezçapasse montrent que le programme fonctionne mais on est jamais à une erreur prêt, n’hésitez pas à me communiquer vos idées d’améliorations ou corrections.

PS: fait amusant concernant AES 256, saviez vous que l’énergie contenue dans une supernova ne suffirait pas rien que pour énumérer les 2²⁵⁶ états possibles (calcul non compris donc). A moins de trouver une faille de sécurité, il est donc impossible, avec les notions de la physique actuelle, de faire un brute force sur une clef AES 256. Source: Applied Cryptography, Bruce Schneier (extrait en question).

Un des problèmes avec la gestion des mails maison, c’est qu’on a vite fait d’être considéré comme un spam par un filtre un peu trop difficile. Très gênant si vous pensiez gérer votre adresse professionnelle. Heureusement il existe des solutions. J’ai mis à jour la page de mon wiki concernant la gestion des mails avec reverse DNS, SPF et DKIM. Voici un résumé :

Les filtres

Le principe des filtres anti-spam (dont SpamAssassin est le plus connu) est très simple. Vous partez d’un score de zéro. Lorsque le filtre détecte quelque chose de suspect votre score augmente, lorsque vous avez un comportement que n’aurait pas un spammeur, vous perdez des points. Arrivé à une certaine limite, vous devenez un spam.

Évidement toute la difficulté réside à bien pondérer et trouver les bons critères. Le fait d’utiliser des mots comme “viagra” va vous faire gagner des points. Les spammeurs l’ayant comprit, ils utiliseront v1agra par exemple. Les critères faisant perdre des points ne doivent pas non plus être simples sinon un spammeur les utilisera pour passer inaperçu.

Il existe également le filtre bayésien plus complexe mais très puissant qui va utiliser des probabilités statistiques. Ce filtre se base sur le contenu du message et l’on a donc pas d’influence coté serveur. Évitez juste de parler de vente de médicaments en ligne dans vos messages.

Voici deux exemples de scores (spamassassin et un inconnu) plutôt mauvais que j’ai eu sans rien activer :

X-SGSI-SpamCheck: n'est pas un polluriel, SpamAssassin (score=1.982,requis 5,
 BAYES_50 1.00, RDNS_DYNAMIC 0.98, SPF_HELO_PASS -0.00)

Il s’agit du filtre de mon université, il considère que l’on est un spam à partir de 5 et m’a mit 1.982, rien de dramatique.

X-Spam-Flag: YES
X-Spam-Score: 6.782
X-Spam-Level: ******
X-Spam-Status: Yes, score=6.782 tagged_above=4 required=6.3
	tests=[BAYES_50=0.8, EIGHTBIT_ENCODING=1, RCVD_FAKED_HELO=2,
	RCVD_SHORT_HELO=2, RDNS_DYNAMIC=0.982] autolearn=no

Il s’agit ici d’un filtre d’entreprise qui est beaucoup plus sévère. Il m’a mit un score de 6.782 alors que sa tolérance est à 6.3. Cela a eu pour effet de mettre un gros ***SPAM*** dans le sujet du message.

“Capitaine, je crois que notre filtre SpamAssassin est un peu trop permissif…”

Reverse DNS

La résolution DNS classique est de faire correspondre une URL à une IP. Le reverse DNS est le chemin inverse. Par défaut, j’ai, dans le cas de mon serveur OVH, 178-33-111-174.kimsufi.com pour l’IP 178.33.111.174. C’est ça qui explique mon “bonus” RDNS_DYNAMIC 0.98.

En mettant votre nom de domaine à la place, le problème est réglé. Vous pouvez vérifier que vous avez la bonne valeur via la commande $ dig -x 11.22.33.44 dans le champ PTR. J’ai remarqué que certains serveurs prenaient beaucoup de temps à mettre à jour leurs reverse DNS donc prenez votre mal en patience.

Si vous possédez comme moi plusieurs domaines pointant sur la même IP, sachez qu’il est inutile de mettre plusieurs entrées DNS PTR, cela pourrait être même contre productif. [Source]

SPF

Le plus simple. SPF pour Sender Policy Framework est simplement une entrée DNS depuis quel domaine on peut envoyer un email. Dans le cas d’un seul domaine qui n’envoie que depuis ses entrées MX, l’entrée DNS est

mart-e.be    SPF    v=spf1 mx ~all

Vous pouvez ainsi spécifier d’autres serveurs (si par exemple vous utilisez le relais SMTP de votre FAI). Pour les cas plus complexes, je vous renvoie vers le site officiel.

La valeur ajoutée par cette règle est assez faible. J’ai eu droit à SPF_HELO_PASS -0.00 pour le premier serveur mail et SPF_HELO_PASS=-0.001,SPF_PASS=-0.001 pour le deuxième. Vous pouvez vous dire que l’intérêt est donc limité mais voyez plutôt comme ceci : si un jour quelqu’un essaye d’envoyer du spam en se faisant passer pour vous, la vérification SPF échouera et son score de spam augmentera de façon non-négligeable.

Attention: SPF casse la redirection. Si vous envoyez un mail à machin@gmail.com sur laquelle votre correspondant a réglé une redirection automatique vers machin@myopera.com, c’est l’adresse IP de Google qui apparaîtra et pas la votre. La vérification SPF échouera donc. Cependant, ce n’est pas si grave que ça parce que le filtre anti-spam de Opera doit avoir l’habitude de recevoir tous les emails venant de machin@gmail.com qui a des bonnes chances d’être dans une liste blanche. Donc si le serveur du correspondant est bien fait, ça ne devrait pas poser de problèmes.

DKIM

Plus difficile, il s’agit ici de signer les headers du mail envoyé. La clef publique est spécifiée dans les DNS. J’ai choisi d’utiliser OpenDKIM. On génère des clefs asymétriques pour chaque domaine et on publie la clef publique dans les DNS. Celle pour ce domaine est par exemple :

default._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQChUywElHkvIJwgp9BYce97yhv0ImwK5+2Jm0CHBCfjYpeV7pSaAh/aYmX9+BJcSupVnJYBPf4DT/AFbV7O6snG6rGf3bnJSHdfyGa7Zq8a/7ERdTYo6/W5LJvaenDAxqlWPlgVafQtncRt+4/iF133FXLpC4VL6NmbMirK0yMRKQIDAQAB"

Lorsque que vous signerez un email, on aura par exemple.

DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mart-e.be; s=default;
t=1353269228; bh=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN/XKdLCPjaYaY=;
h=Date:From:To:Subject:From;
b=VQUjpDqQbD4OH4dRO5Ex3J0Qxoa5aKv6m7EYnxUgXE+SJd45PzJ0ZhIMzlIah3PRJ
6UQX7rZizYU7gp6PioYFovADAW0o31iZYyTpuiUlEXpKAFeoRl0gR7wTNZrPdkSgSr
A8bxxBjJPIUPpYW6ePuRixrumcCiNu2a0o8IC4Bk=

Votre correspondant supportant DKIM vérifiera la signature. Si elle est valide, vous perdez des points à votre score spam, si elle est invalide, vous en gagnez. Ben oui il ne suffit pas dire qu’on fait du DKIM pour ne pas être un spam, il faut encore bien le faire.

Conclusion

En appliquant ces trois méthodes, je suis passé à un score négatif sur le premier serveur et inférieur à 4 sur le deuxième (score à partir duquel il n’indique plus le détail).

Cela ne vous fera pas passer à travers les filtres les plus drastiques mais devrait diminuer le risque. N’hésitez pas à faire des tests sur plusieurs serveurs différents. Les filtres de Google et Yahoo ne donnent pas le détail du score mais les entreprises privées ou gens qui ont installé des filtres maisons sont plus sympa.

Si vous connaissez d’autres moyen de diminuer ce score, n’hésitez pas à partager. Je n’ai pas exemple pas d’explication sur le RCVD_FAKED_HELO et RCVD_SHORT_HELO qui m’ont donné chacun deux points ou le EIGHTBIT_ENCODING que je n’explique pas non plus (tu aurais préféré quoi ?) dans l’exemple ci-dessus.

Les nombreuses groupies qui visitent mon site par millions chaque jour (presque ça) ont sûrement remarqué que mart-e.be a été down pendant quelques jours, au grand désarrois de la touche F5 de leur clavier. La raison est simplement que mon blog et mes emails étaient hébergés chez Legtux, sur un serveur de online.net. Or ce week-end, Legtux ayant subit une attaque DDOS, online a eu la réaction très intelligente de bloquer le compte de Legtux. Ben oui, c’est évidement du à une mauvais gestion de la part de Legtux (alors que les solutions sont si simples -humour-). Situation désormais résolue avec une migration chez OVH (ça t’apprendra à mal traiter tes clients Online).

Bon pourquoi je vous raconte tout ça ? Parce que cet incident m’a poussé à faire quelque chose que j’aurais du faire depuis longtemps : gérer moi même mes mails (ce blog passera le cap dans un future plus ou moins proche)! J’ai prit il y a environ un an un serveur kimsufi chez OVH sur lequel j’héberge de nombreux services (XMPP, StatusNet, RSS, OpenID…), le but étant de gagner toujours plus d’indépendance, en particulier par rapport à Google. Et ce week-end, j’ai avancé d’un cran puisque j’ai configuré un beau serveur Postfix et Dovecot, le tout sans base de donnée.

Pour ceux qui aimeraient gérer eux aussi leurs emails, sachez qu’il existe énormément de méthodes. J’avais commencé en suivant la méthode de ®om (tutoriel de 2009 mais toujours valable) qui utilise également Postfix et Dovecot. Cependant, il y avait une chose qui me gênait : cette méthode était pensée pour la gestion d’un seul compte mail. On crée un utilisateur Unix, on stocke les emails dans ~/Maildir, on accède au compte mail avec ses identifiants. Je ne dis pas que cette méthode est mauvaise (elle est sans doute la meilleur si vous n’avez qu’un seul compte mail) mais je voulais quelque chose de plus souple qui me permette de gérer plusieurs noms de domaine sans devoir me rabattre sur MySQL.

Dovecot travaillant déjà de bon matin

La méthode que j’ai utilisée est assez proche de celle ®om mais utilise des adresses mail virtuelles. Tout est géré par un seul utilisateur selon une hiérarchie très simple: /home/vmail/example.com/bob pour bob@example.com, le mot de passes de bob étant géré par Dovecot dans un format similaire aux utilisateurs Unix (un fichier /etc/dovecot/passwd). Cela me permet facilement de créer des nouvelles adresses pour de nouveaux utilisateurs.

La méthode est très largement inspirée du tutoriel de ubuntu.com PostfixVirtualMailBoxClamSmtpHowto et j’ai traduite et ajoutée sur mon wiki tout neuf. Pour la marche à suivre, rendez vous donc sur wiki.mart-e.be/email. Si vous remarquez que j’ai oublié quelque chose, n’hésitez pas à me le signaler (ou contribuer, c’est un wiki après tout).

Cependant quelques limites à garder en tête en utilisant cette méthode :

  • Les mails sont stockés dans des fichiers texte lisibles par l’administrateur du serveur
  • La gestion des emails se fait par des scripts bash, pas pratique si vous voulez permettre la création de compte pour des externes (mais pas impossible)
  • Les mots de passes sont hashés mais pas salés (deux mots de passes égaux auront le même hash)

J’essayerai aussi d’ajouter la gestion du spam bientôt.

Gwibber est un client pour réseaux sociaux (StatusNet, Twitter & co) assez sympa. Seulement, il a un problème : sa base de donnée à tendance à augmenter au fur et à mesure du temps. Aujourd’hui le fichier ~/.config/gwibber/gwibber.sqlite faisait 132MB chez moi, c’est beaucoup pour gérer juste un flux Twitter et un StatusNet.

En fouillant un peu le code, j’ai trouvé la fonction de maintenance qui sert à supprimer les 2000 plus vieux status au démarrage. Seulement, les status ne sont pas la seule chose qui sont stockées dans la base de donnée, il y a aussi les liens, une crasse qui augmente vite. La preuve :

$ cd ~/.config/gwibber/
$ ls -lh gwibber.sqlite
-rw-r--r-- 1 mart users 132M Nov  2 12:34 gwibber.sqlite
$ sqlite3 gwibber.sqlite 
SQLite version 3.7.14.1 2012-10-04 19:37:12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select count(*) from messages where stream = 'links';
39622

Ouch 40000 liens stockés, pas étonnant que ça monte. J’avais ouvert un bug report à ce sujet là il y a plus de deux mois mais je n’ai eu aucune réponse. Tant pis, on est jamais mieux servi que par soit même de toute façon. On peut donc supprimer les plus vieux en modifiant un peu la commande (triviale) de la fonction de maintenance pour obtenir:

DELETE FROM messages WHERE operation = 'receive' AND stream = 'links' AND time IN (SELECT CAST (time AS int) FROM (SELECT time FROM messages WHERE operation = 'receive' AND stream = 'links' AND time != 0 ORDER BY time ASC LIMIT (SELECT COUNT(time) FROM messages WHERE operation = 'receive' AND stream = 'links' AND time != 0) - 2000) ORDER BY time ASC);

Après avoir lancé cette commande dans le shell sqlite, on purge le tout et tadaaaaam

sqlite> select count(*) from messages where stream = 'links';
3071
sqlite> VACUUM;

$ ls -lh gwibber.sqlite
-rw-r--r-- 1 mart users 41M Nov  2 12:37 gwibber.sqlite

41MB, pas mal le nettoyage. On peut même faire mieux en supprimant les autres types de status qui prennent un peu trop de place. Testez chez vous pour voir ce qui encombre le plus.

sqlite> select count(*), stream from messages group by stream;
4317|images
3084|links
4372|messages
44|private
6|profile
629|replies
39|send_thread
4703|user
1235|videos

Hmmm un peu trop d’images chez moi, ne gardons que les 1000 dernières.

sqlite> DELETE FROM messages WHERE operation = 'receive' AND stream = 'images' AND time IN (SELECT CAST (time AS int) FROM (SELECT time FROM messages WHERE operation = 'receive' AND stream = 'images' AND time != 0 ORDER BY time ASC LIMIT (SELECT COUNT(time) FROM messages WHERE operation = 'receive' AND stream = 'images' AND time != 0) - 1000) ORDER BY time ASC);
sqlite> VACUUM;

$ ls -lh gwibber.sqlite
-rw-r--r-- 1 mart users 34M Nov  2 13:11 gwibber.sqlite

Vous pouvez facilement jouer un peu avec la base de donnée en changeant les paramètres mais prudence. Je n’ai pas inspecté en long et en large la structure et cette façon de faire n’est peut être pas la plus propre (si vous avez beaucoup de lien par message, vous risquez d’en effacer trop par exemple). Mais bon, je n’avais pas envie de passer 2h là dessus et en sachant que je ne retourne rarement plus loin que les 100 derniers status, je ne prend pas trop de risque en nettoyant dans les 2000 derniers. À vous de voir… Vous pouvez aussi mettre les commandes dans un cron pour automatiser tout ça pour garder la base de donnée à une taille raisonnable.