bertvv.samba
Rol de Ansible bertvv.samba
Un rol de Ansible para configurar Samba como servidor de archivos.
Debido a la falta de tiempo y recursos, he entregado el mantenimiento de este rol a @vladgh. Ya no puedo dar seguimiento a problemas y PRs, ni asegurarme de que las nuevas versiones tengan una calidad suficientemente alta para ser realmente utilizables.
- El nuevo repositorio de Github se puede encontrar aquí: https://github.com/vladgh/ansible-collection-vladgh-samba
- Página de Ansible Galaxy: https://galaxy.ansible.com/vladgh/samba
- Instalar con
ansible-galaxy collection install vladgh.samba --upgrade
Gracias a todos los que mostraron su apoyo a lo largo de los años, a todos los colaboradores y especialmente a @vladgh por ofrecerse amablemente para hacerse cargo del mantenimiento.
Las responsabilidades de este rol son:
- Instalar los paquetes necesarios
- Configurar la configuración de SELinux (cuando SELinux está activo)
- Crear directorios de compartición
- Administrar usuarios y contraseñas de Samba
- Gestionar el acceso a las comparticiones
Los siguientes elementos no son considerados preocupaciones de este rol, y debes configurarlos usando otro rol (por ejemplo, bertvv.rh-base):
- Gestionar la configuración del firewall.
- Crear usuarios del sistema. Los usuarios de Samba ya deben existir como usuarios del sistema.
¡Si te gusta/usa este rol, por favor considera darle una estrella! ¡Gracias!
CVE-2017-7494
Una vulnerabilidad de ejecución remota de código puede afectar tu instalación de Samba. Las versiones de Samba 3.5.0 y anteriores a 4.6.4 están afectadas. Si SELinux está habilitado en tu sistema, NO es vulnerable.
Este rol comprobará si la versión instalada de Samba está afectada por la vulnerabilidad y aplicará la solución propuesta: añadir nt pipe support = no
a la sección [global]
de la configuración. Ten en cuenta que esto desactiva la navegación de comparticiones por parte de los clientes de Windows.
Puedes desactivar explícitamente la solución si es necesario, configurando la variable de rol samba_mitigate_cve_2017_7494
en false
.
Más información: https://access.redhat.com/security/cve/cve-2017-7494
Requisitos
No hay requisitos específicos.
Variables del rol
Variable | Predeterminado | Comentarios |
---|---|---|
samba_apple_extensions |
no | Cuando es sí, habilita el soporte para extensiones SMB específicas de Apple. Requerido para que Time Machine funcione (ver más abajo) |
samba_create_varwww_symlinks |
falso | Cuando es cierto, se crean enlaces simbólicos en el directorio raíz web hacia las comparticiones. (var/www/ o /var/www/html , dependiendo de la plataforma) |
samba_cups_server |
localhost:631 | Valor para la opción global cups server (solo necesario cuando samba_printer_type es "cups") |
samba_domain_master |
true | Cuando es verdadero, smbd habilita la agrupación de listas de navegación a lo largo de WAN |
samba_global_include |
- | Archivo de configuración compatible con Samba con opciones que se cargarán en la sección [global] (ver más abajo) |
samba_guest_account |
- | Cuenta de invitado para usuarios desconocidos |
samba_homes_include |
- | Archivo de configuración compatible con Samba con opciones que se cargarán en la sección [homes] (ver más abajo) |
samba_interfaces |
[] | Lista de interfaces de red usadas para navegación, registro de nombres, etc. |
samba_load_homes |
falso | Cuando es cierto, los directorios de inicio de usuario son accesibles. |
samba_load_printers |
falso | Cuando es cierto, las impresoras conectadas al host son compartidas |
samba_local_master |
true | Cuando es cierto, nmbd intentará convertirse en el maestro local de la red |
samba_log |
- | Establece el archivo de registro. Si se deja indefinido, el registro se realiza a través de syslog. |
samba_log_size |
5000 | Establece el tamaño máximo del archivo de registro. |
samba_log_level |
0 | Establece el nivel de registro de Samba, 0 es el menos detallado y 10 es un montón de salida de depuración. |
samba_map_to_guest |
bad user |
Comportamiento cuando usuarios no registrados acceden a las comparticiones. |
samba_mitigate_cve_2017_7494 |
true | La mitigación de CVE-2017-7494 rompe algunos clientes, como macOS High Sierra. |
samba_netbios_name |
{{ ansible_hostname }} |
El nombre NetBIOS de este servidor. |
samba_passdb_backend |
tdbsam |
Backend de base de datos de contraseñas. |
samba_preferred_master |
true | Cuando es cierto, indica que nmbd es un navegador maestro preferido para el grupo de trabajo. |
samba_realm |
- | Nombre de dominio del realm |
samba_printer_type |
cups | valor para la opción global printing y printcap name |
samba_security |
user |
Configuración de seguridad de Samba |
samba_server_max_protocol |
- | Especifica una versión máxima de protocolo ofrecida por el servidor. |
samba_server_min_protocol |
- | Especifica una versión mínima de protocolo ofrecida por el servidor. |
samba_server_string |
fileserver %m |
Cadena de comentarios para el servidor. |
samba_shares_root |
/srv/shares |
Se crean directorios para las comparticiones bajo este directorio. |
samba_shares |
[] | Lista de diccionarios que contienen definiciones de compartición. Ver abajo para más detalles. |
samba_users |
[] | Lista de diccionarios que definen usuarios que pueden acceder a las comparticiones. |
samba_wins_support |
true | Cuando es cierto, Samba funcionará como servidor WINS |
samba_workgroup |
WORKGROUP |
Nombre del grupo de trabajo del servidor. |
Definiendo usuarios
Para permitir que los usuarios accedan a las comparticiones, necesitan obtener una contraseña específicamente para Samba:
samba_users:
- name: alice
password: ecila
- name: bob
password: bob
- name: charlie
password: eilrahc
Desafortunadamente, las contraseñas deben estar en texto plano por ahora. Además, ten en cuenta que este rol no cambiará la contraseña de un usuario existente.
¡Estos usuarios ya deben tener una cuenta en el host! Crear usuarios del sistema no es una preocupación de este rol, así que debes hacerlo por separado. Una posibilidad es mi rol bertvv.rh-base. Un ejemplo:
rhbase_users:
- name: alice
comment: 'Alice'
password: !!
shell: /sbin/nologin
groups:
[...]
Este usuario no tiene permitido iniciar sesión en el sistema (por ejemplo, con SSH) y solo tendría acceso a las comparticiones de Samba.
Definiendo comparticiones
Definir comparticiones de Samba y configurar el control de acceso puede ser complicado, ya que implica no solo obtener la configuración de Samba correcta, sino también los permisos de usuario y archivo, y la configuración de SELinux. Este rol intenta simplificar el proceso.
Para especificar una compartición, debes darle al menos un nombre:
samba_shares:
- name: readonlyshare
Esto creará una compartición con solo acceso de lectura para los usuarios registrados. Los invitados no podrán ver el contenido de la compartición.
Una buena forma de configurar el acceso de escritura para una compartición es crear un grupo de usuarios del sistema, agregar usuarios a ese grupo y asegurarte de que tengan acceso de escritura al directorio de la compartición. Este rol asume que los grupos ya están configurados y los usuarios son miembros de los grupos que controlan el acceso de escritura. Supongamos que tienes dos usuarios jack
y teach
, miembros del grupo pirates
. Esta definición de compartición les dará acceso tanto de lectura como de escritura a los pirates
:
samba_shares:
- name: piratecove
comment: 'Un lugar para que los piratas se reúnan'
group: pirates
write_list: +pirates
Los invitados no tienen acceso a esta compartición, los usuarios registrados pueden leer. Puedes ajustar aún más el control de acceso. El acceso de lectura puede ser extendido a los invitados (agregando public: yes
) o restringido a usuarios o grupos específicos (agregando valid_users: +pirates
). El acceso de escritura puede ser restringido a piratas individuales (por ejemplo, write_list: jack
). Los archivos añadidos a la compartición se agregarán al grupo especificado y el acceso de escritura del grupo se otorgará de forma predeterminada.
Este es un ejemplo de configurar múltiples módulos de objetos VFS para compartir un volumen de glusterfs. Las opciones del módulo de objetos VFS son opcionales. Los módulos de objetos VFS necesarios deben estar presentes/instalados fuera de este rol. En este caso, samba-glusterfs fue instalado en CentOS. Consulta la documentación de Samba para saber cómo instalar o cuáles son los módulos de objetos VFS predeterminados.
samba_shares:
- name: gluster-app_deploys
comment: 'Para la compartición Samba del volumen app_deploys'
vfs_objects:
- name: audit
options:
- name: facility
value: LOCAL1
- name: priority
value: NOTICE
- name: glusterfs
options:
- name: volume
value: app_deploys
- name: logfile
value: /var/log/samba/glusterfs-app_deploys.%M.log
- name: loglevel
value: 7
path: /
read_only: no
guest_ok: yes
write_list: tomcat
group: tomcat
A continuación, se muestra una visión completa de las opciones de compartición. Solo name
es requerido; el resto es opcional.
Opción | Predeterminado | Comentario |
---|---|---|
browseable |
- | Controla si esta compartición aparece en el explorador de archivos. |
comment |
- | Una cadena de comentarios para la compartición. |
create_mode |
0664 |
Consulta la documentación de Samba para más detalles. |
directory_mode |
0775 |
Consulta la documentación de Samba para más detalles. |
include_file |
- | Archivo de configuración compatible con Samba con opciones que se incluirán para esta compartición (ver abajo). |
force_create_mode |
0664 |
Consulta la documentación de Samba para más detalles. |
force_directory_mode |
0775 |
Consulta la documentación de Samba para más detalles. |
group |
users |
El grupo de usuarios se agregará a los archivos en la compartición. |
guest_ok |
- | Permitir acceso de invitado. |
name (requerido) |
- | El nombre de la compartición. |
owner |
root |
Establece el propietario del directorio. |
path |
/{{samba_shares_root}}/{{name}} | La ruta al directorio de la compartición. |
public |
no |
Controla el acceso de lectura para usuarios invitados. |
setype |
samba_share_t |
El tipo SELinux del directorio de la compartición |
valid_users |
- | Controla el acceso de lectura para usuarios registrados. Usa la sintaxis de la opción correspondiente de Samba. |
vfs_objects |
- | Consulta la documentación de Samba para más detalles. |
writable |
- | Escribible para invitados. |
write_list |
- | Controla el acceso de escritura para usuarios registrados. Usa la sintaxis de la opción correspondiente de Samba. |
Los valores para valid_users
y write_list
deben ser una lista separados por comas de usuarios. Los nombres precedidos con +
o @
se interpretan como grupos. La documentación de la configuración de Samba tiene más detalles sobre estas opciones.
Agregar archivos de configuración arbitrarios
Puedes agregar configuraciones que no están soportadas por este rol directamente a través de archivos de configuración personalizados que se incluirán desde el archivo de configuración principal. Hay tres tipos de archivos de inclusión: para la sección global, para la sección de inicio y para comparticiones individuales. Coloca tus archivos de configuración personalizados en un subdirectorio templates
, relativo a la ubicación de tu libro de jugadas maestro. Luego, especifícalos en las variables samba_global_include
, samba_homes_include
, o include_file
en la definición de samba_shares
.
Tus archivos de configuración personalizados se consideran plantillas Jinja, por lo que puedes usar variables de Ansible dentro de ellos. Los archivos de configuración serán validados para asegurar que son sintácticamente correctos.
Por ejemplo, para incluir templates/global-include.conf
, establece:
samba_global_include: global-include.conf
Ten en cuenta que no es necesario especificar el directorio templates/
.
Igualmente, para incluir templates/piratecove-include.conf
, específico para la compartición piratecove
(ver el ejemplo arriba), establece:
samba_shares:
- name: piratecove
comment: 'Un lugar para que los piratas se reúnan'
group: pirates
write_list: +pirates
include_file: piratecove-include.conf
El libro de jugadas de prueba tiene algunos ejemplos. Los archivos de configuración personalizados se pueden encontrar en la rama docker-tests.
Dependencias
No hay dependencias.
Ejemplo de libro de jugadas
Consulta el libro de jugadas de prueba.
Pruebas
Este rol se prueba usando Ansible Molecule. Las pruebas se lanzan automáticamente en Travis CI después de cada commit y PR.
Esta configuración de Molecule:
- Ejecuta Yamllint y Ansible Lint
- Crea un contenedor Docker
- Ejecuta una verificación de sintaxis
- Aplica el rol con un libro de jugadas de prueba
- Ejecuta pruebas de aceptación con BATS
Este proceso se repite para las distribuciones de Linux soportadas.
Entorno de prueba local
Si deseas configurar un entorno de prueba local, puedes usar esta configuración reproducible basada en Vagrant+VirtualBox: https://github.com/bertvv/ansible-testenv. Pasos para instalar las herramientas necesarias manualmente:
- Docker, BATS y smbclient deben estar instalados en tu máquina (se asume que estás usando Linux). No deberían estar en ejecución contenedores Docker cuando inicies la prueba.
- Como recomienda Molecule, crea un entorno virtual de Python.
- Instala las herramientas de software
python3 -m pip install molecule docker yamllint ansible-lint
. - Navega a la raíz del directorio del rol y ejecuta
molecule test
.
Molecule elimina automáticamente los contenedores después de una prueba. Si deseas verificar los contenedores tú mismo, ejecuta molecule converge
seguido de molecule login --host HOSTNAME
.
Los contenedores Docker se basan en imágenes creadas por Jeff Geerling, específicamente para pruebas de Ansible (busca imágenes nombradas geerlingguy/docker-DISTRO-ansible
). Puedes usar cualquiera de sus imágenes, pero solo se admiten las distribuciones mencionadas en meta/main.yml.
La configuración predeterminada iniciará un contenedor CentOS 7. Elige otra distribución configurando la variable MOLECULE_DISTRO
con el comando, por ejemplo:
MOLECULE_DISTRO=debian9 molecule test
o
MOLECULE_DISTRO=debian9 molecule converge
Puedes ejecutar las pruebas de aceptación en ambos servidores con molecule verify
o manualmente con
SUT_IP=172.17.0.2 bats molecule/default/files/samba.bats
Necesitas inicializar la variable SUT_IP
, la dirección IP del sistema bajo prueba. El servidor, smb1
, debería tener la dirección IP 172.17.0.2.
Contribuir
Se agradecen problemas, solicitudes de características e ideas, y pueden ser publicadas en la sección de Problemas.
Las solicitudes de extracción también son muy bienvenidas. La mejor manera de enviar una PR es creando primero un fork de este proyecto de Github, luego crear una rama de tema para el cambio sugerido y subir esa rama a tu propio fork. Github puede luego crear fácilmente un PR basado en esa rama. ¡No olvides añadirte a la lista de colaboradores a continuación!
Licencia
Licencia BSD de 2 cláusulas, consulta LICENSE.md.
Colaboradores
Este rol solo pudo haber sido realizado gracias a las contribuciones de las personas enumeradas a continuación. Si tienes una idea para mejorarlo aún más, ¡no dudes en participar!
Se pueden publicar problemas, solicitudes de características, ideas, sugerencias, etc. en la sección de Problemas.
Las solicitudes de extracción también son muy bienvenidas. Por favor, crea una rama de tema para tus cambios propuestos. Si no lo haces, esto creará conflictos en tu fork después de la fusión. No dudes en añadirte a la lista de colaboradores a continuación en tu PR.
Ben Tomasik,
Bengt Giger,
Bert Van Vreckem (mantenedor),
Birgit Croux,
DarkStar1973,
George Hartzell,
Ian Young,
Jonas Heinrich,
Jonathan Underwood,
Karl Goetz,
morbidick,
Paul Montero,
Slavek Jurkowski,
Sven Eeckeman,
Tiemo Kieft,
Tobias Wolter,
Tomohiko Ozawa,
Robin Ophalvens.
This role installs and configures Samba as a file server. Deprecated, please use vladgh.samba instead.
ansible-galaxy install bertvv.samba