Luego de haber migrado con éxito mi servidor VPN desde Debian 6 hasta OpenBSD fui por más y decidí migrar un servidor de archivos Samba.
Samba provee servicios para compartir archivos e impresoras utilizando el protocolo SMB/CIFS desarrollado por Microsoft. Esto posibilita la interoperabilidad entre sistemas Linux/Unix y Windows. Además permite integrar servidores y workstations Linux/Unix en entornos Active Directory, ya que puede funcionar tanto como Domain Controller o miembro regular de dominio.
El propósito de este artículo, es migrar un servidor de archivos Samba corriendo sombre Debian 6, hacia aun servidor OpenBSD 5.9.
Manos a la obra
El primer paso consiste en instalar Samba en el servidor OpenBSD:
# pkg_add samba
Si se desea compilar el port, es /usr/ports/net/samba/
.
Una vez instalado, se debe traer el archivo de configuración de Samba desde el servidor actual ("archivos.linuxito.com"):
# cd /etc/samba/ # mv smb.conf smb.conf.orig # scp -P 2222 sysadmin@archivos.linuxito.com:/etc/samba/smb.conf .
Luego se deben traer los archivos. Dependiendo del volumen de los datos, ésta puede ser la tarea más pesada.
En este caso se utiliza el directorio /var/samba/archivos
como directorio base donde alojar los shares de Samba. Por ende se debe traer el directorio completo, respetando los metadatos (tiempos de acceso y modificación, permisos, etc.):
# cd /var/samba/ # scp -rp -P 2222 sysadmin@archivos.linuxito.com:/var/samba/archivos .
Hasta este momento no se han agregado los usuarios Unix necesarios para mapear los usuarios Samba. Sin embargo ésto no tiene utilidad. Notar que no he utilizado un tarball para mover los archivos.
El gran inconveniente en este punto es que no es posible preservar el ownership de los archivos, pues el comando tar
de OpenBSD no lo permite (no posee la opción --same-owner
). Por ende, por más que se creen los usuarios antes de mover los archivos, no es posible preservar el ownsership. Es por eso que he utilizado directamente scp
y no un tar
(lógicamente se debe contar con un usuario que tenga acceso de lectura a todos los archivos del directorio de archivos de Samba, en este caso "sysadmin" lo tiene).
A continuación, traer la base de datos de usuarios de Samba:
# cd /var/samba/private/ # scp -P 2222 sysadmin@archivos.linuxito.com:/var/lib/samba/passdb.tdb .
Para cada usuario Samba debe existir su correspondiente usuario Unix. Si son pocos usuarios (como es este caso) es posible crearlos manualmente:
# useradd -c "Cosme Fulanito" -s /sbin/nologin cfulanito useradd: Warning: home directory `/home/cfulanito' doesn't exist, and -m was not specified
Si la base de datos posee muchos usuarios, será necesario implementar un script para crearlos de forma automática. En el servidor Linux actual es posible listar todos los usuarios Samba utilizando la herramienta pdbedit
:
root@debian:~# pdbedit -L nobody:65534:nobody cfulanito:1000:Cosme Fulanito
Lamentablemente tampoco es posible exportar e importar los permisos Unix a través de las herramientas getfacl
y seftacl
, pues OpenBSD no soporta ACLs (realmente no entiendo cómo un sistema operativo que se jacta de estar desarrollado con la seguridad en mente no soporta un concepto tan necesario para implementar mínimo privilegio como son las ACLs).
En este punto llegué a la conclusión de que, al no soportar ACLs, tal vez OpenBSD no sea el sistema operativo más adecuado para implementar un servidor de archivos (ya sea Samba, NFS u otro). En un servidor de archivos, donde se requiere autenticar una cantidad importante de usuarios y grupos, con una cierta complejidad en cuanto a permisos, es casi imprescindible el uso de ACLs.
Sería posible migrar los permisos Unix entre sistemas Linux y FreeBSD utilizando:
# getfacl -R /var/samba/archivos > permisos.acl ### En el servidor origen # setfacl -M permisos.acl /var/samba/archivos ### En el servidor destino
Sin embargo OpenBSD no soporta ACLs, tampoco permite mantener el ownership al extraer un tarball, entonces no queda otra alternativa que aplicar los permisos manualmente. Si alguien sabe cómo lograr ésto (sin implementar un script, claro está) que por favor me lo explique en los comentarios.
# ll /var/samba/archivos/ total 164 drwxr-xr-x 4 root wheel 512B May 27 11:57 . drwxr-x--- 4 root wheel 512B May 27 11:58 .. drwxrwxrwx 3 root wheel 512B May 27 11:57 Software drwxr-xr-x 2 root wheel 512B May 27 11:57 img -rwxr--r-- 1 root wheel 6.4K May 27 11:57 db.bak -rwxr--r-- 1 root wheel 6.4K May 27 11:57 db -rwxr--r-- 1 root wheel 18.9K May 27 11:57 db2.bak -rwxr--r-- 1 root wheel 18.9K May 27 11:57 db2 -rwxr-xr-x 1 root wheel 206B May 27 11:57 README.txt -rw-r--r-- 1 root wheel 16.0K May 27 11:57 egresos.xls
En este caso el servidor posee un único usuario Samba, así que no perdí el tiempo buscando soluciones y apliqué los permisos de forma manual:
# chown -R cfulanito:cfulanito /var/samba/archivos # chmod +rx /var/samba/
# ll /var/samba/archivos/ total 164 drwxr-xr-x 4 cfulanito cfulanito 512B May 30 11:14 . drwxr-xr-x 4 root wheel 512B May 27 11:58 .. drwxrwxrwx 3 cfulanito cfulanito 512B May 27 11:57 Software drwxr-xr-x 2 cfulanito cfulanito 512B May 27 11:57 img -rwxr--r-- 1 cfulanito cfulanito 6.4K May 27 11:57 db.bak -rwxr--r-- 1 cfulanito cfulanito 6.4K May 27 11:57 db -rwxr--r-- 1 cfulanito cfulanito 18.9K May 27 11:57 db2.bak -rwxrw-rw- 1 cfulanito cfulanito 19.1K May 30 11:14 db2 -rwxr-xr-x 1 cfulanito cfulanito 206B May 27 11:57 README.txt -rw-r--r-- 1 cfulanito cfulanito 16.0K May 27 11:57 egresos.xls
Antes de iniciar el servicio es necesario abrir los puertos necesarios para el funcionamiento de Samba en el firewall pf (139
y 445
):
# Permitir trafico entrante hacia los puertos 139 y 445 (Samba) pass in proto tcp from 192.168.23.0/23 to port 139 pass in proto tcp from 192.168.23.0/23 to port 445
Con esta configuración sólo se permite el acceso hacia estos puertos a los clientes dentro de la red 192.168.23.0/24
.
Finalmente, habilitar e iniciar el servicio:
# rcctl enable samba # /etc/rc.d/samba start smbd(ok) nmbd(ok)
Verificar el acceso a los shares desde un cliente:

Por último, el comando pdbedit
permite listar información detallada sobre los usuarios utilizando la opción -v
:
# pdbedit -L -v --------------- Unix username: nobody NT username: Account Flags: [U ] User SID: S-1-5-21-1234-82456345-666-501 Primary Group SID: S-1-5-21-1234-82456345-666-513 Full Name: Unprivileged user Home Directory: HomeDir Drive: (null) Logon Script: Profile Path: Domain: LINUXITO Account desc: Workstations: Munged dial: Logon time: 0 Logoff time: never Kickoff time: never Password last set: 0 Password can change: 0 Password must change: 0 Last bad password : 0 Bad password count : 0 Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF --------------- Unix username: cfulanito NT username: Account Flags: [U ] User SID: S-1-5-21-1234-82456345-666-1000 Primary Group SID: S-1-5-21-1234-82456345-666-513 Full Name: Cosme Fulanito Home Directory: \\linuxito\cfulanito HomeDir Drive: Logon Script: Profile Path: \\linuxito\cfulanito\profile Domain: DOM1 Account desc: Workstations: Munged dial: Logon time: 0 Logoff time: 9223372036854775807 seconds since the Epoch Kickoff time: 9223372036854775807 seconds since the Epoch Password last set: Thu, 04 Oct 2012 09:14:14 ART Password can change: Thu, 04 Oct 2012 09:14:14 ART Password must change: never Last bad password : 0 Bad password count : 0 Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
Verificar, en la salida de este comando, que ningún usuario registre el mensaje "Failed to find a Unix account for", lo cual indica que no se encuentra la cuenta Unix asociada al mismo.
Referencias