Introduction au monde de Linux

Partie 1 / Chapitre 2 : Introduction au monde de Linux

Unix existe depuis la fin des années 1960, et Linux a été créé par Linus Torvalds au début des années 1990. Lorsqu’il a créé Linux, Linus visait avant tout un outil pédagogique qui soit libre, basé sur Unix.

L’objet de cette introduction n’est pas de refaire l’histoire d’Unix et de Linux, mais bien plutôt de répondre à une question qui nous paraît toujours fondamentale, aujourd’hui : pourquoi est-ce que Linux fonctionne ainsi depuis plus de 50 ans, et surtout… que cela fonctionne toujours ?

Plan

  • La Philosophie Unix : le cadre de pensée et ses implications.
  • Modularité : Découper des problèmes complexes en petits utilitaires simples et connectés.
  • Sécurité : Isolation des processus et des utilisateurs (chaque outil a son domaine d’exécution).
  • Tout est fichier : une abstraction fondamentale pour comprendre Linux, mais aussi nombre de technologies populaires aujourd’hui.

image

La philosophie Unix comme cadre de pensée

La philosophie Unix n’est pas juste une relique des années 70 ; c’est un cadre de pensée qui privilégie la simplicité et la prévisibilité. Contrairement à d’autres systèmes qui tentent de tout faire au sein d’un seul programme massif, Unix repose sur une approche minimaliste : « Faites une seule chose, et faites-la bien ».

Cette approche garantit que le système reste stable et compréhensible, même après 50 ans d’existence. En maîtrisant ce cadre, on ne se contente pas d’apprendre des commandes, on apprend à concevoir des solutions élégantes à des problèmes complexes.

La modularité : découper un problème complexe

C’est ici que la magie opère. La modularité consiste à utiliser de petits utilitaires simples comme des briques Lego pour construire des structures complexes : Au lieu d’avoir un logiciel « monolithique » (qui fait tout mais qui est lourd et comportant des erreurs), on utilise des outils spécialisés (comme grep, sort, wc, que nous aborderons plus tard).

Cela facilite la maintenance et le débogage. Si une étape de notre chaîne de traitement échoue, nous pouvons facilement identifier exactement quel petit outil est en cause, plutôt que de fouiller dans 10 000 lignes de code. Il suffira alors d’investiguer cet outil, de voir si nous l’avons bien utilisé, et éventuellement s’il n’a pas de bug.

Dans le monde de Linux, nous allons connecter la sortie d’un outil à l’entrée du suivant : c’est ce qu’on appelle le workflow. Ceci est possible, car la manière d’envoyer et de recevoir des données est standardisée. Et l’intérêt du standard est justement de s’assurer que tous les outils parlent la même langue et s’expriment de la même façon.

Sécurité par l’isolation

Sous Linux, la sécurité n’est pas une option ajoutée après coup, elle est ancrée dans la gestion des processus et des utilisateurs. Chaque outil et chaque utilisateur possède son propre « domaine réservé ». Un processus lancé par un utilisateur standard ne peut pas, par défaut, aller fouiller dans les fichiers d’un autre ou modifier le système.

Un outil ainsi utilisé hérite des droits et permissions de l’utilisateur, pour ces mêmes raisons. D’ailleurs, certaines applications – les services – disposent d’un utilisateur dédié : les accès du service se limiteront exclusivement aux fichiers qu’il doit manipuler, et à rien d’autre. Cette sécurité supplémentaire est d’autant plus pertinente qu’on parle de services généralement exposés à l’extérieur de la machine.

Cela crée un domaine de responsabilité bien défini. Si un service (comme un serveur web) est compromis, l’attaquant reste enfermé dans les droits limités de ce service, évitant ainsi la propagation du problème à tout le système.

Sans cette isolation, des outils comme les agents IA, capables de manipulations avancées disposant d’une compréhension encyclopédique du système, pourraient tenter de manipuler des données sensibles, saturer les ressources…

C’est le principe du « moindre privilège » : on ne donne que ce qui est strictement nécessaire.

Tout est fichier

C’est sans doute l’abstraction la plus puissante de Linux. Pour le système, presque tout ce qui existe est traité comme une suite d’octets dans un fichier. Que vous communiquiez avec votre disque dur, votre clavier, ou un autre programme via le réseau, vous utilisez les mêmes outils de lecture et d’écriture.

Cette uniformité est la clé pour comprendre des technologies modernes comme Docker ou Kubernetes. Si vous savez lire un fichier texte, vous savez potentiellement lire l’état d’un processeur dans /proc ou envoyer des données à un périphérique dans /dev.

Pour vous donner une idée un peu plus précise des implications de cette logique, voici quelques types de fichiers courants sous Linux :

  • Dossiers : Eh oui, sous Linux, les dossiers sont des fichiers ! Techniquement, ce sont des fichiers spéciaux permettant de lire d’autres fichiers. Ils ont un système d’index qui permet de facilement retrouver l’adresse d’un fichier (un peu comme à l’entrée d’un immeuble).
  • Texte : C’est le format de base, notamment utilisé pour les fichiers de configuration (le fameux /etc). C’est également le terme générique pour désigner tous les fichiers lisibles par les humains (éventuellement via des outils), comme les fichiers .txt, .csv, etc.
  • Exécutables : Ce sont tous les scripts (souvent en Bash) ou les binaires compilés qui peuvent être exécutés. Autrement dit, ce sont les outils, programmes, logiciels et services qu’on retrouve sur n’importe quel système.
  • Sockets : Ils servent d’interface entre deux programmes. D’un côté, un programme écrit dans cette socket, et de l’autre côté, un ou plusieurs autres programmes peuvent venir lire (ou « consommer ») ce qui se trouve dans la socket.
  • Volumes : Tous les disques durs, clés USB, DVD (pour ceux qui en ont encore), etc. sont des volumes, du point de vue du système : des espaces de stockage où se trouvent d’autres fichiers … Car oui, Linux les traite aussi comme des fichiers.
  • Archives : Ce sont des fichiers contenant d’autres fichiers pour le transport. Nous utilisons des algorithmes de compression (tar, zip) permettant d’optimiser leur taille tout en permettant de traiter l’ensemble comme un seul fichier, qui peut être ensuite facilement partagé.

Travailler avec les flux

C’est ici que Linux prend tout son sens. La manipulation du flux de données (ou « dataflow » en anglais) permet de transformer une série d’outils simples en une véritable chaîne de production logicielle.

Avec les types de fichier, nous avons parlé des sockets ; nous avons également les fichiers de log, où les applications écrivent en continu. Sous Linux, nous avons également trois canaux (ou descripteurs) que le système ouvre automatiquement lorsqu’un programme est lancé : l’entrée standard (appelée « stdin ») où le programme reçoit des données, la sortie standard (« stdout ») où le programme écrit lui-même des données, et la sortie d’erreur (« stderr ») qui est une sortie dédiée aux messages d’erreurs.

Les flux ne font pas exception à la règle : ils sont également traités comme des fichiers. Nous pouvons donc lire et écrire dessus, mais surtout les rediriger. L’un des cas les plus courants consiste justement à redistribuer les données vers des fichiers spéciaux, en cas de besoin, comme les sockets (pour les interactions entre programmes) ou vers le fichier de logs (logs d’événements et logs d’erreur).

La logique des flux découle naturellement du principe de modularité et de l’abstraction fondamentale où « tout est fichier ». Puisque le système traite les communications entre programmes de la même manière qu’un simple document texte, il devient possible de « brancher » la sortie standard d’un outil sur l’entrée standard d’un autre sans aucune friction.

C’est cette standardisation universelle des échanges qui permet de transformer des utilitaires isolés en une véritable chaîne de production logicielle, offrant une flexibilité et une prévisibilité qui constituent le cœur même de l’expérience Linux.


Exercices

Exercice 1

Niveau débutant

L’IA vous propose de créer un script Python qui va gérer : la lecture de fichiers, les envois réseau, le traitement des données et les logs.

Quel principe de la philosophie Unix cette suggestion viole-t-elle en premier ? Expliquez pourquoi ce choix rend le projet moins compréhensible après 6 mois.

Exercice 2

Niveau débutant

L’IA vous dit : « Nous allons tout faire dans un seul énorme programme comme sur Windows. »

Identifiez les deux mots-clés de la philosophie Unix que cette phrase contredit (« Faites une seule chose… »). Expliquez en quoi la modularité rend Linux encore stable 50 ans plus tard.

Exercice 3

Niveau débutant intermédiaire

Pour votre pipeline, l’IA propose d’utiliser un seul outil qui lit les logs, trie, filtre et envoie un e-mail.

Nommez le principe violé. Proposez une chaîne de 3 outils simples qui font exactement la même chose et expliquez pourquoi il sera plus facile de déboguer si le mail ne part pas.

Exercice 4

Niveau intermédiaire débutant

L’IA vous suggère : « Pour gagner du temps, lance ton script de traitement de données directement en root. »

Quel principe de sécurité est violé ? Décrivez le risque long terme pour un vibecoder qui utilise régulièrement des agents IA.

Exercice 5

Niveau intermédiaire

Vous déployez un petit serveur web avec l’IA. Elle vous fait utiliser votre propre compte pour le démarrer.

Expliquez le principe d’isolation et du « moindre privilège ». Que se passe-t-il concrètement si un attaquant exploite une faille dans ce serveur ?

Exercice 6

Niveau intermédiaire

L’IA vous explique : « Pour lire l’état du CPU, il faut un outil spécial ; pour lire un fichier, c’est autre chose. »

Quel principe fondamental est ignoré ? Donnez deux exemples concrets (/proc et /dev) qui montrent pourquoi cette uniformité est puissante.

Exercice 7

Niveau intermédiaire avancé

L’IA vous propose de créer un dossier pour stocker des sockets réseau.

Pourquoi cette idée est impossible sous Linux ? Expliquez la différence entre un dossier et une socket en termes de « tout est fichier ».

Exercice 8

Niveau intermédiaire avancé

L’IA génère une commande permettant de rediriger toutes les sorties d’un script vers la même sortie, mais oublie complètement stderr pour les erreurs critiques.

Quel concept de flux est mal utilisé ? Expliquez pourquoi séparer les erreurs est crucial pour un vibecoder qui débogue via des logs.

Exercice 9

Niveau avancé

L’IA vous dit : « Pour connecter deux programmes, utilise un fichier temporaire sur le disque. »

Pourquoi cette approche viole à la fois « tout est fichier » et la modularité ? Proposez la solution Unix native et montrez son avantage.

Exercice 10

Niveau avancé

Scénario : votre agent IA (lancé par l’IA précédente) commence à supprimer des fichiers sensibles alors qu’il ne devrait que lire des logs.

Quel principe a été violé à l’origine, d’après vous ? Proposez la correction complète.

Exercice 11

Niveau expert

L’IA vous livre une « solution complète » : un seul conteneur avec tout dedans, web + base de données + traitement + logs, et le tout est lancé en root.

Listez les 4 principes Unix violés en une phrase chacun. Puis proposez une architecture qui respecte ces principes.

Exercice 12

Niveau expert

Voici le diagnostic après un incident : Le système est lent, les logs sont mélangés, un agent IA a modifié /etc/passwd, et on ne sait plus quel outil a fait quoi.

Analysez étape par étape quelles violations cumulées de la philosophie Unix peuvent mener à cette situation. Proposez une refonte complète en 4 points maximum qui empêche ce cercle vicieux.


Vivre dans un système Linux

Dans cette première partie, nous avons parcouru les grands concepts de la philosophie de Linux :

  • La spécialisation
  • La modularité
  • L’isolation
  • La notion de fichier

Comprendre ce cadre théorique peut paraître un peu fastidieux. Il est pourtant nécessaire pour aborder toute la pratique, et surtout l’utilisation de Linux et de Bash.

Dans la prochaine partie, nous allons justement rendre les concepts de Linux nettement plus concrets, puisque nous allons parler du terminal et des commandes de base de Linux grâce auxquels nous pouvons manipuler les utilisateurs et groupes, le système de fichier et les fichiers eux-mêmes : Console et manipulation de fichiers.


Réponses aux exercices

  1. Niveau débutant.
    1. Le principe violé est « Faites une seule chose, et faites-la bien » (règle de simplicité et spécialisation).
    2. Un gros script monolithique mélange responsabilités → après 6 mois (ou dès qu’un bug apparaît), il devient très difficile de comprendre quelle partie fait quoi, même pour son propre auteur.
  2. Niveau débutant intermédiaire
    1. Les deux mots-clés sont « une seule chose » et « bien ».
    2. La modularité (petits outils spécialisés qui collaborent) permet de tester, corriger et remplacer chaque brique indépendamment. C’est pourquoi le noyau et les outils de base sont restés extrêmement stables pendant plus de 50 ans.
  3. Niveau débutant intermédiaire
    1. Le principe violé par la proposition est la modularité.
    2. Une meilleure approche serait d’avoir un outil pour extraire les logs pertinents, un autre pour les trier, et un outil dédié pour l’envoi d’e-mails. Si le mail ne part pas, on sait immédiatement que c’est la dernière brique qui pose problème. Nous pouvons tester indépendamment chaque brique de cette chaîne sans toucher au reste.
  4. Niveau intermédiaire débutant
    1. Le principe violé est le principe du moindre privilège (least privilege).
    2. Risque long terme : un bug, une mauvaise suggestion d’IA ou une injection malveillante dans un prompt peut entraîner la suppression de fichiers système, la modification d’un dossier sensible, l’installation de backdoors (ouvertures qu’un pirate peut exploiter),… jusqu’à la perte totale de la machine.
  5. Niveau intermédiaire
    1. Isolation = chaque processus tourne dans son propre domaine de responsabilité (utilisateur dédié).
    2. Moindre privilège = on ne donne que les droits strictement nécessaires
    3. Conséquence d’une faille : l’attaquant obtient les droits de votre compte personnel, il peut lire, modifier ou supprimer vos fichiers personnels, vos clés SSH, vos tokens cloud, vos projets en cours,… C’est la compromission complète de votre identité numérique.
  6. Niveau intermédiaire
    1. Le principe ignoré est que tout est fichier.
    2. Exemples :
    • /proc/cpuinfo → on peut lire l’état du processeur comme un fichier texte normal.
    • /dev/null est un « fichier » où on peut rediriger la sortie de n’importe quel programme pour le jeter… Nous réutilisons les mêmes outils (cat, grep, echo,…) partout, apportant un énorme gain de simplicité et de puissance.
  7. Niveau intermédiaire avancé
    1. C’est impossible, car une socket est un type de fichier spécial (type s dans ls -l), pas un répertoire (type d).
    2. Différence : un dossier contient une liste d’autres fichiers ; une socket est un point de communication bidirectionnel entre processus.
  8. Niveau intermédiaire avancé
    1. Concept mal utilisé : séparation de stdout et stderr.
    2. stderr permet de capturer uniquement les messages d’erreur et d’alerte. Nous pouvons ainsi les rediriger vers un canal de monitoring (Slack, mail, fichier d’erreurs) séparé des logs normaux. Autrement, les vraies erreurs se noient dans la masse de sortie normale et deviennent très difficiles à repérer.
  9. Niveau avancé
    1. Cette solution viole le principe de modularité → on ajoute une dépendance au disque (I/O lent, concurrence, nettoyage)
    2. « Tout est fichier sous Linux » il est possible d’utiliser un pipe ou une socket pour aboutir au même résultat, mais de façon… « Linuxienne ».
  10. Niveau avancé
    1. Principe violé : moindre privilège et isolation par utilisateur.
    2. Il faut donc créer un utilisateur dédié à chaque agent et s’assurer que chacun ait les droits correspondants à ses missions. Chaque agent peut ensuite passer par son utilisateur dédié pour exécuter ses commandes… Sans risque de déborder sur le périmètre des autres.
  11. Niveau expert
    1. Violations des principes suivants :
      1. Modularité → un seul gros conteneur viole « une seule chose et bien »
      2. Isolation → tous les services partagent le même espace de processus
      3. Moindre privilège → tourne en root
      4. Tout est fichier → mélange des responsabilités rend les flux et volumes très complexes
    2. Architecture suggérée : un conteneur dédié pour le serveur web, un pour la base de donnée et un pour les traitements. Chaque conteneur aura alors son propre utilisateur, avec l’accès aux dossiers dédiés.
    3. Notez que nous traitons du sujet du compte root pour l’exercice. Dans les faits, un conteneur étant dédié à une tâche, et nativement isolé du reste, les risques liés au compte root sont très limités… Tant que nous respectons les principes propres à Docker (nous pourrons en reparler dans un cours dédié ;-))
  12. Niveau expert
    1. Violations cumulées :
      1. Moindre privilège : un agent IA est lancé en root, il a donc pu modifier /etc/passwd
      2. Isolation : Il n’y a pas d’utilisateur dédié par agent, ce qui accroît les risques de propagation du dommage
      3. Modularité : outils et scripts mélangent certainement plusieurs fonctionnalités, ce qui rend impossible de savoir « qui a fait quoi ».
      4. Au niveau des flux, séparation stdout et stderr sont mélangés, ce qui rend difficile le tri des logs pour séparer les vraies erreurs
    2. Refonte en 4 points :
      1. Chaque service et agent devrait avoir son utilisateur dédié
      2. Ne jamais laisser un service ou agent utiliser root (et si c’est vraiment nécessaire, passer par la supervision humaine)
      3. Séparer stdout (logs normaux) et stderr (alertes) dès le départ
      4. Utiliser des pipes ou fichiers de log par service (pas un gros log central non filtré)

Looking for comments…

Searching Nostr relays. This may take a moment the first time this article is opened.