Sécurité locale

Objectifs de certification

Linux Essentials

RHCSA EX200

  • 1.Comprendre et utiliser les outils essentiels
    • 1.5. Se connecter et changer d'utilisateur dans des cibles à plusieurs utilisateurs
    • 1.10. Répertorier, définir et modifier des autorisation ugo/rwx standard
  • 6.Gérer des groupes et utilisateurs système
    • 6.1. Créer, supprimer et modifier des comptes utilisateur locaux
    • 6.2. Modifier les mots de passe et ajuster la durée de validité des mots de passe pour les comptes utilisateur locaux
    • 6.3. Créer, supprimer et modifier des groupes locaux et des appartenances de groupe
  • 4.Créer et configurer des systèmes de fichiers
    • 4.4. Créer et configurer des répertoires SetGID pour la collaboration
    • 4.5. Créer et gérer des listes de contrôle d'accès
    • 4.6. Détecter et résoudre les problèmes d'autorisation sur les fichiers

LPIC 1

LPIC2

1. Utilisateurs et groupes

1.1. Commande su

su (substitute user ou switch user) est une commande Unix permettant d'exécuter un interpréteur de commandes en changeant d'identifiant de GID et de UID. Sans argument, la commande utilise les UID 0 et le GID 0, c'est-à-dire ceux du compte utilisateur root.

Cette commande est surtout utilisée pour obtenir les privilèges d'administration à partir d'une session d'utilisateur normal, c’est-à-dire, non privilégiée.

L’option - place le shell de l’utilisateur.

$ su
$ su -
$ su tintin
$ su - tintin

1.2. Programme sudo

sudo (abréviation de substitute user do, en anglais : «exécuter en se substituant à l'utilisateur») est une commande qui permet à l'administrateur système d'accorder à certains utilisateurs (ou groupes d'utilisateurs) la possibilité de lancer une commande en tant qu'administrateur, ou comme autre utilisateur, tout en conservant une trace des commandes saisies et des arguments.

Pour configurer sudo :

# visudo

qui ouvre le fichier de configuration sudo avec l'éditeur vi.

#
# Adding HOME to env_keep may enable a user to run unrestricted
# commands via sudo.
#
# Defaults   env_keep += "HOME"

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
##     user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)     ALL

## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## Allows people in group wheel to run all commands
%wheel    ALL=(ALL)    ALL

## Same thing without a password
# %wheel    ALL=(ALL)    NOPASSWD: ALL

## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

Par exemple, ajouter un utilisateur au système en tant que non-root :

$ sudo useradd zozo

1.3. Utilisateurs

Toute entité (personne physique ou programme particulier) devant interagir avec un système UNIX est authentifié sur cet ordinateur par un utilisateur ou "user".

Ceci permet d'identifier un acteur sur un système UNIX. Un utilisateur est reconnu par un nom unique et un numéro unique.

Sur tout système UNIX, il y a un super-utilisateur, généralement appelé root, qui a tous les pouvoirs sur le système. Il peut accéder librement à toutes les ressources de l'ordinateur, y compris à la place d'un autre utilisateur, c'est-à-dire sous son identité. En général, du moins sur les systèmes de production, seul l'administrateur système possède le mot de passe root. L'utilisateur root porte le numéro 0.

1.4. Utilisateurs : fichier /etc/passwd

On peut créer un utilisateur de plusieurs manières mais la finalité est toujours la même : pour chaque utilisateur, une entrée doit être créée dans le fichiers /etc/passwd sous ce format :

account:passwd:UID:GID:GECOS:directory:shell

Par exemple, on ajoute un utilisateur "user1" :

echo "user1:x:2000:2000:user1:/home/user1:/bin/bash" >> /etc/passwd

Mais faut-il encore créer le groupe correspondant, vérifier la validité des UID et GID, créer le répertoire utilisateurs, y donner les droits et y placer une structure ...

1.5. Mots de passe : fichier /etc/shadow

Le mot de passe est écrit dans le fichier /etc/shadow avec ses paramètres :

  1. nom de connexion de l'utilisateur (« login »)
  2. mot de passe chiffré : $1$ (MD5),$2$ (Blowfish), $5$ (SHA-256), $6$ (SHA-512)
  3. date du dernier changement de mot de passe
  4. âge minimum du mot de passe
  5. âge maximum du mot de passe
  6. période d'avertissement d'expiration du mot de passe
  7. période d'inactivité du mot de passe
  8. date de fin de validité du compte
  9. champ réservé

Par exemple :

francois:$6$d/uLirbD$s90XRAj6g14036jIuvYYQaSOSrcJKqiNNywIQplztkTlyIrySZE1o2zjFvSobewvyORXFdZ7bGeF0U1OTPoOm.:16842:0:99999:7:::

1.6. Générer un mot de passe aléatoire

  • pwmake est un outil qui permet de générer des mots de passe (Centos 7) :
# pwmake 128
Ib9AHK3boravZUSuNuffYPExunEn
  • Voici un exemple à utiliser dans un exercice de récupération de mot de passe :
pwmake 128 | passwd --stdin root
Changing password for user root.
passwd: all authentication tokens updated successfully.

On peut utiliser des outils natifs :

  • Avec les utilitaires de génération d'emprunte :
date +%s | sha256sum | base64 | head -c 32 ; echo
  • Avec /dev/urandom :
< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo;
  • Avec openssl s'il est installé :
openssl rand -base64 32
  • Dans les dépôts Debian, on trouve les générateurs de mots de passe:
    • pwgen
    • apg
    • makepasswd

1.7. Tester la force des mots de passe

On peut tester la force des mot de passe avec John The Ripper.

Si le paquet john est présent dans dépôt Debian / Ubuntu, il n'est pas disponible pour les distributions RHEL. On peut alors le compiler soi-même : https://gist.github.com/goffinet/83565ebec963fed0c74d

#!/bin/bash
# Centos 7 John the Ripper Installation
yum -y install wget gpgme
yum -y group install "Development Tools"
cd
wget http://www.openwall.com/john/j/john-1.8.0.tar.xz
wget http://www.openwall.com/john/j/john-1.8.0.tar.xz.sign
wget http://www.openwall.com/signatures/openwall-signatures.asc
gpg --import openwall-signatures.asc
gpg --verify john-1.8.0.tar.xz.sign
tar xvfJ john-1.8.0.tar.xz
cd john-1.8.0/src
make clean linux-x86-64
cd ../run/
./john --test
#password dictionnary download
wget -O - http://mirrors.kernel.org/openwall/wordlists/all.gz | gunzip -c > openwall.dico

et puis :

# john /etc/shadow
Loaded 4 password hashes with 4 different salts (generic crypt(3) [?/64])
testtest         (tintin)
testtest         (root)
testtest         (francois)
testtest         (gustave)
guesses: 4  time: 0:00:02:25 DONE (Tue Feb  3 23:06:29 2015)  c/s: 170  trying: spazz - dasha
Use the "--show" option to display all of the cracked passwords reliably

1.8. Groupes

Un utilisateur UNIX appartient à un ou plusieurs groupes.

Les groupes servent à rassembler des utilisateurs afin de leur attribuer des droits communs.

Le groupe principal est le groupe initial de l’utilisateur.

L’utilisateur peut appartenir à des groupes secondaires.

1.9. Fichiers /etc/group et /etc/gshadow

Les fichiers /etc/group et /etc/gshadow définissent les groupes.

Le fichiers /etc/group comporte 4 champs séparés par ":".

  1. nom du groupe
  2. mot de passe du groupe (ou x si le fichier gshadow existe)
  3. le GID
  4. liste des membres séparés par une virgule

1.10. Appartenance à un groupe

On peut vérifier son identifiant et l’appartenance aux groupes via les commandes id et groups :

$ id
uid=1000(francois) gid=1000(francois) groupes=1000(francois),10(wheel) contexte=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
$ groups
francois wheel

2. Opérations sur les utilisateurs et les groupes

  • Créer un nouvel utilisateur avec useradd
  • Définir un mot de passe avec passwd
  • Créer de nouveaux groupes
  • Ajout d’un utilisateur à un groupe
  • Modifier les paramètres utilisateur et groupe
  • Verrouiller un compte
  • Modifier l’expiration du mot de passe
  • Suppression d’un compte et d’un groupe

Pour toutes ces opérations vous devez disposer des droits root.

2.1. Créer un utilisateur

On utilise la commande /usr/sbin/useradd pour créer les nouveaux comptes utilisateurs.

La commande adduser est un lien symbolique qui pointe vers useradd sous RHEL/Centos. Sur les systèmes Debian adduser un script perl qui utilise useradd.

Quand elle est invoquée sans l'option -D, la commande useradd crée un nouveau compte utilisateur qui utilise les valeurs indiquées sur la ligne de commande et les valeurs par défaut du système. En fonction des options de la ligne de commande, la commande useradd fera la mise à jour des fichiers du système, elle pourra créer le répertoire personnel et copier les fichiers initiaux. Source : page man de useradd

Syntaxe de la commande useradd :

useradd [options] identifiant

Exemple : ajouter l'utilisateur tintin

# useradd tintin

Si vous utilisez cette commande sans option, les valeurs par défaut sont utilisées (sous Centos 7, notamment un groupe principal du même nom est créé ainsi que son répertoire personnel).

2.2. Commande useradd : options par défaut

Vous pouvez afficher ces valeurs avec useradd -D, sous RHEL/Centos :

# useradd –D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

Note : Vous trouverez également ces informations dans le fichier /etc/default/useradd.

2.3. Commande useradd : options

On ira utilement lire la page manuel de useradd

man useradd

Les options de useradd sont nombreuses.

Par exemple, sur un système RHEL/Centos :

# useradd -d /home/tintin -G wheel -s /bin/sh milou

Cette dernière commande ajoute l’utilisateur milou appartenant au groupe secondaires wheel avec `/bin/sh comme shell.

Que donne la commande id milou ?

2.4. Répertoire squelette

Le répertoire squelette contient les fichiers et répertoires qui seront copiés dans le répertoire personnel de l’utilisateur au moment de sa création.

Selon les paramètres du système :

$ ls -la /etc/skel/
total 24
drwxr-xr-x.   3 root root   74  8 déc 21:03 .
drwxr-xr-x. 122 root root 8192 16 jan 23:44 ..
-rw-r--r--.   1 root root   18 26 sep 03:53 .bash_logout
-rw-r--r--.   1 root root  193 26 sep 03:53 .bash_profile
-rw-r--r--.   1 root root  231 26 sep 03:53 .bashrc
drwxr-xr-x.   4 root root   37  4 jui  2014 .mozilla

2.5. Définir un mot de passe

C’est la commande passwd qui met à jour le mot de passe de l’utilisateur :

# passwd tintin

2.6. Ajouter un groupe

On peut ajouter des groupes facilement avec groupadd :

# groupadd marketing

On peut ajouter un utilisateur à un groupe avec gpasswd :

# gpasswd -a milou marketing

On peut ajouter un utilisateur à un groupe wheel (pour devenir sudoer sous RHEL/Centos) :

# gpasswd -a francois wheel

On peut retirer un utilisateur d’un groupe :

# gpasswd -d milou marketing

2.7. Modifier les paramètres utilisateur

On change les paramètres des groupes avec le programme usermod. Par exemple :

# usermod -d /home/francois -G tintin,francois,wheel milou

Les options de usermod sont (voir man usermod) :

-d répertoire utilisateur
-g définit le GID principal
-l identifiant utilisateur
-u UID utilisateur
-s shell par défaut
-G ajoute l’utilisateur à des groupes secondaires
-m déplace le contenu du répertoire personnel vers le nouvel emplacement

2.8. Modifier les paramètres d’un groupe

C’est le programme groupmod qui permet de changer les paramètres d’un groupe. On connaît entre autres les options suivantes :

-g GID
-n nom du groupe

2.9. Verrouiller un compte

On peut verrouiller un compte utilisateur de plusieurs manières :

  • En préfixant son mot de passe dans /etc/passwd par un "!". Si vous utilisez les mots de passe masqués shadow, remplacez x par un *.
  • C'est ce que font les commandes suivantes :
    • pour verrouiller passwd -l ou usermod -L
    • pour déverrouiller passwd -u ou usermod -U
  • Il est également possible de supprimer le mot de passe avec passwd -d.
  • Enfin, on peut attribuer l'interpréteur /bin/false à l'utilisateur dans /etc/passwd.

2.10. Modifier l’expiration du mot de passe

La commande chage modifie le nombre de jours entre les changements de mot de passe et la date du dernier changement. Ces informations sont utilisées par le système pour déterminer si un utilisateur doit changer son mot de passe. Pour les lister les paramètres d’un utilisateur :

# chage -l francois

Pour les détails :

$ man chage

Notons que :

  • La date est soit en jours UNIX, soit au format YYYY/MM/DD.
  • Tous ces délais sont dans le fichier /etc/shadow et peuvent être modifiés manuellement.

2.11. Suppression d’un compte et d’un groupe

On peut supprimer un compte utilisateur avec la commande userdel. Pour s’assurer de la suppression du répertoire utilisateur, utilisez la l'option -r.

# userdel -r tintin

Quelles seraient les opérations manuelles alternatives ?

2.12. Exercice : utilisateurs

Créer un utilisateur alpha avec comme politique de mot de passe une obligation de le changer à la prochaine connexion avec un âge maximum et une période d’inactivité de 30 jours et d’une longueur minimale de 12 caractères (chercher sur “Password Quality Checking”).

$ sudo chage -d 0 -M 30 -I 30 tintin
$ sudo chage -l tintin

3. Permissions

  • Propriété
  • Droits
  • Représentation symbolique et octale
  • Umask
  • Droits étendus
  • Modification des droits
  • Modification de l’utilisateur et du groupe propriétaire
  • SUID, GUID, Sticky bit
  • Commande stat
  • Révision de la commande ls

3.1. Propriété

Tout fichier UNIX possède un propriétaire. Au départ, le propriétaire est l’utilisateur (u) qui a créé le fichier mais "root" peut l’attribuer à un autre utilisateur. Seul le propriétaire du fichier et le super utilisateur (root) peuvent changer les droits.

Un fichier UNIX appartient aussi à un groupe (g). On définit ainsi les actions du groupe sur ce fichier. Ce groupe est souvent le groupe d'appartenance du propriétaire, mais ce n'est pas obligatoire.

On peut aussi définir ce que les autres (o) que le propriétaire ou groupe peuvent faire avec le fichier.

Rappelons que les dossiers sous UNIX sont aussi des fichiers. Les droits sur les dossier (mais aussi les périphériques, etc.) fonctionnent exactement de la même façon que sur des fichiers ordinaires.

3.2. Commandes chown/chgrp

chown est un appel système et une commande UNIX nécessitant les droits de root pour changer le propriétaire d'un fichier ou dossier (de l'anglais change the owner).

Voici la syntaxe générale de la commande chown :

chown [-hHLPR] [utilisateur][:groupe] cible1 [cible2 ..]

chgrp permet de changer le groupe d'utilisateur possédant un fichier ou un dossier. Contrairement à chown, la commande n'est pas réservée au super-utilisateur : le propriétaire peut aussi effectuer un changement de groupe s'il fait partie du groupe de destination.

chgrp ''groupe'' ''cible1'' [''cible2'' ..]

3.3. Changer le propriétaire et groupe d’un fichier

Par exemple attribuer l’utilisateur milou et le groupe tintin au fichier monfichier.txt :

$ touch monfichier.txt
$ ls -l monfichier.txt
-rw-rw-r--. 1 francois francois 0 17 jan 12:37 monfichier.txt
$ sudo chown milou:tintin monfichier.txt
$ ls -l monfichier.txt
-rw-rw-r--. 1 milou tintin 0 17 jan 12:37 monfichier.txt

3.4. Droits

À chaque fichier est associée une liste de permissions qui déterminent ce que chaque utilisateur a le droit de faire du fichier.

  • La lecture (r) : on peut par exemple lire le fichier avec un logiciel. Lorsque ce droit est alloué à un dossier, il autorise l'affichage de son contenu (liste des fichiers présents à la racine de ce dossier).

  • L'écriture (w) : on peut modifier le fichier et le vider de son contenu. Lorsque ce droit est alloué à un dossier, il autorise la création, la suppression et le changement de nom des fichiers qu'il contient (quel que soit les droits d’accès). Le droit spécial sticky bit permet de modifier ce comportement.

  • L'exécution (x) : on peut exécuter le fichier s'il est prévu pour, c'est-à-dire si c'est un fichier exécutable. Lorsque ce droit est attribué à un dossier, il autorise l'accès (ou ouverture) au dossier.

On appelle parfois r, w et x des « flags » ou « drapeaux ». Sur un fichier donné, ces 3 « flags » doivent être définis pour son propriétaire, son groupe, mais aussi les autres utilisateurs (différents du propriétaire et n'appartenant pas au groupe).

3.5. Représentation symbolique

Cet ensemble de 3 droits sur 3 entités se représente généralement de la façon suivante :

On écrit côte à côte les droits r, w puis x respectivement pour le propriétaire (u), le groupe (g) et les autres utilisateurs (o). Les codes u, g et o (u comme user, g comme group et o comme others) sont utilisés par les commandes UNIX qui permettent d'attribuer les droits et l'appartenance des fichiers. Lorsqu'un flag est attribué à une entité, on écrit ce flag (r, w ou x), et lorsqu'il n'est pas attribué, on écrit un '-'.

L'exemple suivant signifie que le propriétaire peut lire, écrire et exécuter le fichier, mais que les utilisateurs du groupe attribué au fichier ne peuvent que le lire et l'exécuter, et enfin que les autres utilisateurs ne peuvent que lire le fichier.

3.6. Représentation octale

Les valeurs octales correspondent au tableau suivant de telle sorte que les valeurs possibles pour un fichier ou un dossier sont :

  • 7 rwx
  • 6 rw-
  • 5 r-x
  • 4 r--
  • 3 -wx
  • 2 -w-
  • 1 --x
Symbole Octal Binaire
r 4 100
w 2 010
x 1 001

3.7. Umask

Les permissions standard sont :

  • 666 pour les fichiers
  • 777 pour les dossiers

Umask est un masque de création de fichier qu’il faut soustraire des permissions standards pour obtenir les droits de tout nouveau fichier ou dossier créé par l’utilisateur.

Si 002 est la valeur umask par défaut :

$ umask
0002

Alors les fichiers nouvellement créés auront des droits :

 666
-  
 002
=
 664

et les dossiers auront des droits :

 777
-
 002
=
 775

3.8. chmod

chmod est la commande qui permet de changer les permissions des fichiers et des dossiers.

Voici sa syntaxe :

chmod [option] permission fichier

où les permissions peuvent être notée en octal :

$ chmod 777 fichier

ou en mode symbolique selon la syntaxe en utilisant :

  • les catégories d’utilisateur : u, g, o et a (all)
  • des opérateurs d’ajout/suppression : =, + et -
  • des droits : r, w et/ou x
$ chmod a+rwx fichier

Pour assurer la récursivité, on peut appliquer les permissions à un dossier et toute son arborescence avec l’option -R :

$ chmod -R u+rwx labs

3.9. Modification des droits

  • Créer un script rudimentaire "monscript.sh" :
$ cat monscript.sh
#!/bin/bash
echo "Voici mon premier script"
exit
$ ls -l monscript.sh
-rw-rw-r--. 1 francois francois 51 17 jan 05:02 monscript.sh
$ ./monscript.sh
-bash: ./monscript.sh: Permission non accordée
  • Rendre le script exécutable
$ chmod +x monscript.sh
$ ls -l monscript.sh
-rwxrwxr-x. 1 francois francois 51 17 jan 05:02 monscript.sh
$ ./monscript.sh
Voici mon premier script
  • N’accorder les droits qu’au seul propriétaire
$ chmod 700 monscript.sh

3.10. Droits étendus

Les droits étendus sont des variantes sur l’exécution :

  • SUID sur un exécutable, valeur octale : 4000, valeur symbolique : s
  • SGID sur un fichier ou un dossier, Valeur octale : 2000, valeur symbolique : s
  • Sticky bit, Valeur octale : 1000, valeur symbolique : t

3.11. SUID

  • Valeur octale : 4000, valeur symbolique : s
  • Quand le SUID est activé sur un exécutable, l’utilisateur qui exécute le fichier dispose des mêmes droits que le propriétaire.

Par exemple :

$ ls -l $(which passwd)
-rwsr-xr-x. 1 root root 27832 10 jun  2014 /usr/bin/passwd

Cet Exemple nous indique que cet exécutable à le SUID activé qui autorise un utilisateur d’écrire son mot de passe dans un fichier réservé à root (/etc/shadow).

Attention ce type de fichier appartenant à root pourrait rendre n’importe quelles actions privilégiée possible.

3.12. Commande stat

La commande stat donnera des informations précises sur un fichier :

$ stat $(which passwd)
  Fichier: «/usr/bin/passwd»
   Taille: 27832         Blocs: 56         Blocs d'E/S: 4096   fichier
Périphérique: fd00h/64768d    Inœud: 33859624    Liens: 1
Accès: (4755/-rwsr-xr-x)  UID: (    0/    root)   GID: (    0/    root)
Contexte: unconfined_u:object_r:passwd_exec_t:s0
 Accès: 2015-01-16 02:52:08.012260715 +0100
Modif.: 2014-06-10 08:27:56.000000000 +0200
Changt: 2014-12-08 20:37:41.265606127 +0100
  Créé: -

3.13. Opérations SUID

  • Créez un dossier et tenter de changer son propriétaire. La commande chown ne peut être utilisés que par root.
$ mkdir tmp
$ chown root tmp
chown: modification du propriétaire de «tmp»: Opération non permise
$ ls -l $(which chown)
-rwxr-xr-x. 1 root root 62792 10 jun  2014 /usr/bin/chown
Activer le SUID sur la commande.
$ sudo chmod +4000 $(which chown)
$ ls -l $(which chown)
-rwsr-xr-x. 1 root root 62792 10 jun  2014 /usr/bin/chown
  • On constate que l’utilisateur a pu changer le propriétaire du dossier.
$ chown root tmp
$ ls -ld tmp
drwxrwxr-x. 2 root francois 6  4 mar 23:10 tmp
  • Désactivation du SUID.
$ sudo chmod u-s $(which chown)

3.14. SGID

  • Valeur octale : 2000, valeur symbolique : s
  • Le SGID permet d’endosser les droits du groupe propriétaire.
  • Quand un utilisateur crée un fichier dans un dossier dont il membre du groupe, le fichier prendra les permissions du groupe courant.
  • Quand le SGID est fixé sur un dossier, le fichier créé par l’utilisateur prendra les droits du groupe du dossier. En conséquence, tous les fichiers créés quel que soit l’utilisateur appartiendra au groupe du dossier.

3.15. Opérations SGID

  • Créer un dossier partagé avec l’utilisateur tintin avec le SGID activé :
$ mkdir share
$ chmod g+s share
$ ls -l
drwxrwsr-x. 2 francois francois       6 17 jan 11:53 share
$ groups tintin
$ sudo usermod -G francois tintin
$ groups tintin
$ cd share
  • Création d’un fichier partagé tintin.txt
$ su tintin
Mot de passe :
$ touch tintin.txt
$ ls -l
total 0
-rw-rw-r--. 1 tintin francois 0 17 jan 11:57 tintin.txt
$ exit
  • On retire le droit SGID et on crée un nouveau fichier tintin2.txt
$ chmod g-s share
$ cd share
$ su tintin
Mot de passe :
$ touch tintin2.txt
$ ls -l
total 0
-rw-rw-r--. 1 tintin tintin   0 17 jan 11:59 tintin2.txt
$ exit

3.16. Sticky bit

  • Valeur octale : 1000, valeur symbolique : t
  • Ce droit (traduction bit collant) est utilisé pour manier de façon plus subtile les droits d'écriture d'un dossier. En effet, le droit d'écriture signifie que l'on peut créer, modifier et supprimer les fichiers de ce dossier. Le sticky bit permet de faire la différence avec la suppression.
  • Lorsque ce droit est positionné sur un dossier, il interdit la suppression d'un fichier qu'il contient à tout utilisateur autre que le propriétaire du fichier.
  • C’est typiquement le cas du dossier /tmp :
$ ls -l /
drwxrwxrwt.  11 root root  340 17 jan 11:59 tmp

3.17. Exercice permissions

  • Créer avec un dossier appartenant au groupe “omega”.
  • Le dossier est partagé par deux utilisateurs “alfa” et “beta” appartenant au groupe secondaire “omega”.
  • Ce dossier partagé est leur dossier d’accueil et personnel.
  • Ces utilisateurs peuvent lire le contenu du dossier et ajouter ou modifier des fichiers. Fixer le “sticky bit” et le “SGID” sur ce dossier en démontrant leur utilité.
  • En options :
    • Retirer à ces utilisateurs les droits d’accès à une console graphique.
    • Désactiver le compte de “beta” (plusieurs solutions)
# mkdir /opt/share
# groupadd omega
# chgrp omega /opt/share
# useradd -d /opt/share -G omega -s /bin/bash alfa
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
# useradd -d /opt/share -G omega -s /bin/bash beta
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
# chmod 3770 /opt/share

Vérifications.

# ls -ld /opt/share
drwxrws--T. 2 root omega 6 Apr 11 16:10 /opt/share
# su - alfa
$ touch alfa.txt
$ exit
logout
# su - beta
$ touch beta.txt
$ ls -l
total 0
-rw-rw-r--. 1 alfa omega 0 Apr 11 16:11 alfa.txt
-rw-rw-r--. 1 beta omega 0 Apr 11 16:12 beta.txt
$ rm alfa.txt
rm: cannot remove ‘alfa.txt’: Operation not permitted
$ exit
logout

4. Access control lists (ACLs)

4.1. Complément aux droits standards et étendus

Les Access control lists (ACLs) permettent de définir des permissions différentes pour un ou plusieurs utilisateurs / groupes sur un fichier / répertoire.

A une époque, il fallait adapter le noyau et le FS au support des ACLs. Techniquement, ces informations étendues sur les fichiers sont enregistrées en tant que méta-donnés su FS.

Les droits standards et les droits étendus sont des fonctionnalités intéressantes mais qui ne s'applique que pour un seul utilisateur ou un seul groupe. Comment définir des permissions spécifiques, voire différents, pour d'autres utilisateurs ou groupes que les propriétaires ? Les ACLs offrent une réponse à cette question.

4.2. Support du système de fichiers

Avant de démarrer avec les ACLs, il faut que le système de fichiers soit monté pour les supporter car ses métadonnées devront être étendues.

4.3. Visualiser les permissions ACLs

# mkdir /opt/partage
# ls -ld /opt/partage
drwxr-xr-x. 2 root root 6 23 fév 20:16 /opt/partage
# getfacl /opt/partage
getfacl : suppression du premier « / » des noms de chemins absolus
# file: opt/partage
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

4.4. Ajouter un ACLs à un répertoire

# setfacl -m g:omega:rx /opt/partage
# setfacl -m u:alfa:rwx /opt/partage
# getfacl /opt/partage
getfacl : suppression du premier « / » des noms de chemins absolus
# file: opt/partage
# owner: root
# group: root
user::rwx
user:alfa:rwx
group::r-x
group:omega:r-x
mask::rwx
other::r-x

4.5. ACLs par défaut

Les ACLs par défaut permettent de donner des permissions ACL en héritage pour tout sous-répertoire ou fichier créé dans un répertoire. Toutefois, ces ACLs par défaut ne s'appliquent pas aux objets déjà présents dans le répertoire.

Dans la configuration d'un partage avec des accès multiples, il sera donc nécessaire de procéder en deux étapes :

  1. Modifier l'ACL des fichiers existants
  2. Appliquer un ACL par défaut
# setfacl -R -m u:alfa:rx /opt/partage
# setfacl -m d:u:alfa:rx /opt/partage
# getfacl /opt/partage
getfacl : suppression du premier « / » des noms de chemins absolus
# file: opt/partage
# owner: root
# group: root
user::rwx
user:alfa:r-x
group::r-x
group:omega:r-x
mask::r-x
other::r-x
default:user::rwx
default:user:alfa:r-x
default:group::r-x
default:mask::r-x
default:other::r-x

Enfin, il peut être intéressant d'utiliser les ACLs par défaut pour définir les droits des autres (other) sur les fichiers nouvellement créés.

Par exemple pour empêcher tous les autres en termes de permissions pour tout nouveau fichier ou sous-répertoire créé :

# setfacl -m d:o::- /opt/partage
# getfacl /opt/partage
getfacl : suppression du premier « / » des noms de chemins absolus
# file: opt/partage
# owner: root
# group: root
user::rwx
user:alpha:r-x
group::r-x
group:omega:r-x
mask::r-x
other::r-x
default:user::rwx
default:user:alpha:r-x
default:group::r-x
default:mask::r-x
default:other::---

4.6. Compatibilité

Tous les utilitaires (sauvegarde, copie, déplacement de fichiers) ne sont pas nécessairement compatibles avec les ACLs. Il sera donc indiqué de sauvegarder les ACLs définies pour un dossier afin de les repousser sur une copie des fichiers.

  • Par exemple, on copie le répertoire /opt/partagedans /opt/p2:
# cp -R /opt/partage /opt/p2
# getfacl /opt/p2
getfacl : suppression du premier « / » des noms de chemins absolus
# file: opt/p2
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
  • Sauvegarde
# getfacl -R /opt/partage > acls
getfacl : suppression du premier « / » des noms de chemins absolus
  • Adapataion
# sed -i -e "s/opt\/partage/\/opt\/p2/g" acls
# getfacl /opt/p2
getfacl : suppression du premier « / » des noms de chemins absolus
# file: opt/p2
# owner: root
# group: root
user::rwx
user:alpha:r-x
group::r-x
group:omega:r-x
mask::r-x
other::r-x
default:user::rwx
default:user:alpha:r-x
default:group::r-x
default:mask::r-x
default:other::---
  • Restauration
# setfacl --restore=acls

Notons que l'outil star se comporte et se manipule comme tar mais avec le support des ACLs (option -acl).

5. PAM

Pluggable Authentication Modules (modules d'authentification enfichables, en abrégé PAM) est un mécanisme permettant d'intégrer différents schémas d'authentification de bas niveau dans une API de haut niveau, permettant de ce fait de rendre indépendants du schéma les logiciels réclamant une authentification.

PAM est une création de Sun Microsystems et est supporté en 2006 sur les architectures Solaris, Linux, FreeBSD, NetBSD, AIX et HP-UX.

L'administrateur système peut alors définir une stratégie d'authentification sans devoir recompiler des programmes d'authentification. PAM permet de contrôler la manière dont les modules sont enfichés dans les programmes en modifiant un fichier de configuration.

Les programmes qui donnent aux utilisateurs un accès à des privilèges doivent être capables de les authentifier. Lorsque vous vous connectez sur le système, vous indiquez votre nom et votre mot de passe. Le processus de connexion vérifie que vous êtes bien la personne que vous prétendez être. Il existe d'autres formes d'authentification que l'utilisation des mots de passe, qui peuvent d'ailleurs êtres stockés sous différentes formes.

PAM s'interface entre l'utilisateur et le service demandé. Cette couche intermédiaire permet de manipuler de manière cohérente les politiques d'authentification en appelant des modules qui sont des librairies (fichiers .so)

Les modules PAM sont des bibliothèques dynamiques (par ex. pam_unix.so) fournissant les six primitives d'authentification définies dans la norme, regroupées dans quatre types :

  • Le mécanisme account fournit une seule primitive : il vérifie si le compte demandé est disponible (si le compte n'est pas arrivé à expiration, si l'utilisateur est autorisé à se connecter à cette heure de la journée, etc.).
  • Le mécanisme auth fournit deux primitives ; il assure l'authentification réelle, éventuellement en demandant et en vérifiant un mot de passe, et il définit des « certificats d'identité » tels que l'appartenance à un groupe ou des « tickets » kerberos.
  • Le mécanisme password fournit une seule primitive : il permet de mettre à jour le jeton d'authentification (en général un mot de passe), soit parce qu'il a expiré, soit parce que l'utilisateur souhaite le modifier.
  • Le mécanisme session fournit deux primitives : mise en place et fermeture de la session. Il est activé une fois qu'un utilisateur a été autorisé afin de lui permettre d'utiliser son compte. Il lui fournit certaines ressources et certains services, par exemple en montant son répertoire personnel, en rendant sa boîte aux lettres disponible, en lançant un agent ssh, etc.

Source : https://fr.wikipedia.org/wiki/Pluggable_Authentication_Modules

5.1. Fichiers de configuration des applications PAM

Les fichiers de configuration des différentes applications peut être observé :

ls -l /etc/pam.d/
total 100
-rw-r--r--. 1 root root 192  2 aoû 19:12 chfn
-rw-r--r--. 1 root root 192  2 aoû 19:12 chsh
-rw-r--r--. 1 root root 232 18 aoû  2015 config-util
-rw-r--r--. 1 root root 293 31 mar 17:09 crond
lrwxrwxrwx. 1 root root  19  9 jun 19:29 fingerprint-auth -> fingerprint-auth-ac
-rw-r--r--. 1 root root 702  9 jun 19:29 fingerprint-auth-ac
-rw-r--r--. 1 root root 796  2 aoû 19:12 login
-rw-r--r--. 1 root root 154 18 aoû  2015 other
-rw-r--r--. 1 root root 188 10 jun  2014 passwd
lrwxrwxrwx. 1 root root  16  9 jun 19:29 password-auth -> password-auth-ac
-rw-r--r--. 1 root root 974  9 jun 19:29 password-auth-ac
-rw-r--r--. 1 root root 155 23 jun 20:12 polkit-1
lrwxrwxrwx. 1 root root  12  9 jun 19:29 postlogin -> postlogin-ac
-rw-r--r--. 1 root root 330  9 jun 19:29 postlogin-ac
-rw-r--r--. 1 root root 144 10 jun  2014 ppp
-rw-r--r--. 1 root root 681  2 aoû 19:12 remote
-rw-r--r--. 1 root root 143  2 aoû 19:12 runuser
-rw-r--r--. 1 root root 138  2 aoû 19:12 runuser-l
lrwxrwxrwx. 1 root root  17  9 jun 19:29 smartcard-auth -> smartcard-auth-ac
-rw-r--r--. 1 root root 752  9 jun 19:29 smartcard-auth-ac
lrwxrwxrwx. 1 root root  25  9 jun 19:27 smtp -> /etc/alternatives/mta-pam
-rw-r--r--. 1 root root  76 10 jun  2014 smtp.postfix
-rw-r--r--. 1 root root 904 21 mar  2016 sshd
-rw-r--r--. 1 root root 540  2 aoû 19:12 su
-rw-r--r--. 1 root root 202 31 mar 19:09 sudo
-rw-r--r--. 1 root root 187 31 mar 19:09 sudo-i
-rw-r--r--. 1 root root 137  2 aoû 19:12 su-l
lrwxrwxrwx. 1 root root  14  9 jun 19:29 system-auth -> system-auth-ac
-rw-r--r--. 1 root root 974  9 jun 19:29 system-auth-ac
-rw-r--r--. 1 root root 129 15 sep 16:28 systemd-user
-rw-r--r--. 1 root root  84  6 mar  2015 vlock

Syntaxe d'un fichier de configuration

service type stratégie module arguments

Par exemple :

cat /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth       substack     system-auth
auth       include      postlogin
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
session    optional     pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    include      postlogin
-session   optional     pam_ck_connector.so
cat /etc/pam.d/passwd
#%PAM-1.0
auth       include    system-auth
account    include    system-auth
password   substack    system-auth
-password   optional    pam_gnome_keyring.so use_authtok
password   substack    postlogin
cat /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

Typiquement chaque ligne correspond à un contexte par exemple password prend en charge le changement de mot de passe, applique la stratégie requisite, sufficient puis required avec plusieurs modules et leurs paramètres.

5.2. Stratégies

Chaque ligne dispose d'une stratégie définie ou renvoit à un ensemble d'autres (include).

  • required : Tous les modules utilisant ce contrôle doivent passer avec succès pour que la vérification soit accordée. Le cas échéant l'utilisateur n'est averti qu'à la fin du traitement de la pile.
  • requisite : Comme required sauf que l'utilisateur est averti immédiatement.
  • optionnal : L'échec ou le succès de ce module importe peu et ne peut faire échouer la vérification.
  • sufficient : S'il réussi et qu'il n'y a pas de required en échec, le traitement s'arrête là. Le reste de la pile n'est alors pas traité.

5.3. Configuration des modules

Les modules se configurent dans /etc/security/ :

# ls -l /etc/security/
total 52
-rw-r--r--. 1 root root 4620 18 aoû  2015 access.conf
-rw-r--r--. 1 root root   82 18 aoû  2015 chroot.conf
drwxr-xr-x. 2 root root    6 18 aoû  2015 console.apps
-rw-r--r--. 1 root root  604 18 aoû  2015 console.handlers
-rw-r--r--. 1 root root  939 18 aoû  2015 console.perms
drwxr-xr-x. 2 root root    6 18 aoû  2015 console.perms.d
-rw-r--r--. 1 root root 3635 18 aoû  2015 group.conf
-rw-r--r--. 1 root root 2422 18 aoû  2015 limits.conf
drwxr-xr-x. 2 root root   26  9 jun 19:26 limits.d
-rw-r--r--. 1 root root 1440 18 aoû  2015 namespace.conf
drwxr-xr-x. 2 root root    6 18 aoû  2015 namespace.d
-rwxr-xr-x. 1 root root 1019 18 aoû  2015 namespace.init
-rw-------. 1 root root    0 18 aoû  2015 opasswd
-rw-r--r--. 1 root root 2972 18 aoû  2015 pam_env.conf
-rw-r--r--. 1 root root 1718  6 déc  2011 pwquality.conf
-rw-r--r--. 1 root root  419 18 aoû  2015 sepermit.conf
-rw-r--r--. 1 root root 2179 18 aoû  2015 time.conf

Comme par exemple le fichier /etc/security/pwquality.conf :

cat /etc/security/pwquality.conf
# Configuration for systemwide password quality limits
# Defaults:
#
# Number of characters in the new password that must not be present in the
# old password.
# difok = 5
#
# Minimum acceptable size for the new password (plus one if
# credits are not disabled which is the default). (See pam_cracklib manual.)
# Cannot be set to lower value than 6.
# minlen = 9
#
# The maximum credit for having digits in the new password. If less than 0
# it is the minimum number of digits in the new password.
# dcredit = 1
#
# The maximum credit for having uppercase characters in the new password.
# If less than 0 it is the minimum number of uppercase characters in the new
# password.
# ucredit = 1
#
# The maximum credit for having lowercase characters in the new password.
# If less than 0 it is the minimum number of lowercase characters in the new
# password.
# lcredit = 1
#
# The maximum credit for having other characters in the new password.
# If less than 0 it is the minimum number of other characters in the new
# password.
# ocredit = 1
#
# The minimum number of required classes of characters for the new
# password (digits, uppercase, lowercase, others).
# minclass = 0
#
# The maximum number of allowed consecutive same characters in the new password.
# The check is disabled if the value is 0.
# maxrepeat = 0
#
# The maximum number of allowed consecutive characters of the same class in the
# new password.
# The check is disabled if the value is 0.
# maxclassrepeat = 0
#
# Whether to check for the words from the passwd entry GECOS string of the user.
# The check is enabled if the value is not 0.
# gecoscheck = 0
#
# Path to the cracklib dictionaries. Default is to use the cracklib default.
# dictpath =

Pour de l'aide :

man pam_pwquality

5.4. Exercice avec check_user

L'objectif est de créer une application qui simule une connexion utilisateur :

Normalement, PAM Check_user est récupéré depuis le dossier examples des sources de PAM.

Instructions d'installation sous Centos

Prérequis

Installez les librairies PAM :

$ sudo yum install -y pam-devel

Installez les utilitaires de compilation:

$ sudo yum groupinstall -y 'Development Tools'

Récupérez les sources

Installez Git:

$ sudo yum -y install git

Clonez ce dépôt

$ git clone https://github.com/humboldtux/check_user.git /tmp/check_user

Compilation

$ cd /tmp/check_user
$ gcc -o check_user -lpam -lpam_misc -ldl check_user.c

Un binaire check_user a été créé dans le dossier courant. Vous pouvez vérifier qu'il supporte bien PAM:

$ ldd check_user

Vous pouvez ensuite copier le binaire dans un dossier de votre $PATH:

$ sudo mv check_user /usr/sbin/

Puis vérifier que le binaire est bien accessible:

$ command -v check_user

Ménage

$ cd
$ rm -rf /tmp/check_user

Sans fichier de configuration

# check_user user
Not Authenticated

Une application non définie voit son sort réglé par /etc/pam.d/other :

# cat /etc/pam.d/other
#%PAM-1.0
auth     required       pam_deny.so
account  required       pam_deny.so
password required       pam_deny.so
session  required       pam_deny.so

Création d'un fichier de configuration PAM pour checkuser

Création du fichier /etc/pam.d/check_user :

auth required pam_unix.so
account required pam_unix.so

5.5. Test de stratégies avec le module rps

Documentation rps

Instructions d'installation sous Centos 6.X+

Prérequis

Avoir installé les prérequis de la page https://github.com/humboldtux/check_user

Récupérez les sources

Clonez le dépôt

$ cd
$ git clone https://github.com/humboldtux/pam_rps /tmp/pam_rps

Compilation

$ cd /tmp/pam_rps/src/
$ gcc -fPIC -c pam_rps.c
$ gcc -shared -o pam_rps.so pam_rps.o -lpam

Installation

Un module pam_rps a été créé dans le dossier courant.

Vous pouvez copier dans le dossier des modules PAM de votre système:

$ sudo mv pam_rps.so /lib64/security/

Ainsi que la page de manuel:

$ gzip pam_rps.8.in -c | sudo tee /usr/share/man/man8/pam_rps.8.gz
$ man pam_rps

Ménage

$ cd
$ rm -rf /tmp/pam_rps

Stratégie sufficient

cat /etc/pam.d/check_user
auth sufficient pam_rps.so
auth required pam_unix.so
account required pam_unix.so
check_user user

Stratégie requisite

# cat /etc/pam.d/check_user
#auth sufficient pam_rps.so
auth requisite pam_rps.so
auth required pam_unix.so
account required pam_unix.so
check_user user

Autoriser un service

# cat /etc/pam.d/check_user
auth sufficient pam_permit.so
auth required pam_unix.so
account required pam_unix.so

Interdire un service

# cat /etc/pam.d/check_user
auth sufficient pam_deny.so
auth required pam_unix.so
account required pam_unix.so

Configuration de modules

  • /etc/security/time.conf
  • /etc/security/access.conf
  • /etc/security/limits.conf
  • /etc/security/pwquality.conf

results matching ""

    No results matching ""