En este documento adjunto una guía de los pasos a seguir para realizar la migración de:

  • Samba 3 + OpenLDAP  –>  Samba 4 + OpenLDAP
  • LAM –> FusionDirectory

La experiencia la obtuve a través de la migración del Primary Domain Controller de la compañía para la cual trabajaba, dado que no tenía experiencia con Samba y muy poca con OpenLDAP realicé la migración exitosamente.

Actualmente este documento pretende ofrecer una breve guía de los puntos a tener en cuenta durante una migración y algunas consideraciones importantes de la implementación de un nuevo servidor con programas más actualizados.

Al ser un PDC, también tuve que migrar los siguientes servicios / configuraciones:

  • NFS
  • NRPE
  • Cron / fstab
  • CUPS
  • DHCP
  • DNS
  • ACLs

El Laboratorio y las tareas

Primero invertí muchas horas en la creación de un laboratorio virtualizado sobre RHEVM en una red independiente para realizar una migración de prueba y conocer mejor todos los servicios, tras finalizarlo, creé la documentación con los pasos a seguir en el proceso real:

  1. Instalación y configuración de Debian GNU/Linux 8
  2. Instalación y configuración de OpenLdap
  3. Instalación y configuración de Samba (Samba 4)
  4. Importación y modificación de la configuración existente en (Samba 3)
  5. Instalación de Fusion Directory
  6. Creación de Shares, montar unidades (fstab, NFS)
  7. Instalación de ACL‘s
  8. Implementación Modificación de permisos, políticas y accesos por grupos (gidp map y acls)
  9. Implementación de Scripts de inicio de sesión
  10. Instalación de servicio DNS, replicación de Zonas.
  11. Instalación de servicio DHCP
  12. Actualización e implementación de Kixtart
  13. Servicios de impresión, configuración de drivers (CUPS)
  14. Cron
  15. NFS Services
  16. NRPE
  17. Backups
  18. NTP
  19. Repositorios via web
  20. PXE

Los cambios más importantes fueron:

  1. OpenLDAP: En las versiones superiores a 2.0 está deprecado el uso de SSL (686), ahora es reemplazado por StartTLS (389) estando las comunicaciones encripdatadas o no en el mismo puerto. También la configuración es diferente, ahora se realiza a través de la herramientas ldap y no del todo en el archivo de configuración ldap.conf.
  2. FusionDirectory: Requiere modificar / migrar los objetos de todo el árbol de LDAP, es muy importante tener backups. Adicionalmente los hooks de F.D son importantes para la creación de usuarios.
  3. Samba 4: La sintaxis y modo de Samba 4 es distinto a Samba 3, específicamente conservé el modo de dominio Clásico en Samba 4 y no el nuevo modo «ad». La sintaxis del archivo de configuración varía, especialmente en el mapeo de grupos para LDAP y el modo de inicio de Samba.

Implementar StartTLS en OpenLDAP

Configuración en el Servidor.

El servidor puede distribuir certificados autofirmados (selfsigned), que es como lo he hecho para conservar lo que se implementó anteriormente.

Crear un archivo addcerts.ldif con el siguiente contenido (modificar los valores según sus necesidades):

dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/ca_server.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap_server.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap_server.key

Y ejecute el comando para agregar en la configuración de OpenLDAP:

ldapmodify -H ldapi:// -Y EXTERNAL -f addcerts.ldif
Verifique que los certificados tienen los permisos correctos y suficientes.

En los clientes la configuración es la siguiente (en este ejemplo conservo la configuración para la compatibilidad de los clientes que acceden a OpenLDAP):

uri ldaps://dominio.ejemplo
base dc=dominio,dc=ejemplo

ldap_version 3
timeout      10
bind_timeout 10
bind_policy  soft
deref        never

nss_base_passwd ou=users,dc=dominio,dc=ejemplo?sub
nss_base_shadow ou=users,dc=dominio,dc=ejemplo?sub
nss_base_group  ou=groups,dc=dominio,dc=ejemplo?one

pam_login_attribute  uid
pam_password         md5
pam_member_attribute memberuid
pam_filter           objectClass=posixAccount

ssl            on
TLS_CACERT /etc/ldap/ssl/pdc.pem
TLS_REQCERT demand

Verificar el funcionamiento desde el cliente

  • ldapsearch -x -H ldaps://dominio.ejemplo (método SSL)
  • ldapsearch -ZZ -x -H ldap://dominio.ejemplo (iniciar StartTLS)

Samba 4 (classic domain)

Al ser una migración se conserva el UID del dominio anterior (de modo que todos los clientes no tendrán problemas en procesos de autenticación «equipos en el dominio»)

Se setea el UID anterior:

net setlocalsid <su ID de dominio>

Y se configura también en:

/etc/smbldap-tools/smbldap.conf
# $Id: smbldap_bind.conf 35 2011-02-23 09:07:36Z fumiyas $
#
############################
# Credential Configuration #
############################
# Notes: you can specify two differents configuration if you use a
# master ldap for writing access and a slave ldap server for reading access
# By default, we will use the same DN (so it will work for standard Samba
# release)
masterDN="cn=admin,dc=dominio,dc=ejemplo"
masterPw="**************"
/etc/smbldap-tools/smbldap_bind.conf (END)

Archivo de Configuración Samba 4

La sintaxis varia de Samba 3, aquí hay un ejemplo de mi archivo funcional con el dominio clásico de Samba.

# Global parameters
[global]
        server role = classic primary domain controller
        workgroup = DOMINIO.EJEMPLO 
        server string = Samba at DOMINIO.EJEMPLO
        netbios name = PDC
        domain logons = yes
        domain master = yes
        admin users = Administrador
        security = user
        local master      = yes
        preferred master  = yes
        os level          = 65

        null passwords    = no
        hide unreadable   = yes
        hide dot files    = yes
        
        logon script = logon.bat
        logon path   = 
        logon drive  = U:
        logon home   = 
        domain logons = yes
        domain master = yes
        
        #deprecado, buscar una alternativa
        enable privileges = yes 

        encrypt passwords = true
        ldap password sync      = yes

hosts allow       = <rangos de IP de su red local>
bind interfaces only = yes
socket options       = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192

# Contiene la contraseña del administrador ldap
passdb backend          = ldapsam 

#Parámetros necesarios para ldap como backend

ldap admin dn           = cn=admin,dc=dominio,dc=ejemplo 
ldap group suffix       = ou=Groups
ldap idmap suffix       = ou=Idmap
ldap machine suffix     = ou=Computers
ldap user suffix        = ou=Users
ldap suffix             = dc=dominio,dc=ejemplo
ldap delete dn          = yes

idmap config * : backend      = ldap
idmap config * : ldap_url     = ldap://127.0.0.0
idmap config * : ldap_base_dn = dc=dominio,dc=ejemplo
idmap config * : ldap_user_dn = cn=admin,dc=dominio,dc=ejemplo
passwd program = /usr/sbin/smbldap-passwd -s -u "%u"

# Deshabilita SSL para que pueda usar el plugin de ldap
ldap ssl        = off

wins support = yes
name resolve order = wins lmhosts host bcast
time server  = yes
dns proxy    = no

add user script               = /usr/sbin/smbldap-useradd  -m "%u"
add group script              = /usr/sbin/smbldap-groupadd -p "%g"
add machine script            = /usr/sbin/smbldap-useradd  -W "%u"
set primary group script      = /usr/sbin/smbldap-usermod  -g "%g" "%u"

syslog         = 0
log level      = 1
log file       = /var/log/samba/%m.log
max log size   = 100000
deadtime       = 15 

        dos filetimes  = yes
        dos charset    = 850
        unix charset   = UTF8
        browseable        = no
        nt acl support    = yes
        #flagged as unknown parameter
        acl compatibility = win2k
        map acl inherit   = yes
        inherit acls      = yes
        
        admin users    = @DomainAdmins
        create mask    = 0640
        directory mask = 0750
        case sensitive = No
        dont descend   = /proc,/dev,/etc,/lib,/lost+found,/initrd

[homes]
        comment        = Home de %U, %u
        path           = /opt/samba/shares/homes/%S
        browseable     = no
        valid users    = %S
        read only      = no
        create mask    = 0660
        directory mask = 0750
[netlogon]
        comment    = Network Logon Service
        path       = /opt/samba/shares/netlogon
        write list = @DomainAdmins
        locking    = no
        browseable = no
        guest ok   = yes

[log]
    comment    = Network Logon Service Logs
    path       = /opt/samba/log
    locking    = no
    write list = @DomainAdmins

[homes]
    comment        = Home de %U, %u
    path           = /opt/samba/shares/homes/%S

    browseable     = no
    valid users    = %S
    read only      = no
    create mask    = 0660
    directory mask = 0750

[public]
    comment        = Carpeta publica
    path           = /opt/samba/shares/public
    browseable     = yes
    read only      = no
    create mask    = 0664
    directory mask = 0775

 Agregar equipos windows al dominio con Samba 4

  • Windows XP ingresa sin problemas
  • Windows Server 2003 requiere:

En el protocolo TCP/IP v4 en la placa de red, coloque como DNS el servidor Samba y en las opciones avanzadas el sufijo dominio.ejemplo.  Agregue al dominio.

Establezca una IP de modo manual (Sin DNS)

windows 8 en samba 4

windows 8 en samba 4

Ahora agregue el sufijo de su dominio en las propiedades avanzadas, siendo mi dominio de ejemplo «dominio.ejemplo«:

Windows 8.1 en Samba4

Windows 8.1 en Samba4

Agregue el equipo al dominio y reestableza la configuración de red.

  • Windows 10 (mismo procedimiento de windows 8).

Montar Unidades de red en Windows con Samba 4

Previamente utilizábamos Kixtart como alternativa para levantar las unidades de red en el dominio. Sin embargo Windows deprecó una de las funciones para la evaluación de grupos que era compatible con Samba. Adjunto un script alternativo que funciona en todas las versiones de Windows (CMD):

REM ############################( Evaluate Group GrupoEjemplo ) ############################
set i=0
set examplegroup="                                           *GrupoEjemplo             "
set sociosuser=%username%
for /f %%f in ('"net user %sociosuser% /domain | findstr /l %examplegroup%"') do set /a i=%i+1
if %i% gtr 0 (goto :sociosmember)
:nomember
echo "%user% no puede usar este path".
goto :end
:sociosmember
net use z: \\pdc\grupoejemplo\recursos
net use h: \\pdc\grupoejemplo\sitios
:end

Atención con la variable examplegroup dado que requiere exactamente la misma cantidad de espacios vacios como lo ve Windows al hacer la consulta. Para obtener el valor requerido con todos los espacios ejecute:

net user %username% /domain