Ci sono un paio di approcci, alcuni per lo più sicuri, altri per niente.
Il modo insicuro
Consenti a qualsiasi utilizzo di eseguire mount
, ad esempio tramite sudo. Potresti anche dare loro radice; è la stessa cosa. L'utente può montare un filesystem con una copia suid root di bash
—in esecuzione che fornisce istantaneamente root (probabilmente senza alcuna registrazione, oltre al fatto che mount
è stato eseguito).
In alternativa, un utente potrebbe montare il proprio filesystem su /etc
, contenente la propria copia di /etc/shadow
o /etc/sudoers
, quindi ottenere root con su
o sudo
. O possibilmente bind-mount (mount --bind
) su uno di questi due file. O un nuovo file in /etc/sudoers.d
.
Attacchi simili potrebbero essere sferrati su /etc/pam.d
e molti altri luoghi.
Ricorda che i filesystem non devono nemmeno essere su un dispositivo, -o loop
monterà un file di proprietà (e quindi modificabile) dell'utente.
Il modo più sicuro:udisk o simili
I vari ambienti desktop in realtà hanno già costruito soluzioni a questo, per consentire agli utenti di montare supporti rimovibili. Funzionano montando in una sottodirectory di /media
solo e disattivando il supporto set-user/group-id tramite le opzioni del kernel. Le opzioni qui includono udisks
, udisks2
, pmount
, usbmount
,
Se devi, puoi scrivere il tuo script per fare qualcosa di simile e invocarlo tramite sudo, ma devi stare molto attento a scrivere questo script per non lasciare gli exploit di root. Se non vuoi che i tuoi utenti debbano ricordare sudo, puoi fare qualcosa di simile in uno script:
#!/bin/bash
if [ $UID -ne 0 ]; then # or `id -u`
exec sudo -- "$0" "[email protected]"
fi
# rest of script goes here
Il modo in cui un giorno sarà sicuro:gli spazi dei nomi degli utenti
Gli spazi dei nomi Linux sono una forma molto leggera di virtualizzazione (contenitori, per essere più specifici). In particolare, con gli spazi dei nomi utente, any l'utente sul sistema può creare il proprio ambiente in cui è root. Ciò consentirebbe loro di montare filesystem, tranne che è stato esplicitamente bloccato ad eccezione di alcuni filesystem virtuali. Alla fine, i filesystem FUSE saranno probabilmente consentiti, ma le patch più recenti che ho trovato non coprono i dispositivi a blocchi, solo cose come sshfs.
Inoltre, molti kernel distro hanno (per motivi di sicurezza) l'impostazione predefinita per non consentire agli utenti non privilegiati di utilizzare gli spazi dei nomi degli utenti; per esempio Debian ha un kernel.unprivileged_userns_clone
il valore predefinito è 0. Altre distribuzioni hanno impostazioni simili, anche se spesso con nomi leggermente diversi.
La migliore documentazione che conosco sugli spazi dei nomi degli utenti è un articolo di LWN Spazi dei nomi in funzione, parte 5:Spazi dei nomi degli utenti.
Per ora, sceglierei udisks2.
Puoi farlo, ma devi modificare la voce in /etc/fstab
corrispondente al filesystem che vuoi montare, aggiungendo il flag user
a questa voce. Gli utenti senza privilegi sarebbero quindi in grado di montarlo.
Vedi man mount
per maggiori dettagli.
Ecco il wiki per configurare polkit regole per udisks/udisks2 per montare le partizioni per gruppo non root (ad es. utenti).
Salva il codice qui sotto in /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];
}
});
Supponi di essere nel gruppo "utenti", utilizzando il seguente comando per montare una partizione (non è necessario sudo).
# udisks2
udisksctl mount --block-device /dev/sda1
# udisks
udisks --mount /dev/sda1