Administrer un ordinateur Linux
Introduction
Attentes et objectifs du module
Dans le cadre de votre formation, ce module vous permettra :
- d'acquérir des notions de cybersécurité relatives au fonctionnement d'un ordinateur ;
- administrer et personnaliser votre poste de travail ou un serveur (e.g. dans une PME) ;
- d'utiliser certains outils métiers (e.g. serveurs de calculs).
Dans le cadre de ce module, il ne vous sera pas demandé de retenir les étapes de configurations par coeur, mais d'être capable de suivre des séries d'instructions, en comprenant ce que vous faites, leur effets et raisons. Vous devrez ainsi :
- comprendre les différents concepts présentés dans ce module ;
- être capable d'exploiter les documents fournis (e.g. cheat sheet) ;
- faire preuve de rigueur et de méthode.
Les serveurs
Les serveurs sont des ordinateurs fournissant divers services à ses utilisateurs :
- serveur Web : héberge un site Web ;
- serveur de messagerie : permet d'envoyer et de recevoir des mails ;
- serveurs d'applications : permet d'utiliser des applications à distances, sans installations, e.g. Office 365.
- serveur de calculs : permet d'effectuer des calculs longs et intensifs.
Le terme service fait référence au logiciel, quand le terme serveur peut faire référence au matériel ou au logiciel.
Les serveurs sont très utiles dans le cadre de vos activités (notamment pour effectuer des calculs intensifs) :
- ils restent allumés h24 7j/7, avec des protections en cas de coupures d'électricité (e.g. onduleur).
- ils ont des capacités bien supérieures à un poste de travail classique (e.g. 100+ CPU, 1To+ de RAM, etc).
- ils mutualisent des ressources (CPU/RAM/licences logicielles) entre plusieurs utilisateurs.
- ils fournissent des services sans avoir à les installer sur le poste de travail (e.g. Intranet, webmails, etc.).
- ils permettent de synchroniser des données entre plusieurs postes de travail (e.g. serveur de fichiers).
- etc.
Pourquoi administrer un serveur ?
L'administration d'un ordinateur a (entre autres) pour objectifs :
- d'installer et de configurer les outils nécessaire à vos usages ;
- programmer (schedule) et automatiser des séries d'actions (e.g. sauvegardes, générations de rapports, etc).
Ce module se concentrera sur le système d'exploitation Linux. En effet, si Windows domine les parts de marchés pour les ordinateurs de bureaux (69% contre 4,5% pour Linux), Linux est majoritaire sur les serveurs (96,4%), et les mobiles (71% avec Android). Linux est aussi très utilisé comme poste de travail par les développeurs.
Vocabulaire
Dans le cadre de vos cours précédents, vous avez déjà manipulé plusieurs langages de scripts (R, Python, SQL). Vous utilisiez alors un interpréteur (Rscript, python3, sqlite3) pour exécuter des instructions écrites dans ces langages.
En Python, vous saisissiez vos instructions dans un fichier qui était lu et exécuté par l'interpréteur Python. On parlait alors de script Python.
En revanche, en SQL, vous utilisiez une interface REPL (Read-Eval-Print Loop). Vous écriviez alors une ligne que sqlite3 lisait (read), interprétait (eval), puis vous en affichait le résultat (print). Après chaque exécution, l'interpréteur vous affichait une invite (ici ) pour vous indiquer que vous pouviez saisir une nouvelle instruction :
Les interpréteurs supportent bien souvent ces deux modes (scripts et REPL). Il est par exemple tout à fait possible de donner un fichier SQL à sqlite3, ou de lancer python3 en mode REPL :
Pour administrer un système Linux, on utilise principalement Shell (un autre langage de script), avec l'interpréteur shell Bash. Comme pour les autres langages de script, il est possible de l'utiliser avec des scripts Shell, mais aussi via une interface REPL.
Cependant, le vocabulaire sera légèrement différent. On parlera de :
- ligne de commande pour la ligne saisie puis lue par l'interpréteur ;
- invite de commande (prompt) pour l'invite ;
- interface en lignes de commande (CLI) pour l'interface REPL.
Les commandes
Pour rappel, les lignes de commandes Shell commencent par une commande Shell (l'équivalent d'une fonction en Python), indiquant l'opération à effectuer, e.g. pour copier des fichiers, pour déplacer des fichiers, etc. Les arguments de la commande sont ensuite indiqués, séparés par des espaces, e.g. .
Il existe plusieurs types de commandes Shell (cf ) :
- : fourni par le Shell.
- : fichier exécutable.
- : un alias.
Les alias
Certaines lignes de commandes peuvent être longue et complexes à écrire (et à retenir). Un alias permet alors de remplacer une ligne de commande par un nom plus court et simple à écrire :
- : créer l'alias valant .
- : afficher l'alias (si non indiqué, affiche l'ensemble des alias).
- : supprimer l'alias .
Créez un alias permettant de copier les fichiers images du home vers le dossier (cf ensemble de chemins).
Réécriture de la ligne de commande
En réalité, le Shell n'exécute pas directement les lignes de commande, mais opère quelques réécritures avant de les exécuter. Ainsi, un alias est en réalité remplacé par sa valeur lors de l'interprétation de la ligne de commande.
demande au Shell d'afficher chaque ligne de commandes avant leur exécution (très utile pour déboguer) :
Aussi, les ensembles de chemins, et sont en réalité remplacés par le Shell avant l'exécution de la ligne de commande :
demande au Shell d'interpréter les caractères échappés, dont :
- : retour à la ligne ;
- : tabulation ;
- : formatage du texte (cf TP1).
Les fichiers exécutables
Les commandes ne sont usuellement rien de plus qu'un exécutable (i.e. un script ou un programme). Il est ainsi possible de créer une commande à partir d'un script Python qui sera alors exécuté lorsque la commande est appelée :
Vous remarquerez que la première ligne du script est un peu bizarre :
.
Il s'agit du Shebang. Il permet d'indiquer au Shell l'interpréteur à utiliser pour exécuter le script (ici ) :
Il s'agit du Shebang. Il permet d'indiquer au Shell l'interpréteur à utiliser pour exécuter le script (ici ) :
Pour créer une commande à partir d'un script, nous fournirons la commande .
Chemins relatifs dans les scripts
Les chemins relatifs sont relatifs au dossier de travail actuel, et non à l'emplacement du script. Il convient donc de faire attention aux chemins relatifs dans les scripts. Vous pouvez alors soit :
- Déplacer le dossier de travail : .
- Calculer le chemin absolu : .
Pour information :
- Dossier de travail :
- Dossier du script :
Les arguments
Bien évidemment, le script peut accéder aux arguments de la ligne de commande par laquelle il a été invoqué :
Le script reçoit ainsi les arguments sous la forme d'un tableau de chaînes de caractères qu'il peut ensuite traiter et interpréter de manière totalement arbitraire.
Le premier élément de ce tableau (i.e. ) est la commande exécutée.
Écrivez une commande qui affiche la somme de ses arguments.
Traiter les arguments avec argparse
Il est cependant préférable d'utiliser une bibliothèque dédiée (e.g. argparse en Python) qui fournira diverses fonctionnalités :
Il suffit alors de déclarer les différents arguments de la commande, et la bibliothèque se chargera alors du reste :
- interprétation des arguments (arguments parsing) ;
- détection et affichage des erreurs dans l'usage de la commande ;
- génération automatique de la documentation de la commande.
Par convention, on distingue 3 types d'arguments :
| Arguments positionnels | Arguments nommés | Drapeaux (flags) |
|---|---|---|
| Idem Python, i-ème argument mis dans le i-ème paramètre. |
Idem Python, ou |
Booléen dont la valeur dépend de la présence de l'argument. |
À l'inverse de Python, les drapeaux et arguments nommés sont usuellement écrits avant les arguments positionnels.
Il est possible d'associer un nom court (d'un caractère) aux drapeaux, permettant de fusionner les arguments :
Une fois les paramètres déclarés, vous pouvez utiliser l'argument pour en afficher l'usage :
a de nombreux autres arguments notamment :
- : fixer les valeurs possibles pour l'argument.
- : convertir l'argument (e.g. en booléen, int, etc).
- : indique que l'argument est requis.
- : valeur par défaut si l'argument est absent.
- : décrit le paramètre, s'affichera dans l'usage.
- etc.
Écrivez une commande prenant en argument deux nombres dont il fera la somme, la soustraction, la multiplication, ou la division en fonction de son argument .
Gestion des paquets
Linux fourni déjà de très nombreuses commandes déjà installées, ou à installer. Sous Linux, les logiciels (ou bibliothèques) sont distribués sous la forme d'un paquet (fichier pour Debian/Ubuntu). Les gestionnaire de paquets permettent alors d'aisément :
- installer et configurer un paquet avec ses dépendances ;
- mettre à jour l'ensemble des paquets ;
- désinstaller proprement un paquet et ses dépendances.
Installer/désinstaller un paquet
Par défaut, les distributions Debian/Ubuntu utilisent le gestionnaire de paquet :
- : installer des paquets.
- : désinstaller des paquets (mais conserver leurs fichiers).
- : désinstaller des paquets (supprimer leurs fichiers).
Bien qu'il soit possible de télécharger un fichier et de l'installer directement via (commande utilisée en interne par ), cela n'est pas recommandé. En effet, vous risquez ensuite de vous retrouver avec des problèmes de résolution de dépendances lors de mises à jour.
Mise à jours des paquets
La mise à jours des paquets s'effectue en 2 temps :
- : télécharger la liste des paquets et des mises à jours.
- : télécharger les mises à jours et les installer.
En interne, lit les fichiers afin d'obtenir la liste des dépôts de paquets à interroger.
La liste des dépôts est très sensible. En effet, un dépôt corrompu pourrait fournir des paquets corrompus lors d'installations ou de mises à jour.
Arrêter et redémarrer l'ordinateur
Sous Linux, il n'est pas nécessaire de redémarrer après une mise à jour. Il est toutefois possible de programmer l'arrêt ou le redémarrage de l'ordinateur :
- : arrêter ( ou redémarrer) l'ordinateur.
- : arrêter l'ordinateur à ou dans minutes.
- : message à envoyer aux utilisateurs connectés.
Mise à jours de la distribution
N'essayez jamais de mettre à jours votre distribution d'un coup en sautant plusieurs versions :
- les passages de la version N à la version N+1 sont plus testés et éprouvés.
- cela facilite le travail du gestionnaire de paquet lors de la résolution des dépendances.
- il est plus facile de revenir en arrière en cas de problèmes.
Lorsque vous souhaitez mettre à jour votre distribution Linux, il est recommandé de suivre les étapes suivantes :
- Préparation :
- Branchez l'alimentation de l'ordinateur sur secteur.
- Connectez l'ordinateur via Ethernet si possible.
- Prévoyez un second ordinateur avec accès à Internet.
- Prévoyez une clef USB bootable.
- Faites une sauvegarde de vos fichiers.
- Mettez vos paquets le plus à jours possible :
- Téléchargez la liste des mises à jours avec .
- Alternez les et jusqu'à épuisement des mises à jours.
- pour autoriser la désinstallation de dépendances lors de la mise à jour.
- Si un paquet pose problème, et que vous savez ce que vous faites, (ré/dés)installez-le.
- Recommencez jusqu'à épuisement des mises à jours
- Dans les sources apt, remplacez la version de votre distribution par la version suivante, puis reprenez à l'étape 2.
💡 affiche la version actuelle de votre distribution.
Il est important de bien prendre son temps, et de ne surtout pas paniquer en cas de problèmes lors de la mise à jour. N'éteignez pas l'ordinateurs tant que tous les problèmes ne sont pas résolus.
Droits d'exécutions de commandes
Pour des raisons évidentes de sécurité, on ne souhaite pas que n'importe qui puisse faire n'importe quoi. Ainsi seul l'administrateur (utilisateur , aussi appelé super utilisateur) peut effectuer des opérations d'administration comme :
- modifier la configuration globale de l'ordinateur.
- installer, mettre à jour, ou désinstaller des logiciels.
- créer, modifier, ou supprimer des utilisateurs.
- etc.
Ainsi les commandes vues précédemment doivent être exécutées en tant qu'administrateur.
Sudo
Pour exécuter des lignes de commandes en tant qu'administrateur, on la préfixe par (superuser do) :
permet de réexécuter la ligne de commande précédente avec les droits d'administration :
Si vous avez plusieurs lignes de commandes à exécuter, vous pouvez utiliser afin d'ouvrir un Shell en tant que . L'invite de commande sera alors suffixée par au lieu de :
Sudoers
Il est fréquent de vouloir donner certains droits d'administrations à un utilisateur, sans pour autant lui donner l'intégralité des droits. Par exemple l'autoriser à mettre à jour les paquets (, ), sans lui permettre de modifier la liste des paquets installés (, ). Pour cela on va définir les commandes (ou lignes de commandes) qu'un utilisateur (ou groupe d'utilisateur) aura le droit d'exécuter avec .
Certains droits peuvent permettre une escalade de privilège. Par exemple, pouvoir ajouter des utilisateurs à n'importe quel groupe d'utilisateur, permet de s'ajouter au groupe , et ainsi d'obtenir un accès administrateur complet.
Ces droits sont définis dans les fichiers , et sont édités via la commande .
Les lignes suivent le format , et se lisent comme suit :
"Autorise ( ou interdit) l'utilisateur (ou le groupe ) à exécuter la commande en tant qu'administrateur".
Les lignes suivent le format , et se lisent comme suit :
"Autorise ( ou interdit) l'utilisateur (ou le groupe ) à exécuter la commande en tant qu'administrateur".
- : autorise à manipuler les paquets.
- : autorise le groupe à manipuler les paquets.
- : interdit le groupe à manipuler les paquets.
Pour des raisons de sécurité, il faut préciser le chemin complet de la commande (cf ).
sudo applique la dernière règle correspondante à la situation.
Vous pouvez aussi autoriser une ligne de commande précise, et éventuellement utiliser des expressions régulières pour les arguments (vues plus tard dans la formation) :
Il est dangereux d'essayer d'interdire une commande avec des arguments donnés, car facilement contournable (e.g. en changeant l'ordre des arguments). À la place, il est préférable d'autoriser l'exécution d'un script qui se chargera de vérifier les arguments avant d'appeler la commande.
affiche les droits sudoers de l'utilisateur (ou de l'utilisateur actuel si non précisé).
Écrivez la ligne sudoers permettant de donner à le droit de redémarrer le poste de travail.
Gestion des utilisateurs
Les groupes d'utilisateurs
Gérer les droits de chaque utilisateur un à un serait fastidieux et source d'erreurs, e.g. :
- lorsqu'on modifie les droits d'un ensemble d'utilisateurs, oublier un utilisateur.
- lorsqu'on ajoute (ou retire) un utilisateur d'un ensemble d'utilisateurs, oublier de lui attribuer (ou de lui retirer) un droit.
- oublier qu'un utilisateur a (ou n'a pas) un droit donné.
Il est ainsi bien souvent préférable d'attribuer des droits, non pas à un utilisateur donné, mais à un groupe d'utilisateur. Il suffit alors d'ajouter (ou de retirer) des utilisateurs à ce groupe, pour leur attribuer (ou retirer) des droits. Par exemple, les membres du groupe peuvent exécuter n'importe quelle commande en tant qu'administrateur. Il suffit donc d'ajouter (ou de retirer) des utilisateurs à ce groupes pour leur permettre (ou interdire) d'administrer l'ordinateur.
- : ajouter/supprimer un groupe d'utilisateurs.
- : ajouter/retirer un utilisateur à un groupe d'utilisateurs.
- : afficher les groupes auxquels appartient.
- : afficher les utilisateurs du groupe .
Cela permet notamment d'aisément visualiser qui peut faire quoi. Par exemple, pour savoir qui peut exécuter des commandes d'administrations, il suffit d'afficher les membres du groupe . Pour savoir ce qu'un utilisateur a le droit de faire, il suffit d'afficher les groupes auxquels il appartient.
Les commandes sont des versions bas niveau et non-interactives des commandes présentées ci-dessus.
Gérer les comptes utilisateurs
- : créer un utilisateur ( : sans login ni home).
- : supprimer un utilisateur ( : et ses fichiers).
- : (dés|ré)activer le compte.
- : changer le mot de passe du compte.
- : (dés|ré)activer la connexion par mot de passe du compte.
À la création d'un utilisateur, le contenu de (skeleton) est copié dans son nouvel home. Ce dossier permet alors de définir les fichiers de configuration (e.g. ) des nouveaux utilisateurs, voire même e.g. un .
Les utilisateurs systèmes n'ont pas de dossier home et ne peuvent pas se connecter. Ils sont généralement utilisés pour exécuter des logiciels/scripts/services requérant des droits spécifiques sans pour autant les exécuter en tant que .