Administrer un ordinateur Linux
Introduction
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.
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.
REPL et scripts
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 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.
Les commandes
Il existe plusieurs types de commandes (cf ) :
- : fourni par le Shell.
- : fichier exécutable.
- : un alias.
Alias et réécritures de la ligne de commande
En réalité, le Shell n'exécute pas directement une ligne de commande, mais opère quelques réécritures avant de l'exécuter. Notamment, les ensembles de chemins, et sont en réalité remplacés par le Shell avant d'exécuter la ligne de commande.
💡 demande au Shell d'afficher chaque ligne de commandes avant de l'exécuter (très utile pour déboguer) :
💡 indique au Shell d'interpréter les caractères échappés, dont :
- : retour à la ligne ;
- : tabulation ;
- : formatage du texte (cf TP1).
Un alias est une commande qui, lors de sa réécriture, sera remplacée par un bout de ligne de commande, e.g. :
- : créer l'alias valant .
- : afficher l'alias (si non indiqué, affiche l'ensemble des alias).
- : supprimer l'alias .
💡 Les alias peuvent être utilisés pour simplifier l'écriture de lignes de commandes complexes et difficiles à retenir.
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 python3).
Il s'agit du Shebang. Il permet d'indiquer au Shell l'interpréteur à utiliser pour exécuter le script (ici python3).
💡 Il est aussi possible d'indiquer des arguments à transmettre à l'interpréteur :
💡 Pour créer une commande à partir d'un script, nous fournirons une commande .
Chemins relatifs dans les scripts
⚠ Dans un script, les chemins relatifs sont évalués relativement au dossier de travail actuel, et non relativement à 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 () est la commande exécutée.
⚠ Le premier élément de ce tableau () est la commande exécutée.
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. |
💡 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 la commande, e.g. pour en afficher l'usage :
⚠ À l'inverse de Python, les drapeaux et arguments nommés sont usuellement écrits avant les arguments positionnels.
💡 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.
Administrer l'ordinateur
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.
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 :
💡 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 terminée par au lieu de :
Vous devrez ainsi utiliser afin d'exécuter les lignes de commandes d'administration présentées par la suite.
Gestion des paquets
Sous Linux, un logiciel (ou une bibliothèque) est distribué 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 les dépendances inutilisées.
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.
⚠ Cette liste est très sensible. En effet, un dépôt corrompu pourrait fournir des paquets corrompus lors d'installations ou de mises à jour.
Mise à jours de la distribution
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.
⚠ N'essayez pas 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 de résolution de dépendance du gestionnaire de paquet.
- il est plus facile de revenir en arrière en cas de problèmes.
💡 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 les problèmes de paquets ne sont pas résolus.
Arrêter et redémarrer l'ordinateur
💡 Sous Linux il n'est pas nécessaire de redémarrer après une mise à jour.
- : arrêter ( et redémarrer) l'ordinateur.
- : arrêter l'ordinateur à ou dans minutes.
- : message à envoyer aux utilisateurs connectés.
Gestion des utilisateurs
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 .
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.
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 e.g. d'administrer les utilisateurs du système. 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 à exécuter la commande .
- : autorise le groupe à exécuter la commande .
- : interdit le groupe à exécuter la commande .
⚠ Pour des raisons de sécurité, il faut préciser le chemin complet de la commande ( pour l'obtenir).
💡 affiche les droits sudoers de l'utilisateur (ou de l'utilisateur actuel si non précisé).
⚠ sudo applique la dernière règle correspondante à la situation.
⚠ sudo applique la dernière règle correspondante à la situation.
💡 Vous pouvez aussi autoriser (ou interdire) une ligne de commande précise, et éventuellement utiliser des expressions régulières pour les arguments (vues plus tard dans la formation) :