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

The Official Samba 3.5.x HOWTO and Reference Guide - Chapter 16. File, Directory, and Share Access Controls - Part III. Advanced Configuration - File and Directory Access Control


Tal vez pueda interesarte


Compartí este artículo