En el artículo anterior expliqué cómo crear y configurar jails en FreeBSD. Ahora, contando con nuestros primeros jails en funcionamiento, llega el momento de instalar y configurar un servicio para que corra dentro de un jail: en este caso, Samba.

Este artículo explica cómo instalar y configurar Samba dentro de un jail en un sistema FreeBSD 10.



Tal como se explica en el artículo Jails en FreeBSD, el comando jls permite listar jails en ejecución:

root@j05:~ # jls
   JID  IP Address       Hostname            Path
     1  192.168.177.214  smb.linuxito.com    /zjails/jail/compartido
     2  192.168.177.215  datos.linuxito.com  /zjails/jail/datos
root@j05:~ # jexec 1
root@smb:/ #

En este caso se desea instalar un servidor Samba en el jail "smb.linuxito.com", por ende se utiliza jexec para pasar abrir una sesión dentro de dicho jail.

Instalación de Samba dentro de un jail

La instalación se realiza desde paquete (si se desea compilar, utilizar portmaster, el port es "net/samba44" para la versión 4.4). La primera vez que se corre pkg, se instala automáticamente:

root@smb:/ # pkg search samba
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]:

Actualmente es posible escoger entre las versiones

root@smb:/ # pkg search samba | grep server
samba36-3.6.25_3               Free SMB and CIFS client and server for Unix
samba42-4.2.14                 Free SMB/CIFS and AD/DC server and client for Unix
samba43-4.3.13_1               Free SMB/CIFS and AD/DC server and client for Unix
samba44-4.4.8_1                Free SMB/CIFS and AD/DC server and client for Unix

La última versión disponible es la 4.4. Para instalar dicha versión desde paquete, ejecutar:

# pkg install samba44

Creación de un usuario local para acceso mediante Samba

Luego de instalar Samba, es necesario agregar un usuario Unix con el cual conectarse a los shares. Recurrir a la herramienta adduser, la cual es muy amigable pues es interactiva y no requiere parámetros:

root@smb:/ # adduser
Username: compartido
Full name: Usuario para acceso SMB
Uid (Leave empty for default): 
Login group [compartido]: 
Login group is compartido. Invite compartido into other groups? []: 
Login class [default]: 
Shell (sh csh tcsh nologin) [sh]: nologin
Home directory [/home/compartido]: 
Home directory permissions (Leave empty for default): 
Use password-based authentication? [yes]: 
Use an empty password? (yes/no) [no]: 
Use a random password? (yes/no) [no]: yes
Lock out the account after creation? [no]: 
Username   : compartido
Password   : <random>
Full Name  : Usuario para acceso SMB
Uid        : 1001
Class      : 
Groups     : compartido 
Home       : /home/compartido
Home Mode  : 
Shell      : /usr/sbin/nologin
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (compartido) to the user database.
adduser: INFO: Password for (compartido) is: ****
Add another user? (yes/no): no
Goodbye!

Las opciones dependen para cada caso particular. En este ejemplo se deshabilita el acceso a una consola/terminal ("nologin") pues será utilizado sólo para autenticación. Además se genera una contraseña aleatoria para dicho usuario.

El siguiente paso consiste en crear una contraseña de Samba para este usuario:

root@smb:/ # pdbedit -a -u compartido

Luego, se crea un directorio en el $HOME del nuevo usuario, donde alojar un directorio que será compartido poor la red a través del protocolo Samba:

root@smb:/ # mkdir /home/compartido/samba
root@smb:/ # chown compartido /home/compartido/samba
root@smb:/ # ls -ld /home/compartido/samba/
drwxr-xr-x  2 compartido  compartido  2 Feb 13 14:33 /home/compartido/samba/
root@smb:/ # echo "Hola mundo!" > /home/compartido/samba/prueba

Además se crea un archivo de prueba.

Configuración de Samba

Ahora sólo resta configurar el servicio Samba. Editar el archivo smb4.conf:

root@smb:/ # nano /usr/local/etc/smb4.conf

Las opciones globales dependen de cada servidor y red. Lo más importante es que el grupo de trabajo es "Linuxito", se utiliza el nivel de seguridad user, no se comparten impresoras, y sólo se permite el acceso a hosts en la misma subred:

[global]
   workgroup = Linuxito
   server string = %h server
   wins support = no
   dns proxy = no
   interfaces = 127.0.0.0/8 192.168.177.214/32 em0
   bind interfaces only = yes
   log file = /var/log/samba/log.%m
   max log size = 1000
   syslog = 0
   security = user
   encrypt passwords = true
   passdb backend = tdbsam
   obey pam restrictions = yes
   map to guest = bad user
   load printers = no
   socket options = TCP_NODELAY
   hosts deny = ALL
   hosts allow = 192.168.177.0/24

[compartido]
   comment = Directorio compartido
   path = /home/compartido/samba
   read only = no
   browseable = no
   guest ok = no
   nt acl support = yes

Luego de la sección global se define el share "compartido", el cual apunta al directorio creado anteriormente (/home/compartido/samba). Para el mismo, se habilita el acceso de escritura (siempre que el sistema de archivos subyacente lo permita) y se impide el acceso para el usuario "invitado".

Guardar los cambios en la configuración del servidor Samba y reinicar el servicio:

root@smb:/ # service samba_server start
Performing sanity check on Samba configuration: OK
Starting nmbd.
Starting smbd.

Al ejecutar ps, se observan los procesos de Samba corriendo en el jail:

root@smb:/ # ps aux
USER     PID %CPU %MEM    VSZ   RSS TT  STAT STARTED    TIME COMMAND
root     775  0.0  0.0  14520   584  -  SsJ  Fri01PM 0:00.83 /usr/sbin/syslogd -s
root     846  0.0  0.0  61312   476  -  IsJ  Fri01PM 0:00.00 /usr/sbin/sshd
root     850  0.0  0.0  16624   532  -  SsJ  Fri01PM 0:02.91 /usr/sbin/cron -s
root   39910  0.0  0.7 237844 13760  -  SsJ   2:38PM 0:00.01 /usr/local/sbin/nmbd --daemon --configfile=/usr/local/etc/
root   39914  0.0  1.0 306896 20872  -  SsJ   2:38PM 0:00.04 /usr/local/sbin/smbd --daemon --configfile=/usr/local/etc/
root   39916  0.0  0.9 305012 18236  -  IJ    2:38PM 0:00.00 /usr/local/sbin/smbd --daemon --configfile=/usr/local/etc/
root   39917  0.0  0.9 305004 18096  -  IJ    2:38PM 0:00.00 /usr/local/sbin/smbd --daemon --configfile=/usr/local/etc/
root   39918  0.0  1.0 307420 20920  -  IJ    2:38PM 0:00.00 /usr/local/sbin/smbd --daemon --configfile=/usr/local/etc/
nobody 39919  0.0  1.1 315748 22220  -  SJ    2:38PM 0:00.02 /usr/local/sbin/smbd --daemon --configfile=/usr/local/etc/
root   39921  0.0  0.2  23600  3224  0  SJ    2:39PM 0:00.02 /bin/csh -i
root   39924  0.0  0.1  18768  2076  0  R+J   2:39PM 0:00.00 ps aux

Además, con la herramienta netstat es posible verificar qué puertos TCP y UDP han sido abiertos:

root@smb:/ # netstat -anp tcp
netstat: kvm not available: /dev/mem: No such file or directory
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address          Foreign Address        (state)
tcp4       0      0 192.168.177.214.139     *.*                    LISTEN
tcp4       0      0 192.168.177.214.445     *.*                    LISTEN
tcp4       0      0 192.168.177.214.22      *.*                    LISTEN
root@smb:/ # netstat -anp udp
netstat: kvm not available: /dev/mem: No such file or directory
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address          Foreign Address        (state)
udp4       0      0 192.168.177.214.138     *.*
udp4       0      0 192.168.177.214.138     *.*
udp4       0      0 192.168.177.214.137     *.*
udp4       0      0 192.168.177.214.137     *.*
udp4       0      0 192.168.177.214.138     *.*
udp4       0      0 192.168.177.214.137     *.*
udp4       0      0 192.168.177.214.514     *.*

Tal como se observa en las salidas de netstat, es necesario abrir los puertos TCP 139 (NETBIOS Session Service) y 445 (Microsoft Directory Services), y los puertos UDP 137 (NETBIOS Name Service) y 138 (NETBIOS Datagram Service) en el firewall del host (para la dirección IP correspondiente al jail). Cabe recordar que no se puede configurar un firewall dentro de un jail, pues no se tiene acceso al kernel. Por ello, se utiliza el mismo firewall del host. La configuración depende del firewall utilizado (pf, ipfw, ipf).

(El puerto UDP 514 corresponde al servicio syslogd.)

Verificación

Finalmente, es posible comprobar el correcto funcionamiento del servidor de archivos desde cualquier cliente Windows/Linux/Unix. En este ejemplo, se accede al recurso compartido mediante el protocolo Samba desde un cliente FreeBSD.

Crear un punto de montaje:

root@hal9000:/usr/home/emi # mkdir /mnt/test

Montar el directorio compartido utilizando el comando mount_smbfs:

root@hal9000:/usr/home/emi # mount_smbfs -I smb.linuxito.com //compartido@smb/compartido /mnt/test/
Password:

Al momento de montar, solicita la contraseña para el usuario "compartido".

Verificar el acceso:

root@hal9000:/usr/home/emi # mount | grep smb
//COMPARTIDO@SMB/COMPARTIDO on /mnt/test (smbfs)
root@hal9000:/usr/home/emi # cat /mnt/test/prueba 
Hola mundo!

No olvidar verificar el acceso de escritura.

Referencias

man jls
man jexec
man pkg
man adduser
man pdbedit
man samba
man smb.conf
man mount_smbfs


Tal vez pueda interesarte



Compartí este artículo y dejá tu comentario