Exemple : service de cachet serveur
Système de contrôle d’accès discrétionnaire (DAC) où tout est fichier :
u)g)o)r)w)x)getfacl / setfacl)httpd:http) et PHP FPM (php:http)srw-rw---- 1 httpd http 0 5 mars 16:21 /run/php-fpm.sock
-r-------- 1 php http 3272 13 févr. 2021 /etc/myapp/privkey.pem
ls -lR /srv/partage
drwxrwx---+ 7 root secretariat 4096 15 janv. 2019 Secrétariat
/srv/partage/Secrétariat
total 38
drwxrwx-w- 2 root secretariat 4096 15 janv. 2019 Numérisation
getfacl /srv/partage/Secrétariat
# file: srv/partage/Secrétariat
# owner: root
# group: secretariat
user::rwx
group::rwx
other::---
user:photocopieur:--x
DAC souffre de nombreuses limitations :
Si un programme en UID 0 est compromis, le système entier est compromis
Security-Enhanced Linux apporte un système de contrôle d’accès mandataire (MAC) où le noyau applique une politique de contrôle complémentaire.
SELinux utilise des contextes de sécurité composés :
_u, propriétaire du contexte)_r)_t).Le contexte d’un objet peut être vu avec ls -Z :
drwxr-xr-x root root system_u:object_r:etc_t /etc
Écrire une politique de sécurité est difficile. Certaines distributions appliquent par défaut une politique SELinux, comme RHEL qui se base sur le FHS.
chroot / jailchroot (appel système et commande) simule une autre racine à l’intérieur du système de fichiers
/, /dev, /proc, /sys…), et d’exposer les biliothèques nécessairesCAP_SYS_CHROOT), mais utiliser root ne respecte pas les moindre privilèges ( setuid)chroot(2))chroot / jailjail est une alternative plus robuste sous FreeBSD avec :
jail, jls et jexec)Un jail a aussi son propre environnement réseau (nom d’hôte et adresse IP.)
Faute de mieux, on a le programme firejail sous Linux, utilisant les namespaces et seccomp-bpf
Pour faire simple, jail = chroot en moins pire. Le mieux est quand même d’utiliser des mécanismes modernes comme les namespaces qui ont été conçus à cet effet et sont bien plus robustes
firejail permet historiquement d’isoler le navigateur web, qui dispose notamment d’accès au système de fichiers, pour ainsi éviter (par exemple) l’aspiration de fichiers personnels depuis un site web indélicat.
setuid et setgidCes deux appels systèmes changent l’utilisateur et le groupe principal du processus :
fait par la plupart des services sérieux lancés en root
sinon, écrire un service systemd adapté (systemd.exec(5))
y dédier un compte de service spécifique
y dédier un groupe spécifique à un ensemble de services
(cf. exemple ACL)
Pour limiter les privilèges requis sur certaines actions sensibles, Linux propose les capabilities(7)
seccomp(-bpf)À l’origine, seccomp(2) est un appel système pour jeter ses droits et se restreindre à la manipulation de fichiers déjà ouverts (SECCOMP_SET_MODE_STRICT).
Effectuer un appel système autre que exit, sigreturn, read ou write conduit à se faire tuer par le noyau.
Le mode filtre Berkley Packet Filter (SECCOMP_SET_MODE_FILTER) permet de préciser la liste des appels systèmes autorisés.
seccomp-bpf a ainsi été particulièrement utilisé par Chromium OS dont le code source peut servir de référence d’implémentation.
La fonctionnalité Linux des Control groups (cgroups(7)) permet de :
systemd-cgtop)Ils sont présentés à l’utilisateur comme un simple système de fichiers monté (/sys/fs/cgroup) : tout est fichier.
systemd crée par défaut un cgroup sous system.slice pour chaque service ( systemd-cgls).
Les (*_)namespaces(7) permettent de cloisonner les applications sur plusieurs types de ressources :
| Type | Fonctionnalité |
|---|---|
| Mount | Isolation des points de montagechroot en beaucoup mieux |
| UTS | Isolation du nom d’hôte et de domaine |
| IPC | Isolation des communications interprocessus (IPC System V, files de messages POSIX) |
| User | Isolation des identifiants utilisateurs et des groupes Permet d’avoir un UID 0 sans être vraiment privilégié |
| PID | Isolation des identifiants des processus |
| Network | Isolation des ressources réseau (interfaces, ports…) |
| Cgroup | Isolation des Cgroups |
| Time | Isolation des horloges système |
Avec les fonctionnalités précédentes, il est possible sur un même système hôte (noyau) :
Ces conteneurs peuvent être gérés :
lxc-*)
systemd-nspawn / systemd-machined (machinectl)Voir aussi les Recommandations pour la mise en place de cloisonnement système, ANSSI
user_namespaces…)Lorsqu’une segmentation plus importante ou des fonctionnalités spécifiques du noyau sont requises (comme le filtrage réseau), l’isolation par conteneurs ne suffit plus.
On peut alors employer la virtualisation où un hyperviseur (comme KVM, VirtualBox, Xen ou VMware) émule ou partage les ressources physiques (CPU, mémoire, stockage, I/O) de l’hôte.
Le matériel doit être configuré pour supporter la virtualisation (bits Intel VT-x ou AMD-V)
Voir aussi les Problématiques de sécurité associées à la virtualisation des systèmes d’information, ANSSI
Pour afficher ou masquer ces notes à côté des slides, ajouter dans l'URL :
Actions clavier :