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