PROJET AUTOBLOG


Le blog de Seboss666

Site original : Le blog de Seboss666

⇐ retour index

Dive pour analyser vos images Docker

lundi 3 juin 2019 à 18:30

Djerfy m’a fait récemment découvrir un outil écrit en Go particulièrement pratique quand vous manipulez fréquemment des images Docker, et que vous souhaitez vous assurer qu’elles n’ont rien de suspect avant de les déployer sur vos infrastructures. C’est d’ailleurs à l’occasion d’une découverte fâcheuse qu’il m’a partagé l’outil, et je me suis dit que vous faire une petite démonstration ne serait pas inutile.

Installation

Commençons déjà par disposer de l’outil sur notre machine. ArchLinux et Manjaro disposent d’un PKGBUILD sur AUR, sinon sur le dépôt GitHub le développeur met à disposition fichier DEB et RPM pour l’installation sur Debian/Ubuntu et RedHat/CentOS/Fedora.

Sinon, vous pouvez tenter la méthode manuelle après avoir installé Go. Il est même installable sous Mac et Windows. Bref, vous n’avez aucune excuse pour ne pas l’installer et en abuser.

Le fonctionnement par l’exemple

Dive vous permet d’inspecter chaque couche de votre image docker et de mettre en évidence les différences de chaque commande ayant généré une couche. Vous pouvez visionner la taille totale de l’image (pour rappel, Docker mutualise autant que possible les couches, très pratique si vous construisez plusieurs images à partir de la même base), visualiser les commandes associées aux différentes couches… et sur la droite, vous avez une arborescence complète qui s’adapte en fonction de la couche sélectionnée. Vous pouvez également filtrer l’affichage de cette arborescence, et les différences sont mises en lumière avec des couleurs.

Pour illustrer son fonctionnement, j’ai construit une petite image custom à partir de celle d’Nginx à laquelle j’ai ajouté un petit élément. Je n’ai pas choisi cet élément au hasard, ça fait partie des problèmes que Djerfy a détecté dans l’image qu’il avait analysé. J’ai ensuite fait analyser cette image par dive, et pour gagner un peu de temps, j’ai déjà filtré l’affichage afin de limiter les informations présentes :

En haut à gauche, on a les différentes couches avec les commandes associées. Comme Docker travaille avec des empreintes, ce sont les empreintes qui sont indiquées au lieu des noms des images. Idem pour les noms des dossiers/fichiers qu’on ajouterait, aussi bien que les URLs. Ceci dit, on a bien les chemins de destination, et c’est bien suffisant pour déterminer ce qui n’irait pas dans cette image. Ici, on découvre donc que quelque chose a été ajouté dans le dossier /root/.ssh/. Et la couche d’après indique que c’est un fichier id_rsa. L’arborescence de droite filtrée nous le confirme en vert (le jaune indique une modification, le vert une création).

J’ai ensuite vérifié si les soupçons sont avérés :

docker run --name some-nginx -d nginx-custom
9a28ae0c24ed2d153fa90d05ac29f572ade8ec3c5ff0f5ba9da05496e939137c
 seboss666  ~  dev  dive-test  docker container ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
9a28ae0c24ed        nginx-custom        "nginx -g 'daemon of…"   7 seconds ago       Up 5 seconds        80/tcp              some-nginx
 seboss666  ~  dev  dive-test  docker exec -ti some-nginx /bin/bash
root@9a28ae0c24ed:/# cd /root
root@9a28ae0c24ed:~# ls -la
total 20
drwx------ 1 root root 4096 Jun  1 19:10 .
drwxr-xr-x 1 root root 4096 Jun  1 19:11 ..
-rw-r--r-- 1 root root  570 Jan 31  2010 .bashrc
-rw-r--r-- 1 root root  148 Aug 17  2015 .profile
drwx------ 1 root root 4096 Jun  1 19:10 .ssh
root@9a28ae0c24ed:~# cd .ssh/
root@9a28ae0c24ed:~/.ssh# ls -l
total 4
-rw------- 1 root root 887 Jun  1 19:07 id_rsa
root@9a28ae0c24ed:~/.ssh# cat id_rsa 
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQDTFPvEnX5TVL5NdH7IN17FBwXF3SDZiE+kLbgFxntC3kArzgrX
CI40ZYT3bwEcU54dfDTz4whBzVlxf3iJUB1+47rNg6YCo2nuVS0NaJd2Kkh8U7TC
AIjKa0/RSntS7lOMd6cIQhyDUP25WOfpkvaFndwKvMqIsgcAfZskI5nTXQIBJQKB
gQCrJcU3okrAGzKD/Zc6jcJ2PQuZgtxdWcQIk8Wj0V0FyPXCpw+1RTUH45w+PlPt
dDsDJnAfsSlKHB8CFFPk9NmjrWO2t5Qy/bPM46MaJRYJjt41DhBULcJJ7i5Ore4z
3DYeEq4snnxxcDFfW5YOyhbwRSFxJSWR1zKbzztWhU54rQJBAPoCmEDkaZWI6zNB
(...)

Double bingo, on a bien ajouté une clé privée directement sur le compte root, et sans mot de passe en plus. Ouais c’est dégueu. Et c’est grosso modo ce qu’on a découvert dans l’image en question, pire, on sait exactement à quoi la clé détectée permet d’accéder.

D’autres fonctionnalités intéressantes

Un des signes qui montrent que l’on est face à un développeur consciencieux est la taille de l’image docker qui est prête à être déployée en production. Dive ambitionne de savoir détecter les gaspillages d’espace dans les images Docker, cependant le développeur lui-même indique la fonctionnalité est encore en cours de développement. Ça reste une fonctionnalité intéressante, à surveiller de près donc. Et vous avez un nouvel outil à rajouter dans votre besace pour Docker 🙂

Fail2ban et reverse proxy : c’est possible !

vendredi 24 mai 2019 à 18:30

Je l’ai dit à maintes reprises, Fail2ban est un outil très intéressant quand on peut l’installer et l’utiliser, et je le recommande dès que possible. Dans le cadre de l’analyse du trafic d’un serveur web toutefois, il y a un gros souci qui survient quand on a une architecture qui va au-delà du simple serveur Apache ou Nginx. Explications.

Dernièrement, un client s’est fait bombarder son site de vente de produits « bios », avec un modèle d’attaque qui semblait simple, mais pas facile à contrer, à savoir tabasser les pages du site et les recherches de produits. Dans un cas comme celui-là, on propose soit mod_evasive, soit fail2ban, soit mod_security, chacun ayant ses forces et ses faiblesses.

Ici, le problème principal vient du fait que le trafic ne parvient pas directement au serveur : en effet, le client fait appel à un CDN, Cloudfront en l’occurrence, et donc le serveur web ne voit techniquement que le trafic des instances Cloudfront par lesquelles passent les visiteurs, qu’ils soient légitimes ou pas.

Petit schéma simplifié de l’architecture du client

Donc au niveau d’Apache, ce qu’on voit, ce sont les IPs CloudFront et pas les IPs clients, qui sont déportées dans un entête HTTP X-Forwarded-For (« XFF »). Compliqué donc pour Fail2ban d’ajouter des règles iptables sur des ips qui ne seront jamais vues par le noyau. Dans un cas alternatif, on pourrait modifier l’action par défaut pour transformer ça en ajout dynamique d’une règle « Deny from  » avec un trigger sur XFF, mais le fichier htaccess est activement utilisé déjà par le moteur du site (Prestashop), le risque de dysfonctionnement est donc trop grand.

Netfilter est un petit malin

Ici c’est un CDN, mais la réflexion reste la même quand le serveur web se trouve derrière n’importe quel reverse-proxy/load-balancer/intermédiaire, tant qu’on a l’entête XFF, on peut agir. Ici, le site est en HTTPS, mais la terminaison est effectuée sur CloudFront, et le trafic repart en HTTP derrière, ce qui peut nous servir.

En effet, en cherchant une solution, j’ai découvert que via iptables, on pouvait définir des règles en fonction de la détection de chaines de caractères. Netfilter sait faire de l’inspection de paquets ! Ça ne fonctionnera qu’en HTTP 1.X évidemment, mais c’est une excellente nouvelle pour nous. Pour procéder, il faut utiliser iptables de cette manière :

iptables -I INPUT 1 -p tcp --dport 80 -m string --algo bm --string 'X-Forwarded-For: <ip>' -j DROP

Évidemment, vous pouvez adapter la règle à vos besoins, vous avez compris que c’est le –string qui est le plus important. Je ne connais pas l’incidence de l’algorithme sur l’effectivité ou les performances par contre.

Il est donc possible de modifier les actions de fail2ban pour déclencher un drop sur la base du XFF. Pour les détails, je vous laisse consulter cet article en anglais, mais grosso modo :

Une solution qui a ses limites

Comme toute solution à un problème particulier d’ailleurs. En effet, d’une part, comme je l’ai dit ça implique que le protocole soit « en clair » ce qui est le cas d’HTTP 1.1, HTTP 1.0, mais pas HTTP 2, donc si vous avez du HTTP 2 de bout en bout, c’est cuit, il faudra procéder autrement.

Également, l’entête X-Forwarded-For n’est pas aussi fiable que l’adresse IP dans le paquet TCP. En effet, comme tout entête HTTP, il peut être abusé avant même d’être modifié par votre proxy (Cloudfront dans mon exemple), ce qui veut dire qu’il peut y avoir de fausses IPs dedans en plus de la vraie. On pourrait donc imaginer une sorte d’attaque pour bloquer certains visiteurs en ajoutant leur IP à une salve de requêtes avant même qu’ils essaient de visiter le site.

Pire, au moment de proposer cette solution, le modèle d’attaque avait changé : il n’y a plus une seule IP qui tabasse, mais une chiée plus quinze, qui font une requête à chaque fois avant de « changer ». En filtrant/comptant/classant les IPs, on constate que certaines sont très proches les unes des autres, proviennent d’hébergeurs étrangers et donc pas de vrais clients, ce qui laisse penser à une attaque distribuée via des sites compromis. Fail2ban et iptables sont donc compliqués à exploiter dans ce cas, car qualifier une plage d’ip comme provenant à coup sur d’un hébergeur non légitime et pas un vrai client potentiel est compliqué pour un robot. Idem pour la provenance géographique, voir du trafic arriver d’un hébergeur roumain sur un site de produits bios produits et vendus en France est simple à voir pour un humain, mais pour un script par contre…

De la même façon qu’on ne le verra pas avec HTTP 2.0, désormais, avec la majorité des sites reposant sur HTTPS, netfilter ne peut plus exploiter l’inspection pour détecter d’autres modèles, je pense par exemple à un blocage bas niveau de crawlers malveillants tout juste bon à saturer les sites de requêtes sans plus de ménagement; dans ce cas, seul le serveur web restera une barrière fonctionnelle, au prix d’une consommation de ressources un poil plus élevée (filtrage via mod_rewrite ou mod_setenvif).

Malgré tout, cette fonctionnalité d’iptables que je ne connaissais pas reste intéressante je pense, et je pensais qu’il était utile de la partager avec vous.

Quelques astuces diverses, seizième

mercredi 22 mai 2019 à 18:30

J’adore mon boulot, on a constamment les mains dans de nouvelles choses, on (re)découvre certains outils dont on pensait avoir une bonne maîtrise, et ça fait de nouvelles astuces à partager, en plus ça fait longtemps 🙂

Le piège du $_ENV vide dans PHP

Lors d’une migration d’un site sous Magento d’une VM Debian très mal configurée à un cluster AKS (Azure Kubernetes Service, je déconseille, allez sur un autre cloud provider), j’ai rencontré une difficulté liée à la récupération des variables d’environnement, la superglobale $_ENV de PHP était vide alors que phpinfo() me donnait bien ces variables.

Il s’avère que c’est lié à une configuration de la directive « variables-order » :

;old config
;variables-order="GPCS"
variables-order="EGPCS"

Voilà, par défaut il ne remplit que $_GET, $_POST, $_COOKIE, et $_SERVER (vous les avez les lettres ?). Dans un contexte plus classique on mettrait ces variables dans Apache et on les récupérerait via $_SERVER, mais ça ne s’appliquait pas ici.

Un repo git en souffrance : cannot lock ref ‘refs/remotes/origin/master’

J’ai eu cette erreur bizarre en bossant sur mon api de collection de films, en cherchant un peu, j’ai le coupable :

$ cat .git/refs/remotes/origin/master
{"chrome://browser/content/browser.xul":{

Normalement il devrait y avoir un hash md5 correspondant au dernier commit enregistré du dépôt distant, je ne sais absolument pas comment ça s’est produit mais c’est dégueulasse. Ceci dit ce n’est pas complètement bloquant, j’ai pu pousser mes modifications malgré tout, mais ça l’a perturbé quand même. Pour réparer il faut plusieurs commandes (et une sauvegarde en cas de besoin) :

git branch --unset-upstream
rm .git/refs/remotes/origin/master
git gc --prune=now
git branch --set-upstream-to=origin/master master

Si ça vous arrive sur une autre branche que master, vous devrez évidemment adapter le nom. Vous pouvez tenter un git pull pour vérifier qu’il n’y a plus d’erreur.

Sublime Text : afficher les espaces et les tabulations

Quand vous n’avez pas à disposition un linter potable, au hasard pour Python, vous tombez facilement sur des erreurs d’indentation mixte espaces/tabulation, ce qui est interdit en Python 3. Dans Sublime Text, pour mieux mettre ça en lumière, vous pouvez afficher les « espaces blancs », qui auront alors une forme différente en fonction du contexte :

"draw_white_space": "all",

Et comme une image vaut mieux qu’un long discours…

Les espaces sont représentés par des points, les tabulations par des traits horizontaux

Find : chercher les fichiers et/ou dossiers vides

Alors j’avoue j’ai plus le contexte de ce qui m’a poussé à faire cette découverte, mais voilà, si vous voulez faire le ménage des dossiers vides, ou déjà les identifier, c’est comme ça :

find . -type d -empty

Par contre, je me souviens avoir lu en fonction des sources qu’il pouvait y avoir des différences entre la version BSD et la version GNU de find (ah, ces libristes…).

wp-cli et « this does not seem to be a wordpress installation » : attention au yaml !

J’ai déjà évoqué wp-cli sur l’article qui me permet d’agréger les astuces diverses sur une page de récap. Cet outil puissant devrait vraiment faire partie des indispensables de tout administrateur WordPress. Mais parfois, il réserve quelques surprises, comme ici sur un WordPress fraîchement livré par une agence de développement, en voulant remplacer le domaine par celui de l’environnement concerné :

Error: This does not seem to be a WordPress install.
Pass --path=`path/to/wordpress` or run `wp core download`.

Et ça, même en passant le bon chemin (par défaut on l’exécute à la racine du WordPress). Il s’avère que les petits malins de l’agence ont glissé un petit fichier wp-cli.yml, interprété par l’outil, qui contenait la directive suivante :

path: web/wp

Évidemment, ça va fonctionner beaucoup moins bien. Une fois retiré ce fichier, wp-cli a fait son boulot comme un charme.

Sublime Text, crawl, cpu au secours !

J’ai eu un problème au boulot avec Sublime Text avec une arborescence conséquente, plusieurs Gigaoctets et des centaines (milliers ?) de fichiers, à chaque ouverture Sublime Text me tabasse le CPU pendant plusieurs minutes, parfois la dizaine facile. Et lors de la création du contexte de build pour Docker, la mémoire vive explose à son tour. Mais certains dossiers ne sont même pas inclus dans le dépôt, ni dans l’image Docker de destination, donc pas la peine de perdre son temps à les parcourir.

Et bien il y a une option dans Sublime Text pour ça, il suffit d’ajouter à son fichier de configuration :

"folder_exclude_patterns": [".svn", ".git", ".hg", "CVS", "sites/static_*"],

Dans mon cas, c’est le sites/static_* qui m’a permis de gagner 2Go de contexte de build, et 8 minutes de consommation CPU au lancement, dû au crawl. Vous pouvez ajouter les vôtres, vous me remercierez ensuite 🙂

AWS EC2 et resolv.conf écrasé : retrouvez le bon DNS

Lorsque comme LBN vous gérez certaines configurations globales via un outil comme chef, il arrive parfois que l’on fasse des conneries, et qu’on paramètre certaines choses de travers sur des plateformes spécifiques. Dans mon cas les résolveurs DNS renseignés sur une instance EC2, qui à l’origine sont fournis par AWS via DHCP, ont sauté et été remplacés par des résolveurs qui ont plusieurs problèmes, le principal étant de ne pas être publics et donc de refuser la résolution récursive :

[root@server-p-01:~]# dig domain.tld

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.7 <<>> domain.tld
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 61389
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;domain.tld. IN A

;; Query time: 17 msec
;; SERVER: 1.2.3.4#53(1.2.3.4)
;; WHEN: Tue Mar 26 13:23:51 2019
;; MSG SIZE rcvd: 36

Pour récupérer celui d’AWS, qui peut varier en fonction de la région, la zone de disponibilité, des subnets, on peut soit forcer un dhclient, soit regarder les anciennes réponses, car dhclient enregistre les baux dans un fichier, /var/lib/dhclient/dhclient-eth0.leases :

lease {
  interface "eth0";
  fixed-address 4.5.6.7;
  option subnet-mask 255.255.255.224;
  option routers 4.5.6.254;
  option dhcp-lease-time 3600;
  option dhcp-message-type 5;
  option domain-name-servers 1.2.3.4;
(...)
}

Mieux que de reboot le serveur hein ?

Désactiver/interdire HTTP 1.0 sur Apache/Nginx

De nos jours, et à moins d’un besoin très, très spécifique, il n’est plus nécessaire de conserver ce protocole qui remonte à trop longtemps pour être honnête. Et en effet, dernièrement, à part via des outils peu scrupuleux qui tabassaient des plateformes ou tentaient de l’exploitation de faille, je n’ai pas vu d’utilisation légitime d’HTTP 1.0. Pour le bloquer au niveau de nos serveurs web préférés, il faut ajouter les directives suivantes :

#Apache
RewriteEngine On
RewriteCond %{THE_REQUEST} HTTP/1.0$
RewriteRule .* - [R=429]

#Nginx
if ($server_protocol ~* "HTTP/1.0") {
    return 429;
}

Évidemment, si vous avez une utilisation légitime d’HTTP 1.0 (et encore, ça me surprend quand même j’ai découvert que file_get_contents() en PHP fonctionnait comme ça…), il faudra procéder autrement (peut-être ajouter un filtrage IP supplémentaire).

Du lien symbolique « automatique » à partir d’un dossier

Quand on installe des certificats X509 pour des clients, on a l’habitude de créer des dossiers par année d’installation, et de créer des liens symboliques vers les fichiers dans le dossier en cours, liens qui servent ensuite dans la configuration du serveur web. Quand les fichiers du dossier de l’année ont déjà le bon nom, pour faire les liens symboliques, on peut le faire en une seule commande :

ln -s 2019/* .

Pour chaque fichier du dossier 2019, ça va créer le lien dans le dossier courant, lien qui porte le même nom que le fichier source. Très pratique 🙂

Améliorer les performances des volumes Docker

J’ai du pas mal manipuler de Docker ces dernières semaines, et aussi bien dans ma machine virtuelle que sur les plateformes client, les performances du stockages sont un point d’attention à ne pas laisser de côté. Docker permet quelques manipulations sur ce point, sur la machine virtuelle, je ne peux que vous recommander, si vous ne faites que des tests, d’abuser du cache. Une des méthodes les plus simples, dans le fichier docker-compose, déclarer votre volume de cette manière :

volumes:
      - /home/seboss666/docker/grafana:/var/lib/grafana:cached

Pour les détails et les impacts sur les performances (et l’intégrité des données), je vous laisse avec cet article en français, une fois n’est pas coutume, qui s’est penché sur le sujet.


Trois mois mine de rien, il était temps de remettre ça. J’ai plus rien en stock par contre dans l’immédiat, et je ne sais pas encore quand je vais pouvoir remettre ça.

Quelques liens en vrac et en français, 34° édition

dimanche 19 mai 2019 à 10:30

Le temps passe vite, vite, mes deux semaines de vacances auront été beaucoup trop courtes à mon goût. Et ça fait déjà un mois que je vous ai livré le précédent épisode de ma sélection de lectures. Il est donc temps de vous nourrir de nouveau 🙂

Numérique ou digital ?

Jer fais moi-même un mini-avc quand je vois notre service marketing parler de transformation digitale. La prochaine fois, vous pouvez partager ce mini-site aux personnes qui utilisent une mauvaise traduction. Et en public si possible 🙂

Guide de protection numérique

Tout comme on apprend que marcher dans la rue, la traverser, demande un minimum d’attention, utiliser le web et plus généralement Internet demande aussi de faire attention aux menaces du quotidien. Ce guide découpé en sections évite de mélanger les sujets et donc d’être vite perdu comme c’est souvent le cas. Je conseille donc de le partager au plus grand nombre.

fail2ban est-ce vraiment utile ?

J’ai déjà présenté l’utilité de fail2ban dans ma série sur la sécurisation d’un serveur Linux. Je ne suis manifestement pas le seul à avoir compris l’intérêt d’un tel outil, et pour le manipuler régulièrement sur les serveurs d’un client, il peut effectivement s’avérer très utile quand il est bien configuré.

Améliorer l’accessibilité web – Le web est-il inaccessible ?

J’ai eu l’occasion de me poser la question lorsque j’ai vu un aveugle utiliser ses outils pour essayer de lire mon blog. Je ne m’étais jamais posé la question avant, me concentrant surtout sur l’aspect « responsive », à savoir l’adaptation sur mobile, pour les voyants donc. Mais le problème est loin d’être limité à mon propre blog, et je n’ai aucun mal à imaginer, avec ces « outils » Javascript qui torturent les contenus web en temps réel, la difficulté des non-voyants à exploiter ce merveilleux outil.

J’ai voulu savoir qui avait vendu mes données personnelles et je suis tombée dans un puits sans fond

Le sujet des données personnelles est surtout devenu visible au plus grand nombre l’année dernière avec l’entrée en application du RGPD, puis des multiples scandales liés à Facebook. Il s’avère en fait que lorsque l’on abandonne une donnée à ces géants, les retrouver et identifier les exploitants est encore plus difficile que de connaître l’éleveur derrière la vache qui a « produit » le steak dans votre assiette. A se demander comment on a pu mettre autant de temps avant de s’attaquer au problème de cette économie toxique…

Linux et les jeux vidéo

Je ne suis pas le seul à avoir fait un état des lieux du jeu vidéo sous Linux, cet article développe aussi l’historique, pour que vous vous rendiez compte d’où on part quand on veut pouvoir s’adonner à un loisir en sortant des sentiers battus, et à quel point on est reconnu par les acteurs de ce secteur désormais. Un très bon point de vue différent du mien pour un même objectif 🙂

Créer un theme enfant WordPress en un clin d’oeil

Quand on débute la création d’un site sous WordPress, vient très vite le choix d’un thème, et parfois le constat qu’il faut modifier quelque chose qui n’est pas prévu (ou qui est payant). La meilleure pratique est dès lors de créer un thème enfant. C’est simple, ça prend trente secondes, sérieux essayez en suivant ce petit guide. Et si le txte vous suffit pas y’a même une vidéo à la fin.

Portrait-robot d’un instit sanctionnable

J’ai beau ne pas avoir d’enfants, j’ai pris conscience depuis quelques années de l’état de déliquescence qu’est en train d’atteindre l’Éducation Nationale, torturée par des choix politiques changeant continuellement au gré des différents ministres changeant tout aussi souvent que les programmes. Dernièrement, c’est le fait de vouloir fermer le clapet des « lanceurs d’alerte » qui fait frémir les professeurs et plus généralement Wortous les acteurs de terrain de l’Éducation, je n’inclus pas les parents qui semblent démissionner de plus en plus. Mini-fiction, mais pas tant que ça.

Comment trouver des mots de passes d’emails compromis avec pwnedornot ?

Les personnes qui s’intéressent un peu à la sécurité informatique connaissent le site Have I Been Pwned, qui permet de vérifier si une adresse e-mail a été publiée dans une fuite de données qui contiennent aussi les mots de passe. Pour les habitués de la ligne de commande, ce petit outil permet d’accéder aux résultats plus rapidement, en interrogeant l’API, ce qui est beaucoup plus rapide que d’ouvrir un onglet, d’accéder au site et de saisir l’adresse dans un formulaire.

Pourquoi fabriquer un bout d’internet ?

Vous avez peut-être déjà entendu parler d’FDN, qui est le plus ancien fournisseur d’accès en service en France. Oui, plus vieux qu’Orange/France Télécom.C’est que son aspect associatif et donc son absence de matraquage publicitaire dans les média n’aident pas à rendre le modèle populaire. Mais il n’est pas le seul, la fédération FDN regroupe une grande majorité de ces fournisseurs d’Internet propre (et que d’Internet), et pour comprendre les motivations qui poussent à suivre ce modèle, Spyou nous fait un petit inventaires des raisons qui poussent à fabriquer un bout d’Internet soi-même (ou à plusieurs, parce que c’est comme le sexe, c’est plus rigolo quand on est pas seul).


Voilà, j’ai du virer une interview passionnante d’un vieux routard français du graphisme 3D qui est repassée en mode premium 🙁 Je comprend la démarche, mais ça fait chier quand même…

Un démarrage « graphique » sur Manjaro

mercredi 15 mai 2019 à 18:30

L’idée de masquer le plus possible les messages du démarrage d’un OS Linux avec un joli logo animé est intéressante. On peut la constater chez Fedora, chez Ubuntu, et Tuxicoman a montré comment procéder sous Debian (c’est d’ailleurs lui qui m’a inspiré ce billet). Mais pas chez ArchLinux ou Manjaro. Sur cette dernière, une solution différente et un peu technique a été proposée, elle demande quelques manipulations, que je vais détailler ici.

En effet, ça repose sur l’installation de quelques paquets et la modification de fichiers de configuration, tout ça en mode administrateur. Le résultat est intéressant cependant, parfaitement stable chez moi, donc ne boudons pas notre plaisir de bricoler un peu.

On commence par installer deux paquets : bootsplash-systemd et bootsplash-theme-manjaro. Il existe plusieurs thèmes, j’ai fait l’essai avec celui-là, il n’est pas le plus joli mais ça permet de valider le fonctionnement (j’y reviens tout à l’heure). Certains thèmes sont présents dans les dépôts, d’autres seront à installer par d’autres biais :

$ yay -Ss bootsplash
aur/bootsplash-theme-bgrt 0.1-1 (+2 0.04%) 
    BGRT bootsplash theme
aur/exquisite 1.0.0-1 (+3 0.00%) 
    Bootsplash program able to render in Framebuffer, or X11 (Enlightenmen17 component)
extra/bootsplash-theme-xfce 0.1-3 (42.7 KiB 658.0 KiB) 
    Bootsplash Theme XFCE Logo
extra/bootsplash-theme-vendor 0.1-2 (25.6 KiB 540.0 KiB) 
    Bootsplash Theme Vendor Logo
extra/bootsplash-theme-manjaro 0.1-2 (25.8 KiB 625.0 KiB) (Installed)
    Bootsplash Theme Manjaro Logo
extra/bootsplash-theme-kde 0.1-3 (27.4 KiB 658.0 KiB) 
    Bootsplash Theme KDE Logo
extra/bootsplash-theme-illyria 0.1-2 (26.9 KiB 663.0 KiB) 
    Bootsplash Theme Illyria Logo
extra/bootsplash-theme-gnome 0.1-2 (32.2 KiB 720.0 KiB) 
    Bootsplash Theme Gnome Logo
extra/bootsplash-theme-arch 0.1-2 (31.1 KiB 695.0 KiB) 
    Bootsplash Theme Arch Linux Logo
extra/bootsplash-theme-amd 0.1-2 (28.9 KiB 652.0 KiB) 
    Bootsplash Theme AMD Logo
extra/bootsplash-systemd 0.1.2-1 (14.2 KiB 23.0 KiB) (Installed)
    Systemd service files for Bootsplash

On peut donc ensuite s’attaquer aux fichiers de configurations, à commencer par /etc/mkinitcpio.conf. Ce fichier est responsable de la configuration des images de démarrage système contenant notamment le noyau. A chaque mise à jour noyau, mkinitcpio va reconstruire les images de démarrages pour chaque version installée (sous Manjaro, vous pouvez avoir plusieurs versions installées très simplement), en suivant les paramètres de ce fichier de configuration. Il faut identifier la ligne qui commence par « HOOKS= », et ajouter un élément à la fin de la liste :

HOOKS="base udev autodetect modconf block keyboard keymap resume filesystems fsck bootsplash-manjaro"

Ici, on ajoute bootsplash-manjaro à la fin, manjaro étant le nom du thème, à adapter à la situation. On peut ensuite relancer la construction des initramfs (via root ou sudo) :

$ sudo mkinitcpio -P
==> Building image from preset: /etc/mkinitcpio.d/linux418.preset: 'default'
  -> -k /boot/vmlinuz-4.18-x86_64 -c /etc/mkinitcpio.conf -g /boot/initramfs-4.18-x86_64.img
==> Starting build: 4.18.20-1-MANJARO
  -> Running build hook: [base]
  -> Running build hook: [udev]
  -> Running build hook: [autodetect]
  -> Running build hook: [modconf]
  -> Running build hook: [block]
  -> Running build hook: [keyboard]
  -> Running build hook: [keymap]
  -> Running build hook: [resume]
  -> Running build hook: [filesystems]
  -> Running build hook: [fsck]
  -> Running build hook: [bootsplash-manjaro]
==> Generating module dependencies
==> Creating gzip-compressed initcpio image: /boot/initramfs-4.18-x86_64.img
==> Image generation successful

Le deuxième fichier, c’est /etc/default/grub. C’est celui qui sert de base à la construction du menu qui vous permet de choisir le noyau voire le système d’exploitation (dans le cadre d’un multi-boot) que vous souhaitez utiliser lors du démarrage de la machine. Ici, le minimum vital pour que le bootsplash fonctionne, j’ai fait cette modification :

#Ligne originale
#GRUB_CMDLINE_LINUX_DEFAULT="quiet resume=UUID=bd3d39da-18e6-425a-ae41-34cbaba1f79d"

#Ligne modifiée
GRUB_CMDLINE_LINUX_DEFAULT="bootsplash.bootfile=bootsplash-themes/manjaro/bootsplash resume=UUID=bd3d39da-18e6-425a-ae41-34cbaba1f79d"

Une fois encore, bootsplash-themes/manjaro/bootsplash contient le nom du thème qui doit être chargé, donc il faut adpater en fonction de celui-ci. Notez bien qu’on enlève la directive quiet, qui dans le démarrage par défaut masque les messages de démarrage des services, pour n’afficher que les infos finales des partitions, et d’éventuels messages d’erreur (ce que j’avais sur le Chromebook avec le 4.14 avec la carte son mal supportée).

Il faut ensuite mettre le menu à jour en lançant la commande update-grub :

$ sudo update-grub
Generating grub configuration file ...
Found background: /usr/share/grub/background.png
Found linux image: /boot/vmlinuz-4.19-x86_64
Found initrd image: /boot/intel-ucode.img /boot/initramfs-4.19-x86_64.img
Found initrd fallback image: /boot/initramfs-4.19-x86_64-fallback.img
Found linux image: /boot/vmlinuz-4.18-x86_64
Found initrd image: /boot/intel-ucode.img /boot/initramfs-4.18-x86_64.img
Found initrd fallback image: /boot/initramfs-4.18-x86_64-fallback.img
Found memtest86+ image: /boot/memtest86+/memtest.bin

Voilà, c’est fini, il ne reste plus qu’à redémarrer et à contempler le premier résultat. Voir un logo c’est quand même plus agréable que des messages texte, et si les messages vous intéressent quand même, un appui sur la touche échap vous ravira.

Quelques raffinements supplémentaires, parce que j’ai une carte Intel

Pour être honnête, le résultat n’est pas 100% parfait. En effet, il reste encore des « clignotements » pendant le démarrage, lié à plusieurs étapes de configuration de l’écran. Heureusement, j’ai du matériel Intel, fabricant très actif sous Linux qui propose notamment un raffinement : fastboot, qui permet justement d’éviter les multiples reconfigurations jusqu’à ce que X démarre (ou Wayland, notamment sur Fedora). Pour l’activer, il y a plusieurs méthodes, j’ai choisi d’ajouter l’option au démarrage de grub. Retour donc dans le fichier /etc/default/grub, pour obtenir le résultat suivant :

GRUB_CMDLINE_LINUX_DEFAULT="bootsplash.bootfile=bootsplash-themes/manjaro/bootsplash i915.fastboot=1 resume=UUID=bd3d39da-18e6-425a-ae41-34cbaba1f79d"

Et un petit coup d’update-grub pour parfaire le tableau.

Mais ce n’est pas tout. J’ai aussi découvert qu’on pouvait faire un truc en plus, au petit nom de « Early KMS » (on remercie une fois de plus le wiki d’ArchLinux), qui permet de charger le module graphique plus tôt qu’en temps normal. Il faut retourner cette-fois dans /etc/mkinitcpio.conf, et chercher la ligne qui commence par « MODULES= » :

#Ligne d'origine
#MODULES=""

#Ligne modifiée
MODULES="i915"

Une fois encore, il faut relancer la construction avec mkinitcpio -P, et un dernier reboot pour tout valider. Il doit être possible de faire la même chose pour les autres cartes graphiques dont les pilotes exploitent KMS, je vous laisse chercher.

En tout cas, ça fonctionne vraiment pas mal, il resterait éventuellement la transition entre le logo de chargement et la mire de login de Cinnamon, la transition est plutôt abrupte, mais là je n’ai rien trouvé de probant pour l’adoucir. Un simple fondu, ça devrait pas être compliqué non ?

Prochaine étape : faire son propre thème, l’installation sur Chromebook, tester l’alternative

Je n’ai pas encore compris tous les détails techniques sur la création du thème, mais grosso modo tout est documenté dans ce dépôt, donc quand j’aurai compris, et si je suis motivé, je me ferai mon propre thème.

Les autres distributions, comme le montre tuxicoman sous Debian, reposent plutôt sur une autre méthode, Plymouth, qui existe depuis assez longtemps maintenant, et dont l’installation est également possible sur Manjaro, c’est documenté sur leur Wiki qui explique les petites spécificités par rapport à ArchLinux. J’avais déjà essayé sur ma première installation à l’époque quand j’utilisais encore KDE, ça ne s’était pas vraiment bien passé. Je n’avais jamais retenté, c’est peut-être l’occasion. Je vais même peut-être utiliser le Chromebook pour ça.

PS : comme je n’ai pas la science infuse, ma base de travail a été ce post du forum Manjaro, qui centralise en anglais tout ce dont on a besoin pour mettre en place bootsplash.