GNU/Linux >> Tutoriels Linux >  >> Linux

Comment autoriser les non-superutilisateurs à monter n'importe quel système de fichiers ?

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

Linux
  1. Comment faire monter un système de fichiers lors de la connexion de l'utilisateur ?

  2. Comment créer un fichier et le monter en tant que système de fichiers ?

  3. Comment enregistrer le type de système de fichiers FUSE avec mount(8) et fstab ?

  4. comment faire des tests de système de fichiers?

  5. Comment monter un appareil sous Linux ?

Comment monter un partage NFS sous Linux

Comment monter un fichier ISO sur Linux

Comment chiffrer un seul système de fichiers Linux

Comment monter un système de fichiers Linux distant à l'aide de SSHFS

Comment monter NFS sur Debian 11

Comment monter un système de fichiers NTFS, permettant à tous les utilisateurs un accès complet ?