Montar shares SMB/CIFS + Automontar shares SMB/CIFS en redes kerberizadas
Si son seguidores del blog, saben que utilizo un GNU/Linux unido a un dominio AD desde hace tiempo. Algo que siempre estuve por configurar es el automontaje de los shares para no tener que escribir las direcciones una y otra vez. Hoy llegó el momento =D
A continuación describiré un poco cómo acceder y montar shares SMB en GNU/Linux y luego les mostraré cómo hacer para que un share se monte automáticamente al inicio de sesión, utilizando el ticket kerberos que nos entrega el controlador de dominio en el login.


Montar shares

Para los que trabajan con GNU/Linux es muy común acceder sistemas de archivos Windows a través del protocolo SMB (CIFS es el nombre actual del protocolo). Samba posee una excelente compatibilidad con el protocolo y provee diversas herramientas para el acceso.
Una vez que Samba está instalado, acceder un servidor de archivos es tan simple como escribir la siguiente URL en su navegador de archivos favorito (Dolphin, Nautilus, Krusader, etc):
  smb://server1.ejemplo.com/
donde server1.ejemplo.com es el nombre del servidor.
En una red hogareña, sin AD, la autenticación con el servidor se realiza utilizando el viejo NTLM, con lo cual, al tipear la URL anterior, el navegador les pedirá que ingresen las credenciales de un usuario válido (desde la visión del servidor).

Otra forma de acceder a los archivos es montar el sistema remoto en un directorio local. El paquete smbfs provee soporte para el sistema de archivos smb/cifs, el cual se puede utilizar en el comando mount de la siguiente manera:
mount -t cifs //server1.ejemplo.com /media/samba -o user=pepe
Al ejecutar el comando anterior, aparecerá un prompt solicitando el password del usuario en cuestión.
Por supuesto que también es posible agregar una entrada en /etc/fstab para hacer el montaje más rápido y/o automático. La entrada en fstab correspondiente al ejemplo anterior es la siguiente:
//server1.ejemplo.com    /media/samba    cifs    user,auto,username=pepe    0    0
donde las opciones son:
user -> para que lo pueda montar un usuario común (sin ser root)
auto -> debe montarse automáticamente al iniciar el sistema
username=pepe -> especifica el nombre del usuario a utilizar
Claro que al intentar montar el sistema solicitará el password correspondiente. Hay dos formas de evitar que esto pase, aunque ninguna es muy atractiva:
- utilizar la opción password=
- crear un archivo (por ejemplo /home/pepe/cred.smb) que contenga las líneas:
      username=pepe
      password=elpassword
y luego utilizar la opción credentials=/home/pepe/cred.smb en fstab.
Digo poco atractivas porque en ambos casos es necesario colocar las credenciales en texto plano. Con la segunda opción se evita que otro usuario abra el fstab y vea el password, pero igualmente no es del todo satisfactoria.


Automontar shares en redes corporativas

En una red corporativa con servidores Windows, es muy probable que se utilice Active Directory. La autenticación en estos entornos se lleva a cabo utilizando kerberos, aunque por defecto (al menos hasta Windows 2003) los servidores de archivos soportan NTLM por compatibilidad. Incluso en redes corporativas con servicios integrados con kerberos provistos por servidores GNU/Linux se está utilizando bastante Samba como protocolo para la compartición de archivos, lo que hace doblemente atractiva la siguiente explicación.

Ahora, gracias a Samba y PAM, es posible mejorar el esquema de clientes Linux dentro de la corporación. Algo muy común es que los usuarios de workstations con Windows tengan mapeos automáticos al realizar un login, como por ejemplo el disco F:\ apuntando al servidor server1.ejemplo.com. Un cliente GNU/Linux puede tener esta misma comodidad, con mapeos automáticos de shares de red al árbol de directorios de su máquina.

La siguiente configuración tiene en cuenta que la workstation GNU/Linux autentica usuarios contra Domain Controllers (o servidores kerberos de GNU/Linux) con PAM y kerberos, como se explicó en el artículo Configurar PAM para utilizar kerberos.
Utilizando el entorno descripto en el artículo, los usuarios contarán con un ticket kerberos luego de que se autentiquen. Como Samba es compatible con kerberos, no es necesario seguir ingresando las credenciales al montar o acceder un share, Samba hará la autenticación de forma transparente utilizando el ticket correspondiente.

No existe una alternativa segura para hacer que un usuario monte un share que no figure en el fstab, sólo un administrador puede hacerlo. Claro que no sirve colocar una entrada en fstab que intente montar automáticamente un share, dado que se hará a nombre de root y root no posee un ticket kerberos... es decir, access denied!

La solución entonces consta de dos pasos. Agregar la línea en el fstab, y luego configurar kde, gnome, o el desktop que utilicen, para que realice el mount cuando el usuario se loguea.
Teniendo en cuenta el ejemplo con el que venimos trabajando, deberá agregarse la siguiente línea en fstab para utilizar kerberos:
//server1.ejemplo.com    /media/samba    cifs    user,noauto,sec=krb5    0    0
las opciones relevantes aquí son:
noauto -> no montar automáticamente
sec=krb5 -> indica a samba que utilice kerberos en la autenticación
Para el automontaje se crea un script en bash (o su shell favorito) con el siguiente contenido:
#!/bin/bash
mount //server1.ejemplo.com
y se coloca en el directorio correspondiente (dándole ejecución con chmod +x) para que desktop lo ejecute al iniciar la sesión del usuario. Por ejemplo:
- en kde deberá colocarse en $HOME/.kde/Autostart/
- en gnome debe abrirse el "Gnome Control Center" ir a "aplicaciones al inicio" y agregar la ruta al script.
De esta forma, una vez que el usuario se validó contra kerberos, el sistema automáticamente montará sus shares en el lugar correspondiente, una verdadera comodidad, y un paso más para extender el uso de GNU/Linux en las corporaciones =)

El siguiente paso es agregar un script que desmonte los shares una vez que el usuario ejecuta logout, porque si la misma workstation es compartida por diferentes usuarios, dejar el acceso a los shares de otro usuario no es buena idea. Esta tarea debe realizarse con un script similar al anterior:
#!/bin/bash
umount //server1.ejemplo.com
y colocarlo en el directorio correspondiente al desktop que utilicen. Por ejemplo:
- en kde existe el directorio $HOME/.kde/shutdow destinado a tal fin
- en gnome ??? (avísenme si lo encuentran)

To Do

Como bien dije, no es posible que los usuarios monten los shares que no se encuentren definidos en fstab. Es decir, en fstab deben figurar todos los shares disponibles para los usuarios de una dada workstation, porque sino no podrán montarlos. Esto es un inconveniente bastante molesto, dado que si el usuario puede acceder a los shares, no tiene mucho sentido restringir para que no pueda montarlo en el árbol de directorios local.
Existe, claro, una forma indirecta y que en general es considerada insegura. La misma se basa en otorgar setuid root al ejecutable mount.cifs. Con esto, cuando un usuario ejecute el comando mount.cifs, éste se ejecuta con permisos de root, y por consiguiente puede montar los shares, aunque en este caso, probablemente no funcione el ticket kerberos (no lo probé). Queda en ustedes si se deciden por esta alternativa.


Referencia

- Samba HowTo: Mount a CIFS Network Share [Mapped Drive] in openSUSE

7 comentarios:

Al-Serv dijo...

Hola! tengo un problema con captar unidades cifs desde fstab

todo se mapea bien pero si desde la maquina 1 abro un archivo, el mismo archivo en la maquina 2 no lo puedo abrir

alguna idea??

d3m4s1@d0v1v0 dijo...

Windows no te deja abrir el mismo archivo desde dos máquinas con permisos de escritura, tal vez eso te esté dando problemas.
Probablemente el programa con el que estás abriendo el archivo intente abrirlo en modo escritura y ahí te da error.
Si montas el share en una de las máquinas en modo sólo lectura (umask=222), podés abrir el archivo desde ambas?

Al-Serv dijo...

te comento, tengo una red que conviven maquinas windows y maquinas linux, abro un archivo de una maquina windows y desde otro windows lo abres se abre en modo solo lectura (Que es correcto ) pero si hago lo mismo ni que sea entre 2 maquinas linux que abren a trabes de cifs el primero que abre el archivo puede abrirlo pero el segundo no lo abre ni siquiera como solo lectura! entiendes el concepto?? el umask=222 ya que entonces, todos los archivos se abren como solo lectura!

lo curioso es que si lo abro manualmente desde " Lugares -> conectar con el servidor " y lo hago desde allí, si que me abre como solo lectura y todo funciona como quiero, pero desde cifs no se comporta igual!

d3m4s1@d0v1v0 dijo...

Todos los comandos usan la misma librería para el acceso a los shares. Habría que ver qué hace de diferente al montarlo. Por ahora no se me ocurre que otra cosa puede estar sucediendo, no lo he probado.

Al-Serv dijo...

pues seria de muy gran ayuda ya que queremos dar carpetazo a windows em mi empresa pero durante un tiempo tienen que convivir y si en la primera prueba ya fallo..... espero que me puedas ayudar haciendo tus test :)

@sapamipir dijo...

excelente
tomándolo como base he logrado hacer lo siguiente para automatizarlo un poco mas.
Teniendo en cuenta que en mi trabajo existen dos turnos, por lo cual se debe cargar una carpeta de red para cada uno de los usuarios que usan un mismo equipo, distro kubuntu 12.04, conexión con dominio likewiseopen, domino samba 4, las carpetas a conectar se encuentran en //adcd/nombreusuario.


en la ruta /etc/kde4/kdm se encuentran los archivos encargados del inicio, cierre y configuración de kde de los cuales nos enfocaremos en Xstartup (todos estos archivos corren con permisos de root antes del inicio de sesión y envía información a kdm del usuario que la inicia)

modificar la primer linea del archivo Xstartup de #/!/bin/sh a #!/bin/bash esto para evitar problemas con los comodines \n \a \t al dejarlo por default estas letras desaparecen de los nombres de los usuarios que se guardan en el archivo temporal.
agregar las siguientes lineas bajo la linea /sbin/initctl -q emit desktop-session-start DISPLAY_MANAGER=kdm USER=$USER

######################################################################################################################
#ejecuta consulta de estado al dominio si la respuesta es verdadera ejecuta sentencias de conexión de unidad de lo contrario inicia normalmente
# esto ya que tenemos equipo que no autentican con el dominio
lw-get-status |grep -i 'dominio.red'
if [ $? = 0 ];then
# la variable USER nos muesta dominio\usuario mediante el comando sed eliminamos el prefijo midominio\
# dejando solo el nombre de usuario cada punto corresponde a una letra, esto retorna el nombre del usuario
# el cual se guarda en un archivo
echo $USER|sed 's/^......//'>/home/temp.txt
# hace un backup del archivo nfstab y borra las lineas que contengan //adcd/ de anteriores usuario
sed -i.bak '/adcd/d' /etc/fstab
#carga la informacion del txt con el usuario de dominio en la variable
usuario=$(< /home/temp.txt)
#se agrega la linea con en la ultima linea de /etc/fstab
echo "//adcd/"$usuario" /media/samba smbfs user,noauto,sec=krb5 0 0" >> /etc/fstab
fi

estaré pendiente de cualquier comentario y modificación , dejo pendiente la salida de sesión en la cual estoy trabajando

Anónimo dijo...

hijo de la gran puta de que coño va esto?

Publicar un comentario