- Un utilisateur qui se sert souvent d’un bureau BSD ainsi que de chroot et de jails teste Alpine Linux, et estime que sa conception centrée sur la sécurité, la simplicité et l’efficacité des ressources parlera aux utilisateurs BSD
- Grâce à sa petite taille et à ses dépendances limitées, Alpine est largement utilisée non seulement comme image de base pour conteneurs, mais aussi dans les systèmes embarqués, les routeurs, les appareils mobiles, les serveurs et les postes de travail
- L’installation consiste à exécuter
setup-alpine depuis l’environnement live, puis à configurer successivement les réglages de base comme le keymap, le réseau, le fuseau horaire, SSH et NTP
- Après le premier démarrage, la combinaison OpenRC,
musl et busybox apparaît clairement, avec des éléments comme /etc/rc.conf et crond(8) qui rappellent l’expérience rc façon BSD
- Après avoir vérifié la gestion des paquets avec
apk, la configuration des dépôts et la possibilité d’installer ZFS, l’impression est assez bonne pour envisager sérieusement Alpine comme distribution Linux principale candidate pour les tests et les serveurs
Le caractère d’Alpine familier aux utilisateurs BSD
- Alpine Linux est une distribution Linux indépendante, non commerciale et généraliste destinée aux power users qui privilégient la sécurité, la simplicité et l’efficacité des ressources
- Les binaires de l’espace utilisateur sont compilés en PIE (Position Independent Executables) avec protection contre le stack smashing, avec l’objectif de réduire l’exploitation de certains zero-days et vulnérabilités
- Alpine est un projet plus ancien qu’on ne pourrait le penser, Natanael Copa ayant discuté des origines du projet dès 2005
- Comme les systèmes de la famille BSD, elle est utilisée dans les systèmes embarqués, les routeurs et les appareils mobiles, mais aussi sur des serveurs et postes de travail classiques
- Sa petite taille et ses dépendances limitées en font une image de base largement utilisée pour les conteneurs Linux, et il existe aussi des outils comme alpine-chroot-install pour l’exécuter facilement dans
chroot(8)
- C’est un point particulièrement intéressant pour les utilisateurs qui se servent beaucoup de
chroot(8) sur NetBSD et des jails FreeBSD pour les tests et les déploiements
Expérience d’installation
- Alpine fournit plusieurs builds, notamment pour ARM, PPC64, x86 et x86_64
- L’image ISO Xen a été démarrée dans une VM, mais c’était un choix dû à une mauvaise lecture de Dom0 comme DomU
- Dom0 désigne l’hyperviseur Xen, pas un invité
- Malgré cela, le démarrage et l’installation se sont déroulés comme avec une ISO standard
- L’installation se fait depuis l’environnement live en se connectant avec
root et un mot de passe vide, puis en exécutant setup-alpine
- Pendant l’installation, les éléments de base comme le keymap, le réseau, le fuseau horaire et l’authentification root sont configurés l’un après l’autre
- Il est possible d’injecter des clés SSH au début du processus
- C’est utile lorsqu’on déploie ensuite des lots de VM ou de serveurs avec des outils d’orchestration
- C’est également pratique dans les environnements d’hébergement qui ne fournissent pas de console OOB
- On peut choisir le serveur SSH et le client NTP, ce qui a permis de sélectionner OpenSSH et openntpd
- Le processus d’installation détecte correctement qu’il s’exécute sous Xen
- La configuration LVM est également possible, mais cette fois la configuration standard, qu’Alpine appelle partition
sys, a été choisie
- Cette configuration utilise
ext4
Configuration visible après le premier démarrage
- Après le premier démarrage,
dmesg(1) permet de vérifier que le système utilise OpenRC
- OpenRC est un système init portable, compact, rapide, efficace, transparent et sûr
- Pour les utilisateurs habitués à écrire des scripts rc façon BSD, OpenRC est très familier
- Des éléments comme
/etc/rc.conf et crond(8) rejoignent l’expérience utilisateur BSD
- L’existence de distributions Linux utilisant OpenRC, comme Devuan, Gentoo et Alpine, redonne un côté amusant à Linux
- Alpine inclut musl avec OpenRC et utilise busybox
- musl et busybox sont plus limités que GCC et les GNU coreutils, mais contribuent à la petite taille du système de base et à la réduction de la surface d’attaque
- llvm est également disponible
- Le MirBSD Korn shell est aussi proposé sous forme de paquet, et fait partie des shells interactifs préférés
Gestion des paquets et dépôts
- Le gestionnaire de paquets par défaut d’Alpine est apk
- Comme c’est courant sous Linux,
apk ne distingue pas le système de base des paquets et les met à jour ensemble
- Il n’a pas encore été vérifié s’il peut être exécuté depuis une copie non privilégiée comme sous BSD
- pkgsrc est également disponible, ce qui laisse une alternative
- La configuration des dépôts se trouve dans
/etc/apk/repositories
- Décommenter la deuxième URL fournie par l’installateur permet d’activer le dépôt community
- Alpine dispose aussi d’un dépôt
testing, et il est possible d’ajouter ses propres dépôts
- L’utilisation est simple, même si les habitudes font parfois saisir par erreur
apt install au lieu de apk add
- L’interface web officielle des paquets se trouve sur pkgs.alpinelinux.org
- Les dépôts Alpine peuvent aussi être consultés sur pkgs.org
ZFS et évaluation comme candidate pour les serveurs
- Après avoir installé quelques paquets, il a été possible de retrouver la configuration d’« outils indispensables » utilisée sur un ordinateur portable uniquement en console
- L’un des paquets les plus surprenants était ZFS
- L’installation et le chargement du module noyau ont pu se faire en deux commandes
# apk add zfs zfs-lts
# modprobe zfs
- Configurer le système de fichiers root sur ZFS pourrait être plus complexe
- Le comportement de la configuration ZFS après une mise à niveau n’a pas encore été vérifié
- Rien qu’avec l’expérience acquise jusqu’ici, l’impression est assez bonne pour envisager sérieusement de basculer vers Alpine comme distribution Linux principale pour les tests et les serveurs
- Parmi les points forts cités figurent le fait de ne voir qu’un petit nombre de processus reconnaissables dans
htop(1) et lsof(1), l’usage d’OpenRC, une gestion des paquets qui semble simple et une configuration facile
- S’il existe un « Occam’s Linux » moderne et fonctionnel, Alpine en serait proche
- Si davantage de fonctionnalités que busybox sont nécessaires, il serait possible d’essayer uutils, mais le besoin semble limité sur un serveur
1 commentaires
Avis sur Hacker News
Du point de vue de la sécurité, la plupart des binaires Linux sont aujourd’hui compilés en PIE
Si l’on lance
checksecsur un binaire quelconque d’Ubuntu, cette propriété apparaît, et on peut installerchecksecavecpip install pwntoolsÀ l’inverse, GLIBC possède, à ma connaissance, l’implémentation de tas la plus renforcée, avec davantage de mesures d’atténuation contre le double free et d’autres attaques sur le tas
De ce point de vue, on pourrait donc dire qu’Alpine est moins sûre parce qu’elle utilise musl, mais le fait d’être un système petit et facile à comprendre est un vrai avantage en matière de sécurité
checksecsur tout, et tous les processus ressortent comme ceci. La sortie complète est longue, donc je l’omets, mais je n’ai jamais vu ces flags absents de quelque chose compilé par AlpineCOMMAND PID RELRO STACK CANARY NX/PaX PIEinit 1 Full RELRO Canary found NX enabled PIE enabled[snip...]crond 422838 Full RELRO Canary found NX enabled PIE enabledHonnêtement, je pense que Windows moderne comme macOS ont tous deux une meilleure architecture de sécurité
Je viens aussi du monde BSD et, par hasard, j’ai lancé Alpine pour la première fois cette semaine dans une VM sur bhyve
Le point clé, c’est BusyBox. Si les utilitaires de
/binet/sbinn’ont pas besoin d’être chacun des binaires indépendants, l’espace utilisateur devient très petit et le démarrage rapide. Avec Tmux et zsh installés, c’était suffisant pour la plupart des usages UnixPour arriver à l’environnement final, j’ai quand même dû installer pas mal de choses avec
apk, mais globalement, c’était la meilleure expérience Linux que j’aie eue depuis longtemps. J’aimerais que ZFS soit inclus par défaut, et que la connexion virtio adaptée à l’exécution basée sur ZFS de bhyve soit plus expliciteCela dit, je suis content d’apprendre qu’il existe peut-être une distribution Linux sensée, et si j’ai besoin d’une machine Linux, je l’essaierai. Mais cela arrive assez rarement
apksuffit presque à l’installerLe wiki Alpine contient aussi une documentation plutôt correcte pour installer le système de fichiers racine sur ZFS : https://wiki.alpinelinux.org/wiki/Root_on_ZFS_with_native_en...
Si vous êtes utilisateur de BSD, Void Linux pourrait aussi vous plaire. C’est une distribution créée par xtraeme, développeur NetBSD ; elle existe en versions glibc et musl, et utilise runit comme système d’initialisation
On peut aussi compiler les paquets depuis les sources avec
xbps-srchttps://voidlinux.org/
Il faut toutefois noter que je n’ai utilisé que des installations xfce avec des modifications minimales. Les configurations multi-utilisateurs complexes peuvent être un peu plus pénibles, car runit embarque moins de fonctionnalités par défaut que systemd
Je m’attendais à ce que quelqu’un mentionne que les pages man, dont les BSD sont si fiers, ne sont pas incluses par défaut dans Alpine. C’est l’une des raisons pour lesquelles je n’utilisais pas Alpine sur mon ordinateur portable de voyage, et j’utilise maintenant OpenBSD
Ai-je raté une option de configuration qui ferait que la documentation soit toujours installée quand on récupère un paquet sur Alpine ? Ou faut-il forcément installer manuellement les paquets
-docà chaque fois ?docs. Il tirera ensuite les paquets*-doccorrespondant aux éléments que vous installezHonnêtement, je ne comprends absolument pas pourquoi les gens trouvent des choses comme OpenRC séduisantes. N’importe quelle approche fondée sur la supervision me paraît meilleure que de laisser traîner un PID, de l’enregistrer dans un fichier PID, puis d’espérer que trois semaines plus tard cette valeur pointe encore vers le démon lancé.
En plus, dans certains cas, la gestion du service se fait en lançant
pgrepsur un nom de processus donné. Je suis assez d’accord avec l’idée qu’il ne faut pas tout redémarrer automatiquement par défaut, mais c’est à peu près le seul avantage que ce camp puisse vraiment faire valoir.Et au final, ces systèmes dépendent fortement de syslog, qui est vraiment une technologie des années 80. Des outils comme
multilogousvlogdpourraient être améliorés pour offrir plus facilement une vue centrale de l’ordre des événements entre plusieurs outils, mais regrouper les logs dans des catégories floues et permettre à n’importe qui d’écrire des logs n’importe où sous n’importe quel nom me paraît étrange.https://mastodon.social/@ariadne@treehouse.systems/112044942...
https://mastodon.social/@ariadne@treehouse.systems/112214386...
Il y a trop de choses dans PID1, et il est écrit dans un langage qui n’est pas sûr du point de vue mémoire. Je ne vois pas de raison technique empêchant de le découper en un PID1 minimal et quelques programmes setuid.
La seule chose qui me vienne à l’esprit est que cela permet de faire tourner systemd dans un conteneur Docker, mais Red Hat/IBM préfère probablement que l’on utilise ses propres outils de conteneurisation, comme systemd-nspawn, et ne doit donc pas y tenir particulièrement. Dans sa structure actuelle, je ne pense pas que ce soit jamais défendable du point de vue de la sécurité.
Alpine a un avantage amusant. Quand les utilisateurs de Nix se vantent de la gestion déclarative des paquets, on peut éditer directement
/etc/apk/worldpuis exécuterapk fixpour leur montrer comment faire sans Nix./var/lib/portage/world, les ensembles sélectionnés dans/var/lib/portage/world_sets, et les définitions d’ensembles dans/etc/portage/sets/.Cela permet de répartir les paquets par catégories, de n’en installer certains que sur les systèmes qui en ont besoin, et d’ajouter librement des commentaires dans les fichiers. L’équivalent de
apk fixestemerge -uDU @world && emerge -c, même si c’est un peu plus lourd.Alpine permet aussi de créer quelque chose qui ressemble à des ensembles avec
apk add -t setname pkg1 pkg2 pkg3, ce qui crée un paquet factice dépendant des paquets choisis. De mon côté, je crée souvent des scripts shell dans/etc/apk/sets/pour imiter l’esprit Gentoo, mais ce n’est pas toujours identique.Je me souviens qu’il y avait autrefois des articles sur les performances quand on faisait tourner Alpine dans Docker, et qu’ils recommandaient d’utiliser Debian/Ubuntu.
Articles sur la lenteur d’Alpine :
https://pythonspeed.com/articles/alpine-docker-python/
https://superuser.com/questions/1219609/why-is-the-alpine-do...
Article favorable à Alpine :
https://nickjanetakis.com/blog/benchmarking-debian-vs-alpine...
Je me demande si tout cela est encore valable aujourd’hui.
Cela dit, il serait intéressant de lancer des benchmarks et de voir les chiffres réels côté performances.
musl ne prend toujours pas en charge
pthread_attr_setaffinity_np, non ? Dans ce cas, certains logiciels ne peuvent pas tourner, le plus gros exemple étant PyTorch.Dans beaucoup de situations, la simplicité ou la sécurité sont des préoccupations plus importantes que les performances.
Le juste milieu que j’ai trouvé entre BSD et Linux, c’est Slackware. C’est fièrement Unix dans l’esprit, peu compliqué, et il y a aussi un riche arbre de ports maison via Slackbuilds.
À l’époque, je l’aimais parce que c’était une distribution minimale qui ne se mettait pas en travers de votre chemin, et je la voyais comme visant des utilisateurs un peu plus techniques.
Mais quand on creusait un problème, la communauté pouvait se montrer hostile si l’on n’avait pas fait une installation complète. La raison invoquée était que l’installation complète était la méthode recommandée, et si on ne le faisait pas, on se retrouvait avec des problèmes de dépendances idiots, du genre mplayer qui ne marche pas parce qu’il manque samba.
Je considère qu’Alpine est une amélioration par rapport à Slackware sur tous les plans.
Alpine Linux n’était donc pas vraiment GNU/Linux. Je ne le savais pas.
Ce serait alors BusyBox/Linux ?