UP | HOME
LPASRSI

Modules « Système Linux »

Vacations en licence professionnelle « Audit et Sécurité des Réseaux et Systèmes d'Information » à l'antenne de Ifs du pôle de Caen de l'IUT Grand Ouest Normandie


M22, Session #2

Linux

Trois principes élémentaires pour appréhender le système Linux :

  1. « tout est fichier » : les fichiers, les répertoires, les liens, les disques et autres périphériques, …
  2. chaque fichier est dans une arborescence unique, dont la base / est appelée racine ou slash.
  3. l’interface utilisateur présente sur quasiment tout système Linux est la ligne de commandes (ou CLI, command line interface). En effet, les serveurs GNU/Linux sont généralement dépourvus d’interface graphique. De plus, il est toujours plus aisé – a fortiori à distance – de lancer des commandes lignes que d’utiliser à une interface graphique.

Interface en ligne de commandes

La ligne de commande est la première interface proposée à l’utilisateur pour interagir avec un système. Les commandes saisies par l’utilisateur sont interprétées par l’interpréteur de commandes aussi nommé shell.

Sur un système serveur, après le démarrage, le système propose généralement à l’utilisateur de s’identifier dans le terminal en mode texte.

Si le système dispose d’une interface graphique la ligne de commandes est accessible, après authentification, au travers d’une application nommée « Terminal » (dans le menu « Accessoires » ou « Système »).

Une fois l’application lancée :

  • la combinaison de touches Ctrl-Shift-T ouvre un nouvel onglet,
  • Ctrl-D le ferme,
  • Ctrl-+ augmente la taille des caractères, Ctrl-- la diminue et Ctrl-0 permet de la réinitialiser.

Le copier/coller à la souris peut également s’avérer utile :

  • sélectionner une zone de texte à la souris suffit à la copier ;
  • la combinaison de touches Shift+Insert permet de coller,
  • cliquer avec le bouton du milieu de la souris également

Cf https://github.com/jlevy/the-art-of-command-line

Le shell Bash

Sur la plupart des systèmes, le shell mis à disposition des utilisateurs est bash (zsh sur Kali). Le manuel de bash est disponible en ligne.

bash est un environnement de travail agréable et puissant qui propose entre autres fonctionnalités :

  • la gestion de l’historique (history),
  • l’édition de la ligne de commandes,
  • la gestion des travaux,
  • la gestion de variables d’environnement,
  • la gestion d’alias,
  • la possibilité de personnaliser son comportement.

C’est également un langage de programmation interprété à part entière.

La syntaxe générale d’une commande est la suivante :

[chemin/]commande [ option ... ] [ argument ... ]

Les options sont généralement introduites par un tiret pour les options courtes d’un caractère (ex : -R), ou deux tirets pour les options longues (ex : --recursive).

bash « embarque » un certain nombre de commandes dîtes builtin qui ne correspondent pas à des fichiers (ex : echo). La commande type permet de déterminer le type d’une commande et son chemin le cas échéant. La commande which fournit uniquement le chemin et ne s’applique donc pas aux builtin.

Certaines commandes builtin sont dîtes composées (ex : for …; do…; done ou if…; then…; else…; fi).

Exemple de script :

for i in \
    $(for dom in
          $(virsh list | grep CentOS | tr -s ' ' | cut -d ' ' -f3)
      do mac=$(virsh dumpxml $dom | grep 'mac address' | cut -d"'" -f2)
         arp | grep $mac | cut -d' ' -f1 | cut -d. -f4
      done)
do iptables -t nat -I PREROUTING -p TCP --dport $((6200+i)) -j DNAT \
            --to-destination 192.168.144.$i:22
done

cf https://wiki.bash-hackers.org/

Variables d’environnement

Lorsque vous créez un script dans votre répertoire personnel, il peut être pratique de le rendre exécutable (chmod +x), mais également de pouvoir l’exécuter sans préciser son chemin (complet ou relatif).

C’est la variable d’environnement PATH qui définit ou l’interpréteur de commandes va aller chercher les exécutables dont le nom est saisi sur la ligne de commandes.

Cette variable peut être modifiée par l’utilisateur, par exemple : PATH=$PATH:~.

Une variable définit dans un terminal n’est disponible que pour ce terminal. Pour la rendre disponible à tous les environnements de l’utilisateur (script, autres terminaux, …), il faut l’exporter : export $PATH.

La commande env liste toutes les variables d’environnement de l’utilisateur.

Noms de fichiers et caractères spéciaux

Les fichiers sont désignés par leur nom complet (depuis la racine) ou relatif (depuis le répertoire courant). Le nom d’un fichier peut contenir n’importe quel caractère sauf / qui utilisé pour identifier le chemin d’accès à un fichier. Il est toutefois préférable d’éviter les caractères spéciaux :

#
préfixe les commentaires
=
assignation de variables
*
(glob), englobe toutes les correspondances possibles d’une chaîne de caractères
()
exécute des commandes dans un sous-shell (permet de réaliser des opérations arithmétiques lorsque doublé)
{}
format de liste
~
raccourci vers l’espace de l’utilisateur ou l’espace d’un utilisateur lorsqu’un nom est précisé en préfixe
[]
alias de test, déprécié, à utiliser doublé
|
(pipe) pour le chaînage de commandes (ou logique si doublé)
&
exécute la commande précédente en tâche de fond (et logique si doublé)
;
sépare plusieurs commandes sur une même ligne
< et >
redirecteurs d’entrée/sorties
l’esspace
sépare la commande, les options et les arguments
$
préfixe les noms de variables
\
caractère d’échappement de l’interprétation pour pouvoir utiliser les caractères spéciaux en tant que simple chaîne de caractère
'
simple quote, encadre une chaîne de caractère non interprétée
"
double quote, encadre une chaîne de caractère interprétée
?
(glob), sorte de joker qui remplace un seul caractère (la variable $? contient la valeur de retour de la dernière commande)
et !
inverse le code de retour de la commande qu’il précède (contient la commande précédente si doublé)

Il faut également éviter d’utiliser - comme premier caractère.

Commandes de base

Tout au long de votre vie professionnelle, vous aurez l’occasion, de découvrir de nouvelles commandes, par des collègues, dans des documentations… Il est essentiel de prendre le temps de systématiquement déconstruire ces commandes pour apprendre à les utiliser correctement et en tirer le meilleur parti.

Les commandes disposent généralement d’une page de manuel accessible avec la commande man. Par exemple, pour consulter la page de manuel de l’interpréteur de commandes directement depuis la ligne de commande, on utilisera la commande man bash.

La mise en page du manuel à l’écran est assurée par un programme nommé pager, qui est généralement more ou – mieux – less. Ce programme dispose lui-même d’une page de manuel (utiliser les flèches de direction pour naviguer dans la page et la touche q pour quitter).

Le manuel est organisé autour de 8 sections :

  1. Commandes utilisateur
  2. Appels système (fournis par le noyau)
  3. Fonctions de bibliothèque
  4. Fichiers spéciaux (/dev/*)
  5. Formats de fichier
  6. Jeux
  7. Divers
  8. Commandes privilégiées et d’administration système.

Certaines pages de manuel peuvent être présentes dans plusieurs sections (ex : man 1 stat et man 2 stat).

Il est possible de voir une introduction concernant chacun de ces chapitres avec la commande man -a intro. Pour plus d’informations : man man.

NB : Voir aussi apropos (exemple apropos 'copy files'), help, =info

Premières commandes

Après le premier redémarrage qui suit l’installation (Suivre les menus Troubleshooting puis Boot from Local Hard Drive si nécessaire), il est possible de se connecter à la machine virtuelle dans la console.

etu.lpasrsi.net login: utilisateur
Password: Ni root, ni maître !
Last login: Thu Sep 23 08:17:45 2021
[utilisateur@localhost ~]$ ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:d8:09:e0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.144.157/24 brd 192.168.144.255 scope global dynamic noprefixroute ens3
       valid_lft 41119sec preferred_lft 41119sec
    inet6 fe80::5054:ff:fed8:9e0/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

Le dernier octet est 157, il doit donc être possible de se connecter à la machine virtuelle sur le port 6357 du serveur vdi.unicaen.fr.

$ ssh -p 6357 utilisateur@vdi.unicaen.fr
utilisateur@vdi.unicaen.fr's password: 
Last login: Thu Sep 23 14:40:11 2021
[utilisateur@localhost ~]$ who
utilisateur tty1         2021-09-23 08:40
utilisateur pts/0        2021-09-23 08:31 (10.192.96.12)
[utilisateur@localhost ~]$ pwd
/home/utilisateur
[utilisateur@localhost ~]$ ls 
[utilisateur@localhost ~]$ ls -a
.  ..  .bash_history  .bash_logout  .bash_profile  .bashrc
[utilisateur@localhost ~]$ ps 
    PID TTY          TIME CMD
    994 pts/0    00:00:00 bash
   1021 pts/0    00:00:00 ps
[utilisateur@localhost ~]$ ss --tcp --all
State   Recv-Q  Send-Q      Local Address:Port     Peer Address:Port
LISTEN  0       128               0.0.0.0:ssh           0.0.0.0:*               
ESTAB   0       36        192.168.144.157:ssh      10.192.96.12:58812           
LISTEN  0       128                  [::]:ssh              [::]:* 

Le serveur écoute sur le port 22 les connexions à un service appelé SSH.

SSH, le Secure SHell

SSH est à la fois un protocole réseau et une application. SSH permet d’obtenir — en toute sécurité — un shell (ou interpréteur de commandes) à distance sur une machine proposant ce service (c’est-à-dire sur laquelle « tourne » la partie serveur de l’application).

Il faut — évidemment — disposer d’un compte sur le serveur distant ; alors il est possible de s’authentifier avec un mot de passe (si le serveur le permet), voire — mieux ! — en utilisant une clé de chiffrement asymétrique.

En effet, les robots scanners de vulnérabilités sur le réseau sont à l’affut de ce genre de service nouvellement installé, ne disposant d’aucune sorte de sécurisation et donc potentiellement exploitable par brute force pour obtenir un accès aux ressources.

Pour limiter ce type d’exploit, il faut commencer par interdire les connexions par mot de passe. Avant cela, il va falloir organiser l’accès par clé.

Vulgarisation du mécanisme cryptographique

Les principes de base sont les suivants :

  1. Un utilisateur dispose d’une paire de clé :
    • une clé publique (qui peut/doit être distribuée)
    • et une autre privée (qui doit rester secrète).
  2. Ce que la clé publique chiffre, la clé privée le déchiffre : ce mécanisme garantit la confidentialité.
  3. Ce que la clé privée chiffre, la clé publique le déchiffre : ce mécanisme permet l’authentification.

TP #2 : Connexion SSH à la VM

  1. Sur le client, générer une paire de clés SSH sans utiliser de passphrase (ssh-keygen)
  2. Afficher le contenu de la clé privée (~/.ssh/id_rsa) et les permissions sur le fichier
  3. Supprimer la paire de clés
  4. Générer une paire de clés en veillant bien à chiffrer la clé privée par une passphrase
  5. Afficher le contenu de la clé privée (~/.ssh/id_rsa) et les permissions sur le fichier
  6. Copier la clé publique générée dans le fichier ~/.ssh/authorized_keys sur le serveur (votre VM). Il existe plusieurs solutions utilisant par exemple ssh-copy-id, scp, copier/coller, voire un tiers de confiance disposant des accès requis
  7. Se connecter en SSH sans utiliser de mot de passe

En cas de problème :

  1. Vérifier les droits sur les différents fichiers générés côté client et serveur
  2. Au pire, supprimer les fichiers générés et réessayer en procédant différemment (autre commande, avec ou sans passphrase, …)
  3. Éventuellement, lancer le serveur SSH en mode debug :
$ sudo systemctl stop sshd  # Arrêter le service
$ sudo /usr/sbin/sshd -d    # Le lancer en mode debug# Réaliser les tests et lire les retours
$ sudo systemctl start sshd # Relancer le service une fois terminé

Pour permettre l’accès de votre enseignant préféré à votre serveur :

  1. créer un compte olm (useradd)
  2. ajouter le compte au groupe wheel (usermod)
  3. écrire la chaîne de caractères suivantes dans le fichier /home/olm/.ssh/authorized_keys : ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJg4KOijZ2P2EVC8FYP1bvCoxKDfrOYG7ORfYWvAfDUA olm@n306z-olm001.campus.unicaen.fr
  4. si nécessaire (ls -lRa /home/olm), aligner les droits sur les fichiers (chown)

TP #3 : Sécurisation du service SSH

Maintenant que vous vous connectez à votre serveur sans mot de passe, configurer le serveur SSH pour interdire la connexion par mot de passe et sécuriser ainsi un peu plus le service. Quels directives de configuration avez-vous mis en place ?

TP #4 : Commandes de base

Pour ce TP, il est vivement conseiller d’utiliser la complétion fournie par la touche TAB.

  1. Afficher la date actuelle avec la commande date, au format jj mois yy. Quelle commande avez-vous utilisée ?. Trouvez une autre façon de faire !
  2. Dans votre répertoire utilisateur (utiliser pwd pour afficher le nom du répertoire courant), créer un répertoire nommé travail (mkdir, ls pour vérifier). Dans ce répertoire travail, créer 3 sous-répertoire nommés alice_au_pays_des_merveilles, bob_the_sponge_with_square_pants et paul_le_vilain_pirate_malefique. Le répertoire alice_au_pays_des_merveilles devra contenir un sous répertoire nommé lapin_blanc. Justifier le résultat de la commande cd ~/travail && ls -R ?
  3. Copier (cp) le fichier /usr/share/man/man1/man.1.gz dans le répertoire bob_the_sponge_with_square_pants. Recopier le contenu du répertoire bob_the_sponge_with_square_pants dans paul_le_vilain_pirate_malefique avec une seule commande. Quelle est la dernière commande que vous avez utilisé ?
  4. Renommer (mv) le répertoire paul_le_vilain_pirate_malefique en pirate. Se placer dans le répertoire alice_au_pays_des_merveilles. Déplacer le répertoire lapin_blanc dans le répertoire parent du répertoire alice_au_pays_des_merveilles, sans utiliser la chaîne de caractère travail. Quelle commande avez-vous utilisée ?
  5. Supprimer le répertoire (rmdir) lapin_blanc. Supprimer le répertoire travail. Quelle est la dernière commande utilisée ?

Ressources complémentaires

Raccourcis d’édition de la ligne de commande

Pour tirer partie au mieux des capacités de l’interpréteur de commandes, il est indispensable d’exploiter l’ensemble des fonctionnalités d’édition et d’historique offertes par la bibliothèque GNU readline.

L’édition des commandes est héritée de l’éditeur GNU Emacs. La notation dans la suite de cette section est celle utilisée dans les manuels de bash, readline et emacs :

  • C fait référence à la touche Control ou Ctrl du clavier
  • M à la touche Alt.

M-C-x s’obtient donc en appuyant simultanément sur Alt, Ctrl et x.

Les commandes les plus utiles (liste non exhaustive) sont les suivantes :

Commandes de déplacement
  • et : déplacement d’un caractère vers la gauche et la droite
  • C-← et C-→ : déplacement d’un mot vers la gauche et la droite
  • C-a : début de la ligne
  • C-e : fin de la ligne
Commandes de suppression
  • Suppr ou Del : supprime le caractère sous le curseur
  • Ret.arr. ou Backspace : supprime le caractère à gauche du curseur
Commandes « couper »
  • C-k : couper du curseur à la fin de la ligne
  • C-u : couper du curseur au début de la ligne
  • M-Backspace : coupe du curseur au début du mot précédent
  • C-w : couper du curseur à l’espace précédent
Commandes « coller »
  • C-y : coller le contenu du presse-papier
  • M-y : circuler dans le contenu du presse-papier (ne peut être utilisé qu’après C-y ou M-y)
Autres commandes d’édition
  • C-_ : annuler la dernière édition
  • Tab : complète le nom de la commande ou du fichier (voire des options de la commande si le paquetage bash-completion est installé) dont les premiers caractères ont déjà été saisis
Commandes liées à l’historique
  • : lignes de commande précédente et suivante
  • C-r : rechercher dans les lignes de commande antérieures
  • C-s : rechercher dans les lignes de commandes suivantes

Brève histoire des OS

1940–1960
OS mono-tâches (batch).
1960–1970
OS à tâches multiplexées :
  • Multics (MULTiplexed Information and Computing Service) développé par le MIT.
  • Unics (Unix) développé pour un matériel moins onéreux par Bull, il s’avère facilement portable sur d’autres plateformes (NB : le langage C est créé pour l’occasion)
1970–1980
Développement des micro-ordinateurs, ou ordinateurs personnels (PC, personal computers). Deux principaux OS : Microsoft DOS (ex-DOS/BASIC, ex-QDOS) et le futur MacOS.
1983
le 27 septembre, Richard M. Stallman annonce son intention de développer un OS baptisé GNU (pour GNU’s Not Unix) dont le code source serait distribué gratuitement (comme il l’a fait pour son éditeur de texte, Emacs).
1987
Andrew Tanenbaum (auteur de la « bible » : Operating Systems : Design and Implementation) crée un OS, Minix, pour ses besoins d’enseignement. Évidemment le code source est disponible.
1991
Linus Torvalds, inspiré par Minix, développe Linux, le noyau d’un nouvel OS : GNU/Linux. Il le publie sous licence GPL.

Distributions Linux

  • Une distribution Linux est définie par le dispositif d’installation du système qu’elle propose, l’environnement graphique fourni par défaut à l’utilisateur, le système de gestion des paquetages logiciels qu’elle utilise, les programmes propres au format de paquetage afférent, les logiciels spécifiques qui l’accompagne, le support aux utilisateurs et ses modalités (communautaire, commercial, … ), la distribution de binaires ou des sources (rolling release), …
  • Il existe une grande variété de distributions Linux, qu’il est possible de trier suivant différents critères : parts de marché, format de paquetage des logiciels, facilité de mise en œuvre, fréquence de mise à jour, qualité, stabilité, positionnement par rapport aux principes fondamentaux du logiciel libre, …
  • Les principaux formats de paquetages sont DEB (Debian) et RPM (RPM Package Manager).
  • Certaines distributions s’appuient sur tout ou partie de distributions préexistantes (ex : Ubuntu issue de Debian), d’autres encore sont des versions partielles, de développement ou recompilées de distributions préexistantes. Aussi, il est possible de définir la filiation des distributions (non exhaustive) :
    Slackware
    la plus ancienne distribution GNU/Linux a servi de base à Suse, la première distribution commerciale, devenue Suse Linux Enterprise et OpenSuse sa version libre et communautaire.
    Debian
    distribution non commerciale, régie par un contrat social, supportant de très nombreuses architectures, au cycle de développement très rigoureux (rigide ?), extrêmement stable, est à la base de la distribution grand public Ubuntu, ayant elle-même généré de nombreux dérivés qui souvent reviennent à une base Debian (Backtrack devenu Kali Linux, Mint, …).
    Red Hat
    dont sont issues RHEL et Fedora, sa version communautaire au cycle de développement rapide et CentOS, version strictement recompilée de ses sources.

Voir aussi :