M22, Session #4
Caractéristiques d’un processus
Tout processus sur le système dispose d’un identifiant unique appelé PID. Son PPID (parent process identifier) permet de l’associer au processus l’ayant engendré. Il est associé à un UID et GID qui permettent de déterminer ses droits d’accès.
Le système garde trace d’un grand nombre des autres informations
relatives à un processus, comme le terminal auquel il est rattaché, la
date et l’heure de son lancement, le temps CPU cumulé qu’il a
consommé, son usage de la RAM, son état. L’ensemble de ces
informations est accessible via le pseudo-système de fichier /proc
ou avec la commande dédiée.
La commande ps
La commande ps
permet d’afficher les processus actifs. Sans option,
elle fournit – pour chaque processus utilisant l’identité de
l’utilisateur et rattaché à un terminal – l’identifiant du processus
(pid
), le terminal associé (tname
), le temps CPU cumulé consommé
(time
) et le nom du binaire utilisé pour lancer le processus
(ucmd
). Cette commande permet d’afficher l’ensemble des
informations relatives aux processus. Elle est particulièrement riche
(la page de manuel compte 1151 lignes).
Les processus, outre leur filiation (PID et PPID), sont réunis par
groupe afin de faciliter leur gestion : suspension, interruption,
annulation, pause, continuation, … Cette gestion s’effectue par
l’envoi d’un signal du noyau au processus. La commande kill
permet
d’envoyer manuellement un signal donné à un processus ou groupe de
processus donné.
Les signaux
Cf man 7 signal
!
Tout processus en cours dans un terminal peut être interrompu avec la
combinaison de touches C-z
.
Ce processus est alors suspendu et le prompt de l’interpréteur de commandes est proposé à l’utilisateur.
Les commandes suivantes permettent de gérer ces processus suspendus ou placés en tâche de fond :
jobs
- liste les processus suspendus et en tâche de fond
fg
- éventuellement suivi du numéro du processus (pas le PID !) rappelle le processus en avant-plan. Il redevient actif.
bg
- éventuellement suivi du numéro du processus réactive un processus suspendu, mais en tâche de fond.
Une commande lancée avec le suffixe &
est lancée en tâche de fond.
TP #7 : Processus
- Exécuter les commandes
ps
puisps -o pid,tname,time,cmd
. Que constatez-vous ? - Modifier la deuxième commande ci-dessus pour afficher le nom de l’utilisateur utilisé par le processus dans la première colonne et l’identifiant du processus parent juste après celui du processus lui-même. Quelle commande avez-vous utilisée ? Que constatez-vous en ce qui concerne les colonnes TTY et USER ?
- Ajouter l’option
x
. Que constatez-vous en ce qui concerne la colonne TTY ? Est-ce cohérent avec la page de manuel ? - Supprimer le nom du terminal et le temps CPU consommé de
l’affichage et ajouter l’option
a
. Que constatez-vous en ce qui concerne la colonne USER ? Est-ce cohérent avec la page de manuel ? - Ajouter l’option
f
. Observer l’arbre et les numéros de processus. Que constatez-vous ? - [Question bonus] Ouvrir une page de manuel dans un deuxième
terminal. En une seule commande (
kill $(commande à définir)
), tuer le processus du pager. Quelle commande avez-vous utilisée ? Que constatez-vous sur la page de manuel ?
Initialisation du sytème
Au démarrage, une fois le matériel configuré (contrôles d’intégrité, tests, chargement des ROM matériels), le BIOS se charge de lire le MBR (Master Boot Record) ou la GPT (Globally Unique Identifier Partition Table). La routine de démarrage qui y est adressée lance le chargeur d’amorçage (NTLDR ou Grub). Celui-ci, après une éventuelle interaction, lance le noyau (kernel) du système d’exploitation en usage sur l’ordinateur.
Un disque RAM d’initialisation (image disque montée en mémoire vive) permet d’avoir un noyau minimal, les pilotes requis au fonctionnement du système étant chargés par le noyau depuis le disque monté en RAM.
Le noyau exécute ensuite un premier processus init
(PID 1) qui se
charge de l’initialisation séquentielle du système et des services.
Le programme init
issu d’Unix System V (à ne pas confondre à celui
des BSD) est compatible avec la majorité des distributions Linux.
Cependant, certaines utilisent des versions alternatives, comme
upstart
sur Ubuntu.
System V init
Le fichier de configuration d’init est /etc/inittab
définit le
niveau de fonctionnement attendu du système (runlevel), situé entre
0 et 6 (0 : arrêt, 1 : monoutilisateur, 2 à 5 : personnalisable, 6 :
redémarrage) auquel sont associés des programmes et services à
démarrer et arrêter. À chaque runlevel correspond un répertoire
/etc/rcX.d
qui contient des liens symboliques. Le nom des fichiers
indique l’ordre d’exécution et l’action à réaliser (S : start, K :
kill). Exemples : /etc/rc3.d/S20apache
et /etc/rc6.d/K05apache
.
Les cibles des liens sont des scripts situés dans /etc/init.d
.
Systemd
Aujourd’hui la plupart des distributions (dans l’ordre chronologique : Gentoo, Debian, Archlinux, openSuse, Mandriva, Fedora) ont migré vers systemd qui permet une gestion plus fine des dépendances entre les services, un démarrage en parallèle, une utilisation moindre des scripts et la prise en charge des groupes de contrôle (cgroups).
Là où le processus init
de system V utilisait un démarrage
séquentiel des services, systemd
assure un démarrage parallèle des
services, tout en gérant les dépendances à un niveau très fin. Ainsi
si le service A requiert que le service B ait ouvert une socket,
systemd
sera capable de démarrer A dès que la socket est
disponible, potentiellement avant la fin du démarrage de B.
Services
Le services sont généralement démarrés par le gestionnaire d’initialisation. Toutefois, il est possible de les gérer à la main depuis la ligne de commande.
System V init
Les scripts utilisés par init
sont situés dans le répertoire
/etc/init.d
et permettent d’arrêter ou démarrer manuellement les
services. La commande service
, si elle est présente, permet de
réaliser ces mêmes opérations.
Systemd
systemd
est piloté par la commande systemctl
. Les services sont
gérés par systemd
sous la forme d’unité de type… service. Il existe
d’autres types d’unités (target
, mount
, automount
, device
,
slice
, path
, scope
, socket
, timer
, snapshot
, swap
).
La commande systemctl -t service list-units
permet d’afficher les
services connus.
La commande systemctl start <nom_du_service>
permet de démarrer le
service, systemctl status <nom_du_service>
d’afficher son état (et
plein d’autres informations utiles), systemctl enable
<nom_du_service>
d’activer le démarrage automatique du service.
NB : la commande service
est réécrite pour utiliser systemctl
:
[root@olm ~]# service sshd status
Redirecting to /bin/systemctl status sshd.service
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2021-10-06 03:45:54 EDT; 1min 21s ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 853 (sshd)
Tasks: 1 (limit: 4940)
Memory: 3.8M
CGroup: /system.slice/sshd.service
└─853 /usr/sbin/sshd -D -oCiphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes256-cbc,aes128-gcm@openssh.com,aes128-ctr,aes128-cbc -oMACs=hmac-sha2-256-etm>
oct. 06 03:45:54 olm.lpasrsi.net systemd[1]: Starting OpenSSH server daemon...
oct. 06 03:45:54 olm.lpasrsi.net sshd[853]: Server listening on 0.0.0.0 port 22.
oct. 06 03:45:54 olm.lpasrsi.net sshd[853]: Server listening on :: port 22.
oct. 06 03:45:54 olm.lpasrsi.net systemd[1]: Started OpenSSH server daemon.
oct. 06 03:46:49 olm.lpasrsi.net sshd[4991]: Accepted password for root from 10.192.96.12 port 42880 ssh2
oct. 06 03:46:49 olm.lpasrsi.net sshd[4991]: pam_unix(sshd:session): session opened for user root by (uid=0)
Un autre type d’unité important est target
. La cible par défaut,
visée au démarrage du système est généralement un lien symbolique. La
commande systemctl show -p Wants -p Requires <target>
permet
d’afficher les besoins et pré-requis d’une cible.
[root@olm ~]# ls -l /etc/systemd/system/default.target lrwxrwxrwx. 1 root root 41 6 oct. 03:43 /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target [root@olm ~]# ls -1 /usr/lib/systemd/system/multi-user.target.wants/ dbus.service getty.target systemd-ask-password-wall.path systemd-logind.service systemd-update-utmp-runlevel.service systemd-user-sessions.service
De nombreux autres concepts et commandes étendent la portée de
systemd
(journalctl
, systemd-cgls
, systemd-cgtop
)
[root@olm ~]# journalctl -u sshd
-- Logs begin at Wed 2021-10-06 03:45:48 EDT, end at Wed 2021-10-06 03:46:49 EDT. --
oct. 06 03:45:54 olm.lpasrsi.net systemd[1]: Starting OpenSSH server daemon...
oct. 06 03:45:54 olm.lpasrsi.net sshd[853]: Server listening on 0.0.0.0 port 22.
oct. 06 03:45:54 olm.lpasrsi.net sshd[853]: Server listening on :: port 22.
oct. 06 03:45:54 olm.lpasrsi.net systemd[1]: Started OpenSSH server daemon.
oct. 06 03:46:49 olm.lpasrsi.net sshd[4991]: Accepted password for root from 10.192.96.12 port 42880 ssh2
oct. 06 03:46:49 olm.lpasrsi.net sshd[4991]: pam_unix(sshd:session): session opened for user root by (uid=0)
[root@olm ~]# systemd-cgtop --order=cpu --iterations=1
Control Group Tasks %CPU Memory Input/s Output/s
/ 104 - 393.0M - -
/init.scope 1 - 44.1M - -
/system.slice 31 - 258.9M - -
/system.slice/NetworkManager.service 3 - 7.6M - -
/system.slice/auditd.service 2 - 3.0M - -
Services réseaux
Les services sont généralement rendus au travers du réseau IP. Leur bon fonctionnement requiert une configuration réseau opérante.
Le bon fonctionnement des services peut être vérifié :
- en vérifiant l’exécution effective du (ou des) processus avec
ps
, - en vérifiant que le (ou les) processus sont bien « à l’écoute » du
réseau le cas échéant à l’aide de la commande
ss
(socket statistics), - en vérifiant les messages dans les journaux liée à l’activité générale ou propres au service.
TP #8 : Sécurisation SSH
Afin de limiter la visibilité du service SSH, on souhaite déporter le service sur un port atypique (ex : 1337)
Préliminaire : pour éviter tout conflit de ce changement de configuration avec les outils de sécurité intégrés
- Désactiver selinux :
sudo setenforce 0
- Arrêter et désactiver le parefeu :
sudo systemctl stop firewalld
Première phase :
- Décomposer cet objectif fonctionnel en étapes techniques.
- Pour chaque étape, fournir la (suite de) commande qui permettra de vérifier le bon déroulement.
Deuxième phase, en possession d’une procédure donnée :
- Mettre en œuvre les étape une-à-une telles que le précise la procédure en effectuant scrupuleusement chaque vérification.
- Constater les éventuelles dérives, les expliquer et proposer une remédiation.
Autres éléments de sécurisation :
- Après avoir généré une paire de clé sur votre poste de travail et publié votre clé publique sur le serveur, configurer 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 ?
- Quelles autres solutions — organisationnelles ou techniques — peut-on mettre en œuvre pour sécuriser le service ?
- Mettre en œuvre les mesures techniques.
Contenus additionnels
Gestion des paquetages logiciels
Le gestionnaire de paquetages des distributions de la lignée Redhat
est yum
(Yellowdog Updater Modified). C’est une surcouche de
l’outil de gestion de paquetage unitaire rpm
qui permet de gérer :
- plusieurs sources de paquetages,
- la mise à jour des listes de paquetages fournis par les sources
(
yum check-update
), - la gestion de la liste globale des paquetages (
yum search
ouyum provides
par exemple), - les dépendances entre paquetages,
- le téléchargement des paquetages,
- l’installation de nouveaux paquetages (
yum install
), - la mise à jour des paquetages eux-même (
yum update
), - la mise à jour de l’ensemble du système (
yum upgrade
).
On veillera à configurer le proxy si nécessaire :
[root@olm ~]# cat >> /etc/yum.conf
proxy=http://192.168.144.1:3128
Journalisation
Tout système Linux enregistre son activité et celle des processus
fonctionnant en tâche de fond dans des journaux (log). Ceux-ci sont
disponibles sous forme de simples fichiers dans le répertoire
/var/log
.
Un processus dédié à la journalisation, appelé démon de journalisation
système (le plus souvent syslogd
) est chargé de recevoir les
enregistrements à journaliser. La cible d’un enregistrement est
déterminée par la configuration du démon.
La journalisation des événements est une technique de sécurité majeure. Elle permet d’effectuer des analyses diverses, en temps réel ou a posteriori, en corrélant les journaux avec d’autres événements. La mise en œuvre d’une centralisation de la journalisation permet d’accéder à des niveaux fonctionnels et de sécurité optimaux.
Sur un système enregistrant les événements dans des fichiers, la
connaissance des commandes de recherche et de manipulation de texte et
de fichiers texte est essentiel pour l’exploitation des journaux :
grep
et tail
principalement ; voire cut
, awk
, ou – mieux
encore – perl
.
Édition de texte
Avec vi
https://vim-adventures.com/ !!!
L’éditeur de texte vi
fonctionne suivant deux modes :
- le mode commandes proposé par défaut une fois l’éditeur lancé,
accessible avec la touche
Esc
lorsqu’on est en mode édition, qui sert à piloter l’éditeur - le mode édition accessible en utilisant la touche
i
lorsqu’on est en mode commandes, qui sert à saisir du texte
Les commandes de base suivantes sont accessible en mode commandes,
celles préfixées par :
doivent être validées avec la touche
Entrée
:
:w
- écrire le fichier
:q
- quitter
ZZ
- écrire et quitter
u
- annuler la dernière édition
/chaîne de caractères
- rechercher une chaîne de caractères
:n
- aller à la ligne numéro
n
i
- passer en mode édition
dd
- couper une ligne
:dn
- couper
n
lignes P
- coller
À l’éditeur de base vi
, on préfèrera la version améliorée
(improved) vim
. Sur certaines distributions, un alias est
automatiquement mis en place à l’installation du paquetage pour
appeler la version améliorée avec la commande vi
; sur d’autres il
faut utiliser explicitement la commandex vim
.
Avec emacs
Emacs est un éditeur de texte libre, développé par Richard M. Stallman, fondateur de la FSF et du projet GNU qui le maintient encore aujourd’hui.
Emacs n’est pas juste un éditeur : son cœur est un interpréteur Lisp développé en C, qui le rend extensible à merci. Combiné au fait que c’est l’un des plus anciens éditeur de texte existant, utilisé par de générations d’informaticiens, en fait « the one true editor ».
Comme bash
, emacs utilise la bibliothèque readline
:
C
fait référence à la toucheControl
ouCtrl
du clavierM
à la toucheAlt
, bien que ce caractère de contrôle puisse également être obtenu en pressant la toucheEchap
ouEsc
du clavier avant de saisir la suite de la commande.
Toutes les commandes de déplacement et d’édition de la ligne de
commande bash
sont valides sous emacs :
- Commandes de base :
- Ouvrir un fichier
C-x C-f
- Sauvegarder le buffer en cours
C-x C-s
- Sortir de emacs
- (vous êtes sûr ?) :
C-x C-c
- Pour aller (un peu) plus loin :
- Le tutoriel
C-h t
, ouF1 t
- Tutoriel en français
M-x help-with-tutorial-spec-language
- Consulter une page de manuel
M-x woman