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)

 

noteQuelques 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

noteSUID 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.

attention 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.

noteCette 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.

note 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

noteCf. 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.

note 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.

noteSpé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).


attentionLes 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.