Herramientas de usuario

Herramientas del sitio


ifc:asir:sri:pdc_linux

Controlador de Dominio Primario en Linux (Samba, OpenLDAP y PAM/NSS)

En este tutorial explicaremos como instalar y configurar un controlador de dominio utilizando Samba y OpenLDAP. Este servidor también lo utilizaremos para realizar la autentificación en otras aplicaciones como Moodle, Postfix, Joomla…

OpenLDAP

Instalación de OpenLDAP

El primer paso será la instalación de OpenLDAP:

root@pdc:~# apt-get install slapd ldap-utils

El asistente nos solicitará la contraseña del administrador del directorio LDAP. Nosotros utilizaremos la contraseña secreto.

Configuración básica de OpenLDAP

Ejecutaremos el siguiente comando para configurar los principales parámetros de nuestro directorio OpenLDAP:

root@pdc:~# dpkg-reconfigure --priority=low slapd

El asistente nos solicitará la siguiente información:

  • ¿Desea omitir la configuración del servidor OpenLDAP? No
  • Introduzca su nombre de dominio DNS: example.com
  • Nombre de la organización: Example. Podemos indicar cualquier nombre de organización.
  • Contraseña del administrador: secreto
  • Verificación de la contraseña: secreto
  • Motor de base de datos a utilizar: HDB
  • ¿Desea que se borre la base de datos cuando se purgue el paquete slapd? No. De esta manera, aunque desinstaláramos por equivocación el paquete slapd no perderíamos nuestros datos.
  • ¿Desea mover la base de datos antigua? . Relizamos una copia de seguridad de los datos anteriores.
  • ¿Desea permitir el protocolo LDAPv2? No. Únicamente deberíamos permitir el protocolo LDAPv2 si queremos utilizar alguna aplicación que solo acepta la versión 2.

Comprobamos que se ha inicializado correctamente nuestro directorio:

root@pdc:~# slapcat

Debería mostrar dos objetos:

  • La raíz de nuestro directorio: dn: dc=example,dc=com
  • El usuario administrador: dn: cn=admin,dc=example,dc=com

Si no muestra la información esperada pararemos el servicio slapd, borraremos la base de datos actual, ejecutaremos el asistente (introduciendo los datos indicados anteriormente), iniciaremos el servicio slapd y comprobaremos de nuevo el contenido de nuestro directorio:

root@pdc:~# service slapd stop
root@pdc:~# rm -R /var/lib/ldap/*
root@pdc:~# dpkg-reconfigure --priority=low slapd
root@pdc:~# service slapd start
root@pdc:~# slapcat

Configuración de una conexión cifrada: StartTLS

Podemos cifrar una conexión LDAP utilizando dos métodos:

  • LDAP over SSL o LDAP Secured (LDAPS). Este método utiliza el esquema ldaps:// y un puerto diferente al estándar (habitualmente, el tcp/udp 636). Este método se considera obsoleto.
  • StartTLS. Este método permite establecer una conexión cifrada (TLS/SSL) utilizando el esquema ldap:// y el puerto de conexión por defecto (tcp/udp 389). Este método permite convertir una conexión en texto plano en una conexión cifrada. A través de un proceso de negociación el servidor proporciona al cliente su certificado x.509.

Veámos como podemos configurar el servidor y los cliente para utilizar una conexión cifrada mediante StartTLS.

Configuración del servidor

Primero generaremos la clave privada y el certificado de nuestra CA (Autoridad Certificador) que luego utilizaremos para la generación y firma de la clave privada y el certificado de nuestro servidor.

Utilizaremos un directorio temporal para almacenar los ficheros generados:

root@pdc:~# mkdir /root/temporal/ldap/starttls
root@pdc:~# cd /root/temporal/ldap/starttls

Paso 1. Generación de la clave privada de nuestra CA (Autoridad Certificadora):

Para generar la clave privada de nuestra CA ejecutaremos el siguiente comando:

root@pdc:~/temporal/ldap/starttls# certtool --generate-privkey --outfile slapd-ca-key.pem

Paso 2. Generación del certificado autofirmado de la CA.

Para facilitar su generación utilizaremos una plantilla (ca.info) que contendrá la información necesaria para la generación del certificado:

ca.info
cn = Example
ca
cert_signing_key

Para generar el certificado autofirmado de la CA ejecutaremos el siguiente comando:

root@pdc:~/temporal/ldap/starttls# certtool --generate-self-signed --load-privkey slapd-ca-key.pem 
     --template ca.info --outfile slapd-ca-cert.pem

Paso 3. Generación de la clave privada de nuestro servidor:

Para generar la clave privada de nuestro servidor ejecutaremos el siguiente comando:

root@pdc:~/temporal/ldap/starttls# certtool --generate-privkey --bits 1024 --outfile 
     slapd-server-key.pem

Paso 4. Generación del certificado autofirmado de la CA.

Para facilitar su generación utilizaremos una plantilla (servidor.info) que contendrá la información necesaria para la generación del certificado:

servidor.info
organization = Example
cn = pdc.example.com
tls_www_server
encryption_key
signing_key
expiration_days = 3650

Recuerda que en el campo cn (Common name) debes indicar el FQDN del servidor.

Para generar el certificado de nuestro servidor ejecutaremos el siguiente comando:

root@pdc:~/temporal/ldap/starttls# certtool --generate-certificate --load-privkey slapd-server-key.pem
     --load-ca-certificate slapd-ca-cert.pem --load-ca-privkey slapd-ca-key.pem --template 
     servidor.info --outfile slapd-server-cert.pem

Paso 5. Ubicación de los ficheros y establecimiento de permisos.

Nuestro servidor LDAP usará solo tres archivos: el certificado público de la CA (slapd-ca-cert.pem), la clave privada del servidor (slapd-server-key.pem) y el certificado público del servidor (slapd-server-cert.pem).

Deberemos ubicar estos tres ficheros en los siguientes directorios:

cp slapd-ca-cert.pem /etc/ssl/certs/
cp slapd-server-key.pem /etc/ssl/private/
cp slapd-server-cert.pem /etc/ssl/certs/

Si nos fijamos en los permisos de la clave privada del servidor (slapd-server-key.pem) podremos observar que el usuario y el grupo propietario es root y que sus permisos son 600. Por defecto, slapd se ejecuta como usuario y grupo openldap, por tanto no puede leer la clave privada del servidor (slapd-server-key.pem). La mejor opción para solucionar este problema es añadir el usuario openldap al grupo ssl-cert, establecer como usuario propietario del fichero a root y como grupo propietario a ssl-cert y, por último, establecer los permisos 640.

Si no está instalado, deberemos instalar el paquete ssl-cert:

root@pdc:~# apt-get install ssl-cert

Ahora realizaremos todos los cambios indicados anteriormente:

root@pdc:~# usermod -a -G ssl-cert openldap
root@pdc:~# chown root:ssl-cert /etc/ssl/private/slapd-server-key.pem
root@pdc:~# chmod 640 /etc/ssl/private/slapd-server-key.pem

Paso 6. Modificar la configuración de OpenLDAP.

Crearemos un fichero LDIF (starttls.ldif) para indicar a OpenLDAP el certificado de la CA, el certificado del servidor y la clave privada del servidor:

starttls.ldif
dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/slapd-ca-cert.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/slapd-server-cert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/slapd-server-key.pem

Ahora modificamos la configuración del servidor con el siguiente comando:

root@pdc:~/temporal/ldap/certificados# ldapmodify -Y EXTERNAL -H ldapi:/// -f starttls.ldif

Podemos comprobar que se ha añadido correctamente la configuración ejecutando el siguiente comando:

root@pdc:~# ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config | grep /etc/ssl

Configuración de los clientes

En los clientes deberemos copiar el fichero slapd-ca-cert.pem a la carpeta /etc/ssl/certs:

root@gcen:~/temporal/ldap/starttls# install -o root -g root -m 644 slapd-ca-cert.pem
     /etc/ssl/certs/slapd-ca-cert.pem

Y, por último, estableceremos el siguiente contenido en el fichero de configuración del cliente LDAP (/etc/ldap/ldap.conf):

ldap.conf
BASE dc=example,dc=com
URI ldap://pdc.example.com/
TLS_CACERT /etc/ssl/certs/slapd-ca-cert.pem

Recuerda que el servidor a su vez también realiza las funciones de cliente, por tanto, también deberás modificar el fichero de configuración del cliente LDAP en el servidor.

Para comprobar que funciona correctamente el cifrado de la conexión puedes ejecutar el siguiente comando:

root@gcen:~# ldapsearch -x -h pdc.example.com -ZZ -b dc=example,dc=com

Verificación del servicio

Podemos verificar que el servicio está en ejecución con el siguiente comando:

root@pdc:~# service slapd status

También podemos comprobar que el servicio slapd está escuchando en el puerto esperado (TCP 389). Con la opción -n mostramos los puertos en formato numérico (389); sin la opción -n se muestra el nombre del servicio (ldap):

root@pdc:~# netstat -atun
root@pdc:~# netstat -atu

Verificamos que la conexión a nuestro directorio OpenLDAP realizando una consulta:

root@pdc:~# ldapsearch -x -b "dc=example,dc=com"

Parámetros:

  • -x: utiliza autenticación simple en lugar de SASL.
  • -b: punto de inicio de la consulta.

Configuración de OpenLDAP para almacenar la información de Samba

El siguiente paso es la configuración de OpenLDAP para almacenar la información de Samba (dominio, grupos, usuarios, equipos…).

Instalación del esquema de Samba

El primer paso será listar los esquemas que OpenLDAP ya tiene cargados:

root@pdc:~# ls -l /etc/ldap/slapd.d/cn\=config/cn\=schema

Por defecto OpenLDAP carga los siguientes esquemas:

cn={0}core.ldif
cn={1}cosine.ldif
cn={2}nis.ldif
cn={3}inetorgperson.ldif

Si añadimos otro esquema deberíamos asignarle el siguiente número libre. En nuestro caso, el 4.

El esquema OpenLDAP de Samba podemos encontrarlo en el paquete samba-doc:

root@pdc:~# apt-get install samba-doc

Copiamos el esquema de samba al directorio donde OpenLDAP tiene los almacenados los esquemas (/etc/ldap/schema/):

root@pdc:~# zcat /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz > /etc/ldap/schema/samba.schema

A continuación crearemos un directorio temporal donde ubicaremos todos los ficheros necesarios para la configuración de OpenLDAP:

root@pdc:~# mkdir -p /root/temporal/ldap

Creamos el fichero /root/temporal/ldap/esquemas.conf y estableceremos como contenido la lista de esquemas ya cargados en OpenLDAP (en riguroso orden) y los esquemas que queremos añadir (en nuestro caso, Samba):

esquemas.conf
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

Creamos un directorio donde almacenaremos los esquemas en formato LDIF:

root@pdc:~# mkdir /root/temporal/ldap/esquemas.d

Convertimos el fichero /root/temporal/ldap/esquemas.conf a formato LDIF:

root@pdc:~# slaptest -f /root/temporal/ldap/esquemas.conf -F /root/temporal/ldap/esquemas.d

Editamos el fichero ldif del esquema Samba (/root/temporal/ldap/esquemas.d/cn\=config/cn\=schema/cn\=\{4\}samba.ldif) y realizamos los siguientes cambios:

  • Modificamos las tres primeras líneas estableciendo el siguiente contenido:
 dn: cn=samba,cn=schema,cn=config
 objectClass: olcSchemaConfig
 cn: samba
  • Borramos las últimas líneas:
structuralObjectClass: olcSchemaConfig
entryUUID: 8309b686-91ed-102f-93fa-972e7504ce9b
creatorsName: cn=config
createTimestamp: 20101201232147Z
entryCSN: 20101201232147.210006Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20101201232147Z

Añadimos el esquema Samba con el siguiente comando:

root@pdc:~# ldapadd -Y EXTERNAL -H ldapi:/// 
     -f /root/temporal/ldap/esquemas.d/cn\=config/cn\=schema/cn\=\{4\}samba.ldif

Parámetros:

  • -Y: especifica el mecanismo SASL de autentificación.
  • -H: especifica la URI que hace referencia al servidor LDAP (protocolo/host/puerto).
  • -f: lee las modificaciones desde un fichero en lugar de utilizar la entrada estándar.

Índices de Samba

Samba necesita una serie de índices en la base de datos para funcionar correctamente. Crearemos el fichero /root/temporal/ldap/samba_indices.ldif con el siguiente contenido:

samba_indices.ldif
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: uidNumber eq
olcDbIndex: gidNumber eq
olcDbIndex: loginShell eq
olcDbIndex: uid eq,pres,sub
olcDbIndex: memberUid eq,pres,sub
olcDbIndex: uniqueMember eq,pres
olcDbIndex: sambaSID eq
olcDbIndex: sambaPrimaryGroupSID eq
olcDbIndex: sambaGroupType eq
olcDbIndex: sambaSIDList eq
olcDbIndex: sambaDomainName eq
olcDbIndex: default sub

Añadimos los índices anteriores con el siguiente comando:

root@pdc:~# ldapmodify -Y EXTERNAL -H ldapi:/// -f /root/temporal/ldap/samba_indices.ldif

Podemos comprobar que los índices se han añadido correctamente con la siguiente consulta:

root@pdc:~# ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config olcDatabase={1}hdb olcDbIndex

Parámetros:

  • -Q: habilita el modo SASL Quiet. Nunca solicita información.
  • -LLL: modifica la forma en que se muestra la información
  • -Y: especifica el mecanismo SASL de autentificación.
  • -H: especifica la URI que hace referencia al servidor LDAP (protocolo/host/puerto).
  • -f: lee las modificaciones desde un fichero en lugar de utilizar la entrada estándar.

Samba

Instalación de Samba

Instalamos el servidor Samba:

root@pdc:~# apt-get install samba

Si el asistente nos solicita el nombre del dominio o del grupo de trabajo introduciremos EXAMPLE.

Configuración de Samba

El primer paso será realizar una copia de seguridad del fichero de configuración de Samba (/etc/samba/smb.conf):

root@pdc:~# cp /etc/samba/smb.conf{,.orig}

El contenido de /etc/samba/smb.conf debe ser el siguiente:

smb.conf
[global]

### ------ Dominio ------ ###

workgroup = EXAMPLE
netbios name = PDC
realm = example.com
server string = %h PDC

security = user

dns proxy = No

### ------ PDC ------ ###

domain master = Yes
preferred master = Yes
local master = Yes
wins support = Yes

os level = 65

domain logons = Yes

# Si queremos que los perfiles de los usuarios sean móviles estableceremos
# la siguiente directiva:
# logon path = \\%L\profiles\%U\

logon path = 
logon drive = H: 
logon script = netlogon.bat

time server = Yes

### ------ Usuarios ------ ###

passdb backend = ldapsam:ldap://127.0.0.1

username map = /etc/samba/smbusers

# Si queremos permitir el acceso a usuarios invitados deberemos crear el 
# usuario indicado en 'guest account'
# map to guest = Bad User
# guest account = guest

map to guest = Never

encrypt passwords = Yes

ldap password sync = Yes

passwd program = /usr/sbin/smbldap-passwd -u %u
passwd chat = *New*password* %n\n *Retype*new*password* %n\n *all*authentication*tokens*updated*

### ------ LDAP ------ ###

ldap suffix = dc=example,dc=com
ldap admin dn = cn=admin,dc=example,dc=com

ldap user suffix = ou=Users
ldap group suffix = ou=Groups
ldap machine suffix = ou=Computers
ldap idmap suffix = ou=Idmap

ldap ssl = No
ldap delete dn = Yes

# La siguiente directiva solo tiene sentido si tenemos un servidor LDAP esclavo
# ldap replication sleep = 1000
 
add machine script = /usr/sbin/smbldap-useradd -w %u

add user script = /usr/sbin/smbldap-useradd -m %u
delete user script = /usr/sbin/smbldap-userdel %u
add group script = /usr/sbin/smbldap-groupadd -p %g
delete group script = /usr/sbin/smbldap-groupdel %g
add user to group script = /usr/sbin/smbldap-groupmod -m %u %g
delete user from group script = /usr/sbin/smbldap-groupmod -x %u %g
set primary group script = /usr/sbin/smbldap-usermod -g %g %u

### ------ Ficheros ------ ###

case sensitive = No
default case = lower
preserve case = Yes
short preserve case = Yes
map acl inherit = Yes
hide unreadable = Yes

dos charset = 850
Unix charset = ISO8859-1

map archive = Yes
map system = No
map hidden = No

### ------ Impresoras ------ ###

# load printers = Yes
# printing = cups
# printcap name = cups

### ------ Red ------ ###

socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
interfaces = eth0 eth1 lo

# La directivas 'hosts allow' y 'hosts deny' permiten establecer seguridad
# adicional realizando un filtrado de direcciones IP. Se pueden definir
# direcciones IP individuales (Ex. 192.168.200.34) o redes (192.168.200.0/24).
# La directiva 'hosts allow' indica a qué anfitriones se les permitirá conectarse.
# La directiva 'hosts deny' indica a qué anfitriones se les denegará la conexión.
# Ejemplos:
# hosts allow = 127.0.0.1, 192.168.200.0/24, 192.168.210.0/24
# hosts deny = 0.0.0.0/24

smb ports = 139 445
bind interfaces only = Yes
name resolve order = wins hosts lmhosts bcast

# La directiva "remote announce" solo la utilizaremos para enviar
# paquetes broadcast a redes remotas (no conectadas al servidor)
# remote announce = 192.168.210.255/EXAMPLE

### ------ Logs ------ ###

syslog only = No
max log size = 1000
log file = /var/log/samba/log.%m 
syslog = 0

### ------ Varios ------ ###

panic action = /usr/share/samba/panic-action %d

### ------ Comparticiones ------ ###

[netlogon]

comment = Domain Logon Service
path = /home/samba/netlogon
guest ok = No
read only = Yes
browseable = No

[profiles]

comment = Network Profiles Share
path = /home/samba/profiles
read only = No
create mask = 0600
directory mask = 0700
browseable = No
guest ok = No
printable = No
profile acls = Yes
csc policy = disable

[homes]

comment = Home Directories
valid users = %S, %D%w%S
read only = No
browseable = No
guest ok = No
create mask = 0600
directory mask = 0700
inherit acls = Yes
vfs objects = recycle
recycle:repository = Papelera de reciclaje 
recycle:keeptree = Yes
recycle:versions = Yes

# [printers]

# comment = All Printers
# path = /var/spool/samba
# browseable = No
# printable = Yes
# guest ok = No
# read only = Yes
# create mask = 0700

# [print$]

# comment = Printer Drivers
# path = /var/lib/samba/printers
# browseable = Yes
# read only = Yes
# guest ok = No

Crearemos el fichero /etc/samba/smbusers con el siguiente contenido:

/etc/samba/smbusers
 root = Administrador
 root = Administrator

Indicamos a Samba la contraseña del usuario rootDN (cn=admin,dc=example,dc=com):

root@pdc:~# smbpasswd -w secreto

La contraseña del usuario rootDN se almacena en el fichero /var/lib/samba/secrets.tdb. Es importante que este fichero solo pueda ser leido por el usuario root.

Reiniciamos el servicio Samba:

root@pdc:~# service samba restart

Si consultamos el contenido de nuestro directorio (comando slapcat) veremos como se ha creado un objeto (dn: sambaDomainName=EXAMPLE,dc=example,dc=com) con la información de nuestro dominio Samba.

Directorios de Samba: netlogon, profiles y shares

Crearemos los directorios necesarios para almacenar la información de nuestro dominio Samba:

  • netlogon: almacena los scripts de autentificación de los cliente Windows.
  • profiles: almacena los perfiles de usuario de los clientes Windows si están habilitados los perfiles móviles.
  • shares: almacena los directorios compartidos de nuestro dominio.

Ejecutaremos los siguientes comandos para crear y configurar los directorios anteriores:

root@pdc:~# mkdir -p /home/samba/{netlogon,profiles,shares}
root@pdc:~# chmod 755 /home/samba/{netlogon,shares}
root@pdc:~# chmod 1777 /home/samba/profiles

Fichero netlogon.bat

Creamos el fichero /home/samba/netlogon/netlogon.bat.unix con el siguiente contenido:

netlogon.bat
net time \\PDC /set /yes
net use H: \\PDC\%U

PDC es el nombre NETBIOS de nuestro servidor Samba.

Debemos convertir el fichero a formato DOS. Para ello utilizaremos la aplicación tofrodos.

Instalamos la aplicación tofrodos:

root@pdc:~# apt-get install tofrodos

Convertimos el fichero a formato DOS:

root@pdc:~# fromdos -u < /home/samba/netlogon/netlogon.bat.unix > /home/samba/netlogon/netlogon.bat

Herramientas para la administración de dominios: smbldap-tools

El paquete smbldap-tools nos facilitará mucho la gestión de nuestro dominio: creará los objetos necesarios (unidades organizativas, grupos…) y nos proporcionará comandos para la gestión de usuarios y grupos.

Instalación de smbldap-tools

Instalamos el paquete smbldap-tools:

root@pdc:~# apt-get install smbldap-tools

Configuración de smbldap-tools

La configuración del paquete smbldap-tools se realiza en dos ficheros: /etc/smbldap-tools/smbldap.conf y /etc/smbldap-tools/smbldap_bind.conf.

Por defecto estos dos ficheros no existen. El propio paquete nos proporciona ficheros de ejemplo que podemos adaptarlos a nuestras necesidades:

root@pdc:~# cp /usr/share/doc/smbldap-tools/examples/smbldap_bind.conf /etc/smbldap-tools
root@pdc:~# cp /usr/share/doc/smbldap-tools/examples/smbldap.conf.gz /etc/smbldap-tools
root@pdc:~# cd /etc/smbldap-tools
root@pdc:~# gzip -d smbldap.conf.gz

El contenido final del fichero /etc/smbldap-tools/smbldap_bind.conf debe ser:

smbldap_bind.conf
slaveDN="cn=admin,dc=example,dc=com"
slavePw="secreto"
masterDN="cn=admin,dc=example,dc=com"
masterPw="secreto"

El contenido final del fichero /etc/smbldap-tools/smbldap.conf debe ser:

smbldap.conf
# General Configuration
# ---------------------
 
# Puedes obtener el SID de su servidor Samba con el comando "net getlocalsid"
SID="S-1-5-21-2252255531-4061614174-2474224977"
 
# Nombre del dominio Samba
sambaDomain="EXAMPLE"
 
# LDAP Configuration
# ------------------
 
# Servidor LDAP esclavo
slaveLDAP="127.0.0.1"
slavePort="389"
 
# Servidor LDAP maestro
masterLDAP="127.0.0.1"
masterPort="389"
 
# Seguridad - TLS/SSL
 
# Al ser una conexión loopback (127.0.0.1) no es necesario utilizar una conexión segura
ldapTLS="0"
ldapSSL="0"
 
# Cómo se verifica el certificado: none, optional o require.
# No utilizamos conexión segura, por tanto su valor es irrelevante
verify="require"
 
# Certificado de la Autoridad Certificadora.
# No utilizamos conexión segura, por tanto su valor es irrelevante
cafile="/etc/smbldap-tools/ca.pem"
 
# Certificado.
# No utilizamos conexión segura, por tanto su valor es irrelevante
clientcert="/etc/smbldap-tools/smbldap-tools.example.com.pem"
 
# Clave privada.
# No utilizamos conexión segura, por tanto su valor es irrelevante
clientkey="/etc/smbldap-tools/smbldap-tools.example.com.key"
 
# Sufijo LDAP
suffix="dc=example,dc=com"
 
# Unidad Organizativa en la que se almacenan los usuarios.
usersdn="ou=Users,${suffix}"
 
# Unidad Organizativa en la que se almacenan los equipos.
computersdn="ou=Computers,${suffix}"
 
# Unidad Organizativa en la que se almacenan los grupos
groupsdn="ou=Groups,${suffix}"
 
# Unidad Organizativa en la que se almacenan las entradas Idmap.
idmapdn="ou=Idmap,${suffix}"
 
# Dónde se almacena el siguiente uidNumber y gidNumber disponibles para
# los nuevos usuarios y grupos.
sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}"
 
# Ámbito predeterminado
scope="sub"
 
# Hash de las contraseñas Unix (CRYPT, MD5, SMD5, SSHA, SHA, CLEARTEXT)
password_hash="MD5"
 
# Si el hash seleccionado es CRYTP deberemos indicar el formato de la
# semilla (por defecto, %s)
password_crypt_salt_format="%s"
 
 
# Unix Accounts Configuration
# ---------------------------
 
# Shell de los usuarios al iniciarse en el sistema
userLoginShell="/bin/bash"
 
# Carpeta personal
userHome="/home/%U"
 
# Permisos de la carpeta personal
userHomeDirectoryMode="700"
 
# Gecos de los usuarios
userGecos="System User"
 
# GID por defecto de los usuarios (POSIX and Samba)
defaultUserGid="513"
 
# GID por defecto de los equipos (Samba)
defaultComputerGid="515"
 
# Directorio "skel" (patrón para crear las carpetas personales) 
skeletonDir="/etc/skel"
 
# Es necesario habilitar la opción shadowAccount si queremos utilizar
# políticas de contraseña, por ejemplo, tiempo de expiración.
shadowAccount="1"
 
# Tiempo (número de días) que las contraseñas son válidas.
defaultMaxPasswordAge="45"
 
 
# SAMBA Configuration
# -------------------
 
# Ruta donde se almacenan las carpetas personales de los usuarios.
# Si se deja vacío toma el valor de la directiva 'logon home' del
# fichero de configuración de Samba (smb.conf).
# Ejemplo: userSmbHome="\\PDC\%U"
userSmbHome=
 
# En el caso de perfiles móviles, ruta donde se almacenan los perfiles
# de los usuarios. Si se deja vacío toma el valor de la directiva
# 'logon path' del fichero de configuración de Samba (smb.conf)
# Ejemplo: userProfile="\\PDC\profiles\%U"
userProfile=
 
# Unidad de red en la que será mapeado la carpeta personal del usuario.
userHomeDrive="H:"
 
# El fichero de lotes (.bat) que se ejecutará cuando un usuario inicie
# sesión.
# Ejemplo: userScript="logon.bat %U"
userScript="netlogon.bat"
 
# Dominio añadido al atributo "mail" cuando se utiliza el comando
# smbldap-useradd -M
mailDomain="example.com"
 
# SMBLDAP-TOOLS Configuration (default are ok for a RedHat)
# ---------------------------------------------------------
 
# Allows not to use smbpasswd (if with_smbpasswd="0" in smbldap.conf) but
# prefer Crypt::SmbHash library
with_smbpasswd="0"
smbpasswd="/usr/bin/smbpasswd"
 
# Allows not to use slappasswd (if with_slappasswd="0" in smbldap.conf)
# but prefer Crypt:: libraries
with_slappasswd="0"
slappasswd="/usr/sbin/slappasswd"
 
# comment out the following line to get rid of the default banner
# no_banner="1"

Poblar nuestro directorio LDAP

Por último ejecutaremos el comando que inicializará nuestro directorio LDAP con la información anterior:

root@pdc:~# smbldap-populate

Este comando nos solicitará la contraseña para el administrador (root) del dominio. Nosotros le asignaremos la contraseña secreto.

A continuación se muestra los principales objetos (unidades organizativas, usuarios y grupos) creados:

dc=example,dc=com
|
|--- ou=Users                   Unidad organizativa para almacenar las cuentas de usuario UNIX/Samba
|     |
|     |--- uid=root             Administrador de UNIX y Administrador del Dominio Samba
|     |
|     |--- uid=nobody           Cuenta anónima para UNIX y el Dominio Samba
|
|
|--- ou=Computers               Unidad organizativa para almacenar las cuentas de los
|                               equipos Microsoft Windows añadidos al dominio
|
|--- ou=Groups                  Unidad organizativa para almacenar los grupos UNIX/Samba
|     |
|     |--- cn=Domain Admins     Grupo Global para los Administradores del Dominio
|     |
|     |--- cn=Domain Users      Grupo Global para los Usuarios de Dominio
|     |
|     |--- cn=Domain Computers  Grupo Global para las Cuentas de Computadoras del Dominio
|
|
|--- ou=Idmaps                  Unidad organizativa para almacenar los índices Idmaps

En este punto es necesario reiniciar el servidor Samba:

root@pdc:~# service samba restart

Comprobar la instalación, configuración e integración de OpenLDAP y Samba

Comprobar las cuentas Samba almacenadas en el directorio

El comando pdbedit nos permite gestionar las cuentas Samba. Nosotros solo utilizaremos pdbedit para listar información del directorio. Siempre que tengamos que realizar cualquier modificación (añadir una cuenta, borrar una cuenta, modificar una cuenta, añadir un grupo…) utilizaremos las herramientas proporcionadas por smbldap-tools.

Podemos listar las cuentas Samba almacenadas en el directorio con el comando:

root@pdc:~# pdbedit -L

Si no hemos añadido nuevos usuarios nos deberá mostrar solo dos usuarios: root y nobody.

Si queremos ver un listado detallado utilizaremos la opción -v:

root@pdc:~# pdbedit -Lv

Para obtener la información de un usuario en concreto utilizaremos el comando:

root@pdc:~# pdbedit -L usuario

En este punto es importante recordar que el usuario root de UNIX está mapeado con el usuario root de Samba y que el usuario nobody de UNIX está mapeado con el usuario nobody de Samba.

Comprobar el mapeo de grupos Unix y Samba

Podemos consultar los grupos mapeados entre Unix y Samba con el siguiente comando:

root@pdc:~# net groupmap list

Los principales grupos mapeados son:

  • Domain Admins (S-1-5-21-…-512) → 512
  • Domain Users (S-1-5-21-…-513) → 513
  • Domain Guests (S-1-5-21-…-514) → 514
  • Domain Computers (S-1-5-21-…-515) → 515

En los siguientes apartados configuraremos nuestro servidor para que obtenga la información de usuario y grupos Unix a partir del servidor LDAP. De esta manera en lugar de ver el GID (512, 513, 514…) veremos el nombre del grupo.

Puedes consultar más información sobre el mapeo de grupos en Chapter 12. Group Mapping: MS Windows and UNIX.

Puedes consultar más información de Identificadores de seguridad conocidos en los sistemas operativos de Windows.

Comprobar la conexión a nuestro servidor Samba

Para realizar una conexión al servidor Samba necesitamos instalar el cliente Samba:

root@pdc:~# apt-get install smbclient

Para comprobar que funciona correctamente realizaremos una conexión al recurso compartido netlogon con el usuario root:

root@pdc:~# smbclient //localhost/netlogon -U root

Podemos comprobar también que los mapeos de usuario samba especificados en el fichero /etc/smbusers funcionan:

root@pdc:~# smbclient //localhost/netlogon -U Administrador
root@pdc:~# smbclient //localhost/netlogon -U Administrator

Modificar la cuenta root

Es conveniente realizar las siguientes modificaciones en el usuario root:

  • Cambiar la ruta de su carpeta personal.
  • Establecer el shell (/bin/bash).
  • Deshabilitar el uso de perfil móvil.

Para realizar estos cambios ejecutaremos el siguiente comando:

root@pdc:~# smbldap-usermod -d /root -s /bin/bash -C "" -D "" -F "" root

Podemos observar los cambios ejecutando el comando:

root@pdc:~# ldapsearch -x -D "cn=admin,dc=example,dc=com" -b "uid=root,ou=Users,dc=example,dc=com" -W

Comando básicos de gestión de usuarios

El paquete smbldap-tools proporciona una serie de comandos que facilita la gestión de grupos y usuarios. Los principales son los siguientes:

  • Añadir un usuario: smbldap-useradd
  • Borrar un usuario: smbldap-userdel
  • Modificar un usuario: smbldap-usermod
  • Cambiar contraseña de un usuario: smbldap-passwd
  • Añadir un grupo: smbldap-groupadd
  • Borrar un grupo: smbldap-groupdel
  • Modificar un grupo: smbldap-groupmod

Podéis consultar la página de manual asociada a cada uno de estos comandos para ver todas las opciones.

Veamos algunos ejemplos comunes:

— Crear una cuenta (UNIX y Samba) a Juan Palomo Mercaderes con el nombre de usuario juan, creando su carpeta personal y estableciendo su contraseña:

root@pdc:~# smbldap-useradd -a -m -N "Juan" -S "Palomo Mercaderes" -P juan

Opciones:

  • -a: el usuario tendrá cuenta en UNIX y en Samba
  • -m: crea la carpeta personal del usuario si no existe
  • -N: nombre
  • -S: apellidos
  • -P: una vez que se ha creado el usuario se ejecuta smbldap-passwd para asignarle contraseña.

— Establecer la contraseña del usuario juan en UNIX y en Samba:

root@pdc:~# smbldap-passwd -a juan

— Borrar el usuario juan:

root@pdc:~# smbldap-userdel juan

— Borrar el usuario juan y borrar su carpeta personal:

root@pdc:~# smbldap-userdel -r juan

— Crear el grupo ventas (UNIX y Samba):

root@pdc:~# smbldap-groupadd -a ventas

— Borar el grupo ventas:

root@pdc:~# smbldap-groupdel ventas

— Añadir el usuario juan al grupo ventas:

root@pdc:~# smbldap-groupmod -m juan ventas

— Eliminar el usuario juan del grupo ventas:

root@pdc:~# smbldap-groupmod -x juan ventas

Configuración de PAM/NSS

En este apartado configuraremos nuestro servidor para que pueda obtener la información de las cuentas de usuario tanto del sistema local (/etc/passwd, /etc/group…) como de nuestro servidor OpenLDAP. Para ello utilaremos NSS y PAM.

El servicio NSS (Name Service Switch) proporciona una interfaz para configurar y acceder a diferentes bases de datos de cuentas de usuarios. Por defecto accede a la información almacenada localmente (/etc/passwd, /etc/shadow, /etc/group, /etc/hosts…) pero también podemos configurarlo para que acceda a un servidor LDAP.

PAM (Pluggable Autentication Modules) es una conjunto de librerías que permite a las aplicaciones y a los servicios abstraerse del mecanismo de autentificación. Es decir, las aplicaciones se autentifican contra PAM y es PAM quien se encarga de obtener la información de las cuentas de usuarios.

Instalaremos y configuraremos los siguientes paquetes:

  • libnss-ldap: módulo de NSS para acceder a la información de un directorio LDAP.
  • libpam-ldap: módulo de PAM que permite acceder a la información de un servidor LDAP.

Inslación y configuración de NSS/PAM

Instalaremos los paquetes anteriores con el comando:

root@pdc:~# apt-get install libnss-ldap libpam-ldap

El asistente de configuración nos solicitará la siguiente información:

  • Configuración de libnss-ldap
    • URI del servidor de LDAP: ldapi:///127.0.0.1
    • El nombre distintivo (DN) de la base de búsquedas: dc=example,dc=com
    • Versión de LDAP a utilizar: 3
    • Cuenta LDAP para root: cn=admin,dc=example,dc=com
    • Contraseña para la cuenta LDAP de root: secreto
  • Configuación de libpam-ldap:
  • ¿Desea permitir que la cuenta del administrador de LDAP se comporte como el administrador local?
  • ¿Hace falta un usuario para acceder a la base de datos de LDAP? No
  • Cuenta del administrador de LDAP: cn=admin,dc=example,dc=com
  • Contraseña del administrador de LDAP: secreto

Es necesario volver a configurar libpam-ldap:

root@pdc:~# dpkg-reconfigure --priority=low libpam-ldap

El asistente de configuración nos solicitará la siguiente información:

  • URI del servidor de LDAP: ldapi:///127.0.0.1
  • El nombre distintivo (DN) de la base de búsquedas: dc=example,dc=com
  • Versión de LDAP a utilizar: 3
  • ¿Desea permitir que la cuenta del administrador de LDAP e comporte como el administrador local?
  • ¿Hace falta un usuario para acceder a la base de datos de LDAP? No
  • Cuenta LDAP para root: cn=admin,dc=example,dc=com
  • Contraseña para la cuenta LDAP de root: secreto
  • Algoritmo de cifrado local a utilizar en las contraseñas: md5
  • Perfiles PAM a habilitar:
    • [*] Unix Authentication
    • [*] LDAP Authentication

Configuración de /etc/nsswitch.conf

El archivo /etc/nsswitch.conf pertenece al servicio NSS y determina qué orígenes utilizar NSS para obtener la información.

Para indicarle al servicio NSS que también tiene que consultar LDAP para obtener la información de las cuentas de usuario deberemos modificar las siguiente líneas del fichero /etc/nsswitch.conf:

/etc/nsswitch.conf
passwd:    compat ldap
group:     compat ldap
shadow:    compat ldap
 
hosts:     files wins dns

Por precaución reiniciaremos nscd (servicio de caché para el servicio de nombres):

root@pdc:~# service nscd restart

Ahora podemos consultar todos los usuarios y grupos (los locales y los almacenados en el directorio OpenLDAP):

— Usuarios:

root@pdc:~# getent passwd

— Grupos

root@pdc:~# getent group

Además, si volvermos a listar el mapeo de grupos veremos como ya se muestran los grupos almacenados en LDAP:

root@pdc:~# net groupmap list

Opciones de configuración

Auto creación de la carpeta de usuario

Podemos indicarle a PAM que cuando un usuario acceda al sistema por primera vez le cree su carpeta personal si no existe.

Para ello deberemos modificar el fichero /etc/pam.d/common-session y añadir la siguiente línea:

...
session required  pam_mkhomedir.so  skel=/etc/skel umask=0077
...

Verificación de la configuración de PAM/NSS

Prueba 1

El objetivo de esta prueba es añadir un usuario y acceder con él en un sistema UNIX.

Añadimos un usuario juan creando su carpeta personal:

root@pdc:~# smbldap-useradd -a -m juan

Asignamos una contraseña al usuario juan:

root@pdc:~# smbldap-passwd juan

Acceder con el usuario juan en una consola del propio servidor PDC.

Prueba 2

El objetivo de esta prueba es acceder con el usuario creado en la Prueba 1 al recurso compartido netlogon de Samba:

root@pdc:~# smbclient //localhost/netlogon -U juan

Prueba 3

El objetivo de esta prueba es añadir un usuario sin crear su carpeta personal y que, cuando acceda por primera vez, se cree su carpeta personal.

Añadimos un usuario lucia creando su carpeta personal:

root@pdc:~# smbldap-useradd -a lucia

Asignamos una contraseña al usuario lucia:

root@pdc:~# smbldap-passwd lucia

Al acceder con el usuario lucia en una consola del propio servidor PDC se mostrará la siguiente línea:

Creating directory /home/lucia

Configuración de clientes

Configuración de clientes Linux

Para que un cliente Linux pueda autenticarse contra el servidor LDAP deberemos comfigurar PAM y NSS de la misma manera que lo hemos configurado en el servidor. Obviamente, en lugar de indicar como IP del servidor la 127.0.0.1 deberemos indicar la IP del servidor (por ejemplo, 192.168.20.253).

Configuración de clientes Windows

Un cliente Microsoft Windows podrá acceder a los recursos compartidos por Samba e incluso añadirse al dominio de la misma manera que lo haría con un servidor Microsoft Windows Server.

ifc/asir/sri/pdc_linux.txt · Última modificación: 16/02/2014 11:32 por dwadmin