¿Cómo permitir que los no superusuarios monten cualquier sistema de archivos?

48

¿Es posible permitir que algunos usuarios particulares (por ejemplo, miembros de un grupo) monten cualquier sistema de archivos sin privilegios de superusuario en Linux?

Otra pregunta podría haber sido "¿de qué manera un usuario puede dañar un sistema al montar sistemas de archivos?"

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
Quizásgvfs-mount-d /dev/sdX
KrisWebDev
relacionado unix.stackexchange.com/questions/20838/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

46

Hay un par de enfoques, algunos de ellos en su mayoría seguros, otros en absoluto.

El camino inseguro

Deje que cualquier uso se ejecute mount, por ejemplo, a través de sudo. También podrías darles raíz; es lo mismo. El usuario podría montar un sistema de archivos con una copia raíz suid de: bashejecución que proporciona instantáneamente la raíz (probablemente sin ningún registro, más allá del hecho de que mountse ejecutó).

Alternativamente, un usuario podría montar su propio sistema de archivos encima /etc, que contenga su propia copia de /etc/shadowo /etc/sudoers, y luego obtener la raíz con suo sudo. O posiblemente bind-mount ( mount --bind) sobre uno de esos dos archivos. O un nuevo archivo en /etc/sudoers.d.

Ataques similares podrían llevarse a cabo en /etc/pam.dmuchos otros lugares.

Recuerde que los sistemas de archivos ni siquiera necesitan estar en un dispositivo, -o loopmontarán un archivo que sea propiedad (y por lo tanto modificable) del usuario.

La forma más segura: udiscos o similares

Los diversos entornos de escritorio ya han creado soluciones para esto, para permitir a los usuarios montar medios extraíbles. Funcionan montando solo en un subdirectorio /mediay desactivando el soporte de set-user / group-id a través de las opciones del kernel. Opciones aquí incluyen udisks, udisks2, pmount, usbmount,

Si debe hacerlo, puede escribir su propio script para hacer algo similar e invocarlo a través de sudo, pero debe tener mucho cuidado al escribir este script para no dejar exploits raíz. Si no desea que sus usuarios tengan que recordar sudo, puede hacer algo como esto en un script:

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

# rest of script goes here 

La forma segura algún día: espacios de nombres de usuario

Los espacios de nombres de Linux son una forma muy ligera de virtualización (contenedores, para ser más específicos). En particular, con espacios de nombres de usuario, cualquier usuario en el sistema puede crear su propio entorno en el que sea root. Esto les permitiría montar sistemas de archivos, excepto que se ha bloqueado explícitamente, excepto por unos pocos sistemas de archivos virtuales. Eventualmente, los sistemas de archivos FUSE probablemente se permitirán, pero los parches más recientes que pude encontrar no cubren dispositivos de bloque, solo cosas como sshfs.

Además, muchos núcleos de distribución tienen (por razones de seguridad) el valor predeterminado de no permitir que los usuarios sin privilegios utilicen espacios de nombres de usuario; por ejemplo, Debian tiene un valor kernel.unprivileged_userns_clonepredeterminado de 0. Otras distribuciones tienen configuraciones similares, aunque a menudo con nombres ligeramente diferentes.

La mejor documentación que conozco sobre los espacios de nombres de usuarios es un artículo LWN Espacios de nombres en funcionamiento, parte 5: Espacios de nombres de usuarios .

Por ahora, iría con udisks2.

derobert
fuente
¡Gracias por tu respuesta! Por cierto, ¿crees que es seguro permitir que los usuarios del grupo mountpuedan montar sistemas de archivos como lo hace root? Leeré el documento de espacios de nombres que ha vinculado e intentaré implementar esta cosa del grupo de montaje, al menos como ejercicio.
1
@derobert, ya que estaba hablando de espacios de nombres de usuario, puede consultar el Plan 9 de Bell Labs (es el sucesor de UNIX, creado por las mismas personas). modela el árbol de archivos como un espacio de nombres por proceso (y no existe tal cosa como raíz). cosas fascinantes
Strugee
1
@derobert ¿Podemos obtener una actualización de la sección "La forma segura algún día: espacios de nombres de usuario "?
Malan
1
@malan OK, lo he actualizado. En todo caso, creo que usar espacios de nombres de usuario para esto parece estar aún más en el futuro.
derobert
1
@derobert Qué triste. Leí la respuesta, vi que era de 2015 y pensé "¡Me pregunto si tenemos esto ahora!"
malan
16

Puede hacerlo, pero debe modificar la entrada /etc/fstabcorrespondiente al sistema de archivos que desea montar, agregando la bandera usera esta entrada. Los usuarios sin privilegios podrían montarlo.

Ver man mountpara más detalles.

MBR
fuente
1
Esta es la única respuesta que puedo encontrar con google. Descubrí que en FreeBSD, uno puede permitir a los usuarios montar sistemas de archivos configurando una variable (a saber vfs.usermount). Yo quiero algo análogo a eso. Utilizo muchas unidades extraíbles con muchas particiones en cada una y sería engorroso agregar una docena o dos entradas a fstab para cada una de ellas.
Una solución fea podría ser permitir udevadministrar las entradas a medida que aparecen y desaparecen nuevos dispositivos.
Jester
No he encontrado que esto funcione en Mint o Ubuntu. Sí, la cuenta de usuario predeterminada puede montarse sin root, pero los usuarios 'estándar' / 'de escritorio' no pueden montarla.
johny por qué el
6

Aquí está la wiki para configurar las reglas de Polkit para udisks / udisks2 para montar particiones por grupo no root (por ejemplo, usuarios).

Guarde el siguiente código en /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];
  }
});

Suponga que está en el grupo "usuarios", utilizando el siguiente comando para montar una partición (no es necesario sudo).

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

# udisks
udisks --mount /dev/sda1
maullar
fuente
2
Parece el camino a seguir, pero no funcionó para mí.
Stéphane Gourichon
5

1 Mira donde funciona

En Xubuntu, funciona de inmediato para montar y expulsar almacenamiento masivo USB, particiones de disco duro, CD / DVD y probablemente más.

Supongamos que la solución elegida por Ubuntu, usando policyKit, es lo suficientemente segura.

2 Elija la parte relevante

En XFCE en Debian 8.3 necesitaba permitir al usuario montar y expulsar sistemas de archivos de Thunar sin contraseña. Lo que funcionó para mí es elegir un archivo de permiso de Ubuntu.

Agregar las siguientes líneas como raíz a un archivo llamado /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkladebería ser el truco:

[Mounting, checking, etc. of internal drives]
Identity=unix-group:admin;unix-group:sudo
Action=org.freedesktop.udisks.filesystem-*;org.freedesktop.udisks.drive-ata-smart*;org.freedesktop.udisks2.filesystem-mount-system;org.freedesktop.udisks2.encrypted-unlock-system;org.freedesktop.udisks2.filesystem-fstab;
ResultActive=yes

3 Beneficio!

(Lo que hice en realidad fue elegir un poco más del archivo con el mismo nombre en Ubuntu 16.04 y funcionó para mí. Si lo necesita, en su mayoría parece el contenido de https://gist.github.com/kafene/5b4aa4ebbd9229fa2e73 )

Stéphane Gourichon
fuente
Solo esto funciona en sistemas similares a debian, no sé por qué poner reglas en / etc / no funcionó.
Anwar
No funciona en Debian Stretch.
Philipp Ludwig
1
¡Funciona en Debian Buster en XFCE! ¡Gracias!
Maxwel Leite
3

Puede configurar sudopara permitir que un conjunto de usuarios ejecute el mountcomando.

Actualización : en cuanto a cómo puede dañar un sistema montando? Por ejemplo, puede crear un shell raíz setuid en un sistema de archivos que luego puede montar y ejecutar para obtener privilegios de root.

Bufón
fuente
He pensado en esto, pero ¿no requerirá esto que el usuario ejecute el comando sudo? Además, ¿no es el usuario root el que monta el sistema de archivos, solo detrás de escena, con este método?
Sí, necesitarían sudo y sí, se ejecutaría en nombre de root. Para resolver el primer problema, podría alias mounta sudo mounto utilizar un guión envoltorio.
Jester
Lo que me gustaría tener es montar el sistema de archivos sin la agencia del usuario raíz. Enmascarar a esta agencia con cualquier cosa no es lo que busco en absoluto.
Tenga en cuenta que incluso agregar usera fstab solo funciona porque mountes setuid root. El núcleo está buscando la raíz o la CAP_SYS_ADMINcapacidad, por lo que realmente no puede evitar involucrar a la raíz.
Jester
Puedes configurar, ¿cómo? Esto no ayuda
Nuzzolilo
0

Para responder a su pregunta entre paréntesis, dado que un sistema de archivos es un marcador de posición para los archivos, entonces un usuario puede llevar a cabo operaciones dañinas en ese sistema de archivos, como eliminar archivos.

Resumiendo las otras 2 preguntas, diré esto:

  • fstabes ideal para montar en el momento del arranque almacenamiento permanente . No es tan bueno cuando desea conectar unidades USB o montar ocasionalmente algunos recursos compartidos de red.

  • sudo mounttambién está bien si estás en sistemas ubuntu *. Sin embargo, aún deberá escribir una contraseña.

  • udev se encargará de montar cosas como memorias USB, cámaras y tarjetas flash en sistemas ubuntu * (pero no en distribuciones menos fáciles de usar como debian, slackware, etc.)

Agregaré que, históricamente, la forma unix de otorgar autoridad a algunos usuarios (o grupos) para hacer cosas es a través del sudoersarchivo.

Hay MUCHAS guías para usarlo, así que no sugeriré nada en particular. Diré que utilicé el sitio web del proyecto de documentación de Linux para conocerlo.

Además sudoers, puede montar dispositivos y recursos compartidos de forma transparente, incluso sin proporcionar una contraseña si decide hacerlo (tenga mucho cuidado al respecto).

Lo que generalmente hago en un entorno de control es que uso el sudoersarchivo para permitir a los usuarios de cierto grupo montar recursos compartidos de red de forma transparente. Así que agrego los comandos mount.nfsy mount.cifsen el archivo sudoers que permiten operaciones como "montar la carpeta de inicio del usuario desde un servidor de archivos de red, cuando el usuario inicia sesión en un terminal de cliente" y tachuelas así.

nass
fuente
1
Si está usando sudo para permitir que los usuarios monten sus carpetas de inicio al iniciar sesión, debe mirar autofs.
derobert
Los uso juntos; No pude descubrir cómo usarlo autofssolo para montarlo /home/$USERdesde el servidor de archivos, a la ubicación /home/$USER/fromFS/en la PC del cliente.
nass
0

guestmount truco de libguestfs

sudo apt-get install libguestfs-tools

# Workarounds for Ubuntu 18.04 bugs.
# https://serverfault.com/questions/246835/convert-directory-to-qemu-kvm-virtual-disk-image/916697#916697
sudo rm -rf /var/cache/.guestfs-*
echo dash | sudo tee /usr/lib/x86_64-linux-gnu/guestfs/supermin.d/zz-dash-packages
sudo chmod +r /boot/vmlinuz-*

# Create a test image.
mkdir sysroot
dd if=/dev/urandom of=sysroot/myfile bs=1024 count=1024
virt-make-fs --format=raw --type=ext2 sysroot sysroot.ext2

# Mount it, have fun, unmount!
mkdir -p mnt
# /dev/sda becuase we have a raw filesystem.
guestmount -a sysroot.ext2.qcow2 -m /dev/sda mnt
cmp sysroot/myfile mnt/myfile
guestunmount mnt

Se basa en:

  • implementación de los sistemas de archivos por parte del usuario
  • FUSIBLE

Documentos: http://libguestfs.org/guestmount.1.html

Probado en Ubuntu 18.04, libguestfs-tools 1: 1.36.13-1ubuntu3.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente