GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich Nicht-Superuser erlauben, jedes Dateisystem zu mounten?

Es gibt ein paar Ansätze, von denen einige größtenteils sicher sind, andere überhaupt nicht.

Der unsichere Weg

Lassen Sie jeden Benutzer mount ausführen , z. B. durch sudo. Sie könnten ihnen genauso gut Wurzel geben; das ist gleich. Der Benutzer könnte ein Dateisystem mit einer Suid-Root-Kopie von bash mounten – Ausführen, das sofort Root gibt (wahrscheinlich ohne Protokollierung, abgesehen von der Tatsache, dass mount ausgeführt wurde).

Alternativ könnte ein Benutzer sein eigenes Dateisystem auf /etc mounten , das seine/ihre eigene Kopie von /etc/shadow enthält oder /etc/sudoers , erhalten Sie dann root entweder mit su oder sudo . Oder möglicherweise bind-mount (mount --bind ) über eine dieser beiden Dateien. Oder eine neue Datei in /etc/sudoers.d .

Ähnliche Angriffe konnten über /etc/pam.d abgezogen werden und vielen anderen Orten.

Denken Sie daran, dass sich Dateisysteme nicht einmal auf einem Gerät befinden müssen, -o loop wird eine Datei einhängen, die dem Benutzer gehört (und daher geändert werden kann).

Der sicherste Weg:udisks oder ähnliches

Die verschiedenen Desktop-Umgebungen haben tatsächlich bereits Lösungen dafür entwickelt, um Benutzern das Mounten von Wechselmedien zu ermöglichen. Sie funktionieren, indem sie in einem Unterverzeichnis von /media gemountet werden nur und durch Deaktivieren der Set-User/Group-ID-Unterstützung über die Kernel-Optionen. Zu den Optionen hier gehört udisks , udisks2 , pmount , usbmount ,

Wenn Sie müssen, könnten Sie Ihr eigenes Skript schreiben, um etwas Ähnliches zu tun, und es über sudo aufrufen – aber Sie müssen beim Schreiben dieses Skripts wirklich vorsichtig sein, um keine Root-Exploits zu hinterlassen. Wenn Sie nicht möchten, dass sich Ihre Benutzer sudo merken müssen, können Sie in einem Skript so etwas tun:

#!/bin/bash
if [ $UID -ne 0 ]; then       # or `id -u`
    exec sudo -- "$0" "[email protected]"
fi

# rest of script goes here 

Der Weg, der eines Tages sicher sein wird:Benutzernamensräume

Linux-Namespaces sind eine sehr leichte Form der Virtualisierung (genauer gesagt Container). Insbesondere bei Benutzernamensräumen beliebig Benutzer auf dem System können ihre eigene Umgebung erstellen, in der sie root sind. Dies würde es ihnen ermöglichen, Dateisysteme zu mounten, außer dass dies explizit blockiert wurde, mit Ausnahme einiger weniger virtueller Dateisysteme. Irgendwann werden FUSE-Dateisysteme wahrscheinlich erlaubt sein, aber die neuesten Patches, die ich finden konnte, decken keine Blockgeräte ab, sondern nur Dinge wie sshfs.

Außerdem haben viele Distributions-Kernel (aus Sicherheitsgründen) standardmäßig nicht zugelassen, dass unprivilegierte Benutzer Benutzernamensräume verwenden; zum Beispiel hat Debian einen kernel.unprivileged_userns_clone das ist standardmäßig 0. Andere Distributionen haben ähnliche Einstellungen, wenn auch oft mit etwas anderen Namen.

Die beste mir bekannte Dokumentation über Benutzernamensräume ist ein LWN-Artikel Namespaces in operation, part 5:User namespaces.

Im Moment würde ich mit udisks2 gehen.


Sie können es tun, aber Sie müssen den Eintrag in /etc/fstab ändern entsprechend dem Dateisystem, das Sie mounten möchten, indem Sie das Flag user hinzufügen zu diesem Eintrag. Benutzer ohne Berechtigung könnten es dann mounten.

Siehe man mount für weitere Details.


Hier ist das Wiki zur Konfiguration von polkit Regeln für udisks/udisks2 um Partitionen von Nicht-Root-Gruppen (z. B. Benutzer) einzuhängen.

Speichern Sie den folgenden Code unter /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];
  }
});

Angenommen, Sie befinden sich in der Gruppe „Benutzer“ und verwenden den folgenden Befehl, um eine Partition zu mounten (kein Sudo erforderlich).

# udisks2
udisksctl mount --block-device /dev/sda1

# udisks
udisks --mount /dev/sda1

Linux
  1. So verschlüsseln Sie ein einzelnes Linux-Dateisystem

  2. Wie leitet man Befehle an ein beliebiges Terminal weiter?

  3. Wie erstelle ich eine Datei und mounte sie als Dateisystem?

  4. So mounten und unmounten Sie Dateisysteme/Partitionen unter Linux (Mount/Umount-Befehlsbeispiele)

  5. So mounten Sie ein Dateisystem automatisch mit Systemd

So mounten Sie eine NFS-Freigabe unter Linux

So mounten Sie eine ISO-Datei unter Linux

So mounten Sie ein Remote-Linux-Dateisystem mit SSHFS

So mounten Sie NFS unter Debian 11

Wie binde ich ein NTFS-Dateisystem ein, das allen Benutzern vollen Zugriff gewährt?

Wie führt man Dateisystemtests durch?