6.4.2.2. Controlador de dominio

Bajo este epígrafe recogeremos todas las acciones que permiten convertir nuestro servidor en un controlador de dominio para directorio activo y las pruebas que nos asegurarán que lo es.

El directorio activo exige DNS. samba proporciona un servidor DNS interno que puede usarse para ello. Otra opción, si ya se dispone de servidor DNS, es usar bind9 y hacer que éste use la base de datos de samba.

Advertencia

Para el directorio activo es indistinto el uso de mayúsculas y minúsculas. Así pues, «Administrator», «administrator» o «ADMINISTRATOR» son el mismo usuario.

6.4.2.2.1. Instalación

Son necesarios tres paquetes y opcionalmente otros dos:

# apt-get install samba winbind sssd smbclient krb5-user acl

Desglosadamente:

samba

Es el paquete que permite instalar el servidor en el sistema.

winbind

Necesario para poder autenticarse usando la base de datos de samba.

sssd

Permite que los usuarios y grupos de samba pueden usarse para la autenticación (libpam-sss) y en el servicio nss configurado con /etc/nsswitch.conf (libnss-sss). Además, permite guarda una caché, lo que permite que el usuario pueda validarse incluso cuando se halle caído el servidor.

smbclient

Es un cliente de línea de comandos para samba. No es necesario, pero puede ayudarnos en las comprobaciones.

krb5-user

Contiene una serie de programas que permite ser clientes de un servidor kerberos. Como en el caso anterior, no es necesario, pero nos permite realizar comprobaciones.

acl

Las herramientas para manejar los permisos basados en ACL. Son útiles si se crean a mano los perfiles de los usuarios.

Nota

Es importar estar atento a los mensajes del proceso de post-instalación:

Samba is not being run as an AD Domain Controller, masking samba-ad-dc-service.

La configuración predeterminada no es la de un controlador de dominio para directorio activo, sino la de un servidor samba independiente (standalone). Esto hace que se habiliten los servicios smbd y nmbd; y se deshabilite (y enmascare) samba-ad-dc, que es el que nos interesa.

Nota

La instalación de krb5-config (dependencia de krb5-user) nos obliga a configurar el cliente kerberos. No tiene demasiada importancia lo que respondamos, ya que la configuración de samba nos proporcionará el fichero de configuración adecuado.

6.4.2.2.2. Configuración

Trataremos bajo este epígrafe como transformar el servidor samba en un controlador de dominio para directorio activo. La instalación presupone que lo utilizaremos como servidor independiente, así que debemos desechar los scripts de arranque habilitados:

# invoke-rc.d smbd stop
# invoke-rc.d winbind stop
# invoke-rc.d nmbd stop
# systemctl mask smbd
# systemctl mask nmbd
# systemctl mask winbind

Además, debemos deshacernos del fichero de configuración antiguo para no tener problemas al generar la nueva configuración:

# mv /etc/samba/smb.conf{,.dpkg-dist}

Como servidor DNS cabe la posibilidad de usar el básico que facilita samba o usar bind9.

Con DNS interno

El primer paso es constituir la base de datos (un LDAP interno):

# samba-tool domain provision  --host-ip=192.168.255.1 --use-rfc2307 --interactive
Realm [IESPJM.DOMUS]:
 Domain [IESPJM]:
 Server Role (dc, member, standalone) [dc]:
 DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]:
 DNS forwarder IP address (write 'none' to disable forwarding) [80.58.61.250]:
Administrator password:
Retype password:
[...]
Server Role:           active directory domain controller
Hostname:              dc
NetBIOS Domain:        IESPJM
DNS Domain:            iespjm.domus
DOMAIN SID:            S-1-5-21-967385316-1535922226-3155704407

Como ya hemos preparado el servidor, basta con aceptar todas las opciones. Obsérvese que se ha elegido como servidor DNS el interno. Esta elección conlleva que se nos pregunte el forwarder que usará tal servidor interno para resolver las direcciones que no sean del dominio propio. Se sugiere el servidor que se esté usando, con lo que debería bastar con aceptarlo. Nótese que se ha incluido la IP por la que queremos prestar el servicio y a cuya red queremos asociar el dominio, ya que en nuestro sistema hay dos ips distintas.

Advertencia

No vale cualquier contraseña. samba tiene habilitadas unas reglas para evitar contraseñas demasiado sencillas. Para estas pruebas se ha introducido «Passw0rd» (la letra o se susutituye por el dígito 0), que la acepta sin problemas.

Con bind9

Si queremos usar bind es obvio que lo debemos tener instalado ya (véase cómo) y elegir BIND9_DLZ al generar la configuración. Además, a la instalación estándar de bind habría que hacer simplemente dos cambios:

  1. Incluir en el bloque options de file:/etc/bind/named.conf.options la línea:

    tkey-gssapi-keytab "/var/lib/samba/private/dns.keytab";
    
  2. Incluir en /etc/bind9/named.conf la línea:

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

Ambas ficheros deben poder ser leídos por bind, pero en ambos casos es así.

Advertencia

Con bin9 no se debe generar configuración para la zona iespjm.domus, ya que de ello se encargar el propio samba.

Utilicemos bind9 o el servidor interno[1], toca tras la configuración, echar a andar el servidor, pero antes añadiremos a la sección [global] de /etc/samba/smb.conf la siguiente directiva, que permite usar las herramientas del paquete ldap-tools para hacer consultas:

ldap server require strong auth = No

Hecho lo cual, sí podemos reiniciar (y habilitar de paso el servicio para que arranque automáticamente durante el inicio):

# systemctl unmask samba-ad-dc.service
# systemctl enable samba-ad-dc.service
# invoke-rc.d samba-ad-dc start
# wbinfo -D iespjm.domus
Name              : IESPJM
Alt_Name          : iespjm.domus
SID               : S-1-5-21-967385316-1535922226-3155704407
Active Directory  : Yes
Native            : Yes
Primary           : Yes

Y, ahora que ya tenemos servidor DNS, modificar /etc/resolv.conf para que sea la propia máquina el servidor de nombres:

domain iespjm.domus
search iespjm.domus
nameserver 127.0.0.1

Además, samba ha generado una configuración para el cliente kerberos apropiada, que debemos usar:

# ln -sf /var/lib/samba/private/krb5.conf /etc

Debemos tocar, además, rematar la configuración del servidor de hora y descomentar la línea que dejamos comentada:

ntpsigndsocket /var/lib/samba/ntp_signd

Hecho esto, es necesario cambiar el grupo propietario de /var/lib/samba/ntp_signd para que el demonio pueda leer el socket:

# chgrp ntp /var/lib/samba/ntp_signd

Y reiniciar el servicio:

# invoke-rc.d ntp restart

Finalmente, silo deseamos podemos añadir la zona para la resolución inversa al servidor DNS interno, aunque samba no actualiza esta zona como sí hace con la directa:

$ samba-tool dns zonecreate localhost 255.168.192.in-addr.arpa -U Administrator
Zone 1.168.192.in-addr.arpa created successfully

En principio, todo debería marchar, pero conviene cerciorarnos de que es así. Sin embargo, antes, vamos a eliminar la complejidad de las contraseñas a fin de que la configuración a partir de ahora, nos sea menos molesta:

# samba-tool domain passwordsettings set --min-pwd-length 4
# samba-tool domain passwordsettings set --complexity off
# samba-tool domain passwordsettings set --min-pwd-age 0
# samba-tool domain passwordsettings show
Password informations for domain 'DC=iespjm,DC=domus'

Password complexity: off
Store plaintext passwords: off
Password history length: 24
Minimum password length: 4
Minimum password age (days): 0
Maximum password age (days): 42
Account lockout duration (mins): 30
Account lockout threshold (attempts): 0
Reset account lockout after (mins): 30

Obsérvese que las contraseñas, además, tienen una caducidad de 42 días. Ahora podemos simplifcar nuestra contraseña de administrador de samba, cuyo nombre es Administrator (en inglés):

# samba-tool user setpassword Administrator
New Password:
Retype Password:
Changed password OK

Advertencia

Lo que se acaba de hacer, NO SE DEBE HACER JAMÁS en un servidor en producción. Las contraseñas, en ese caso, debe ser cuanto más seguras mejor; y es muy aconsejable obligar al usuario a que así las elija.

Nota

Tenga en cuenta que, si como se aconseja, no se hace lo indicado las contraseñas tendrán un vida mínima de un día, con lo que no podremos hacer pruebas repetidas de ir cambiando la contraseña a un mismo usuario.

Es más que probable que, en algún momento, queramos crear usuarios que tengan ficheros almacenados en el servidor, así que lo más recomendable es dedicar a ello una partición (en nuestro caso, un volumen lógico para el grupo de volúmenes VGserver)[2]:

# lvcreate -L250M VGserver -n samba
# mkfs.ext4 -L SAMBA /dev/VGserver/samba

Además deberemos añadir la entrada al fichero /etc/fstab para que se monte automáticamente con cada arranque:

# echo "/dev/mapper/VGserver-samba   /srv/samba  ext4  defaults   0  2" >> /etc/fstab

y, finalmente, montarlo:

# mount /srv/samba

6.4.2.2.3. Comprobaciones

Preguntemos algo de información a nuestro servidor recién configurado:

$ samba-tool domain info 127.0.0.1
Forest           : iespjm.domus
Domain           : iespjm.domus
Netbios domain   : IESPJM
DC name          : dc.iespjm.domus
DC netbios name  : DC
Server site      : Default-First-Site-Name
Client site      : Default-First-Site-Name

Bien, según lo que pretendíamos. Echemos un vistazo a qué los usuarios que hay en nuestra base:

# samba-tool user list
Administrator
krbtgt
Guest

y a los grupos, que son unos cuantos:

# samba-tool group list
[...]

Esto es lo mínimo para que el controlador de dominio funcione como tal. También podemos comprobar cómo se ha creado nuestro DNS:

$ samba-tool dns serverinfo localhost -U Administrator
Password for [IESPJM\Administrator]:
[...]

Y cuáles son las zonas que gestionamos:

$ samba-tool dns zonelist localhost -U Administrator
Password for [IESPJM\Administrator]:
  3 zone(s) found

  pszZoneName                 : 1.168.192.in-addr.arpa
  Flags                       : DNS_RPC_ZONE_DSINTEGRATED DNS_RPC_ZONE_UPDATE_SECURE
  ZoneType                    : DNS_ZONE_TYPE_PRIMARY
  Version                     : 50
  dwDpFlags                   : DNS_DP_AUTOCREATED DNS_DP_DOMAIN_DEFAULT DNS_DP_ENLISTED
  pszDpFqdn                   : DomainDnsZones.iespjm.domus

  pszZoneName                 : iespjm.domus
  Flags                       : DNS_RPC_ZONE_DSINTEGRATED DNS_RPC_ZONE_UPDATE_SECURE
  ZoneType                    : DNS_ZONE_TYPE_PRIMARY
  Version                     : 50
  dwDpFlags                   : DNS_DP_AUTOCREATED DNS_DP_DOMAIN_DEFAULT DNS_DP_ENLISTED
  pszDpFqdn                   : DomainDnsZones.iespjm.domus

  pszZoneName                 : _msdcs.iespjm.domus
  Flags                       : DNS_RPC_ZONE_DSINTEGRATED DNS_RPC_ZONE_UPDATE_SECURE
  ZoneType                    : DNS_ZONE_TYPE_PRIMARY
  Version                     : 50
  dwDpFlags                   : DNS_DP_AUTOCREATED DNS_DP_FOREST_DEFAULT DNS_DP_ENLISTED
  pszDpFqdn                   : ForestDnsZones.iespjm.domus

Obsérvese que se incluye la zona de resolución inversa que creamos antes. Por último, comprobemos si el servidor DNS resuelve convenientemente:

$ host dc
dc.iespjm.domus has address 192.168.1.20
$ host -t srv _ldap._tcp.iespjm.domus
_ldap._tcp.iespjm.domus has SRV record 0 100 389 dc.iespjm.domus.
$ host -t srv _kerberos._udp.iespjm.domus
_kerberos._udp.iespjm.domus has SRV record 0 100 88 dc.iespjm.domus.

También podemos conectarnos con el cliente smbclient para ver los recursos compartidos:

$ smbclient -L localhost -U Administrator
Enter Administrator's password:
Domain=[IESPJM] OS=[Windows 6.1] Server=[Samba 4.5.2-Debian]

        Sharename       Type      Comment
        ---------       ----      -------
        netlogon        Disk
        sysvol          Disk
        IPC$            IPC       IPC Service (Samba 4.5.2-Debian)
Domain=[IESPJM] OS=[Windows 6.1] Server=[Samba 4.5.2-Debian]

        Server               Comment
        ---------            -------

        Workgroup            Master
        ---------            -------
        WORKGROUP            DC

O entrar en una de las unidades compartidas:

$ smbclient //localhost/sysvol -U Administrator
Enter Administrator's password:
Domain=[IESPJM] OS=[Windows 6.1] Server=[Samba 4.5.2-Debian]
smb: \> ls
  .                                   D        0  Tue Dec 27 18:49:29 2016
  ..                                  D        0  Tue Dec 27 20:46:47 2016
  iespjm.domus                           D        0  Tue Dec 27 18:49:27 2016

                1733064 blocks of size 1024. 673972 blocks available
smb: \>

Aún, sin embargo, no hemos usado la autenticación con kerberos, para lo cual primero hay que conseguir un ticket:

$ kinit Administrator@IESPJM.DOMUS
Password for Administrator@IESPJM.DOMUS:
Warning: Your password will expire in 41 days on mar 07 feb 2017 19:09:36 CET

Ahora ya tenemos credenciales para Administrator[3]:

$ klist -l
Principal name                 Cache name
--------------                 ----------
Administrator@IESPJM.DOMUS        FILE:/tmp/krb5cc_0

Así que podremos usar samba-tool o smbclient sin indicar usuario, ya que este será aquel del que tenemos la credencial. Con el primero:

$ samba-tool dns zonelist dc.iespjm.domus
[...]

Obsérvese que no se usa localhost, sino el nombre de la máquina, aunque podríamos habernos ahorrado el dominio:

$ samba-tool dns zonelist dc

Con smbclient debemos tener la precaución de añadir la opción -k que indica que usaremos kerberos:

$ smbclient -L dc -k
[...]

O bien, si preferimos acceder al disco:

$ smbclient //DC/sysvol -k
smb: \>

Aún podemos hacer más pruebas, porque el directorio activo se caracteriza por ser una implementación compatible con LDAP. Por tanto, podremos hacer consultas con las herramientas del paquete ldap-utils (que se debe haber intalado como dependencia). Usando la autenticación con contraseña, podemos consultar los atributos del administrador:

$ ldapsearch -LLL -h dc -D 'cn=Administrator,cn=Users,dc=iespjm,dc=domus' -W \
   -b 'dc=iespjm,dc=domus' cn=Administrator
Enter LDAP Password:
dn: CN=Administrator,CN=Users,DC=iespjm,DC=domus
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: Administrator
description: Built-in account for administering the computer/domain
instanceType: 4
whenCreated: 20161228130519.0Z
uSNCreated: 3545
name: Administrator
objectGUID:: VPawBTKfx0+sCWj1mZtipw==
userAccountControl: 512
badPwdCount: 0
codePage: 0
countryCode: 0
badPasswordTime: 0
lastLogoff: 0
primaryGroupID: 513
objectSid:: AQUAAAAAAAUVAAAA7Wn7kfRzi7GK+ngk9AEAAA==
adminCount: 1
accountExpires: 9223372036854775807
sAMAccountName: Administrator
sAMAccountType: 805306368
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=iespjm,DC=domus
isCriticalSystemObject: TRUE
memberOf: CN=Administrators,CN=Builtin,DC=iespjm,DC=domus
memberOf: CN=Group Policy Creator Owners,CN=Users,DC=iespjm,DC=domus
memberOf: CN=Enterprise Admins,CN=Users,DC=iespjm,DC=domus
memberOf: CN=Schema Admins,CN=Users,DC=iespjm,DC=domus
memberOf: CN=Domain Admins,CN=Users,DC=iespjm,DC=domus
pwdLastSet: 131274042783321350
lastLogonTimestamp: 131274042965165270
whenChanged: 20161228131136.0Z
uSNChanged: 3774
lastLogon: 131274275990954850
logonCount: 10
distinguishedName: CN=Administrator,CN=Users,DC=iespjm,DC=domus

Y si tenemos las credenciales del administrador, con kerberos:

$ ldapsearch -h dc -LLLQY GSSAPI -b 'dc=iespjm,dc=domus' cn=Administrator
[...]

Enlaces de interés

Notas al pie