miércoles, 23 de octubre de 2019

Montar unidad samba con permisos de usuario

El escenario es el siguiente:

Queremos acceder a una carpeta compartida en un equipo con sistema operativo Windows o a un NAS o a un Linux que comparte carpetas con samba desde otro equipo que tiene Linux.
Existe un problema común en este escenario que consiste en montar la carpeta compartida en un directorio local de nuestro Linux pero los archivos pertenecen a root y es muy incómodo trabajar con ellos.
Veamos cómo solucionarlo.

Doy por supuesto que hemos dado los permisos correctos a la carpeta compartida y que hay un usuario que tiene acceso a la misma. Esto se hace en el equipo que comparte la carpeta (Windows, NAS o Linux), para este artículo supongamos que el usuario con permisos es luis y su contraseña es luis y la carpeta que compartimos es Downloads de un usuario de un equipo con Windows y cuya IP es 192.168.0.148. Luis tiene permisos de lectura y escritura en dicha carpeta. En la máquina Linux usamos al usuario pedro.


En el equipo Linux que quiere acceder a la carpeta compartida por red debemos tener instalado el smbclient para acceder a recursos de red y poder ver carpetas compartidas en red por el protocolo smb/samba.
Sino ejecutamos:

sudo apt install smbclient
para comprobar si lo tienes instalado ejecuta:

smbclient , si te salen las opciones del programa está instalado

Actualmente la mayoría de distribuciones GNU/Linux traen instalado el programa smbclient y desde su explorador de archivos se pueden gestionar los recursos compartidos en red. Incluso podremos compartir carpetas desde dicho explorador de archivos, instalando el servidor de samba que el propio programa nos recomendará al intentar compartir una carpeta.


Volvamos a nuestro escenario.
Una forma muy habitual de usar la carpeta compartida es montarla en un directorio local para hacer esto, hay que usar sudo
Ejecutamos:

sudo mount -t cifs //192.168.0.148/Downloads /home/pedro/share -o username=luis,password=luis


Nota: el directorio share debe estar creado previamente a montar la carpeta y mejor que esté vacío.

Accedemos a la carpeta montada y vemos los permisos de los archivos:

ls -l /home/pedro/share 


y al acceder a la carpeta share vemos que los archivos están montados de tal forma que pertenecen a root (lógicamente ya que es él quien la ha montado, aunque hemos accedido como usuario luis de Windows). Pero esto es muy incómodo porque el usuario que lo ha ejecutado no puede trabajar de forma cómoda con la carpeta montada. Si intenta editar un archivo le dirá que no tiene permisos.



Vamos a ver distintas alternativas que solucionan el problema:

smbclient

Con este comando podemos acceder a las carpetas compartidas por samba en la red y trabajar con ellas. Pero para trabajar con ellas abre una sesión interactiva, por lo que para incorporarlo a un script sería complicado.



En Ubuntu y derivadas: GIO

gio mount permite montar la unidad desde la línea de comandos y trabajar con ella desde el modo gráfico y desde la línea de comandos sin sesión interactiva. El problema es que sólo permite algunos comandos, por ejemplo no podremos editar con nano.

Ej.: gio mkdir smb://luis:luis@192.168.0.148/Downloads/lol
crea la carpeta lol en el recurso compartido.

Solución parcial con Mount

Como el problema son los permisos de los archivos montados, hay unas opciones del comando mount que permiten montar la carpeta con permisos para el usuario que la monta, la opción es uid=id_usuario

Nota: para saber el id del usuario basta con ejecutar el comando id

Este comando:

sudo mount -t cifs //192.168.0.148/Downloads /home/pedro/share -o username=luis,password=luis,uid=1000,gid=1000

montaría la carpeta share con permisos para el usuario con id igual a 1000 (que es el que estaba usando en ese momento, o sea, pedro) y así trabajar cómodamente.


Ahora sí se puede editar.



Esto resuelve nuestro problema pero nos deja con el inconveniente de que el usuario pedro tiene que ejecutar sudo para lo cual hay que añadirlo al archivo sudoers y por tanto el usuario puede ejecutar todas las acciones como administrador lo cual es peligroso.

Para solucionar esto podemos limitar que comandos puede ejecutar dicho usuario, lo mejor es hacerlo por grupo. Así añadiremos una línea como esta al archivo sudoers


%sambashare ALL=(ALL) /usr/bin/mount

Nota: Para comprobar que el usuario pertenece al grupo sambashare, ejecutar cat /etc/group | grep sambashare y debe aparecer la lista de usuarios de dicho grupo y ahí tiene que estar pedro .

El grupo sambashare se crea en la instalación de smbclient, y tiene a todos los usuarios que pueden acceder a recursos compartidos por samba.

Ya tendríamos limitados a los usuarios samba, sólo pueden ejecutar sudo con el comando mount
Es una buena solución pero existe otra mas elegante.

Solución definitiva



Tenemos que editar el archivo fstab (que se encarga de montar las unidades o sistemas de archivos al arrancar el equipo) y añadir una línea como la siguiente


//192.168.0.148/Downloads/ /home/pedro/share cifs noauto,users,username=luis,passwd=luis


las opciones:
- noauto para que no monte automáticamente la carpeta al iniciar el sistema
- users , para que cualquier usuario pueda montar la carpeta sin necesidad de sudo. esta es la clave de la solución a nuestro escenario.
- username y passwd, es el nombre del usuario al que se han dado permisos para acceder a la carpeta compartida.

Nota: Una vez guardado el archivo, no es necesario reiniciar el sistema para que vuelva a leer el fstab. Ejecutamos esto y lo vuelve a leer sudo mount -a 

Nota: La contraseña está en claro en el archivo (luis), esto no deberíamos hacerlo, sería mejor usar un archivo de credenciales pero no quiero complicar todavía más el artículo.

Ahora los usuarios pueden montar la carpeta compartida para ello ejecutan:

mount /home/pedro/share

Ahora si hacemos un ls -l  /home/pedro/share veremos los archivos de la carpeta compartida con permisos para pedro que era lo que queríamos.



Nota: Observa que no usamos sudo, el usuario no necesita privilegios de administrador para usar la carpeta
Nota: Se puede crear un lanzador o acceso directo en el escritorio del usuario pedro que ejecute este comando y con sólo hacer doble click montaríamos la unidad y podríamos verla en el explorador de archivos



Pues era fácil, el administrador debe añadir una línea al archivo fstab y los usuarios sólo tienen que ejecutar un comando mount cada vez que quieran usar esa carpeta compartida de la red.

Act.: Para el artículo he elegido un directorio /home/pedro/share para que cualquier usuario del grupo sambashare monte la carpeta compartida en dicho directorio. Eso no es muy correcto, sería mejor usar un directorio común a todos los usuarios de ese grupo.

Espero te haya gustado, si tienes otras ideas para contactar conmigo @mosqueteroweb en Telegram y Twitter.