Sécurité sous Unix
Le système UNIX étant multi-utilisateurs, il est nécessaire de définir des permissions ou droits d’accès entre les utilisateurs, afin d’empêcher des incidents de ‘voisinage’.
La sécurité commence donc lors de la connexion sur une machine Unix.
Connexion sur une machine Unix
Pour qu’un utilisateur puisse se connecter, il faut que celui-ci dispose d’un nom d’utilisateur (LOGIN) et éventuellement d’un mot de passe (PASSWORD). L’administrateur du système doit donc pour créer un nouvel utilisateur, définir l’environnement de travail de ce dernier. Cette étape peut se faire via des commandes shell (qui seront vu dans un autre chapitre), où encore grâce à des outils disponibles sous X Window. Généralement, lors de l'installation du système Unix, il sera aussi possible de définir des utilisateurs.
Lorsque vous disposez d’un nom adéquat, vous pouvez vous connecter au système.
Dès que le système UNIX affiche le mot « LOGIN : », vous pouvez saisir votre nom d’utilisateur. Affichage alors du mot « PASSWORD : », vous devrez taper votre mot de passe qui ne s’affichera évidemment pas à l'écran !
Si votre nom et mot de passe sont reconnus, vous pourrez travailler...Sinon, le système va redemander votre login. Il faut savoir que le processus prendra un certain temps avant de vous proposer de nouveau le login. Ceci est normal, il est là pour faire ralentir un éventuel programme cherhant à se connecter ou encore pour énerver une personne essayant de forcer le système. De plus au bout de 3 essais, le système peut désactiver le compte pendant une plus longue durée.
Le terminal est en mode CANONIQUE, c’est à dire que votre commande n’est prise en compte par le SHELL, que lorsque vous frapperez sur la touche return.
Lors de la saisie de votre identifiant sous shell, il est possible de modifier la ligne en cours de saisie grâce à <BACK-SPACE> ou <CTRL-H> qui permettent d’effacer le dernier caractère frappé. La touche <CTRL-U> permet d’effacer tous les caractères précédant le curseur.
La séquence <CTRL-D> vous déconnecte du système sans espoir de retour, c’est cette séquence qu’il faut exécuter pour quitter UNIX.
Sous X Window, il faudra utiliser <CTRL-BAKSPACE> pour clôturer votre session X Window.
(Cf. PROCESSUS 1 (processus INIT) et ceux exécutés à la connexion (processus GETTY, LOGIN)).
Si l'utilisateur parvient à se connecter. Il arrivera, suivant le paramétrage de l'administrateur et suivant aussi son terminal, sous une session en mode caractère ou sous X Window. quant au programme qui sera lancé, cela dépendra aussi du paramétrage. Mais dans tous les cas, cet utilisateur aura des droits d'accès plus ou moins important pour accéder à des fichiers afin d'exécuter des programmes, pour lire ou écrire dans des fichiers.
Permissions & confidentialité
Lorsque vous accédez à un fichier, vous pouvez être perçu par le système comme
- propriétaire du fichier (user).
- appartenant à un groupe d'utilisateur auquel est associé le fichier (group).
- un utilisateurs ni propriétaire et n'appartenant pas au groupe du fichier (other).
Pour chacune de ces vues, il y aura des droits en lecture, écriture et exécution.
Les états précisant les droits d’accès sur les fichiers et répertoires
Le système unix propose 12 bits d’état, placés dans les i-noeuds et précisant les droits d’accès sur les fichiers et répertoires.
- Les droits d’accès du propriétaire(user).
- Les droits d’accès d’un groupe d'utilisateurs(group).
- Les droits d’accès pour tous les utilisateurs(other).
- Exécution d’un programme en tant qu'utilisateur propriétaire d'un fichier(SUID bit)
- Exécution d’un programme en tant que groupe propriétaire d’un fichier(GUID bit)
- ‘Sticky’ bit ordonnant à un programme de rester en mémoire centrale.
Un programme avec
le SUID positionné alors que le propriétaire est ROOT implique
que ce programme fonctionnera avec tous les privilèges de l'utilisateur
ROOT !!! Imaginez les risques si vous aviez un programme permettant d'en lancer
d'autres (un SHELL par exemple) ! Vous pourriez alors faire presque tout ce
que peut faire l'utilisateur ROOT alors que vous ne vous êtes pas forcement
connecté en tant qu'utilisateur ROOT !!!
Droits d'accès
Il existe 3 bits par droits d’accès:
- L’accès en Lecture (4 ou r)
- L’accès en Ecriture (2 ou w)
- En exécution(1 ou x)
Ces trois types d’accès peuvent être positionnés sur le propriétaire du fichier, le groupe propriétaire et les autres utilisateurs.
C'est la commande chmod qui permettra de positionner ces droits (via votre utilisateur suivant les droits que vous aurez pour les modifier, ou le root)
Quelques remarques
sur les droits:
- Le droit d'exécution pour un répertoire n'existant pas, ce bit est utilisé pour autoriser ou non la recherche de fichiers dans celui-ci.
- L'utilisateur propriétaire d'un fichier peut s'interdire la lecture, l'écriture ou l'exécution.
- De même, il peut autoriser ou non les membres du groupe auxquels il appartient à lire, modifier et exécuter son fichier. Et enfin faire de même avec les autres utilisateurs.
- Seul le ROOT peut effectuer facilement les opérations qu'il veut quelque soit les autorisations posées par l'utilisateur.
Le SUID, GUID et sticky bit
Rappel :
Le suid, guid, ... peuvent être positionnés sur tous les fichiers (y compris les répertoires). Ces termes signifies:
- SUID bit : Exécution d'un programme en tant qu'utilisateur propriétaire d'un fichier (4 ou s)
- GUID bit : Exécution d'un programme en tant que groupe propriétaire d'un fichier (2 ou g)
- ‘Sticky’ bit : ordonne à un programme de rester en mémoire centrale (1 ou t).
Le sticky bit positionné sur un répertoire donne pour résultat, l’impossibilité pour un utilisateur de modifier ou effacer un fichier pour lequel il n’est pas propriétaire.
La fonction chmod permet de positionner la valeur de chacun d’eux.
SUID (visualisé s) = 4 ou u+s
GUID (visualisé S) = 2 ou g+s
sticky (visualisé t) = 1 ou t
SUID
et GUID à 0 signifie que l'on à affaire à un fichier dont le propriétaire est
root, du groupe system ou root suivant le système d'exploitation. Le programme
aura donc tous les droits.
Commande chmod
La commande permettant de positionner les droits de lecture, ecriture ou d'exécution, ainsi que le SUID, GUID et sticky bit pourront être positionnés grace à la commande
chmod [options] mode fichier
avec option: à -R pour traitement récursif (cascade dans les sous-répertoires)
-- pour fin des options
Il peut exister d'autres options suivant le système utilisé
mode: [ugoa...][[+-=][rwxXstugo...]...][,...]
+ ou - pour ajouter un droit ou le retirer (Ex. +r -w)
ugo pour droits user, group ou other
x droit d'exécution pour un fichier ou de parcours pour un répertoire
X exécution du chmod si le fichier est un répertoire ou si autorisation d'exécution (fichier exécutable)
fichier: le(s) fichier(s) (ou répertoire) à modifier (* ? sont autorisés)
Ou mode par combinaison de chiffres (1 à 4) calculé en ajoutant les valeurs 4, 2 et 1 (opération logique ou) des droits d'accès ou SUID GID sticky bit (opération logique ou)
composé de la façon suivante:
chmod attributSGs attributUser attributGroup attributAll
attributSGs est composé de SUID | GID | sticky
attributUser attributGroup attributAll chacun composé des droit de lecture (4) | droit d'écriture (2) | droit d'exécution (1) (Exemple 7 = 4 + 2 + 1 ou 4 | 2 | 1 en logique binaire ou. Si vous voulez positionner les droits de lecture et exécution: 4 + 1 = 5)
Exemple
chmod 777 *
Donne tous les droits de lecture/écriture/exécution à tout le monde user, group et other
chmod 4777 * idem que ci-dessus, mais lors de l'exécution des programmes, ils seront lancés avec les même droits que ceux du propriétaire du fichier car SUID est positionné = 4 (Hyper dangereux la commande là !!! Ne pas faire surtout si propriétaire root !)
Création d’utilisateurs et de groupes.
Il faut avoir
tous les privilèges pour cette opération. Pour faire simple, être
root soit en se connectant en tant qu'utilisateur root,
soit en passant en root via la commande su ou si disponible en utilisant la
commande sudo.
Les commandes shell sont:
- Sous linux, il existe aussi une commande pour créer un nouvel utilisateur : la commande adduser. Les informations demandées seront celles que l’on trouve dans le fichier /etc/passwd. Elle permet en plus de créer la home directory de l’utilisateur. Au minimum, il faudra passer le nom de l'utilisateur. Des outils sous X Window seront disponibles (genre sous outils système\configurer l'ordinateur\système\gérer les utilisateurs. Les options dépendant de la version Linux. L'utilisation sous X Window étant évidemment plus simple !). Pour supprimer un utilisateur: userdel, pour le modifier usermod
- Sous AIX 4.3, il y a une commande équivalente qui est mkuser.
« mkuser nom_user » va créer une ligne dans /etc/passwd et créer la home directory. Je ne connais pas les paramètres de cette commande. Il est peut-être possible de lui passer le groupe ainsi que le mot de passe,…
Vous pouvez aussi utiliser smit sous X Window.
A la main
Cette méthode était valable dans les années 90, elle est d éconseillée de nos jours...
Création/modification/suppression d’utilisateurs
Pour créer un utilisateur, l’administrateur du système
peut insérer une nouvelle ligne dans le fichier /etc/passwd en s’assurant
que le nom de l’utilisateur et son UID soient uniques, et que le GID corresponde
à un groupe existant (fichier /etc/group).
Pour supprimer/modifier un utilisateur, l’administrateur du système
peut supprimer ou modifier la ligne correspondante dans le fichier /etc/passwd,
après s’être assuré que l’utilisateur n’est
pas connecté.
Le mot de passe doit être créé par le système, si
absent, seul le nom de l’utilisateur suffit pour la connexion.
Seul l’identifiant numérique UID ou GID est reconnu par le système.
Il est ainsi possible (mais déconseillé !) de créer plusieurs
utilisateurs ayant des noms différents, mais un identifiant unique. A
ce moment là, seul le premier nom dans le fichier /etc/passwd sera affiché.
Remarque :
Pb. mot de passe utilisateur perdu, il est possible pour l'administrateur de
supprimer l’ «*» dans le fichier /etc/passwd, puis de
se connecter sur ce user et de changer son mot de passe par la commande
passwd.
Cette
solution n'est plus possible sur les versions récentes des systèmes.
De même, de modifier le groupe de cet utilisateur par le fichier /etc/group(ne
pas oublier dans ce cas le chgrp sur le(s) répertoire(s) de celui-ci).
Création/modification/suppression d’un groupe
Pour créer un nouveau groupe, l’administrateur peut ajouter une nouvelle ligne en utilisant un nom de groupe unique et un identifiant unique.
La destruction du groupe suppose l’effacement de tous les utilisateurs de ce groupe (sauf si ceux-ci sont déplacés dans un autre groupe). Il ne doit pas y avoir d’utilisateurs connectés avec ce groupe.
Il est préférable
d’effectuer ces modifications lorsque le système n’est pas
utilisé par d’autres personnes, notamment lors de la suppression
d’un groupe ou d’un utilisateur.
La suppression d’un utilisateur doit entraîner la suppression des répertoires et fichiers de cet utilisateur.
La création d’un utilisateur entraîne la création d’un répertoire pour celui-ci.
Ne pas oublier de le rendre propriétaire de son répertoire (chown <nom utilisateur> <nom répertoire>), et de donner le bon groupe (chgrp <nom groupe> <nom répertoire>). (cf. la commande chmod à Opérations sur les permissions d’accès avec le shell (chrgp, chown, chmod, newgrp & logname)).
Des commandes sous Linux existent: groupadd, groupdel ou groupmod.
Le super utilisateur (root)
Le super utilisateur (ou encore administrateur) est un utilisateur dont le nom est root et dont le groupe
est root (ou system, suivant les OS) son UID = 0, GID = 0.
La plupart des fichiers systèmes appartiennent à root, et sont
gérés par lui.
L’utilisateur root dispose de toutes les permissions, il peut donc lire, modifier ou supprimer les structures du système. Seul l’administrateur système doit avoir accès au super utilisateur root.
Le root ne peut pas deviner le mot de passe crypté d’un utilisateur, puisqu’il n’existe aucune commande de décryptage. Et en même temps, à quoi cela lui servirait, puisqu'il a tous les droits !
Changement momentané d’utilisateur
su [-]
ou
su [-] [nom utilisateur]
Cette commande provoque la connexion sur l’utilisateur précisé en paramètre et, en fin de session (exit ou ctrl+D), vous retrouverez votre propre interpréteur de commandes avec vos propres droits.
Si su n’est pas accompagné d’un nom utilisateur, l’utilisateur par défaut sera le root et un mot de passe vous sera demandé. Avec su seul, il est donc possible de passer momentanément en super utilisateur puis, de revenir à son travail initial.
L’option -, si elle est présente, signal à l’interpréteur de commandes d’exécuter les fichiers d’initialisations (.profile pour le Bourne Shell, cf. les différents shell) pour connaitre les fichiers correspondant à un shell précis utilisés) correspondant à l'utilisateur précisé pour su (ou root si non précisé).
sudo permet d'exécuter des commandes sous un nom d'utilisateur (là encore, si l'utilisateur n'est pas précisé, ce sera le root). Cette commande n'existe pas sur tous les systèmes Unix, mais est souvent adoptée sur les systèmes récents. man sudo pour plus de précision.
Exécution d'une commande en tant qu'un autre utilisateur
Il s'agit de l'équivalent de la commande su, mais limité dans le temps à l'exécution de la commande qui suivra en paramètre la commande sudo . Généralement utilisé pour exécuter une commande en tant qu'administrateur (soit l'utilisateur root).
Exemple:
sudo chmod 644 toto
Cf.
le fichier /etc/sudoers et la commande visudo pour indiquer les utilisateurs
pouvant utiliser la commande sudo.
Interdire la connexion à distance ssh en tant qu'utilisateur root
Si le service sshd (openssh) est activé pour permettre une connexion à distance sécurisée, il est urgent d'interdire les connexions à distance en tant qu'utilisateur root !
Interdire la connexion sur certains terminaux en tant qu'utilisateur root
Le fichier /etc/securetty liste l'ensemble des terminaux sur lesquel l'utilisateur root peut se connecter. En principe, seule console (voire tty1) devrait être autorisée pour des raisons de sécurité !
Interdire la connexion pour certains utilisateurs
Il est possible d'interdire le login pour certains utilisateurs. Il suffit dans le fichier etc/passwd de remplacer le programme à exécuter au login (souvent un shell comme /bin/sh) par /sbin/nologin ou /bin/false.
La différence entre l'utilisation de nologin et false (nologin vs false):
nologin affiche un message à l'utilisateur avant de le déloguer. Ce qui n'est pas le cas de false qui arrête immédiatement le login sans aucune information.
Vous
pouvez personnaliser le message en créant/modifiant le fichier
/etc/nologin.txt
Dans le cas de l'utilisation de ssh pour une connexion à distance, il est possible de n'autoriser que certains comptes ou groupes à distance.
Commandes pour le super utilisateur (eh oui !) avec le SHELL(chown, chgrp & umask)
Ces commandes pourront aussi être utilisé par un simple utilisateur mais seront fortement limitées au regard de ses privilèges !
Changer le propriétaire ou le groupe d'un fichier/répertoire
chown [-option] <nom utilisateur ou UID>[:groupe ou GID] <fichier, répertoire ou filtre> [fichier, répertoire ou filtre] [fichier...]
Cette commande permet de modifier l’UID ou le GID présent dans un i-nœud, c’est à dire l’identifiant ou le groupe du propriétaire de fichiers ou de répertoires.
Spécificités
GNU: les : peuvent être remplacé par un . pour séparer
l'utilisateur du groupe. De plus, si l'utilisateur est suivi de : sans rien
d'autre de précisé derrière, les fichiers se verront affecté le
groupe associé à l'utilisateur. De plus, il est possible de ne
pas préciser l'utilisateur, mais uniquement :groupe pour ne modifier
que le groupe d'un fichier. Dans ce cas, chown est équivalent à chgrp.
Changer le groupe d'un fichier/répertoire
chgrp <nom du groupe ou GID> <fichier, répertoire ou filtre>
[fichier, répertoire ou filtre] [fichier...]
Cette commande permet de modifier le GID présent dans un i_nœud,
c’est à dire l’identifiant du groupe propriétaire
de fichiers ou de répertoires.
Masques des droits d'accès
umask <masque des droits d’accès>
Cette commande permet d’indiquer les droits d’accès par défaut,
lors de la création d’un fichier par un utilisateur.
umask 077 interdira l’accès à tout le monde sauf au propriétaire
du fichier.
umask 022 interdira l’accès en écriture à tout le
monde sauf au propriétaire du fichier.
Les fichiers /etc/passwd, /etc/group et /etc/shadow
Le fichier /etc/passwd contient la liste des utilisateurs référencés dans le système. Chaque utilisateur est défini sur une ligne qui comporte les informations suivantes :
- Nom unique de l’utilisateur (8 caractères)
- Mot de passe crypté, si la gestion du mot de passe n’est pas faite dans /etc/shadow, suivant les systèmes. Si le fichier /etc/shadow existe, le mot de passe de /etc/passwd sera à blanc ou x (x oblige la saisie du mot de passe au login). (optionnel, minimum 6 et maximum 15 caractères)
- Identifiant unique de l’utilisateur(UID)
- Identifiant unique du groupe(GID)
- Données générales
- Chemin d’accès du répertoire de l’utilisateur
- Interpréteur de commande à exécuter ou application
à lancer.
Une ligne se présente ainsi :
Nom :[password] :UID :GID :commentaire :chemin :shell ou application
La liste des groupes d’utilisateurs est présente dans le fichier
/etc/group.
La liste des groupes se compose de plusieurs lignes chacune décrivant
un groupe.
Sur une ligne, vous trouverez les informations suivantes :
- Nom du groupe
- Mot de passe crypté
- Identifiant unique du groupe (GID)
- Liste des noms d’utilisateurs autorisés à passer dans
ce groupe (Les noms doivent être séparées par une virgule).
Les
mots de passe sont maintenant déplacés des fichiers /etc/passwd
et etc/group. Vous trouverez à la place un x . Il se peut que le mot
de passe crypté
soit maintenant dans le fichier /etc/shadow ou dans une base. la raison est
liée au moins au problème suivant: le mot de passe
crypté bien que indécryptible était récupérable
en lecture. Or, à partir des deux premiers caractères du mot
de passe récupéré, vous obtenez la clef de cryptage
utilisée.
Il était donc possible d'utiliser crypt
pour tenter de trouver un mot de passe dont le cryptage via cette clef correspondé
à celui trouvé dans le fichier en passant par une solution
de type "bruteforce".
Ce fichier est composé du mot de passe crypté et de paramètres
liés à la durée de vie du mot de passe. (cf Exemple
de programme en C accédant au fichier etc/passwd et etc/shadow pour
plus de détails).
Gestion du file system
Les disques durs, clef usb , ... sont des périphériques de bloc (avec buffer) sous Unix, encore appelé file system. Vous retrouverez donc les fichiers spéciaux mode bloc sous /dev (voir la commande mknod)
Contrairement à Windows, aucune lettre de lecteur n'est affectée aux périphériques de bloc. Ceci seront montés directement dans des répertoires.
La commande mount seule va permettre de lister les répertoires où sont montés les périphériques.
Exemple
/dev/sdb1 on /mnt/home type ext2 (rw,relatime,errors=continue)
Dans cet exemple, le périphérique qui utilise le fichier spécial /dev/sdb1, sera monté sous /mnt/home.
La commande mount permet de monter temprairement un nouveau file system ou de modifier temporairement un montage (par exemple modifier un file system positionner lecture seule pour qu'il devienne accessible en écriture).
Exemple
mount /dev/cdrom
mount /cd
Sous Linux, il est possible de faire passer un répertoire pour un périphérique et ainsi de monter ce répertoire dans un autre. Vous retrouvez ainsi le contenu de ce répertoire dans ce nouveau répertoire.
Voir similitude avec la commande ln
mount --bind repertoire_origine nouveau_repertoire
ou
mount -B repertoire_origine nouveau_repertoire
D'autres exemples:
Montage d'un file system d'un ordinateur hôte dans une machine virtuel sous virtualbox
Pour un remontage en lecture/ecriture (ici sous Android)
La commande umount permet de faire le démontage.
Il est possible de monter de façon permanente un file system. Il suffit d'ajouter une ligne dans le fichier /etc/fstab
Voir aussi les commandes df et blkid
mknod
mknod permet de créer les fichiers spéciaux sous Unix sous /dev.
Pour rappel, sous unix, tout est fichier. Pour accéder à un périphérique, vous passerez donc par un fichier: les fichiers spéciaux.
Il y a trois types de fichiers spéciaux:
- p pour fifo (créer des tubes nommés)
- b pour bloc (buffer)
- c pour caractère (ou u pour unbuffer - sans buffer)
D'où la commande suivante pour créer ces fichiers spéciaux
mknod [options] nom {bcu} numéro_majeur numéro_mineur
mknod [options] nom p (posix préconise l'usage de mkfifo)
Avec
- options à
- -m, --mode mode pour indiquer les droits d'accès au fichier avec mode fourni comme avec la commande chmod
- --help pour avoir de l'aide
- --version pour la version du programme
- numéro_majeur correspond au driver visé pour gérer le périphérique (Vous pouvez retrouver le driver et son numéro avec cat /proc/devices)
- numéro_mineur le numéro de périphérique dans la liste des périphériques présents pour ce driver.