Gestió centralitzada d’usuaris utiltizant LDAP
🎯 Objectius del laboratori
En aquest laboratori desplegarem i configurarem una infraestructura LDAP completa utilitzant tres instàncies EC2 a AWS Academy. L’objectiu és entendre tant el funcionament intern d’un servei d’autenticació centralitzada com la seva integració amb clients Linux i eines d’administració.
🏗️ Infraestructura a desplegar
Treballarem amb tres màquines virtuals:
- Servidor LDAP (OpenLDAP) : Gestionarà el directori, usuaris, grups i esquemes.
- Client LDAP + SSSD: Permetrà que els usuaris definits al directori es puguin autenticar al sistema Linux.
- Servidor web LAM (LDAP Account Manager): Oferirà una interfície gràfica per administrar el directori de manera senzilla.
🧠 Què aprendràs en aquest laboratori?
En finalitzar el laboratori seràs capaç de:
- Comprendre l’arquitectura i els components bàsics d’un sistema LDAP.
- Instal·lar i configurar OpenLDAP en un servidor Linux.
- Activar TLS/SSL i utilitzar LDAPS (port 636) per a connexions segures.
- Crear i gestionar usuaris, grups i unitats organitzatives (OU) al directori.
- Configurar un client Linux perquè utilitzi LDAP per autenticar usuaris (PAM + SSSD).
- Utilitzar LDAP Account Manager (LAM) per administrar visualment el directori.
- Verificar que un usuari creat al directori pot iniciar sessió al client Linux.
📌 Resultats esperats
En acabar hauràs desplegat un entorn funcional que simula un sistema d’autenticació corporatiu, tal com es trobaria en una infraestructura real d’empresa.
🧩 Requisits per començar el laboratori
Per completar aquest laboratori necessitareu tres instàncies EC2 que formaran la infraestructura LDAP. Utilitzarem Amazon Linux 2023, ja que és estable, lleuger i compatible amb les eines necessàries.
| Rol | Nom recomanat | Ports oberts | Programari necessari |
|---|---|---|---|
| Servidor LDAP | OpenLDAP-AMSA-Server |
22, 389, 636 | OpenLDAP instal·lat i configurat amb TLS/SSL |
| Client LDAP | LDAP-Client |
22 | SSSD, Paquets openldap-clients |
| Servidor LAM | LAM-WebServer |
22, 80 | Apache HTTPD + PHP + LDAP Account Manager (LAM) |
🔐 Grups de seguretat (Security Groups)
- Regles d’entrada:
| Rol | Ports necessaris oberts |
|---|---|
| Servidor LDAP | SSH (22/tcp), LDAP (389/tcp), LDAPS (636/tcp) |
| Client LDAP | SSH (22/tcp) |
| Servidor LAM | SSH (22/tcp), HTTP (80/tcp) |
- Regles de sortida: Totes per defecte (Allow All).
Verifica que:
- Les 3 instàncies EC2 estan creades. Apunta el DNS públic de cadascuna.
- Assegura’t que pots connectar-te via SSH a cada instància.
- Cada servei té els ports necessaris oberts al seu Security Group. Per comprovar-ho pots fer servir la comanda
nc -zv <IP_SERVIDOR> <PORT>.
PART I – Configuració del servidor OpenLDAP
🛠️ Instal·lació d’eines i dependències
Segons el manual oficial d’instal·lació manual d’instal·lació, OpenLDAP requereix un conjunt de biblioteques i eines per poder compilar:
- Compilador C (gcc)
- OpenSSL → necessari per TLS/SSL
- Cyrus SASL → suport d’autenticació avançada
- libevent → millora del rendiment en gestió d’esdeveniments
- libargon2 / libsodium → hashing de contrasenyes
- Eines de compilació: make, autoconf, libtool
sudo dnf install \
cyrus-sasl-devel make libtool autoconf libtool-ltdl-devel \
openssl-devel libdb-devel tar gcc perl perl-devel wget vim -y📦 Descarregar i descomprimir OpenLDAP
Descarregarem el paquet des de la pàgina oficial mitjançant FTP i el descomprimirem:
VER="2.6.3"
cd /tmp
wget ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-$VER.tgz
tar xzf openldap-$VER.tgz
cd openldap-$VER/tmp?
/tmp: És un directori temporal, ideal per compilar programari sense embrutar el sistema. Un cop reiniciem, tot el que hi ha a /tmp es perd.
pwdha de mostrar/tmp/openldap-2.6.3.ls -lah /tmp/openldap-2.6.3ha de llistar els fitxers font d’OpenLDAP.
⚙️ Configuració i instal·lació d’OpenLDAP
Un cop descarregat el codi font, procedirem a configurar, compilar i instal·lar OpenLDAP. Aquest procés ens permet controlar exactament quines funcionalitats tindrà el servidor.
Configurem el paquet amb les opcions que necessitem:
./configure --prefix=/usr --sysconfdir=/etc --disable-static \ --enable-debug --with-tls=openssl --with-cyrus-sasl --enable-dynamic \ --enable-crypt --enable-spasswd --enable-slapd --enable-modules \ --enable-rlookups --disable-sql \ --enable-ppolicy --enable-syslog--prefix=/usr→ OpenLDAP s’instal·larà sota /usr (no /usr/local).--sysconfdir=/etc→ Fitxers de configuració a /etc/openldap.--with-tls=openssl→ Activa TLS/SSL (LDAPS).--enable-slapd→ Construeix el servidor LDAP.--enable-modules→ Permet càrrega dinàmica de mòduls.--enable-ppolicy→ Suport de polítiques de contrasenyes.--enable-debug→ Útil en entorns docents.
Compilem i instal·lem el paquet:
sudo make depend sudo make
El comandament make test executa proves d’integritat, però pot trigar força estona i no és necessari en aquest laboratori. En producció, sí que es recomana.
Compilem els mòduls addicionals per suportar SHA-2: Per defecte, OpenLDAP utilitza SHA-1, que avui dia és insuficientment segur. Activarem suport per a SHA-256, SHA-384 i SHA-512.
cd contrib/slapd-modules/passwd/sha2 sudo makeInstal·lem el servidor OpenLDAP:
cd ../../../.. # Tornem a la carpeta inicial sudo make install
Aquesta comanda instal·larà: - el servidor slapd - eines d’administració (ldapadd, ldapsearch, etc.) - configuració base a /etc/openldap/
Instal·lem els mòduls addicionals relacionats amb SHA-2:
cd contrib/slapd-modules/passwd/sha2 sudo make install
En aquest punt, si tot ha anat bé, ja tindrem el servidor LDAP instal·lat al nostre servidor. Podeu comprovar:
Els fitxers de configuració a
/etc/openldap/:sudo ls -la /etc/openldap/Els mòduls instal·lats a
/usr/local/libexec/openldap/:sudo ls -la /usr/local/libexec/openldap/ # (o /usr/libexec/openldap/ si la vostra configuració així ho ha definit).
Assegura’t que la instal·lació ha anat bé:
- Verifica que existeix el directori
/etc/openldap. - Verifica que existeix el directori
/usr/local/libexec/openldap. - Verifica que existeix
/usr/local/libexec/openldap/pw-sha2.la. - Verifica
slapd -VVper veure la versió i els mòduls carregats.
Si tot és correcte, ja tens OpenLDAP instal·lat i llest per configurar.
🔐 Generació de contrasenyes amb SHA-512 (SSHA-512)
Un cop instal·lats els mòduls SHA-2, podem generar contrasenyes utilitzant l’algorisme SSHA-512, que és molt més segur que el tradicional SHA-1. Aquest tipus de hash és el que s’utilitzarà per emmagatzemar contrasenyes dins del directori LDAP.
🛠️ Generació del hash amb slappasswd
Utiltizarem la comanda slappasswd on cal indicar:
- quin algorisme de hash volem utilitzar (
-h "{SSHA512}"), en aquest cas SHA-512. - els mòduls que implementen aquest algorisme (
-o module-load=pw-sha2.la). - la ruta on es troben aquests mòduls (
-o module-path=/usr/local/libexec/openldap).
slappasswd -h "{SSHA512}" -o module-load=pw-sha2.la -o module-path=/usr/local/libexec/openldap🔑 Introducció de la contrasenya
Quan executeu la comanda, se us demanarà la contrasenya:
New password: ********
Re-enter new password: ********En l’exemple del laboratori utilitzem 1234 per simplicitat, però en entorns reals això seria extremadament insegur.
🧮 Exemple de resultat
El resultat generat serà un hash llarg similar al següent:
{SSHA512}CBVaUdQC9mVvAi+0O92J3hA+aPdiWUqf4lVr6bGRAUsFJX5aFOEb+1pSsY8PQwW1UKuuCGO2+160HotnfjXIaRKlryVekLnuAquesta cadena és el valor que es pot inserir al directori LDAP en atributs com userPassword.
⚙️ Configuració del servei slapd.service
És una bona pràctica de seguretat que qualsevol servei del sistema s’executi amb un usuari propi i amb permisos mínims. Això evita que un possible atac comprometi tot el sistema. El servidor LDAP (slapd) no ha de ser executat com a root. En lloc d’això, crearem un usuari dedicat i un grup dedicat amb permisos estrictament limitats.
Crearem un grup de sistema anomenat ldap amb un GID fixat:
sudo groupadd -g 55 ldapEl GID 55 és una convenció comuna per al grup ldap en moltes distribucions Linux. Utilitzar un GID fixat ajuda a mantenir la coherència entre diferents sistemes i facilita la gestió d’usuaris i permisos relacionats amb el servei LDAP. Facilita també la migració o sincronització de dades entre sistemes.
Crearem un usuari per al servei LDAP:
sudo useradd -r -M -d /var/lib/openldap -u 55 -g 55 -s /usr/sbin/nologin ldap-r→ crea un usuari de sistema (sense entrada en/etc/login.defs).-M→ no crea directori home (evita carpetes innecessàries).-d /var/lib/openldap→ defineix el directori “base” del servei.-u 55→ UID específic, alineat amb el GID creat.-g 55→ assigna el grup ldap.-s /usr/sbin/nologin→ impedeix que l’usuari iniciï sessió interactiva.
El servei LDAP tindrà només els permisos que necessiti, i res més.
⚙️ Configuració del servei LDAP
📁 Creació dels directoris necessaris
OpenLDAP utilitza dos elements importants:
- Directori de dades → conté la base de dades i el PID del servei
- Directori de configuració slapd.d → conté la configuració dinàmica generada per slapadd i slapd
Creem-los:
sudo mkdir -p /var/lib/openldap
sudo mkdir -p /etc/openldap/slapd.d🛡️ Assignació de permisos
Assignació de permisos al directori de dades
Com hem creat abans l’usuari i grup ldap, ara assignarem permisos correctes.
sudo chown -R ldap:ldap /var/lib/openldapAixò permet que el servei pugui crear els fitxers de BD, sockets i el PID.
Permisos al fitxer de configuració
sudo chown root:ldap /etc/openldap/slapd.conf
sudo chmod 640 /etc/openldap/slapd.confEl fitxer de configuració ha de ser propietat de root, però el grup ldap ha de tenir permisos de lectura. Això permet que el servei pugui llegir la configuració, però evita que altres usuaris no autoritzats hi accedeixin. Els permisos 640 signifiquen: el propietari (root) té permisos de lectura i escriptura, el grup (ldap) té permisos de lectura, i altres usuaris no tenen cap permís.
🛠️ Creació del fitxer de servei Systemd
Ara crearem un servei slapd.service perquè OpenLDAP s’integri amb systemd i pugui arrencar automàticament amb el sistema.
sudo bash -c "cat > /etc/systemd/system/slapd.service << 'EOL'
[Unit]
Description=OpenLDAP Server Daemon
After=syslog.target network-online.target
Documentation=man:slapd
Documentation=man:slapd-mdb
[Service]
Type=forking
PIDFile=/var/lib/openldap/slapd.pid
Environment=\"SLAPD_URLS=ldap:/// ldapi:/// ldaps:///\"
Environment=\"SLAPD_OPTIONS=-F /etc/openldap/slapd.d\"
ExecStart=/usr/libexec/slapd -u ldap -g ldap -h \${SLAPD_URLS} \$SLAPD_OPTIONS
[Install]
WantedBy=multi-user.target
EOL"En la secció [Unit] definim el nom i les dependències del servei. El directiu After=syslog.target network-online.target garanteix que slapd no s’iniciï fins que el sistema de registre (syslog) i la connexió de xarxa estiguin plenament operatius.
En la secció [Service] especifiquem que el servei és de tipus forking, ja que el dimoni slapd es bifurca i continua executant-se en segon pla. També indiquem el fitxer PID que systemd utilitzarà per controlar el procés, les variables d’entorn i la comanda d’inici. La variable SLAPD_URLS defineix les URL on el servidor escoltarà connexions:
- ldap:/// → LDAP per TCP (port 389)
- ldapi:/// → socket Unix local
- ldaps:/// → LDAP sobre TLS (port 636)
La variable SLAPD_OPTIONS especifica la ubicació del directori de configuració dinàmica (slapd.d), que és el mètode modern de configuració d’OpenLDAP.
Finalment, en la secció [Install] indiquem que el servei ha d’activar-se automàticament en l’objectiu multi-user.target, que correspon al nivell d’execució típic en servidors Linux.
Una bona pràctica és reinciar systemd per informar-lo dels nous serveis creats: sudo systemctl daemon-reload.
🧩 Creació de la base de dades de configuració (cn=config)
Abans que slapd pugui funcionar, cal inicialitzar la base de dades de configuració dinàmica d’OpenLDAP. Aquesta configuració és diferent de la base de dades de dades (on viuran els usuaris) i s’anomena cn=config.
cn=config funciona com una BD LDAP normal: - tot són objectes… - cada objecte té un DN… - i cada DN té objectClasses i atributs.
Aquesta estructura substitueix l’antic slapd.conf, i és molt més flexible.
Conceptes
Configuració global (dn: cn=config)
El dn indica el nom distintiu de l’objecte dins de l’arbre LDAP. En aquest cas, cn=config és el nom distintiu per a la configuració global del servidor LDAP. Defineix paràmetres generals que afecten tot el servidor:
- Rutes per als fitxers de PID i arguments (.pid, .args)
- Configuració TLS mínima
- Política general del dimoni
Mòduls (dn: cn=module,cn=config)
Els mòduls són components addicionals que amplien la funcionalitat del servidor LDAP. En aquest cas, carreguem:
- back_mdb.la → el backend de base de dades MDB (el més modern i recomanat)
- pw-sha2.la → suport de contrasenyes SHA-256/384/512
- ⚠️ Nota: El mòdul pw-sha2.la pot estar a /usr/libexec/openldap o /usr/local/libexec/openldap segons la compilació. Per això el fitxer defineix dues entrades.
Esquemes — cn=schema,cn=config
Els esquemes defineixen quins objectes i atributs existeixen en el directori. En aquest cas, carreguem els esquemes típics:
- core: objectes bàsics (person, organization, organizationalUnit, etc.)
- cosine: amplia atributs i objectes estàndard
- nis: atributs relacionats amb usuaris i grups d’estil Unix/NIS
- inetorgperson: l’esquema més utilitzat per comptes d’usuari moderns (mail, telephoneNumber, etc.)
Frontend — dn: olcDatabase=frontend,cn=config
Controla com s’accedeixen totes les BDs. Nosaltres definirem:
- Quin hash utilitzar per defecte → {SSHA512}
- Permisos:
- tothom pot llegir cn=Subschema
- root local UNIX (peercred) pot administrar TOT
Base de dades de configuració — dn: olcDatabase=config,cn=config
Defineix permisos acl per accedir al propi cn=config.
📄 Creació del fitxer /etc/openldap/slapd.ldif
Aquest LDIF conté tota la configuració inicial de slapd. El crearem així:
sudo bash -c "cat > /etc/openldap/slapd.ldif << 'EOL'
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/lib/openldap/slapd.args
olcPidFile: /var/lib/openldap/slapd.pid
olcTLSCipherSuite: TLSv1.2:HIGH:\!aNULL:\!eNULL
olcTLSProtocolMin: 3.3
dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /usr/libexec/openldap
olcModuleload: back_mdb.la
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /usr/local/libexec/openldap
olcModuleload: pw-sha2.la
include: file:///etc/openldap/schema/core.ldif
include: file:///etc/openldap/schema/cosine.ldif
include: file:///etc/openldap/schema/nis.ldif
include: file:///etc/openldap/schema/inetorgperson.ldif
dn: olcDatabase=frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: frontend
olcPasswordHash: {SSHA512}CBVaUdQC9mVvAi+0O92J3hA+aPdiWUqf4lVr6bGRAUsFJX5aFOEb+1pSsY8PQwW1UKuuCGO2+160HotnfjXIaRKlryVekLnu
olcAccess: to dn.base=\"cn=Subschema\" by * read
olcAccess: to *
by dn.base=\"gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth\" manage
by * none
dn: olcDatabase=config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: config
olcRootDN: cn=config
olcAccess: to *
by dn.base=\"gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth\" manage
by * none
EOL"El script anterior té un problema: olcTLSCipherSuite: TLSv1.2:HIGH:\!aNULL:\!eNULL conté caràcters especials (\!) per eliminar-los feu:
sudo sed -i 's/olcTLSCipherSuite: TLSv1\.2:HIGH:\\!aNULL:\\!eNULL/olcTLSCipherSuite: TLSv1.2:HIGH:!aNULL:!eNULL/' /etc/openldap/slapd.ldif🏗️ Carregar la configuració inicial (cn=config) al servidor LDAP
En aquest punt, ja hem creat el fitxer slapd.ldif que descriu tota la configuració del servidor LDAP:
- paràmetres globals
- mòduls i esquemes
- ACL i bases de dades internes
Ara cal carregar aquesta configuració dins la base de dades cn=config utilitzant l’eina slapadd.
Pas 1 — Carregar la configuració amb slapadd
cd /etc/openldap/
sudo slapadd -n 0 -F /etc/openldap/slapd.d -l /etc/openldap/slapd.ldif
sudo chown -R ldap:ldap /etc/openldap/slapd.dslapadd→ importa dades directament a una base de dades LDAP sense passar pel servidor.-n 0→ indica que volem modificar la base número 0, que sempre correspon acn=config.-F /etc/openldap/slapd.d→ defineix el directori on s’escriuran els fitxers de configuració dinàmica.-l slapd.ldif→ fitxer amb el contingut que volem carregar.
Després de carregar la configuració, canviem els permisos perquè el servei LDAP (slapd) pugui llegir i escriure al directori slapd.d.
Si es produeix un error, podeu eliminar la base de dades i tornar a carregar la configuració. Per fer-ho, sudo rm -rf /etc/openldap/slapd.d/* i torneu a executar la comanda slapadd.
Pas 2 — Iniciar el servei LDAP
Un cop la base de dades cn=config està creada, ja podem arrencar slapd com a servei systemd:
sudo systemctl enable --now slapdVerifica que el servei s’ha iniciat correctament:
- Comprova l’estat del servei amb:
systemctl status slapd
🗂️ Configurant l’estructura de la base de dades del directori
Un cop tenim configurada la base cn=config, és moment de crear la base de dades LDAP que contindrà les dades reals: usuaris, grups i unitats organitzatives. Aquesta base de dades es defineix mitjançant una entrada dins cn=config anomenada: dn: olcDatabase=mdb,cn=config.
rootdn.ldif — Creació de l’usuari admin i configuració de la base de dades
Crearem un fitxer amb la configuració de la base de dades principal i el root admin.
BASE="dc=amsa,dc=udl,dc=cat"
sudo bash -c "cat << EOL > /etc/openldap/rootdn.ldif
dn: olcDatabase=mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: mdb
olcDbMaxSize: 42949672960
olcDbDirectory: /var/lib/openldap
olcSuffix: $BASE
olcRootDN: cn=admin,$BASE
olcRootPW: {SSHA512}CBVaUdQC9mVvAi+0O92J3hA+aPdiWUqf4lVr6bGRAUsFJX5aFOEb+1pSsY8PQwW1UKuuCGO2+160HotnfjXIaRKlryVekLnu
olcDbIndex: uid pres,eq
olcDbIndex: cn,sn pres,eq,approx,sub
olcDbIndex: mail pres,eq,sub
olcDbIndex: objectClass pres,eq
olcDbIndex: loginShell pres,eq
olcAccess: to attrs=userPassword,shadowLastChange,shadowExpire
by self write
by anonymous auth
by dn.subtree=\"gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth\" manage
by dn.subtree=\"ou=system,$BASE\" read
by * none
olcAccess: to dn.subtree=\"ou=system $BASE\"
by dn.subtree=\"gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth\" manage
by * none
olcAccess: to dn.subtree=\"$BASE\"
by dn.subtree=\"gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth\" manage
by users read
by * none
EOL"Observa que:
- El node arrel de la base de dades serà
dc=amsa,dc=udl,dc=cat. Aquest node defineix l’abast del directori LDAP i és on s’emmagatzemaran tots els usuaris i grups. Tot el que crearem viurà sota aquest node. - L’usuari administrador serà
cn=admin,dc=amsa,dc=udl,dc=cat. Aquest usuari tindrà privilegis elevats per gestionar el directori. La seva contrasenya està definida mitjançant un hash SSHA-512 (ara mateix és 1234), però podeu canviar-la generant un nou hash ambslappasswd. - Els índexs definits optimitzen les cerques habituals en el directori (per exemple, per uid, cn, sn, mail, etc.).
- Els ACLs (Access Control Lists) defineixen qui pot accedir a quins atributs i entrades dins del directori. Per exemple, només l’usuari admin i el root local poden gestionar tot, mentre que els usuaris normals només poden llegir. Ningú més té accés. El root s’aconsegueix amb
peercred.
Carregar la configuració de la base de dades
Un cop creat el fitxer, carreguem la configuració a la base de dades:
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/rootdn.ldifAquesta comanda:
ldapadd→ eina per afegir entrades a una base de dades LDAP.-Y EXTERNAL→ utilitza l’autenticació SASL EXTERNAL, que permet autenticar-se com a usuari del sistema (en aquest cas, root).-H ldapi:///→ utilitza el socket local (ldapi) per connectar-se al servidor LDAP.-f rootdn.ldif→ fitxer amb la configuració que volem carregar.
Creació de l’estructura del directori LDAP
Un cop creada la base de dades MDB i configurat l’usuari administrador (cn=admin,$BASE), ja podem definir l’estructura bàsica del Directori d’Informació (DIT). Aquesta estructura seguirà un patró molt habitual en entorns Linux i empreses:
- ou=users → usuaris del sistema
- ou=groups → grups del sistema
- ou=system → comptes o recursos especials
Per tant, la nostra estructura bàsica serà:
- dc=amsa,dc=udl,dc=cat: Node principal de la jerarquia LDAP.
- ou=groups,dc=amsa,dc=udl,dc=cat. Aquesta entrada representa una organització per als grups. Contindrà entrades de tipus posixGroup o groupOfNames.
- ou=users,dc=amsa,dc=udl,dc=cat. Aquesta entrada representa una organització per als usuaris. Contindrà entrades de tipus inetOrgPerson, posixAccount, o altres objectClasses d’usuaris.
- ou=system,dc=amsa,dc=udl,dc=cat: Aquesta entrada representa una organització per al sistema. És habitual crear aquesta OU per comptes especials del sistema, serveis, ACL internes, o objectes que no són “usuaris reals”.
Aquesta estructura fa que el directori sigui ordenat, modular i coherent amb els sistemes Linux quan utilitzen NSS/LDAP.
Per a crear aquesta estructura, primer crearem un fitxer LDIF anomenat basedn.ldif:
BASE="dc=amsa,dc=udl,dc=cat"
DC="amsa"
sudo bash -c "cat << EOL >> basedn.ldif
dn: $BASE
objectClass: dcObject
objectClass: organization
objectClass: top
o: AMSA
dc: $DC
dn: ou=groups,$BASE
objectClass: organizationalUnit
objectClass: top
ou: groups
dn: ou=users,$BASE
objectClass: organizationalUnit
objectClass: top
ou: users
dn: ou=system,$BASE
objectClass: organizationalUnit
objectClass: top
ou: system
EOL"Com que el nostre servidor permet peercred com a administrador, podem afegir aquests objectes amb:
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f basedn.ldif-Y EXTERNAL -H ldapi:/// és el mètode més segur: autentica via socket Unix com a root local del sistema, sense enviar cap contrasenya. En altres entorns, ldapadd -x -D "cn=admin,$BASE" -W -f basedn.ldif demanarà la contrasenya de l’usuari admin.
📂 Creació d’usuaris i grups dins del directori LDAP
Ara que ja tenim l’estructura bàsica (ou=users, ou=groups, ou=system), podem començar a crear usuaris i grups reals dins el directori. La creació d’un usuari en LDAP es fa mitjançant un fitxer LDIF que descriu totes les seves propietats.
👤 Exemple bàsic: Creació d’un usuari
dn: uid=johndoe,ou=users,dc=amsa,dc=udl,dc=cat
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: top
cn: John Doe
sn: Doe
uid: johndoe
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/johndoe
loginShell: /bin/bash
userPassword: {SSHA512}CBVaUdQC9mVvAi+0O92J3hA+aPdiWUqf4lVr6bGRAUsFJX5aFOEb+1pSsY8PQwW1UKuuCGO2+160HotnfjXIaRKlryVekLnu
on:
- inetOrgPerson: Permet atributs de persona (nom, cognom, email…).
- posixAccount: Necessari perquè el sistema Linux pugui validar UID, GID, shell, home, etc.
- shadowAccount: Permet gestionar atributs com caducitat de contrasenya.
- uidNumber / gidNumber: Identificadors reals d’usuari i grup.
- loginShell: Shell que s’executarà quan entri al sistema.
- userPassword: Hash generat prèviament (SSHA-512).
És habitual crear un usuari especial OSProxy, amb la missió de permetre a sistemes Linux consultar:
- UID d’usuaris
- GID de grups
- Llistes de membres
Això forma part del model de seguretat least privilege: Un compte limitat que només pot llegir informació essencial del directori, sense privilegis administratius.
🛠️ Creació del fitxer users.ldif amb usuaris i grups
sudo bash -c '
BASE="dc=amsa,dc=udl,dc=cat"
groups=("programadors" "dissenyadors")
gids=("4000" "5000")
users=("ramon" "manel")
sns=("mateo" "lopez")
uids=("4001" "5001")
# Crear fitxer LDIF
cat > /etc/openldap/users.ldif << EOL1
dn: cn=osproxy,ou=system,${BASE}
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: osproxy
userPassword: {SSHA512}CBVaUdQC9mVvAi+0O92J3hA+aPdiWUqf4lVr6bGRAUsFJX5aFOEb+1pSsY8PQwW1UKuuCGO2+160HotnfjXIaRKlryVekLnu
description: OS proxy for resolving UIDs/GIDs
EOL1
# GRUPS
for (( j=0; j<${#groups[@]}; j++ )); do
cat >> /etc/openldap/users.ldif << EOL2
dn: cn=${groups[$j]},ou=groups,${BASE}
objectClass: posixGroup
cn: ${groups[$j]}
gidNumber: ${gids[$j]}
EOL2
done
# USUARIS
for (( j=0; j<${#users[@]}; j++ )); do
cat >> /etc/openldap/users.ldif << EOL3
dn: uid=${users[$j]},ou=users,${BASE}
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: ${users[$j]}
sn: ${sns[$j]}
uid: ${users[$j]}
uidNumber: ${uids[$j]}
gidNumber: ${uids[$j]}
homeDirectory: /home/${users[$j]}
loginShell: /bin/bash
userPassword: {SSHA512}CBVaUdQC9mVvAi+0O92J3hA+aPdiWUqf4lVr6bGRAUsFJX5aFOEb+1pSsY8PQwW1UKuuCGO2+160HotnfjXIaRKlryVekLnu
EOL3
done
'Carregar els usuaris i grups al directori LDAP
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/users.ldif🧪 Testeig inicial de la instal·lació LDAP (abans de TLS)
🔍 Buscar objectes amb ldapsearch (mode local ldapi:///)
Per comprovar que la base de dades conté els usuaris creats, fem una cerca a ou=users:
ldapsearch -H ldapi:/// -Y EXTERNAL -b "ou=users,dc=amsa,dc=udl,dc=cat"
# La sortida ha de mostrar els usuaris creats com el ramon i el manel amb els seus atributs🔍 Buscar objectes amb ldapsearch (mode anònim)
També podem provar una connexió LDAP anònima (sense autenticar) per veure quina informació és accessible públicament:
ldapsearch -x -H ldapi:/// -b "ou=users,dc=amsa,dc=udl,dc=cat"Si tot està configurat correctament, hauràs de veure només els atributs que l’ACL permet per a usuaris anònims (normalment molt pocs o cap).
🔐 Prova amb l’usuari admin (connexió autenticada)
També podem provar una connexió LDAP clàssica utilitzant cn=admin,$BASE.
ldapsearch -x -W \
-H ldapi:/// \
-D "cn=admin,dc=amsa,dc=udl,dc=cat" \
-b "ou=users,dc=amsa,dc=udl,dc=cat"On:
- El paràmetre -x indica que utilitzem autenticació simple (sense SASL).
- El paràmetre -D especifica el DN de l’usuari amb el qual ens autenticarem (admin).
Altres comandes útils per a la gestió LDAP
Aquestes són les eines bàsiques per gestionar qualsevol directori LDAP:
| Eina | Funció |
|---|---|
| ldapsearch | Cerca i consulta entrades |
| ldapadd | Afegeix entrades (LDIF) |
| ldapmodify | Modifica entrades existents |
| ldapdelete | Elimina entrades |
| ldappasswd | Canvia contrasenyes |
Us recomano familiaritzar-vos amb aquestes eines, ja que són fonamentals per a l’administració diària d’un servidor LDAP. Feu proves amb elles per entendre com funcionen. Per exemple, podeu provar a canviar la contrasenya d’un usuari amb ldappasswd.
ldappasswd -H ldapi:/// \
-D "cn=admin,dc=amsa,dc=udl,dc=cat" \
-x -W \
"uid=manel,ou=users,dc=amsa,dc=udl,dc=cat"Aquesta comanda canviarà la contrasenya de l’usuari manel. Et demanarà: la contrasenya de l’admin i després la nova contrasenya per a manel (2 vegades). Recordeu que ldappasswd genera automàticament el hash de la contrasenya. No us cal fer-ho manualment. Podeu introduir la contrasenya en text pla, i ldappasswd s’encarregarà de convertir-la al format correcte (SSHA512).
Exercicis d’ampliació
Exercic 1: middleearth.ldif — Creació de la base de dades MiddleEarth
A partir del que has fet a l’exercici anterior, crea una jerarquia nova per a middleearth dins el teu domini LDAP. Crea un fitxer middleearth.ldif que conté:
- els grups hobbits, elfs, nans, mags
- els seus gidNumber respectius
- Afegeix-lo al servidor amb ldapadd.
- Comprova que els grups s’han creat amb ldapsearch
Exercici 2: Crear els usuaris de Middle-Earth
Crea un fitxer users-middleearth.ldif amb:
- els usuaris Frodo, Samwise, Gollum, Legolas, Gimli i Gandalf
- sn correctes
- uidNumber únics
- gidNumber que coincideixi amb el seu grup
Verifica que pots consultar-los amb ldapsearch.
Exercici 3: Modificar grup amb ldapmodify
- Modificar el grup actual d’un usuari (per exemple, assigna a Gandalf el grup dels hobbits).
- Comprova que el canvi s’ha aplicat correctament amb
ldapsearch.
Exercici 4: Eliminar usuari amb ldapdelete
- Elimina l’usuari Gollum del directori LDAP.
- Verifica que ja no existeix amb
ldapsearch.
🔐 Configuració de certificats TLS per LDAP (LDAPS)
Per protegir la comunicació amb el servidor LDAP, activarem TLS perquè els clients puguin utilitzar LDAPS (port 636) o LDAP+StartTLS (port 389). Això garanteix que:
- les contrasenyes viatgen xifrades
- totes les consultes i respostes es protegeixen contra interceptació
- els clients poden verificar la identitat del servidor
Generació de certificats TLS amb OpenSSL
El primer pas serà generar un parell de claus i un certificat autosignat amb OpenSSL. Això és suficient per a un laboratori, però en producció es faria amb una CA real.
El Common Name (CN) del certificat ha de coincidir amb el hostname del servidor LDAP que faran servir els clients.
PATH_PKI="/etc/pki/tls"
HOSTNAME="ec2-xx-xxx-xxx-xxx.compute-1.amazonaws.com" # Canvia-ho pel teu hostname públic (DNS Públic)
commonname=$HOSTNAME
country=ES
state=Spain
locality=Igualada
organization=UdL
organizationalunit=IT
email=admin@udl.cat
sudo openssl req -days 500 -newkey rsa:4096 \
-keyout "$PATH_PKI/ldapkey.pem" -nodes \
-sha256 -x509 -out "$PATH_PKI/ldapcert.pem" \
-subj "/C=$country/ST=$state/L=$locality/O=$organization/OU=$organizationalunit/CN=$commonname/emailAddress=$email"Això crearà una clau privada RSA de 4096 bits i un certificat X.509 autosignat vàlid per 500 dies.
Assignació de permisos
La clau privada ha de ser llegible només per l’usuari ldap:
sudo chown ldap:ldap "$PATH_PKI/ldapkey.pem"
sudo chmod 400 "$PATH_PKI/ldapkey.pem"Una CA (Certificate Authority) és una entitat de confiança que emet certificats digitals. Aquests certificats s’utilitzen per verificar la identitat d’un servidor o usuari i per establir connexions segures mitjançant protocols com TLS/SSL. Quan un client es connecta a un servidor, utilitza el certificat emès per la CA per assegurar-se que està comunicant-se amb el servidor legítim i no amb un impostor. Ens ajuda a establir una cadena de confiança en les comunicacions segures.
Creem també un CA (per autosignats utilitzem el mateix certificat):
sudo cp "$PATH_PKI/ldapcert.pem" "$PATH_PKI/cacerts.pem"- Verifica que els fitxers s’han creat correctament:
openssl x509 -in /etc/pki/tls/ldapcert.pem -noout -text. Heu de veure el Common Name (CN) correcte -> el DNS públic del vostre servidor.
Afegir la configuració TLS al servidor LDAP
Ara crearem un LDIF per dir al servidor LDAP on trobar els certificats.
sudo bash -c " cat << EOF > /etc/openldap/add-tls.ldif
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: "$PATH_PKI/cacerts.pem"
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: "$PATH_PKI/ldapkey.pem"
-
add: olcTLSCertificateFile
olcTLSCertificateFile: "$PATH_PKI/ldapcert.pem"
EOF"Perquè aquests atributs encara no existeixen en la configuració inicial. Si tornessis a aplicar TLS una segona vegada, aleshores sí que hauries d’usar:
changetype: modify
replace: olcTLSCertificateFile
Carregar la configuració TLS
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/add-tls.ldifReiniciar el servei LDAP
sudo systemctl restart slapd- Assegura que s’han introduit amb
sudo slapcat -b cn=config | grep tls, hauries de veure tres línies de sortida. - Comprova que el servei s’ha reiniciat correctament:
systemctl status slapd - Comprova que està escoltant als ports LDAP i LDAPS amb:
ss -tuln | grep slapd - Pots utilitzar
openssl s_client -connect localhost:636 -showcertsper verificar que el certificat TLS s’ha carregat correctament. ldapwhoami -H ldaps://$HOSTNAME -x -D "cn=admin,dc=amsa,dc=udl,dc=cat" -Wper assegurar-te que pots autenticar-te via LDAPS.
🖥️ Configuració del client LDAP
En aquest apartat configurarem una nova instància EC2 perquè pugui:
- validar usuaris LDAP,
- utilitzar grups LDAP,
- crear automàticament el directori /home/
quan un usuari LDAP entri al sistema, - utilitzar LDAPS (TLS) per a totes les connexions.
Instal·lar els paquets necessaris
El client necessita eines LDAP i SSSD (System Security Services Daemon), que permet integrar LDAP amb PAM i NSS.
sudo dnf install -y openldap-clients sssd sssd-tools authselect oddjob-mkhomediropenldap-clients→ eines com ldapsearch, ldapadd, etc.sssd→ daemon que gestiona usuaris i credencials.oddjob-mkhomedir→ crea /home/automàticament. authselect→ configura PAM/NSS amb SSSD.
Copiar el certificat CA del servidor LDAP
El client ha de confiar en el certificat TLS del servidor.
Al servidor LDAP:
sudo cat /etc/pki/tls/cacerts.pem
# Copia TOT el contingut.Al client LDAP:
Crea el fitxer:
sudo vi /etc/pki/tls/cacert.crt
# Enganxa el contingut.Es recomana establir permisos restrictius:
sudo chmod 644 /etc/pki/tls/cacert.crtConfigurar /etc/openldap/ldap.conf
Aquest fitxer indica al client on trobar el servidor LDAP i la CA:
sudo bash -c "cat > /etc/openldap/ldap.conf << EOF
BASE dc=amsa,dc=udl,dc=cat
URI ldaps://ec2-XX-XXX-XXX-XXX.compute-1.amazonaws.com
TLS_CACERT /etc/pki/tls/cacert.crt
EOF"Configurar SSSD /etc/sssd/sssd.conf
sudo bash -c "cat > /etc/sssd/sssd.conf << EOF
[sssd]
services = nss, pam, sudo
config_file_version = 2
domains = default
[nss]
[pam]
offline_credentials_expiration = 60
[domain/default]
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
access_provider = ldap
sudo_provider = ldap
cache_credentials = True
ldap_uri = ldaps://ec2-XX-XXX-XXX-XXX.compute-1.amazonaws.com
ldap_search_base = dc=amsa,dc=udl,dc=cat
ldap_user_search_base = ou=users,dc=amsa,dc=udl,dc=cat
ldap_group_search_base = ou=groups,dc=amsa,dc=udl,dc=cat
ldap_default_bind_dn = cn=osproxy,ou=system,dc=amsa,dc=udl,dc=cat
ldap_default_authtok = 1234
ldap_tls_reqcert = demand
ldap_tls_cacert = /etc/pki/tls/cacert.crt
ldap_id_use_start_tls = True
ldap_search_timeout = 50
ldap_network_timeout = 60
ldap_access_filter = (objectClass=posixAccount)
EOF"Aquest fitxer configura SSSD per utilitzar LDAP com a font d’usuaris i grups, amb connexió segura via LDAPS. Molt important: assegura’t que ldap_uri i ldap_default_bind_dn coincideixen amb el teu servidor i usuari OSProxy. La contrasenya també ha de ser correcta.
En aquest exemple, la contrasenya de l’usuari osproxy s’ha posat en text pla per simplicitat. En un entorn de producció, és recomanable utilitzar mètodes més segurs per gestionar les contrasenyes, com ara fitxers de contrasenyes xifrats o utilitzar eines de gestió de secrets. Tot i això, recordeu que l’usuari proxy té permisos limitats per llegir només la informació necessària i no pot escriure/modificar res al directori LDAP.
Assigneu els permisos correctes:
sudo chmod 600 /etc/sssd/sssd.confConfigurar Authselect
authselect és una eina que simplifica la configuració d’autenticació en sistemes Linux. Ens permet no tenir que configurar PAM i NSS manualment.
sudo authselect select sssd --forceConfigurar Oddjob per a la creació automàtica de directoris d’inici
El servei oddjobd crea els directoris /home/<usuari> quan un usuari LDAP inicia sessió per primera vegada.
sudo systemctl enable --now oddjobdAfegeix la següent línia al fitxer /etc/pam.d/system-auth per habilitar aquesta funcionalitat:
sudo bash -c 'echo "session optional pam_oddjob_mkhomedir.so skel=/etc/skel/ umask=0077" >> /etc/pam.d/system-auth'Iniciar i habilitar SSSD
sudo systemctl enable --now sssdTestar la configuració del client LDAP
Prova a cercar usuaris LDAP amb id i getent:
id ramon
getent passwd ramon
getent group programadorsTestar amb creació manual
sudo mkdir /home/ramon
sudo chown 4001::4000 /home/ramon
ls -ld /home/ramon
# Si veus que el propietari és ramon i el grup és programadors, tot funciona correctament.
# Si veus, 4001:4000, vol dir que SSSD no està funcionant correctament.🌐 Instal·lació i configuració d’un client web LDAP (LAM)
Per facilitar l’administració del servidor LDAP, instal·larem LAM — LDAP Account Manager, una interfície web que permet:
- veure usuaris i grups de manera visual
- modificar entrades LDAP
- afegir nous usuaris i grups
- gestionar contrasenyes
- aplicar plantilles d’usuaris i perfils
És una eina molt útil perquè els estudiants entenguin com està organitzat el directori i com funcionen els objectClasses. Aquesta configuració es pot fer en la mateixa instància del servidor LDAP o en una instància separada. Nosaltres ho farem en una instància separada per simular un entorn real on el client web està aïllat del servidor LDAP.
Instal·lació de dependències
Cal instal·lar Apache i els mòduls PHP necessaris perquè LAM funcioni:
sudo dnf install -y httpd php php-ldap php-mbstring php-gd php-gmp php-zip
sudo systemctl enable --now httpdInstal·lació de LAM
Per fer-ho, descarregarem el paquet RPM oficial de LAM i l’instal·larem:
sudo wget https://github.com/LDAPAccountManager/lam/releases/download/9.0.RC1/ldap-account-manager-9.0.RC1-0.fedora.1.noarch.rpm
sudo dnf install -y ldap-account-manager-9.0.RC1-0.fedora.1.noarch.rpmComprova a la pàgina oficial de LAM Releases si hi ha una versió més recent i actualitza l’enllaç de descàrrega si cal.
LAM quedarà instal·lat a /usr/share/lam i accessible via http://
Configuració de LAM
Per configurar LAM, es pot fer des de la interfície web. Accedeix a: http://<IP_SERVER>/lam, el usuari per defecte és lam i la contrasenya també lam. És molt important que canvieu aquesta contrasenya en el primer accés per motius de seguretat.

Aneum a LAM Configuration:
- Edit general settings:
- Importeu el certificat CA del servidor LDAP a la secció TLS/SSL per permetre connexions segures. Copieu l’adreça del servidor LDAP (e.g
ldaps://XXXXXXXX.compute-1.amazonaws.com:636) i feu clic a Import from server.
- Importeu el certificat CA del servidor LDAP a la secció TLS/SSL per permetre connexions segures. Copieu l’adreça del servidor LDAP (e.g
- Edit server profiles:
- Server Address:
ldaps://XXXXXXXX.compute-1.amazonaws.com:636o bé si esteu utilitzant el vostre servidor LDAP,ldap://localhost:389. - Activate TLS: Marcat.
- List of Valid Users:
cn=osproxy,ou=system,dc=amsa,dc=udl,dc=cat. - Tree suffix:
dc=amsa,dc=udl,dc=cat.
- Server Address:
- Account Types:
- Users:
ou=users,dc=amsa,dc=udl,dc=cat. - Groups:
ou=groups,dc=amsa,dc=udl,dc=cat.
- Users:
- List of Valid Users:
cn=osproxy,ou=system,dc=amsa,dc=udl,dc=cat.
Aquesta configuració es guarda en un fitxer anomenat config.inc.php a /etc/lam/. Si necessites canviar la configuració manualment, pots editar aquest fitxer.
Testing de LAM
Un cop configurat correctament, hauríeu de poder iniciar sessió a LAM amb l’usuari osproxy i la contrasenya que heu definit anteriorment. Un cop dins, podreu veure i gestionar els usuaris i grups del vostre directori LDAP de manera visual. Ara podeu afegir nous usuaris, modificar els existents i gestionar grups fàcilment.
