Servidor Samba con LDAP NSS – PAM en Debian Wheezy
- Este artículo se mantiene por motivos de consulta.
- Podría interesarle revisar Migrando un dominio Samba NT4 a Samba Active Directory
Contenido |
Resumen
Este artículo describe el proceso de instalación y configuración de un Controlador de Dominio Primario (PDC por sus siglas en inglés) sobre Debian 7.0 "Wheezy", usando SAMBA, OpenLDAP como almacén de credenciales, NSS y PAM para autenticación-autorización de usuarios.
Introducción
Este artículo es una actualización de Servidor Samba con LDAP NSS – PAM en Debian. Principalmente, se actualiza el método para configurar OpenLDAP y se simplifican otras partes de la configuración.
N.B. Todas las configuraciones como usario root, a menos que se indique lo contrario.
¿Por qué no samba4?
Debian "Wheezy" incluye una versión de Samba 4 en sus repositorios (lo que indica que se considera estable), sin embargo, en la descripción del paquete se menciona lo siguiente:These packages contain snapshot versions of Samba 4, the next-generation version of Samba. These should be considered _experimental_, and should not be used in production.Este paquete contiene una instantánea de las versiones de Samba4, la siguiente generación de la versión de Samba. Estos deben ser considerados _experimentales_, y no deben ser utilizados en producción. (Traducción libre).
Configuración previa del Servidor
- Es importante tener configurados los repositorios y la configuración de red correcta de tal manera que permita la comunicación.
- Revise que la configuración del idioma sea español
- Configure NTP si el servidor va tomar parte de procesos de réplica con otros servidores, puesto que las marcas de tiempo que usa en los atributos de operaciones son configuradas en base a la hora del sistema
Instalar LDAP
aptitude install slapd ldap-utils
Durante el proceso de instalación de solicita que se introduzca una contraseña.
Para configurar el paquete slapd recién instalado se utiliza dpkg-reconfigure:
dpkg-reconfigure slapd
- ¿Desea omitir la configuración del servidor OpenLDAP? No
- Introduzca su nombre de dominio DNS: salud.gob.sv
- Nombre de la organización: Ministerio de Salud
- Contraseña del administrador:
- Verificación de contraseña:
- Motor de base de datos a utilizar: HDB
- ¿Desea que se borre la base de datos cuando se purgue el paquete slapd? No
- ¿Desea mover la base de datos antigua? Sí
- ¿Desea permitir el protocolo LDAPv2? No
Usuario de lectura
Crear un directorio de trabajo:
mkdir -p /root/openldap.conf.d/
Crear una contraseña cifrada:
password=$(slappasswd -s Contraseña-del-usuario-de-lectura -h {SHA})
El siguiente comando creará el fichero ldif /root/openldap.conf.d/usuario-lectura, que usaremos para agregar al usuario en nuestro árbol LDAP
cat <<MAFI> /root/openldap.conf/usuario-lectura.ldif dn: cn=lector,dc=salud,dc=gob,dc=sv objectClass: simpleSecurityObject objectClass: organizationalRole cn: lectura description: LDAP lectura userPassword: $password MAFI
Ejecutar la siguiente orden para agregar al usuario a la base de datos de LDAP. Se debe ingresar la contraseña especificada durante el proceso de configuración:
ldapadd -x -D cn=admin,dc=salud,dc=gob,dc=sv -W -f /root/openldap.conf.d/usuario-lectura.ldif
Configuraciones avanzadas para servidores LDAP en Debian
Si lo desea, en este punto puede dirigirse a Configuraciones avanzadas para servidores LDAP en Debian para habilitar el tráfico cifrado y algunas opciones avanzadas de LDAP (registro de autenticación y replicación)
Soporte para SAMBA LDAP
Instalar el paquete que contiene la documentación de Samba:
aptitude install samba-doc
Copiar el esquema al directorio de configuración de ldap.
zcat /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz > /etc/ldap/schema/samba.schema
Crear un directorio de trabajo para el esquema
mkdir -p /root/schemas.conf.d/
Crear el archivo /root/schemas.conf.d/schemas.ldif con el siguiente comando:
cat <<MAFI> /root/schemas.conf.d/schemas.ldif include /etc/ldap/schema/core.schema include /etc/ldap/schema/cosine.schema include /etc/ldap/schema/nis.schema include /etc/ldap/schema/inetorgperson.schema include /etc/ldap/schema/samba.schema MAFI
Cargar el esquema que se ha creado:
slaptest -f /root/schemas.conf.d/schemas.ldif -F /root/schemas.conf.d/
Arroja el siguiente resultado.
config file testing succeeded
Ahora copias el esquema ldiff creado al directorio correspondiente
cp schemas.conf.d/cn\=config/cn\=schema/cn\=\{4\}samba.ldif /etc/ldap/slapd.d/cn\=config/cn\=schema/
Normalizas los permisos del archivo que acabas de copiar.
chown openldap:openldap /etc/ldap/slapd.d/cn\=config/cn\=schema/cn\=\{4\}samba.ldif
Reinicias el servidor LDAP para que agregue los anteriores esquemas
service slapd restart
Modificando ldap: ACL e índices
Cree el fichero cambios.ldif con el siguiente contenido:
cambios.ldif |
dn: olcDatabase={1}hdb,cn=config changetype: modify replace: olcAccess olcAccess: {0}to attrs=userPassword,shadowLastChange,sambaLMPassword,sambaNTPassword by self write by anonymous auth by dn="cn=admin,dc=psalud,dc=gob,dc=sv" write by * none - add: olcAccess olcAccess: {1}to dn.base="" by * read - add: olcAccess olcAccess: {2}to * by dn="cn=admin,dc=psalud,dc=gob,dc=sv" write by * read - replace: olcDbIndex olcDbIndex: uidNumber eq olcDbIndex: gidNumber eq olcDbIndex: cn pres,sub,eq olcDbIndex: sn pres,sub,eq olcDbIndex: uid pres,sub,eq olcDbIndex: displayName pres,sub,eq olcDbIndex: memberUid eq,subinitial olcDbIndex: uniqueMember eq olcDbIndex: mail eq,subinitial olcDbIndex: givenname eq,subinitial olcDbIndex: sambaSID eq olcDbIndex: sambaPrimaryGroupSID eq olcDbIndex: sambaDomainName eq olcDbIndex: sambaGroupType eq olcDbIndex: sambaSIDList eq |
Se aplica con:
ldapmodify -Y EXTERNAL -H ldapi:/// -f cambios.ldif
Puede ver lo linda que queda la configuración con el siguiente comando
ldapsearch -Y EXTERNAL -H ldapi:/// -b olcDatabase={1}hdb,cn=config -LLL
Comprobar que no haya tenido un error escribiendo en el archivo de configuración, y que reconozca el archivo LDIF del esquema SAMBA.
slaptest -vu
Y debe devolver algo como
config file testing succeeded |
Comprobar que todo este bien con un simple
ldapsearch -x -b '' -s base '(objectClass=*)' namingContexts -LLL
Devolverá algo como esto
dn: namingContexts: dc=salud,dc=gob,dc=sv |
O con algo más elaborado. Comprobará además que su clave es la correcta.
ldapsearch -x -D cn=admin,dc=salud,dc=gob,dc=sv -b dc=salud,dc=gob,dc=sv -W -LLL
El resultado debe ser como el siguiente. Verifique que el atributo marcado userPassword aparezca
dn: dc=salud,dc=gob,dc=sv objectClass: top objectClass: dcObject objectClass: organization o: Ministerio de Salud dc: salud dn: cn=admin,dc=salud,dc=gob,dc=sv objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: LDAP administrator userPassword:: {hash-password-ldap-root} dn: cn=lector,dc=salud,dc=gob,dc=sv objectClass: simpleSecurityObject objectClass: organizationalRole cn: mafi description: LDAP lectura userPassword:: {hash-password-ldap-lector} |
Configuración del Cliente LDAP
Configure el archivo /etc/ldap/ldap.conf (Cliente LDAP en Debian) siguiendo el siguiente ejemplo y cambiando los valores adecuados.
/etc/ldap/ldap.conf |
BASE dc=salud,dc=gob,dc=sv URI ldap:192.168.192.12:389 BINDDN cn=admin,dc=salud,dc=gob,dc=sv |
Compruebe con una búsqueda con ldapsearch
ldapsearch -x -LLL
La respuesta debe ser del como la que sigue, sin el atributo userPassword
dn: dc=salud,dc=gob,dc=sv objectClass: top objectClass: dcObject objectClass: organization o: Ministerio de Salud dc: salud dn: cn=admin,dc=salud,dc=gob,dc=sv objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: LDAP administrator dn: cn=mafi,dc=salud,dc=gob,dc=sv objectClass: simpleSecurityObject objectClass: organizationalRole cn: mafi description: LDAP lectura |
Samba
Instalar samba
aptitude install samba{,-tools} smbclient
No aparece más un asistente de configuración. Nada cambia si se invoca.
Detener el servicio. No lo vuelva a levantar hasta que se indique, después de la sección sobre smbldap-tools
service samba stop
Borrar los datos de configuración que SAMBA hizo al inicio. Sí, los que acaba de crear
rm /var/lib/samba/*{tdb,dat}
Posiblemente aparezca el siguiente mensaje de error. No es nada de que preocuparse.
rm: no se puede borrar «/var/lib/samba/*dat»: No existe el fichero o el directorio |
Configurar samba
El siguiente archivo de configuración pareciera tener todas las opciones necesarias para el uso que se ha descrito en la presentación de este trabajo. Será bueno que mantenga en alguna medida los comentarios para referencias futuras sobre cambios que quieran hacerse.
Los atributos que deben modificarse son:
- workgroup = dominio.com
- netbios name= <hostname>
- passdb backend: = <ip del servidor LDAP>
- ldap admin dn: = cn=admin,dc=<dominio>,dc=gob,dc=sv
- ldap suffix: = dc=<dominio>,dc=gob,dc=sv
/etc/samba/smb.conf |
[global] server role = classic primary domain controller loglevel = 2 workgroup = salud.gob.sv netbios name = pdc server string = %h server - %L wins support = yes name resolve order = lmhosts host wins bcast dns proxy = no socket options = TCP_NODELAY smb ports = 139 log file = /var/log/samba/log.%m max log size = 1000 syslog = 2 log level = 0 panic action = /usr/share/samba/panic-action %d security = user enable privileges = yes passdb backend = ldapsam:ldap://pdc.salud.gob.sv ldap admin dn = cn=admin,dc=salud,dc=gob,dc=sv ldap suffix = dc=salud,dc=gob,dc=sv ldap user suffix = ou=Users ldap machine suffix = ou=Computers ldap passwd sync = Yes ldap delete dn = No ldap ssl = no ldap replication sleep = 1000 ldap timeout = 5 ldap delete dn = No obey pam restrictions = yes encrypt passwords = true pam password change = yes add user script = /usr/sbin/smbldap-useradd -a -m "%u" add group script = /usr/usr/sbin/smbldap-groupadd -p "%g" add machine script = /usr/sbin/smbldap-useradd -W "%u" add user to group script = /usr/sbin/smbldap-groupmod -m "%u" "%g" set primary group script = /usr/sbin/smbldap-usermod -g "%g" "%u" delete user from group script = /usr/sbin/smbldap-groupmod -x "%u" "%g" ldapsam:trusted = yes ldapsam:editposix = yes domain logons = yes domain master = yes local master = yes os level = 65 logon path = logon drive = H: logon home = logon script = client ntlmv2 auth = yes wins proxy = no lanman auth = yes ntlm auth = yes load printers = no printing = bsd printcap name = /dev/null disable spoolss = yes [homes] comment = Home Directories browseable = no read only = no writeable = yes create mask = 0700 directory mask = 0700 valid users = %S veto files =/*.mp3/*.mp4/*.mpg/*.avi [netlogon] comment = Network Logon Service path = /var/lib/samba/netlogon guest ok = yes read only = yes write list = root |
Creamos el directorio para netlogon, sobre todo, por cualquier eventualidad en el futuro
mkdir /var/lib/samba/netlogon
Normalizas permisos:
chown -R root:sambashare /var/lib/samba/netlogon/
Revisamos el archivo de configuración: testparm La salida debe ser similar a esto:
Load smb config files from /etc/samba/smb.conf rlimit_max: rlimit_max (1024) below minimum Windows limit (16384) Processing section "[homes]" Processing section "[netlogon]" Loaded services file OK. Server role: ROLE_DOMAIN_PDC Press enter to see a dump of your service definitions |
Veremos por el error rlimit_max: rlimit_max (1024) below minimum Windows limit (16384) hacia el final de este documento.
Agregar el password del administrador del árbol ldap
smbpasswd -W
SMBLDAP-TOOLS
Se espera que el servidor SAMBA no haya sido iniciado desde la sección anterior.
Instalar smbldap-tools.
aptitude install smbldap-tools
Configuración de SMBLDAP-TOOLS
Conseguir los archivos de configuración necesarios.
zcat /usr/share/doc/smbldap-tools/examples/smbldap.conf.gz >/etc/smbldap-tools/smbldap.conf cp /usr/share/doc/smbldap-tools/examples/smbldap_bind.conf /etc/smbldap-tools/
Adecuar los permisos
chown root:openldap /etc/smbldap-tools/smbldap*
Cambiaremos el archivo /etc/smbldap-tools/smbldap_bind.conf, para que ambas los valores de autenticación se correspondan con los nuestros.
slaveDN="cn=admin,dc=salud,dc=gob,dc=sv" slavePw="{password-ldap-root}" masterDN="cn=lector,dc=salud,dc=gob,dc=sv" masterPw="{password-ldap-lector}" |
Verifique que se ha desactivado TLS y SSL para la comunicación con el servidor LDAP. Luego, revise que se han desactivado las opciones de usuarios móviles. Se configura el SID de nuestro servidor Samba anterior. En smbldap.conf se deben configurar todas las opciones que entendamos con nuestro smb.conf en mano. Toda saldra bien.
/etc/smbldap-tools/smbldap.conf |
############################################################################## # # General Configuration # ############################################################################## SID="S-1-5-21-2434350264-4182727829-1472804664" sambaDomain="SALUD.GOB.SV" ############################################################################## # # LDAP Configuration # ############################################################################## slaveLDAP="ldap://pdc.salud.gob.sv/" masterLDAP="ldap://pdc.salud.gob.sv/" ldapTLS="0" verify="require" cafile="/etc/smbldap-tools/ca.pem" clientcert="/etc/smbldap-tools/smbldap-tools.example.com.pem" clientkey="/etc/smbldap-tools/smbldap-tools.example.com.key" suffix="dc=salud,dc=gob,dc=sv" usersdn="ou=Users,${suffix}" computersdn="ou=Computers,${suffix}" groupsdn="ou=Groups,${suffix}" idmapdn="ou=Idmap,${suffix}" sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}" scope="sub" password_hash="SSHA" password_crypt_salt_format="%s" ############################################################################## # # Unix Accounts Configuration # ############################################################################## userLoginShell="/bin/false" userHome="/home/%U" userHomeDirectoryMode="764" userGecos="System User" defaultUserGid="513" defaultComputerGid="515" skeletonDir="/etc/skel" shadowAccount="1" defaultMaxPasswordAge="99999" ############################################################################## # # SAMBA Configuration # ############################################################################## userSmbHome="\\PDC\%U" userProfile="" userHomeDrive="H:" userScript="logon.bat" mailDomain="salud.gob.sv" ############################################################################## # # SMBLDAP-TOOLS Configuration (default are ok for a RedHat) # ############################################################################## with_smbpasswd="0" smbpasswd="/usr/bin/smbpasswd" with_slappasswd="0" slappasswd="/usr/sbin/slappasswd" |
Luego, corres el archivo que lo demuestra todo
smbldap-populate
Inicias el servidor samba
service samba start
Seteas el valor del SID para que coincida con el que esta en el archivo de configuración de smbldap.conf
net setlocalsid S-1-5-21-2434350264-4182727829-1472804664
Configuraciones especiales en el servidor
Editar el archivo /etc/sysctl.conf
Agregar, si es que no lo esta, la línea
net.ipv6.bindv6only = 1
Si no le es posible reiniciar el servidor por esta vez, configure sobre la marcha
sysctl -p
Agregue la siguiente línea al archivo /etc/security/limits.conf, para aumentar el número de ficheros que el usuario root (quién administra los procesos de samba) puede mantener abiertos.
root - nofile 16384
Si no le es posible reiniciar el servidor esta vez, configure sobre la marcha
ulimit -n 16384
Módulos para NSSSWITCH y PAM
Se instala el paquetes libnss-ldap. El resolverás las dependencias necesarias
aptitude install libnss-ldap libpam-ldap
A continuación, aparecen unos asistentes de configuración que pueden resultar engorrosos para la mayoría, amén del hecho que es fácil equivocarse dentro de ellos. Se recomienda que los ignore y configure los archivos de la siguiente manera:
/etc/libnss-ldap.conf |
base dc=salud,dc=gob,dc=sv uri ldap://10.20.20.10 ldap_version 3 binddn cn=lector,dc=salud,dc=gob,dc=sv bindpw {contraseña-lector-ldap} rootbinddn cn=admin,dc=salud,dc=gob,dc=sv bind_policy soft nss_base_passwd ou=Users,dc=salud,dc=gob,dc=sv?one nss_base_shadow ou=Users,dc=salud,dc=gob,dc=sv?one nss_base_group ou=Groups,dc=salud,dc=gob,dc=sv?one |
/etc/pam_ldap.conf |
base dc=salud,dc=gob,dc=sv uri ldap://10.20.20.10 ldap_version 3 binddn cn=lector,dc=salud,dc=gob,dc=sv bindpw {contraseña-lector-ldap} rootbinddn cn=admin,dc=salud,dc=gob,dc=sv bind_policy soft pam_password crypt nss_base_passwd ou=Users,dc=salud,dc=gob,dc=sv?one nss_base_shadow ou=Users,dc=salud,dc=gob,dc=sv?one nss_base_group ou=Groups,dc=salud,dc=gob,dc=sv?one |
El archivo /etc/libnss-ldap.secret se crea con una redirección de echo:
echo "{contraseña-administrador-ldap}" > /etc/libnss-ldap.secret
/etc/libnss-ldap.secret |
{contraseña-administrador-ldap} |
El archivo /etc/pam_ldap.secret se crea con una redirección de echo:
echo "{contraseña-administrador-ldap}" > /etc/pam_ldap.secret
/etc/pam_ldap.secret |
{contraseña-administrador-ldap} |
Configuraremos ahora el archivo /etc/nsswitch.conf, modificaremos las siguiente líneas para que queden como tal:
/etc/nsswitch.conf |
passwd: compat ldap group: compat ldap shadow: compat ldap hosts: files wins dns |
Empiezan las pruebas: Se obtiene la lista de usuarios del sistema (NSSWITCH)
getent passwd
Luego, ejecutar y deseleccionar la opcion LDAP Authentication
pam-auth-update
Reinicias el servicio nscd
service nscd restart
Y verificar con un usuario al azar que sea un verdadero usuario del sistema. (Pero el truco anterior le impedirá loguearse en el servidor)
id lramirez
Que debe devolver algo como esto
uid=3058(lramirez) gid=1020(HNSensunte) grupos=1020(HNSensunte) |
El siguiente comando debe devolver un estado del mapeo de grupos Unix-Samba
net groupmap list
El resultado debe dar algo como esto, tome en cuenta que esta es una salida recortada
Domain Admins (S-1-5-21-371878337-141820978-2368272707-512) -> Administradores rorien (S-1-5-21-371878337-141820978-2368272707-3013) -> Reg_Oriental ... Domain Admins (S-1-5-21-371878337-141820978-2368272707-512) -> Domain Admins Domain Users (S-1-5-21-371878337-141820978-2368272707-513) -> Domain Users |
Respaldo – restauración del árbol LDAP
Respaldo
Se debe obtener un respaldo por rama del servidor en cuestión. Con esto bastará.
ldapsearch -x -D cn=admin,dc=salud,dc=gob,dc=sv -w {password-ldap-root} -b ou=Users,dc=salud,dc=gob,dc=sv>personas.ldif ldapsearch -x -D cn=admin,dc=salud,dc=gob,dc=sv -w {password-ldap-root} -b ou=Computers,dc=salud,dc=gob,dc=sv>machines.ldif ldapsearch -x -D cn=admin,dc=salud,dc=gob,dc=sv -w {password-ldap-root} -b ou=Groups,dc=salud,dc=gob,dc=sv>group.ldif
Y si se hace desde la terminal de un equipo externo agregas el parametro -H
ldapsearch -x -H ldap://192.168.10.14:389 -D cn=admin,dc=salud,dc=gob,dc=sv -w contrasenia -b ou=people,dc=salud,dc=gob,dc=sv>personas.ldif
Como puedas, borra la entrada de nobody y root del archivo ldiff, porque ya existen en esa rama. Borra también la entrada en la rama.
Cuando esto se haya hecho, puede levantarse el sevicio samba
service samba restart
Si usted migra desde otro servidor, revise que los atributos que cada objeto tenga se corresponda con los disponibles en los esquemas agregados. Ese fue un trabajo especialmente interesante en nuestra organización. Y sí, prácticamente es a prueba y error.
Recuperación
Para volverse al lugar de donde vinieron, solo debe correrse lo siguiente con cada archivo de subarbol que se haya recuperado . Debe usarse el usuario administrador.
ldapadd -D cn=admin,dc=salud,dc=gob,dc=sv -w {password-ldap} -f personas.ldif ldapadd -D cn=admin,dc=salud,dc=gob,dc=sv -w {password-ldap} -f machines.ldif ldapadd -D cn=admin,dc=salud,dc=gob,dc=sv -w {password-ldap} -f group.ldif
Cuando se recuperen, se debe revisar que samba los pueda leer.
pdbedit -L
Primeros pasos en la administración
El usuario más normal del mundo puede crearse con el siguiente comando, el cual parece ser bastante explicativo sobre el uso de cada opción propuesta. Mencionar que -m le creará al usuario un directorio en home, algo que en realidad muy pocos usuarios tendrán el privilegio de tener. El uso más común que tendrá el usuario será el siguiente:
smbldap-useradd -a -P -N "Alexander" -S "Figueroa" -c "Alexander Figueroa" -g "Domain Admins" -d "" admin01
Se recomienda darle permisos de administrador en el dominio
net -S 10.10.20.49 rpc rights grant 'salud.gob.sv\Domain Admins' SeTakeOwnershipPrivilege SeAddUsersPrivilege SeMachineAccountPrivilege