Il existe plusieurs approches, certaines pour la plupart sécurisées, d'autres pas du tout.
La manière non sécurisée
Laissez toute utilisation exécuter mount
, par exemple via sudo. Vous pourriez aussi bien leur donner de la racine; c'est la même chose. L'utilisateur peut monter un système de fichiers avec une copie racine suid de bash
- exécution qui donne instantanément root (probablement sans aucune journalisation, au-delà du fait que mount
a été exécuté).
Alternativement, un utilisateur peut monter son propre système de fichiers sur /etc
, contenant sa propre copie de /etc/shadow
ou /etc/sudoers
, puis obtenez root avec soit su
ou sudo
. Ou éventuellement bind-mount (mount --bind
) sur l'un de ces deux fichiers. Ou un nouveau fichier en /etc/sudoers.d
.
Des attaques similaires pourraient être lancées sur /etc/pam.d
et bien d'autres endroits.
N'oubliez pas que les systèmes de fichiers n'ont même pas besoin d'être sur un appareil, -o loop
montera un fichier appartenant (et donc modifiable) à l'utilisateur.
Le moyen le plus sécurisé :udisks ou similaire
Les différents environnements de bureau ont en fait déjà construit des solutions à cela, pour permettre aux utilisateurs de monter des supports amovibles. Ils fonctionnent en se montant dans un sous-répertoire de /media
uniquement et en désactivant la prise en charge de set-user/group-id via les options du noyau. Les options ici incluent udisks
, udisks2
, pmount
, usbmount
,
Si vous le devez, vous pouvez écrire votre propre script pour faire quelque chose de similaire et l'invoquer via sudo, mais vous devez être très prudent en écrivant ce script pour ne pas laisser d'exploits root. Si vous ne voulez pas que vos utilisateurs aient à se souvenir de sudo, vous pouvez faire quelque chose comme ceci dans un script :
#!/bin/bash
if [ $UID -ne 0 ]; then # or `id -u`
exec sudo -- "$0" "[email protected]"
fi
# rest of script goes here
La méthode qui sera un jour sécurisée :les espaces de noms d'utilisateurs
Les espaces de noms Linux sont une forme très légère de virtualisation (les conteneurs, pour être plus précis). En particulier, avec les espaces de noms d'utilisateurs, any l'utilisateur sur le système peut créer son propre environnement dans lequel il est root. Cela leur permettrait de monter des systèmes de fichiers, sauf que cela a été explicitement bloqué, à l'exception de quelques systèmes de fichiers virtuels. Finalement, les systèmes de fichiers FUSE seront probablement autorisés, mais les correctifs les plus récents que j'ai pu trouver ne couvrent pas les périphériques de bloc, seulement des choses comme sshfs.
De plus, de nombreux noyaux de distribution ont (pour des raisons de sécurité) par défaut interdit aux utilisateurs non privilégiés d'utiliser les espaces de noms d'utilisateurs ; par exemple Debian a un kernel.unprivileged_userns_clone
qui par défaut est 0. D'autres distributions ont des paramètres similaires, bien que souvent avec des noms légèrement différents.
La meilleure documentation que je connaisse sur les espaces de noms d'utilisateurs est un article de LWN Namespaces in operation, part 5 :User namespaces.
Pour l'instant, j'irais avec udisks2.
Vous pouvez le faire, mais vous devez modifier l'entrée dans /etc/fstab
correspondant au système de fichiers que vous souhaitez monter, en ajoutant le drapeau user
à cette entrée. Les utilisateurs non privilégiés pourraient alors le monter.
Voir man mount
pour plus de détails.
Voici le wiki pour configurer polkit règles pour udisks/udisks2 afin de monter des partitions par groupe non root (par exemple, les utilisateurs).
Enregistrez le code ci-dessous dans /etc/polkit-1/rules.d/50-udisks.rules
polkit.addRule(function(action, subject) {
var YES = polkit.Result.YES;
var permission = {
// only required for udisks1:
"org.freedesktop.udisks.filesystem-mount": YES,
"org.freedesktop.udisks.filesystem-mount-system-internal": YES,
"org.freedesktop.udisks.luks-unlock": YES,
"org.freedesktop.udisks.drive-eject": YES,
"org.freedesktop.udisks.drive-detach": YES,
// only required for udisks2:
"org.freedesktop.udisks2.filesystem-mount": YES,
"org.freedesktop.udisks2.filesystem-mount-system": YES,
"org.freedesktop.udisks2.encrypted-unlock": YES,
"org.freedesktop.udisks2.eject-media": YES,
"org.freedesktop.udisks2.power-off-drive": YES,
// required for udisks2 if using udiskie from another seat (e.g. systemd):
"org.freedesktop.udisks2.filesystem-mount-other-seat": YES,
"org.freedesktop.udisks2.encrypted-unlock-other-seat": YES,
"org.freedesktop.udisks2.eject-media-other-seat": YES,
"org.freedesktop.udisks2.power-off-drive-other-seat": YES
};
if (subject.isInGroup("users")) {
return permission[action.id];
}
});
Supposons que vous êtes dans le groupe "utilisateurs", en utilisant la commande suivante pour monter une partition (pas besoin de sudo).
# udisks2
udisksctl mount --block-device /dev/sda1
# udisks
udisks --mount /dev/sda1