Samba proporciona software de servidor y cliente para permitir el intercambio de archivos entre máquinas Linux y Windows. Instalarlo y configurarlo en RHEL 8 / CentOS 8 es bastante fácil. Siga leyendo para aprender cómo compartir un directorio con samba y cómo aplicarle el contexto SELinux apropiado.
Requisitos de software y convenciones de la línea de comandos de Linux Categoría | Requisitos, convenciones o versión de software utilizada |
Sistema | Red Hat Enterprise Linux 8 |
Software | Paquetes Samba, coreutils y policycoreutils-python-utils |
Otro | Permiso para ejecutar el comando con privilegios de root. |
Convenciones | # – requiere que los comandos de Linux dados se ejecuten con privilegios de root, ya sea directamente como usuario root o mediante el uso de sudo comando $ – requiere que los comandos de Linux dados se ejecuten como un usuario normal sin privilegios |
Presentamos Samba
Samba, como se indica en la página de inicio del proyecto, es un software de código abierto, publicado bajo la GPL
licencia, que nos permite compartir archivos y servicios de impresión usando SMB/CIFS
protocolo.
El proyecto proporciona software de servidor y cliente para permitir la interoperabilidad con máquinas Windows, lo que representa la solución ideal en entornos mixtos. En este tutorial, veremos cómo instalar Samba en Red Hat Enterprise Linux 8, cómo configurar un recurso compartido de samba, cómo configurar el firewall para permitir el acceso a los recursos compartidos y cómo aplicar el contexto SELinux apropiado.
Instalación
Lo primero que tenemos que hacer es instalar samba en nuestra máquina. El paquete y las bibliotecas necesarias están disponibles en los repositorios oficiales de RHEL 8 / CentOS 8, por lo que podemos instalarlos simplemente usando yum o dnf. En esta versión de RHEL/CentOS, el primer comando es solo un "enlace" al segundo:
$ sudo dnf install samba samba-client
El paquete samba-client no es estrictamente necesario, pero las utilidades que proporciona pueden ser útiles. Una vez instalados los paquetes, tenemos que iniciar y habilitar el smb
y el nmb
demonios en el arranque. El primero es el demonio que se encarga de realizar las transferencias reales y las operaciones de uso compartido, mientras que el segundo realiza el NetBIOS
Resoluciones de nombres, lo que permite que los recursos aparezcan al navegar por la red en Windows. Ahora podemos habilitar e iniciar ambos servicios systemd con solo un comando:
$ sudo systemctl enable --now {smb,nmb}
Configuración del cortafuegos
El siguiente paso es la configuración del cortafuegos. Debemos abrir los puertos apropiados, para que los recursos compartidos de samba puedan ser accesibles desde otras máquinas. El software de administración de firewall predeterminado en RHEL 8 / CentOS 8 es firewalld.
Por suerte para nosotros, no hay necesidad de abrir puertos manualmente:todo lo que tenemos que hacer es agregar el servicio “samba” a nuestra zona. Un "servicio" es solo una abstracción que nos permite permitir el tráfico a través de todos los puertos que necesita un servicio, haciendo referencia al nombre del servicio, en lugar de tener que configurar (y recordar) cada puerto que utiliza. En caso de que queramos recopilar información sobre un “servicio”, podemos ejecutar:
$ sudo firewall-cmd --info-service samba
samba
ports: 137/udp 138/udp 139/tcp 445/tcp
protocols:
source-ports:
modules: netbios-ns
destination:
Del resultado del comando vemos que el servicio permitirá el tráfico a través de los puertos 173/udp, 138/udp, 139/tcp y 445/tcp. Para agregar permanentemente el servicio a la zona predeterminada, podemos ejecutar:
$ sudo firewall-cmd --permanent --add-service=samba
Al ejecutar el comando usamos --permanent
switch para que nuestro cambio sea persistente. También asumimos el default
zona a estar en uso. Si quisiéramos especificar otra zona para aplicar la acción, habríamos usado --zone
y proporcionó el nombre de la zona como argumento (por ejemplo, –zone=external). Dado que nuestro cambio está configurado para ser permanente, para que sea efectivo, debemos volver a cargar la configuración del firewall:
$ sudo firewall-cmd --reload
Podemos verificar que el servicio “samba” ahora es parte de nuestra zona, ejecutando:
$ sudo firewall-cmd --list-services
cockpit dhcpv6-client http samba ssh
Nuevamente, si no se especifica ninguna zona, el comando se aplica a la zona predeterminada.
Configuración de un directorio compartido al que pueden acceder los invitados
Digamos que queremos compartir un directorio a través de samba, y queremos permitir el libre acceso a este directorio a los usuarios invitados, sin que tengan que proporcionar una contraseña. Para obtener el resultado deseado, debemos hacer algunos cambios en el /etc/samba/smb.conf
archivo, y agregue una "estrofa" para nuestra parte. Abra el archivo con su editor favorito y en el [global]
sección, agregue el texto resaltado:
[global]
workgroup = SAMBA
security = user
passdb backend = tdbsam
printing = cups
printcap name = cups
load printers = yes
cups options = raw
map to guest = bad user
El map to guest = bad user
instrucción, asignará los intentos de inicio de sesión con nombres de usuario incorrectos al usuario invitado predeterminado, que, de forma predeterminada, es nobody
. Esto es necesario para permitir el acceso anónimo sin tener que proporcionar una contraseña.
Después de este cambio, debemos agregar una nueva estrofa dedicada a nuestro recurso compartido al final del archivo. Nombraremos el recurso compartido "linuxconfig":
[linuxconfig]
path = /mnt/shared
guest only = yes
Con la configuración anterior, declaramos que queremos compartir el contenido de /mnt/shared
directorio, sin necesidad de autenticación de usuario. Esta configuración es obviamente arriesgada, y aquí se informa solo como un ejemplo:en un escenario del mundo real, es posible que desee al menos denegar el acceso de escritura a los invitados (puede hacerlo agregando writeable = no
instrucción). Para que los cambios sean efectivos, debemos reiniciar los demonios:
$ sudo systemctl restart {smb,nmb}
Configurar un recurso compartido al que solo puedan acceder los usuarios registrados
Para proteger el acceso a un recurso con una solicitud de inicio de sesión, cuando samba se ejecuta como un servidor independiente, debemos agregar un usuario existente a la base de datos de samba. Las credenciales de este usuario serán necesarias para acceder al directorio compartido. Por razones de seguridad, es una buena práctica crear un usuario dedicado a la tarea, omitiendo la creación de su directorio de inicio y asignándole un shell falso:
$ sudo adduser -M sambauser -s /sbin/nologin
El -M
la opción pasada al comando es la forma abreviada de --no-create-home
, que se explica por sí mismo; el -s
opción, en su lugar, especifiquemos un shell, en este caso uno inválido a propósito:/sbin/nologin
. En este punto, el usuario ni siquiera necesita tener una contraseña configurada en nuestro sistema.
Una vez que se crea el usuario, debemos agregarlo a la base de datos de samba:podemos realizar la operación usando el smbpasswd
comando:
$ sudo smbpasswd -a sambauser
New SMB password:
Retype new SMB password:
Added user sambauser.
Después de ejecutar el comando, se nos solicita que asignemos una contraseña para el usuario y también que la confirmemos:esta contraseña solo será válida en el contexto de samba, no tiene nada que ver con la cuenta de usuario en nuestro sistema. Para restringir el recurso compartido que creamos anteriormente, tenemos que hacer un pequeño cambio en la sección dedicada:
[linuxconfig]
path = /mnt/shared
guest ok = no
Podemos verificar que nuestra configuración es válida usando el testparm
comando:
$ testparm
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Processing section "[homes]"
Processing section "[printers]"
Processing section "[print$]"
Processing section "[linuxconfig]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Nuevamente, debemos reiniciar el smb
y nmb
demonios para que nuestros cambios sean efectivos. Ahora solo se podrá acceder al directorio compartido después de proporcionar las credenciales correctas.
Configurar SELinux para samba
SELinux a menudo se ve como una complicación y se desactiva de inmediato. Esto no es necesario:solo debemos aprender a configurarlo y aprovechar la mejora en seguridad que proporciona. Para que nuestro recurso compartido de samba funcione cuando SELinux está en modo de "aplicación", debemos asignar el contexto apropiado a nuestro directorio y archivos compartidos:
$ sudo chcon -R -t samba_share_t /mnt/shared
En el ejemplo anterior, usamos el chcon
comando con -t
opción, para cambiar el TYPE
sección del contexto de SELinux a samba_share_t
. También usamos el -R
cambiar para hacer que el comando sea recursivo. Este cambio sobrevivirá a un reinicio, pero no a un reetiquetado del sistema si existe una política predeterminada para nuestro directorio y archivos, porque en tal caso se volvería a aplicar la configuración predeterminada.
Si queremos que nuestro cambio sobreviva a un evento de reetiquetado, debemos agregar nuestra regla a la política. Podemos hacer esto usando el semanage
comando:
$ sudo semanage fcontext -a -t samba_share_t "/mnt/shared(/.*)?"
Ya que usamos el (/.*)?
regex, la regla se aplicará a todo el contenido del directorio "compartido" y al propio directorio. Podemos verificar que nuestra regla se haya agregado a la política enumerando las etiquetas en uso en nuestro sistema:
$ sudo semanage fcontext -l | grep /mnt/shared
/mnt/shared(/.*)? all files system_u:object_r:samba_share_t:s0
Ahora deberíamos tener una configuración de samba que funcione. Para modificar aún más la configuración de samba, es posible que también necesitemos manipular los valores booleanos de SELinux. Por ejemplo, al agregar usuarios existentes a samba, para permitir que se compartan sus directorios de inicio, debemos habilitar el booleano dedicado de SELinux. Para listar todos los booleanos relacionados con samba, podemos ejecutar:
$ sudo semanage boolean -l|grep samba
samba_create_home_dirs (off , off) Allow samba to create home dirs
samba_domain_controller (off , off) Allow samba to domain controller
samba_enable_home_dirs (off , off) Allow samba to enable home dirs
samba_export_all_ro (off , off) Allow samba to export all ro
samba_export_all_rw (off , off) Allow samba to export all rw
samba_load_libgfapi (off , off) Allow samba to load libgfapi
samba_portmapper (off , off) Allow samba to portmapper
samba_run_unconfined (off , off) Allow samba to run unconfined
samba_share_fusefs (off , off) Allow samba to share fusefs
samba_share_nfs (off , off) Allow samba to share nfs
sanlock_use_samba (off , off) Allow sanlock to use samba
tmpreaper_use_samba (off , off) Allow tmpreaper to use samba
use_samba_home_dirs (off , off) Allow use to samba home dirs
virt_use_samba (off , off) Allow virt to use samba
En el resultado anterior, la segunda columna indica el valor actual del booleano, mientras que la tercera indica el valor predeterminado (ambos están desactivados, en este caso). El booleano que queremos activar, para habilitar el uso compartido de directorios de inicio, es samba_enable_home_dirs
. Podemos realizar la operación usando el setsebool
comando:
$ sudo setsebool samba_enable_home_dirs=1
Conclusiones
En este tutorial vimos cómo instalar samba en un sistema RHEL 8 / CentOS 8. También vimos cómo compartir un directorio, permitiendo el acceso a invitados o restringiéndolo a usuarios autenticados. También vimos cómo configurar el firewall para que el recurso compartido sea accesible desde otras máquinas en la red.
Finalmente, vimos cómo realizar los cambios necesarios para tener una configuración de samba que funcione con SELinux en modo de "aplicación". Si está interesado en SELinux, también puede leer nuestro artículo sobre el tema.