| |

PROJET – Linux Partitions Calculator

Je ne pensais pas en venir un jour à rédiger un article sur cette thématique. Pourtant force est de constater que je me suis fait encore une fois ch*er la bi*e (passez-moi l’expression) à déployer une machine linux.

Je rassure le lecteur qui s’est égaré ici, ce billet va être simple.

Bref, j’ai la problématique suivante, lorsque je déploie une nouvelle machine Linux (RHEL1 ou Debian) je suis le guide d’hygiène et sécurité de l’ANSSI2. Ce qui se traduit par le partitionnement strict des points de montage système et de données. Sauf que lorsque la taille de notre disque varie, difficile de définir de tête quelle volumétrie doit être provisionnée pour chaque partition…

C’est donc là que j’ai pris un coup de sang.

En voiture Simone, c’est parti !

Avant-Propos

Je ne vais pas rentrer dans le détail du code qui compose mon application, ce n’est pas l’objectif. Si l’on souhaite comprendre ce dernier, un peu de réverse engineering et le tour est joué (surtout que j’ai commenté le code).

Je n’aborderai pas non plus la partie de durcissement des systèmes GNU Linux. Pourquoi ?

  1. Ce n’est pas le sujet de ce billet
  2. Je traite le sujet dans un de mes premiers articles que je ne partage que sur contact et échange
  3. Je pars du principe que cela sera fait après déploiement du SE3.

L’objectif est vraiment de comprendre ou du moins rappeler la structure d’un système GNU quant à son arborescence d’organisation de fichier. Et donc outre à mesure à comprendre pourquoi nous devons allouer plus ou moins d’espace de stockage.

Concernant l’application que j’ai développé, bien que je revienne sur ce point plus bas dans ce billet, cette dernière n’est pas fonctionnelle sur les environnements GNU Linux du fait de la GUI4.

Il est également important de souligné que cette application n’est compatible qu’avec la version 5.X de powershell.

Prérequis

  • SE : Environnement Windows non obsolète
  • Apps : Non Applicable
  • Autres :
    • PowerShell version 5.X

Théorie

Si nous devons commencer par la base, il serait bon de se poser la question

« Comment est structurer un environnement GNU Linux ? »

Contrairement à certaines connaissances que j’ai pu fréquenter, oui c’est un point important. Cela évite de faire n’importe quoi et dans une outre mesure d’apprendre quelques choses. (Toutes ressemblances avec des personnes existantes et purement fortuite).

T’es un peu chafouin en ce moment non ? Tu ne voudrais pas ton petit suppositoire à la verveine ?

Légèrement agacé avec une pointe de colère et donc de sarcasme il est vrai. L’hypocrisie des uns fait le désespoir des autres. Mais OKLM comme disent les d’jeuns je prends un sacré recul. Cependant, je suis partant pour la verveine mais pas en suppositoire, plus en pousse café 🙂 Et puis Monsieur, Madame, Mademoiselle, je suis bien fatigué… J’en ai marre…

Regardons alors de plus près l’architecture n à n-1.

(Pas de panique je vais prendre le temps de décrire chaque répertoire).

Nous avons le répertoire parent de notre arborescence, communément appelé « la Racine » (et non rien à voir avec l’organisation de l’ombre de Konoha dans Naruto [super référence…]) ou root. C’est sous ce répertoire / que nous allons retrouver les répertoires qui organise notre SE.

Ce répertoire est l’abréviation de binaries. Il est essentiel au bon fonctionnement du système puisque ce dernier va contenir l’ensemble des commandes exécutables de bases.

C’est ici que nous retrouvons les programmes nécessaires au mode de restauration ainsi qu’au démarrage du système. C’est je pense l’un des répertoire les plus important du système.

Ce répertoire est réservé au rangement des chaussures afin d’utiliser nos sockets… Ok je sors.

Plus sérieusement, ce répertoire contient tout ce qui est nécessaire au démarrage du système.

Pas de /boot ? Pas de démarrage…

Ce dernier contient le kernel (noyau Linux), les fichiers d’amorçage (bootloader pour ne pas dire GRUB5 dans la majorité des cas) ainsi que l’initramfs ou initrd (cela dépend) qui est notre « petit » système d’exploitation temporaire. Il va sans dire que ce dernier est critique…

Ce répertoire est l’abréviation de devices. C’est dans ce répertoire que nous allons retrouver l’ensemble des fichiers spéciaux représentant les périphériques systèmes.

Si nous avions des doutes, sous Linux, Tout est fichiers.

Bref, c’est ici que nous allons interagir avec nos médias de stockage, les périphériques tels que caméra, micro, audio etc… C’est notre noyau qui gère son contenu.

Ce n’est ni plus ni moins que l’interface entre notre système logique et notre système physique pour ne pas dire matériel.

/etc, l’un des dossiers les plus importants… C’est dans ce dernier que nous allons retrouver l’ensemble des fichiers de configuration du système. Il me semble de jadis ce que j’ai écrit dans mes cours de licence (merci M. HSU) que c’est l’abréviation de et cetera (c’était pour la minute Père castor)

  • Configurations globales du système
  • Paramètres de sécurité
  • Informations sur les utilisateurs
  • Configuration réseau
  • Configuration des services

Généralement, la modification des fichiers nécessite les droits d’administrations. Il est généralement conseillé avant toutes altérations de faire une copie du fichier d’origine 🙂

Généralement on se fait avoir une fois pas deux #bisous

E.T phone… HHHHH-OOOOOOOMMMMM-EEE…

C’est le répertoire utilisateur. C’est dans ce dernier que les utilisateurs vont stocker leurs items, et c’est également dans ce dernier que la configuration propre au profil de l’utilisateur est stockée.

Pour faire simple, c’est un espace personnel limité par des permissions strictes pour chaque utilisateur.

Abréviation de librairie, ce répertoire va contenir l’ensemble des bibliothèques partagées essentielles et nécessaires au fonctionnement de notre système et des exécutables stockés dans les répertoires /bin et /sbin.

Si nous faisions la comparaison avec Windows, les fichiers .dll s’appellent .so.

Dans ce répertoire nous retrouvons également les modules du kernel. Ce répertoire est critique pour le système car lié au /bin.

Merci Capt’ain Obvious !

L’un des amalgames que nous pouvons souvent faire avec ce répertoire se fait avec le répertoire /dev et /mnt.

Effectivement, le répertoire /media sert de point de montage automatique pour les périphériques amovibles. Si vous voyez genre les Usb-Key, CD/DVD, DD externe, Disquette, Carte SD etc… C’est pourquoi nous ne retrouvons pas ces périphériques dans /dev.

Le fait que le point de montage se fait automatiquement il n’y a pas besoin de chercher du côté du répertoire /mnt.

L’abréviation de mount. Ce répertoire est un point de montage temporaire pour monter manuellement des systèmes de fichiers.

Il sert à monter un disque manuellement, monter un ISO, accéder à une partition de réparation.

C’est un répertoire un peu particulier d’abréviation processus. C’est un système de fichiers virtuel qui est généré dynamiquement par le kernel.

Ainsi, nous retrouvons :

  • Les processus actifs
  • Les informations des ressources (CPU et RAM)
  • La configuration du kernel

Il est possible de modifier certains paramètres systèmes à chaud comme le réseau par exemple.

De son abréviation system binaries, nous retrouvons les mêmes caractéristiques que le répertoire /bin à l’exception que les commandes des exécutables présents dans le répertoire sont destinées principalement à l’administration (utilisateur root).

Ainsi les ressources présentes dans le répertoire /sbin :

  • Permettre le démarrage du système
  • Gérer l’administration des partitions et des disques
  • Administrer le réseau
  • Réaliser la maintenance et récupération

Les commandes étant sensibles, ces dernières ne doivent pas être accessible des utilisateurs. Uniquement des utilisateurs privilégiés.

De son petit nom service, ce répertoire va contenir les données des services fournis par le système.

Il sert à stocker les fichiers spécifiques aux services réseau ou applications serveurs. Généralement chaque service à son propre sous-dossier.

Les données présentes dans /srv sont considérées comme fixes. Dans le cas contraire il faudra se tourner vers le /var.

Le répertoire temporaire enfin. Comme son nom l’indique il va contenir des ressources temporaires durant l’exécution d’un programme, d’échange de données inter processus, voire de zone tampon durant l’installation ou compilation d’un programme.

C’est un répertoire magique, une zone grise. L’avantage de ce répertoire se trouve dans la suppression des données à chaque redémarrage du système.

Le dossier variable… Ce répertoire va contenir les données qui vont changer dans le temps contrairement aux fichiers statiques comme /usr, /bin, /srv.

Ce répertoire est généralement utilisé pour stocker des fichiers générés par le système ou par les applications (site web par exemple). Toutefois, nous retrouvons également :

  • Les journaux systèmes et services (logs)
  • Les files d’impressions ou mails (spools)
  • Les BDDs6
  • Les fichiers temporaires persistants

Attention car ce répertoire peut très vite grossir 🙂

L’un des répertoires importants du système mais pas non critique. Ce dernier est l’abréviation de user et va contenir les logiciels installés par le système ou l’administrateur.

Une sous arborescence bien organisée est présente afin de garantir l’accès aux programmes, bibliothèques et fichiers partagés pour l’ensemble des utilisateurs :

  • /usr/bin : Programme accessible à tous les utilisateurs
  • /usr/sbin : Programmes d’administration
  • /usr/lib : Bibliothèques partagées
  • /usr/share : Fichiers partagés
  • /usr/include : Fichiers header pour la compilation de logiciels
  • /usr/local : Programmes installés manuellement

Je peux vous dire que plus d’une fois je me suis mordu les doigts pour ne pas avoir bien provisionné ma partition et je me retrouve bloqué en plein update ou durant une installation…

J’en peux plus. C’est que c’est long comme retour aux bases… J’espère ne pas avoir oublié de répertoire.

L’une des mauvaises pratiques lors du déploiement d’un SE Linux est d’allouer l’ensemble de l’espace disponible à /, de ce fait si par exemple je viens à blinder le /var/tmp ou /var/log mon système est à genoux. Donc sur un disque il convient de partitionner les répertoires.

Oui mais quels répertoires ?

En réponse à cette question, je mets en 3/4 face et je réponds par un Uraken des familles en sortant le guide de l’ANSSI.

Cela offre également une autre possibilité concernant la sécurité.

Au-delà d’assurer le fonctionnement du système quant au potentiel risque de saturation de stockage, il est possible de définir des options sur les points de montage de nos répertoires.

Ainsi il est possible de limiter l’accès au device ou l’exécution de programme.

Je préconise également d’ajouter le répertoire /var/log/audit.

Je ne rentre volontairement pas dans le détail car j’explique ce point de recommandation (R12) dans mon billet concernant le durcissement d’un système GNU Linux.

Ok pour ce qui est de la segmentation, mais du coup, quel doit être la répartition niveau stockage ?

C’est plutôt simple. Encore une fois, il suffit de chercher un peu. Malheureusement il n’y a pas de recommandation empirique. C’est donc à nous de définir les seuils par répertoire en tenant compte des critères énoncés précédemment.

Pour ma part cela donne :

Répertoires% Minimum% Maximum
/10%15%
/boot* 1024 Mio* 1024 Mio
/usr10%15%
/var10%15%
swap1:1 de la RAM si =< 8 Gio
1:0.5 de la RAM si > 8 Gio
1:1 de la RAM si =< 8 Gio
1:0.5 de la RAM si > 8 Gio
/var/log5%10%
/var/log/audit2%5%
/var/tmp5%5%
/tmp5%5%
/opt5%10%
/home10%10%
/srv2%5%

Voilà ce qui est pour la théorie. Comme ça me soule de ne pas savoir quel espace allouer pour 30 Gio, 40 Gio, 50 Gio de disque, j’ai été contraint de faire une petite application en Powershell… Pourquoi changer une équipe qui gagne ?

Application

Je reste un puriste en termes de développement et je ne peux me passer de Windows Powershell ISE7. Je sais qu’il existe mieux comme IDE8 (Visual Studio Code par exemple) mais je n’arrive pas à me faire à l’idée de quitter ISE…

Cela fait-il de moi un vieux réactionnaire ? Un dev de l’ancien temps ?

Bref, je laisse cette question existentielle en suspens.

Je me suis amusé pour une fois à réaliser une interface GUI9 via WindowsForm. Moi l’amoureux du CLI10 je reconnais mettre amusé. Encore une fois je sais que je ne savais rien et j’ai donc encore appris.

Réaliser une application GUI en plaçant les items au pixel c’est marrant mais vite casse gueule. Cela demande une gymnastique d’esprit qui ne me rebute pas.

Il y a toutefois un bémol non négligeable à l’utilisation de WindowsForm, cela ne permet pas l’opérabilité multiplateforme. Logique puisque WindowsForm fait partie intégrante de Windows, donc pas possible de faire fonctionner ce dernier sous Linux.

Il faudrait donc que je compose un mode de fonctionnement CLI pour assurer l’opérabilité. Cela n’est qu’au final que le développement d’une fonction d’affichage.

La première version de mon application ne se base pas pour l’instant sur un fichier de configuration ce qui implique que les seuils minimums et maximums sont défini en dur dans le code (en tant que constante global tout de même je ne suis pas un sauvage !).

J’offre également la possibilité de définir la taille minimum ou maximum à provisionner.

Pour bien comprendre (c’est un grand mot) je propose la courte vidéo de présentation de la version béta de mon app.

Démonstration

GitHub

Miaou

Conclusion

Qu’il est bon de revenir aux bases. Sans cela, je pense que je n’aurai pas eu l’idée de faire du GUI en powershell depuis mon ISE. Il est vrai que cela permet également de revenir peut-être aux prémices de ce blog qui étaient :

  • L’aspect pédagogique
  • Aborder les bases
  • Réaliser des petits projets
  • Sortir des sentiers battus

Ainsi, je renoue avec certaines valeurs laissées de côté dans le cadre des derniers gros projets que j’ai pu mener. Toutefois, je reste une tête de c*n à laisser transparaitre ma désinvolture, sarcasmes et autres tournures de phrases et expressions vitriolés 🙂 (Ce blog et mes articles restent un loisir personnel et cela m’amuse d’user de ma liberté d’expression tout en tachant de rester respectueux).

Bref, il est temps de clôturer ce billet et d’attaquer d’autres thématiques 🙂

Le mot de la fin :

J’ai évalué et calculé mon incompétence, elle est à la hauteur de vos mensonges et de votre lâcheté. Un petit partitionnement de prime et de service ? Vous méritez bien convenablement un pâté lorrain en cadeau ?

Erwan GUILLEMARD

Sources

  1. RHEL : RedHat Entreprise Linux ↩︎
  2. ANSSI : Agence Nationale de Sécurité des Systèmes d’Informations ↩︎
  3. SE : Système d’Exploitation ↩︎
  4. GUI : Graphical User Interface ↩︎
  5. GRUB : GRand Unifier Bootloader ↩︎
  6. BDD : Base De Données ↩︎
  7. ISE : Integrated Scripting Environment ↩︎
  8. IDE : Integraded Development Environment ↩︎
  9. GUI : Graphical User Interface ↩︎
  10. CLI : Command Line Interface ↩︎