materials

Samba

Introducción

Samba es una implementación en software libre del protocolo de red SMB/CIFS de Microsoft para la compartición de ficheros e impresoras en redes Windows. Desde la versión 3 de Samba además de proporcionar servicios de impresión y compartición de ficheros para clientes Windows, puede gestionar un dominio de Windows Server NT4 como DC (Domain Controller) o como miembro del dominio. A partir de Samba 4 también puede actuar como un controlador de dominio de un dominio Active Directory.

Samba funciona en la mayoría de sistemas UNIX y derivados como GNU/Linux, BSD o Mac OS X. Normalmente se utiliza para:

Nosotros vamos a utilizar Samba 4 para crear y administrar un dominio Active Directory en el cual validaremos a los usuarios, compartiremos carpetas e impresoras y estableceremos directivas.

Algunos de los protocolos y servicios que utiliza Samba son:

Instalación y configuración del servidor

El paquete a instalar en el servidor es el paquete samba (si el servidor es CentOS tenemos que instalar samba4). Podéis encontrar más información de como instalar Samba en diferentes distribuciones en la web oficial del proyecto Samba.

Para añadir los clientes al dominio también necesitaremos tener instalado el paquete winbind.

Para saber saber qué versión de samba tenemos instalada ejecutamos:

  samba -V

El protocolo se controla por dos demonios o servicios:

Además Samba4 incluye el servicio samba-ad-dc (Samba Active Directory Domain Controller) que por defecto está deshabilitado y que sustituye a los anteriores en dominios Active Directory.

La configuración del servicio se hace en el fichero /etc/samba/smb.conf.

Creación del dominio

El primer paso es hacer la provisión de nuestro dominio con el comando samba-tool. Para que funcione correctamente tenemos que eliminar previamente el fichero del configuración de Samba (o mejor, cambiarle el nombre). Para crear el dominio ejecutamos el comando:

  samba-tool domain provision --use-rfc2307 --interactive

La opción use-rfc2307 permite a Samba guardar atributos POSIX de los usuarios y crear la información NIS para gestionarlos en GNU/Linux y será útil si vamos a tener equipos GNU/Linux en el dominio.

Lo que nos preguntará este comando es:

Samba crear dominio

También se puede ejecutar el comando poniéndole todas las opciones en vez de poner --interactive:

samba-tool domain provision --realm cipfpbatoi.lan --domain CIPFPBATOI --adminpass P@ssw0rd --server-role=dc --use-rfc2307

En este caso tendremos que editar después el fichero de configuración de Samba para indicar cuál será el reenviador de DNS.

Si todo funciona correctamente se creará el nuevo dominio:

Dominio creado

Ahora tenemos que cambiar la configuración de la red para poner como dns-nameservers nuestro servidor y añadir en dns-search nuestro dominio. Si nuestro servidor usa ifupdown haremos:

Configurar la red

Y si usa netplan:

Configurar la red netplan

Tras recargar la red comprobamos que nuestro equipo sabe resolver tanto el dominio ldap como el servidor. Si nuestro sistema usa systemd-resolved no resolverá el dominio y tenemos que hacer las configuraciones adicionales que se indican en el siguiente apartado para desactivar ese servicio.

Ya tenemos el dominio configurado y podemos añadir nuestros clientes Windows exactamente como se hace para añadirlos a un dominio creado con Windows Server. Recordad que el nombre del administrador de nuestro dominio es Administrator y no Administrador.

Sin embargo para que Windows se comunique con el servidor y pueda crearse la cuenta del equipo en el dominio debemos haber instalado en el servidor el paquete winbind (y reiniciar el servidor). Si no lo tenemos al añadir el cliente al dominio se nos pide las credenciales de quien nos puede añadir al dominio (y se validan correctamente en el servidor) pero luego aparece un error diciendo que el recurso ya no está disponible.

Si añadimos al fichero de configuración de Samba (/etc/samba/smb.conf) en la sección [global] la línea

allow dns updates = nonsecure and secure

permitirá a los clientes registrarse en el DNS cuando se añaden al dominio.

Siempre que modifiquemos el fichero de configuración de samba tenemos que recargar los datos con el comando:

smbcontrol all reload-config

Para añadir clientes GNU/Linux se hace igual que para añadirlos al Active Directory creado con un Windows Server.

Es importante que la hora sea la correcta tanto en el servidor como en el cliente para que Kerberos funcione adecuadamente. Para asegurarnos de ello podemos instalar el servicio NTP (el paquete se llama ntp) que coge la hora de Internet. Una vez instalado toma la hora por defecto de los servidores de hora de Ubuntu pero podemos indicarle otros servidores de hora.

Configuración adicional en sistemas con systemd-resolved

Las distribuciones Ubuntu 17.10 y posteriores utilizan un servicio denominado systemd-resolved para resolver los nombres de dominio que utiliza una caché que optimiza la resolución de nombres. En ellas cuando miramos su DNS nos dice que és la 127.0.0.1:53 (es el puerto que usa este servicio).

Esto que es muy útil en una máquina cliente, causa problemas en el servidor porque interfiere con el DNS interno de Samba por lo que vamos a desactivarlo después de configurar el dominio.

Los pasos a realizar son los siguientes:

  1. Paramos y deshabilitamos (para que no se inicie de nuevo al arrancar el servidor) el servicio systemd-resolved:
    systemctl stop systemd-resolved
    systemctl disable systemd-resolved
    
  2. Eliminamos resolv.conf (que ahora no es un fichero sino un enlace al fichero de systemd-resolved) y lo creamos nuevo. En él escribimos el DNS 127.0.0.1 (para que resuelva el DNS de Samba) y el nombre del dominio (para que resuelve el nombre de nuestro servidor aunque no pongamos su nombre completo, con dominio):
    rm /etc/resolv.conf
    nano /etc/resolv.conf
    

Y en él escribimos

search cipfpbatoi.lan
nameserver 127.0.0.1

Activación del Active DIrectory

Al instalar Samba se configuran los servicios que hemos visto para compartir carpetas en la red con el protocolo CIFS/SMB pero no el servicio que gestiona el Active Directory. Para activarlo haremos:

  1. Paramos y deshabilitamos (para que no se iniciem de nuevo al arrancar el servidor) los servicios de samba (smbd, nmbd y winbind):
    systemctl stop smbd nmbd winbind
    systemctl disable smbd nmbd winbind
    
  2. Activamos y habilitamos el servicio de controlador de dominio de Samba:
    systemctl unmask samba-ad-dc
    systemctl enable samba-ad-dc
    

Tras reiniciar el servidor comprobaremos que el servicio samba-ad-dc funciona correctamente con:

systemctl status samba-ad-dc

Configurar ufw

Si tenemos activado el Firewall debemos abrir los puertos que utiliza el dominio de Samba para que el cliente pueda acceder al mismo (de hecho no funciona ni el comando nslookup porque el puerto 53 está bloqueado como el resto).

Por lo tanto tenemos que abrir en el firewall los puertos que vayamos a necesitar. Para abrir un puerto en los protocolos TCP y UDP ejecutamos:

ufw allow num_puerto

Para abrir un puerto sólo en TCP o en UDP hacemos igual pero con /TCP o /UPD:

ufw allow num_puerto/udp

Para abrir un rango de puertos se separan por “:” y se tiene que indicar el protocolo. Por ejemplo para abrir los puertos del 20 al 25 TCP:

ufw allow 20:25/tcp

Para cerrar puertos en vez de allow ponemos deny y para ver todos los puertos abiertos hacemos:

ufw status

Podemos quitar una regla que hemos puesto previamente con delete y la regla a eliminar:

ufw delete allow 20:25/tcp

Por último podemos reiniciar el firewall y dejarlo cómo al principio (sin ningún puerto abierto y deshabilitado) con:

ufw reset

Los puertos que utiliza samba y que tenemos que abrir en ufw son:

Service Port Protocol
DNS * 53 tcp/udp
Kerberos 88 tcp/udp
End Point Mapper (DCE/RPC Locator Service) 135 tcp
NetBIOS Name Service 137 udp
NetBIOS Datagram 138 udp
NetBIOS Session 139 tcp
LDAP 389 tcp/udp
SMB over TCP 445 tcp
Kerberos kpasswd 464 tcp/udp
LDAPS ** 636 tcp
Dynamic RPC Ports *** 49152-65535 tcp
Global Catalog 3268 tcp
Global Catalog SSL ** 3269 tcp

Como son muchos podemos crear un script donde los anotamos y así sólo tenemos que ejecutar el script o modificarlo cuando lo necesitemos.

Crear el dominio en un servidor DNS

Si queremos que nuestro servidor además de hacer de Controlador del Dominio sea también un servidor DNS con bind tenemos que instalar el paquete bind9 y configurarlo.

Cuando creamos el dominio (con samba-tool domain provision) a la hora de escoger el DNS pondremos BIND_DLZ (en mayúsculas) en lugar de SAMBA_INTERNAL.

Después de crearse el dominio tenemos que configurar diversas cosas en algunos ficheros de bind:

Añadiremos al final la línea:

include "/var/lib/samba/private/named.conf";

Eso incluye en BIND la configuración de Samba.

Añadimos al final (pero dentro de las llaves) la línea:

tkey-gssapi-keytab "/var/lib/samba/private/dns.keytab";

Eso permitirá a Samba añadir registros al DNS cuando se añadan clientes al dominio.

Si en este fichero tenemos ya una definición de zona de nuestro dominio (por ejemplo si estaba configurado antes con SAMBA_INTERNAL) tenemos que quitarla porque la añadirá Samba automáticamente.

Finalmente reiniciamos el servicio BIND:

systemctl restart bind9

Com ya dijimos, conviene añadir en /etc/samba/smb.conf en la sección global la opción

allow dns updates = nonsecure and secure

para permitir que se registren en el DNS los clientes al ser añadidos al dominio.

Ya debería funcionar el DNS y podemos continuar con la configuración del dominio como se ha explicado en el capítulo anterior.

Fuentes:

Samba4 en CentOS

Red Hat no proporciona el servicio de Samba4 que permite implementar un Active Directory y en vez de Samba4 apuesta por FreeIPA para la administración de identidades.

Si queremos instalar Samba4 tenemos que descargarnos el código fuente de samba y compilarlo nosotros en nuestro servidor. Los pasos a hacer son los siguientes:

1.- Añadimos nuestro servidor a hosts.

Editamos /etc/hosts y añadimos una línea con nuestra IP y el nombre del el nuestro servidor, con y sin dominio, por ejemplo:

192.168.100.1 srvCentos srvCentos.acmé.lan

2.- Descargamos las herramientas necesarias.

Para poder descargar y compilar samba necesitaremos instalar wget, gcc, perl, python-devel, gnutls-devel, libacl-devel, openldap-devel y pam-devel. Además instalaremos los paquetes bind-utils (incluye los comandos nslookup, host y dig), krb5-workstation (para usar kerberos y el comando kinit), cups-devel (para tener el servicio CUPS). Con esto tendríamos que tener suficiente para compilar Samba.

En la página oficial de Samba nos dicen que los paquetes a instalar son:

yum groups install bind-utils docbook-style-xsl gcc gdb krb5-workstation libsemanage-python libxslt perl perl-ExtUtils-MakeMaker perl-Parse-Yapp perl-Test-Base pkgconfig policycoreutils-python python-crypto gnutls-devel gpgme-devel jansson-devel libattr-devel keyutils-libs-devel libacl-devel libaio-devel libblkid-devel libxml2-devel openldap-devel pam-devel popt-devel python2-devel readline-devel systemd-devel zlib-devel python-markdown

o directamente podemos instalar el grupo de paquetes “Development Tools” que nos instala todo eso (i muchas más cosas) y unos paquetes adicionales:

yum groups install "Development Tools"
yum -y install iniparser libldb libtalloc libtdb libtevent python-devel gnutls-devel libacl-devel openldap-devel pam-devel readline-devel krb5-devel cups-devel 

NOTA: A partir de la versión de Samba 4.9.0 son necesarios unos paquetes (lmbd) que no están en el repositorio oficial de CentOS sino en el EPEL (Extra Packages for Enterprise Linux). Para añadir el repositorio EPEL e instalar este paquete haremos:

yum install epel-release
yum --enablerepo="epel" install lmdb lmdb-devel

El comando para ver los repositorios instalados es yum repolist.

3.- Descargamos samba

Previamente debemos instalar los paquetes attr, bind-utils docbook-style-xsl, libsemanage-python, python-devel,

Para descargar la última versión de Samba:

curl -O https://download.samba.org/pub/samba/samba-latest.tar.gz

y descomprimimos el fichero

tar zxvf samba-latest.tar.gz

4.- Compilamos samba

Entramos al directorio donde hemos descomprimido samba y ejecutamos:

./configure --enable-debug --enable-selftest --with-ads --with-systemd --with-winbind
make && make install

(Este comando tarda bastante. Paciencia)

Si todo ha ido bien los ejecutables de samba los tendremos en /usr/local/samba/bin así que tenemos que añadir ese directorio al PATH:

export PATH=$PATH:/usr/local/samba/bin

Así sólo lo añadimos para esta sessió,. Para que se añada al PATH al iniciar sessión tenemos que configurarlo en el perfil del usuario (en ~/.bash_profile).

5.- Creamos el dominio

Antes de crear el dominio hay un par de cosas que tenemos que hacer:

Ahora creamos el dominio:

samba-tool domain provision --use-rfc2307 --interactive

Modificamos el DNS de nuestra tarjeta externa poniendo 127.0.0.1

Copiamos el fichero de configuración de kerberos de Samba:

cp /usr/local/samba/private/krb5.conf /etc/krb5.conf

También podemos editar el fichero nosotros directamente. Sólo hace falta que tenga las siguientes líneas:

[libdefaults] 
  dns_lookup_realm = true 
  dns_lookup_kdc = true 
  default_realm = ACME.LAN

6.- Configuraciones finales

Abrimos los puertos en el firewall (ya vimos cuáles son):

firewall-cmd --add-port=53/tcp --permanent;firewall-cmd --add-port=53/udp --permanent;firewall-cmd --add-port=88/tcp --permanent;firewall-cmd --add-port=88/udp --permanent; firewall-cmd --add-port=135/tcp --permanent;firewall-cmd --add-port=137-138/udp --permanent;firewall-cmd --add-port=139/tcp --permanent; firewall-cmd --add-port=389/tcp --permanent;firewall-cmd --add-port=389/udp --permanent;firewall-cmd --add-port=445/tcp --permanent; firewall-cmd --add-port=464/tcp --permanent;firewall-cmd --add-port=464/udp --permanent;firewall-cmd --add-port=636/tcp --permanent; firewall-cmd --add-port=49152-65535/tcp --permanent;firewall-cmd --add-port=3268-3269/tcp --permanent
firewall-cmd --reload

Creamos un fichero para que arranque el servicio samba en /etc/systemd/system/samba.service:

[Unit]
Description= Samba 4 Active Directory
After=syslog.target
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/samba/var/run/samba.pid
ExecStart=/usr/local/samba/sbin/samba

[Install]
WantedBy=multi-user.target

Activamos y arrancamos el sericio samba:

systemctl enable samba
systemctl start samba

Fuentes: