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:
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.
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:
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:
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:
Y si usa 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.
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:
systemctl stop systemd-resolved
systemctl disable systemd-resolved
rm /etc/resolv.conf
nano /etc/resolv.conf
Y en él escribimos
search cipfpbatoi.lan
nameserver 127.0.0.1
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:
systemctl stop smbd nmbd winbind
systemctl disable smbd nmbd winbind
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
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.
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:
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:
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
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
.
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
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).
Antes de crear el dominio hay un par de cosas que tenemos que hacer:
includedir /etc/krb5.conf.d/
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
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: