Diferència entre revisions de la pàgina «Servidor LDAP en Debian/Ubuntu»

De Cacauet Wiki
Salta a la navegació Salta a la cerca
 
(Hi ha 48 revisions intermèdies del mateix usuari que no es mostren)
Línia 1: Línia 1:
 
LDAP és una especificació de servei de directori. Es sol utilitzar per centralitzar comptes d'usuari per diferents aplicacions.
 
LDAP és una especificació de servei de directori. Es sol utilitzar per centralitzar comptes d'usuari per diferents aplicacions.
  
L'objectiu d'aquest article és crear un directori bàsic per autenticació d'aplicacions web.
+
L'objectiu d'aquest article és crear un directori bàsic per autenticació de diversos clients:
 +
* Login en GNU/Linux (Ubuntu).
 +
* Aplicacions web en PHP.
 +
* CMSs diversos com ''moodle'' o ''wordpress''
 +
* ...
  
No cobrirem la creació d'usuaris per validació amb el SO Linux ni la compatibilitat amb Windows.
+
<br>
 +
 
 +
== Introducció ==
 +
Hi ha algunes variants del protocol:
 +
* ldap://    (port 389 sense encriptació o amb STARTTLS)
 +
* ldaps://    (port 636) encriptat amb SSL
 +
 
 +
Característiques:
 +
* [https://wiki.base22.com/display/btg/Glossary+of+LDAP+acronyms+and+terms Llistat d'acrònims] de LDAP: Lightweight Directory Access Protocol
 +
* LDAP no deixa de ser un protocol per atacar una base de dades jeràrquica (directori).
 +
* Cada component pot contenir subcomponents i atributs (arbre).
 +
* Per accedir a un element s'especifica amb el '''DN (DIstinguished Name)''' que inclou tot el "path". Per exemple, admin.enric.local s'especificaria així: <pre>cn=admin,dc=enric,dc=local</pre>
 +
* RDNs són els Relative Distinguised Names, cadascuna de les parts del "path":
 +
** CN = Common Name
 +
** DC = Domain Component
 +
** OU = Organizational Unit
 +
** UID = User IDentifier
 +
** GID = Group IDentifier
 +
** etc.
 +
 
 +
Normalment cada entrada LDAP cal adreçar-la per complet d'aquesta manera. El típic esquema sol ser:
 +
* dc=enric,dc=local
 +
** cn=admin
 +
** ou=Grups
 +
*** cn=grup1
 +
*** cn=grup2
 +
** ou=Usuaris
 +
*** cn=usuari1
 +
*** cn=usuari2
 +
** ou=Maquines
 +
*** cn=pc1
 +
*** cn=pc2
  
 
<br>
 
<br>
  
 +
=== Referències ===
 +
Utilitza els següents tutorials de DigitalOcean per configurar el teu Ubuntu a que faci el login del sistema mitjançant autenticació LDAP:
 +
* [https://help.ubuntu.com/lts/serverguide/openldap-server.html Pàgina oficial Ubuntu sobre OpenLDAP].
 +
* [https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-a-basic-ldap-server-on-an-ubuntu-12-04-vps LDAP Server en Ubuntu 12]
 +
*: Si us apareix un error en crear usuaris amb PHPLDAPADMIN [http://stackoverflow.com/questions/20673186/getting-error-for-setting-password-field-when-creating-generic-user-account-phpl mireu aquesta solució].
 +
* [https://www.digitalocean.com/community/tutorials/how-to-authenticate-client-computers-using-ldap-on-an-ubuntu-12-04-vps tutorial de LDAP per autenticacio de clients de dominis en Ubuntu]: està per Ubuntu 12 però també funciona amb el 14.
 +
* [https://www.digitalocean.com/community/tutorials/how-to-change-account-passwords-on-an-openldap-server Per canviar contrasenyes d'un LDAP] amb ldappasswd.
 +
* Per remenar un Windwos AD amb una eina per a LDAP seguiu aquestes indicacions:
 +
*: https://www.jamf.com/jamf-nation/articles/224/troubleshooting-ldap-connections-to-active-directory-using-apache-directory-studio
 +
 +
<br>
  
 
== Instal·lació a Debian / Ubuntu ==
 
== Instal·lació a Debian / Ubuntu ==
 
Primer l'instal·larem com de costum:
 
Primer l'instal·larem com de costum:
  # apt-get install slapd
+
  # apt-get install slapd ldap-utils
  
Després s'ha de reconfigurar per configurar els arxius bàsics:
+
La via fàcil: reconfigurar els arxius amb un assistent:
 
  # dpkg-reconfigure slapd
 
  # dpkg-reconfigure slapd
  
Evidentment, cal que recordeu la contrassenya que heu generat per l'usuari "admin".
+
Evidentment, cal que recordeu la contrasenya que heu generat per l'usuari "admin".
 +
 
 +
Aquesta instal·lació bàsica ens habilitarà un LDAP. Per modificar les seves dades cal posar un editor, mireu més avall, es recomana PHPLDAPADMIN.
 +
 
 +
=== Seguretat LDAP ===
 +
Per fer un sistema segur del tot ens caldria, a més:
 +
* Encriptació SSL de l'autenticació.
 +
** Secció TLS del [https://help.ubuntu.com/lts/serverguide/openldap-server.html#openldap-tls tutorial oficial d'Ubuntu sobre OpenLDAP].
 +
** També hi ha [https://www.digitalocean.com/community/tutorials/how-to-encrypt-openldap-connections-using-starttls aquest tutorial per TLS de Digital Ocean].
 +
** [https://help.ubuntu.com/community/SecuringOpenLDAPConnections Una altra pàgina oficia d'Ubuntu] (però que no m'ha resultat tan clara).
 +
* Inhabilitar el ''anonymous bind'', ja que tothom pot veure les dades del directori (llevat de les contrasenyes).
 +
** [http://serverfault.com/questions/325912/disallow-global-anonymous-bind-with-cn-config Com deshabilitar anonymous bind] a mi m'ha funcionat la 2a resposta (la que utilitza <code>ldapmodify -Q -Y EXTERNAL...</code>)
 +
 
 +
'''START TLS vs LDAPS'''
 +
 
 +
Cal tenir en compte que el sistema més acceptat actualment és START TLS (ldap/ldapi). Hi ha hagut un temps que s'ha utilitzat el LDAPS en el port 636, però està en desús ja que és un protocol diferent que requereix encriptació des del principi. En canvi, '''START TLS té avantatges''':
 +
* Utilitza el mateix port 389 que el ldap sense encriptar.
 +
* Inicia la comunicació de forma desencriptada i en un segon pas encripta la comunicació.
 +
* Permet la negociació amb el client i facilita el setup i la depuració.
 +
 
 
<br>
 
<br>
  
 +
== Editors per LDAP ==
 +
Editar els arxius de LDAP a mà és una feina dura i complexa. És convenient utilitzar eines gràfiques que ens ho posin fàcil:
 +
* <strike>'''Webmin''' : se suposa que hauria de permetre editar el servidor LDAP, però les proves realitzades han estat negatives.</strike>
 +
* '''Apache Directory Studio''' : requereix Java en el client.
 +
* '''PHPLDAPADMIN (recomanat)''' : interfície web. Molt còmode (llegiu més avall)
 +
* '''JXplorer''' : un altre client per Java. Té l'avantatge que està als repositoris de Debian/Ubuntu i es pot instal·lar simplement amb<pre># apt-get install jxplorer</pre>
  
== Instal·lació de Webmin ==
+
<br>
Webmin és un paquet que ens pot ajudar a administrar el servidor LDAP: http://www.webmin.com
 
  
Aneu a Downloads on hi ha la descàrrega del package per Debian i les instruccions per instal·lar-ho.
+
=== PhpLdapAdmin ===
 +
Segurament és el més còmode d'utilitzar, ja que no necessitem un programari en el client, i ens permet modificar el directori via web.
  
Amb la versió Ubuntu 12.04 sembla que Webmin no funciona d'entrada per gestionar el servidor LDAP.
+
Instal·lació:
<br>
+
# apt-get install phpldapadmin
  
 +
Incidències:
 +
# En la configuració per defecte el programa mostra sempre en el mateix arbre (dc=example,dc=com). Si tens un altre domini diferent (és el normal) millor comenta les línies en que surt aquest example.com i automàticament mostrarà l'arbre on ens haguem loguejat. [[Samba_amb_LDAP#Ajustar_phpldapadmin|Més detalls dels ajustos aquí]].
 +
# En la versió d'Ubuntu 14.04 apareix un error en crear usuaris, [http://stackoverflow.com/questions/20673186/getting-error-for-setting-password-field-when-creating-generic-user-account-phpl mireu aquesta solució].
  
== Apache Directory Studio ==
+
=== Apache Directory Studio ===
 
ADS és una eina stand alone que ens anirà perfecte per administrar el servidor LDAP.
 
ADS és una eina stand alone que ens anirà perfecte per administrar el servidor LDAP.
 
* Primer instal·leu un Java JRE (si teniu instal·lat el Eclipse ja el deveu tenir).
 
* Primer instal·leu un Java JRE (si teniu instal·lat el Eclipse ja el deveu tenir).
Línia 48: Línia 122:
 
<br>
 
<br>
  
== Creant els primers usuaris ==
+
=== Creant els primers usuaris amb Apache Directory Studio ===
 
Per crear els usuaris amb l'Apache Directory Studio:
 
Per crear els usuaris amb l'Apache Directory Studio:
* Clicar amb botó dret sobre el domini (dc=..., dc=...) -> New Entry
+
* Clicar amb botó dret sobre el domini (dc=..., dc=...) -> "New Entry"
 +
* Crear un '''Organizational Unit (ou)'''. Ens servirà de "carpeta" pels usuaris. Li podeu assignar l'atribut:
 +
** '''ou=usuaris'''
 +
* Crearem els usuaris dintre d'aquesta OU.
 
* Crear un nou objecte amb les '''objectClass''' següents: "person", "uidObject" (i "top" que ens ho posa automàticament):
 
* Crear un nou objecte amb les '''objectClass''' següents: "person", "uidObject" (i "top" que ens ho posa automàticament):
 
** '''person''': ens permetrà afegir els atributs:
 
** '''person''': ens permetrà afegir els atributs:
Línia 59: Línia 136:
 
*** '''userPassword''' : la necessitarem per autenticar-nos. Potser la més segura és SSHA (Salted SHA1).
 
*** '''userPassword''' : la necessitarem per autenticar-nos. Potser la més segura és SSHA (Salted SHA1).
 
* Assignar tots aquests atributs comentats
 
* Assignar tots aquests atributs comentats
 +
 +
=== Comprovar passwords abans de fer el codi ===
 +
Amb l'Apache DS podeu comprovar l'usuari des de l'editor de passwords. Té la opció "Verify" i "Bind" (si no funcionen les dues segur que el codi PHP tampoc funcionarà).
 +
 +
[http://stackoverflow.com/questions/17387195/apache-directory-studio-ldap-bind-from-php Aquest post clarifica possibles problemes amb la password], en particular si hem afegit el "lang", cosa que no s'ha de fer i el ''wizard'' ens proposa al crear la password.
 +
 +
<br>
 +
 +
== Configuració de clients LDAP ==
 +
Recorda que si estàs treballant sobre una màquina AWS hauràs d'obrir el port 389 per poder-te connectar al servei LDAP.
 +
 +
En [https://books.google.co.uk/books?id=eIPA4v0u05EC&lpg=PR11&dq=%22The+UNIX+Authentication+Process%22&hl=it&pg=PA95#v=onepage&q&f=true aquest llibre podeu consultar els ''internals'' del sistema d'autenticació GNU/Linux].
 +
 +
Per habilitar els comptes d'usuaris dels clients cal fixar-se en 2 parts del [[sistema operatiu]]:
 +
* '''NSS : Name Services Switch'''. És un mòdul del ''core'' de Linux i que permet la resolució de noms de recursos (bàsicament usuaris, grups i hosts). Aquest sistema inventat per Sun Mircrosystems permet compatibilitzar la resolució de noms als arxius locals (p.ex. /etc/groups, shadow, etc.) i la centralització en un server d'un sistema corporatiu.
 +
*: Està centralitzat a l'arxiu <code>/etc/nsswitch.conf</code>
 +
* '''PAM : Pluggable Authentication Module'''. És un sistema modular que dona serveis d'autenticació a les aplicacions i serveis del sistema operatiu que ho demanin (aplicacions, serveis, etc.).
 +
*: Podeu trobar els arxius diversos a <code>/etc/pam.d/</code>
 +
 
<br>
 
<br>
  
 +
== Client Ubuntu (login) ==
 +
Anem a canviar el mode d'autenticació d'un client Ubuntu perquè utilitzi el servidor LDAP. Bàsicament el que farem serà aplicar uns canvis sobre el '''PAM (Pluggable Authentication Module)''' perquè validi a través del servidor LDAP abans de provar a la BD d'usuaris de la màquina local.
 +
 +
IMPORTANT: quan toquem aquestes configuracions del PAM podem produir errors irrecuperables de la màquina. En aquests casos es pot intentar solventar arrencant el client en mode segur (menú d'arrencada del GRUB).
  
== Primer codi de comprovació en PHP ==
+
Utilitza els següents tutorials de DigitalOcean per configurar el teu Ubuntu a que faci el login del sistema mitjançant autenticació LDAP:
Recorda que si tens una màquina AWS tindràs que obrir el port 389 per poder-te connenctar al servei LDAP.
+
* [https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-a-basic-ldap-server-on-an-ubuntu-12-04-vps LDAP Server en Ubuntu 12]
 +
*: Si us apareix un error en crear usuaris amb PHPLDAPADMIN [http://stackoverflow.com/questions/20673186/getting-error-for-setting-password-field-when-creating-generic-user-account-phpl mireu aquesta solució].
 +
* [https://www.digitalocean.com/community/tutorials/how-to-authenticate-client-computers-using-ldap-on-an-ubuntu-12-04-vps tutorial de LDAP per autenticacio de clients de dominis en Ubuntu]: està per Ubuntu 12 però també funciona amb el 14.
  
Necessitem la llibreria php5-ldap:
+
Si tens problemes comprova abans:
  # apt-get install php5-ldap
+
* Que les màquines es veuen (mateixa xarxa, etc).
 +
* Que has configurat la xarxa de la màquina client de forma manual (/etc/network/interfaces). El ''Network Manager'' del Gnome no funciona perquè per poder iniciar sessió, abans que res cal tenir la xarxa habilitada.
 +
* Que el servidor LDAP està visible.
 +
* Que hem configurat el client correctament contra un servidor ldap://.... (no ldapi:// o ldaps:// )
 +
 
 +
Si cal reconfigurar alguna cosa pots fer:
 +
$ sudo dpkg-reconfigure ldap-auth-config
 +
 
 +
=== Si es penja Ubuntu en l'arrencada ===
 +
És possible que a l'arrencada [https://bugs.launchpad.net/ubuntu/+source/libnss-ldap/+bug/1024475 el sistema d'autenticació provoqui algun error i Ubuntu 12/14 es penji]. Per solventar-ho arrenca en mode ''recovery'' i modifica '''/etc/nsswitch.conf''', invertint l'ordre <code>ldap compat</code> i deixant-lo així:
 +
passwd:    compat ldap
 +
group:      compat ldap
 +
shadow:    compat ldap
 +
 
 +
=== Habilitant canvi de password ===
 +
La comanda <code>passwd</code> (o el mètode gràfic) no ens funciona per canviar la contrasenya. Pots utilitzar [http://ubuntuforums.org/showthread.php?t=1640070 aquest link per solventar el problema de ''passwd''].
 +
 
 +
En realitat cal fixar-se en l'arxiu '''/etc/pam.d/common-password''' i modificar la línia del '''pam_ldap.so''' i treure el '''use_authtok'''.
 +
Ha de quedar així:
 +
password [success=1 user_unknown=ignore default=die] pam_ldap.so <strike>use_authtok</strike> try_first_pass
 +
 
 +
=== Compartint <code>/home</code> centralitzat ===
 +
Un cas típic en GNU/Linux és l'ús compartit dels ''home directories'' a través de NFS. Consulta com realitzar-ho. Bàsicament caldrà:
 +
* Instal·lar NFS a client (nfs-common) i servidor (nfs-kernel-server)
 +
* Exportar carpeta <code>/home</code> al server (a l'arxiu <code>/etc/exports</code>)
 +
* muntar el <code>/home</code> al client dintre de l'arxiu <code>/etc/fstab</code>
 +
 
 +
Amb els ajustos per defecte, els usuaris no poden entrar quan no tenen creat un ''home directory'' en el server. Per tant, per activar un usuari cal:
 +
# Crear una entrada al directori LDAP. Apunta't el UID (user ID)
 +
# Crear el ''homedir'' a <code>/home/users</code> del servidor, i posar-li el propietari adequat amb <code>chown</code> utilitzant el UID enlloc del nom d'usuari, ja que el server no coneix els usuaris del LDAP (i és millor que sigui així per seguretat).
 +
# També convé passar els arxius del ''skeleton'' de usuaris (arxius .profile, .bashrc, etc.) que estan a <code>/etc/skel</code>
 +
 
 +
Per exemple, si creem un nou usuari "pepe" al LDAP i ens dóna un UID=1005, farem (al server):
 +
# mkdir /home/users/pepe
 +
O bé, si volem tenir els continguts del ''skeleton'':
 +
# cp -r /etc/skel /home/users/pepe
 +
I finalment:
 +
# chown 1005 /home/users/pepe
 +
 
 +
<br>
 +
 
 +
== Clients Windows (login) ==
 +
Les màquines Windows NO poden realitzar el logon directament sobre un servei LDAP.
 +
 
 +
Per realitzar això cal muntar un [[Samba|servei Samba com a PDC]] (explicat a l'article). El que sí que es pot fer és que Samba tingui una base de dades LDAP com a ''backend'', el que ens propicia que en darrer terme tenim les contrasenyes i dades centralitzades al LDAP. Pots mirar també l'article [[Samba amb LDAP]].
 +
 
 +
<br>
 +
 
 +
== Aplicació web en PHP com a client LDAP ==
 +
 
 +
Necessitem la llibreria php-ldap (es un paquet genèric que agafarà la versió de php present al sistema):
 +
  # apt-get install php-ldap
 
  # service apache2 restart
 
  # service apache2 restart
  
I ja podem provar d'autenticar-nos sobre el nostre servidor:
+
I ja podem provar d'autenticar-nos sobre el nostre servidor.
 +
 
 +
Prova el següent codi per testejar l'aplicació via LDAP, i modifica'l afegint un formulari que permeti entrar usuari i contrasenya.
 +
 
 
<syntaxhighlight lang="php">
 
<syntaxhighlight lang="php">
 
<h1>prova LDAP</h1>
 
<h1>prova LDAP</h1>
 
+
 
<?php
 
<?php
 
$ldapconfig['host'] = 'localhost';
 
$ldapconfig['host'] = 'localhost';
$ldapconfig['port'] = NULL; // es el 389 però amb NULL l'agafa per defecte
+
$ldapconfig['port'] = 389; // el 389 es el port per defecte
$ldapconfig['basedn'] = 'dc=enric,dc=local';
+
$ldapconfig['basedn'] = 'ou=Usuaris,dc=enricus,dc=xyz';
$ldapconfig['authrealm'] = 'My Realm';
+
 
 
 
$username = "manolo";
 
$username = "manolo";
 
$passw = "manolo123";
 
$passw = "manolo123";
 
+
 
echo "Inici...</br>";
 
echo "Inici...</br>";
 
+
 
$ds = ldap_connect($ldapconfig['host'],$ldapconfig['port']);
 
$ds = ldap_connect($ldapconfig['host'],$ldapconfig['port']);
 
+
 
if( !$ds ) {
 
if( !$ds ) {
 
     echo "Error en la connexio</br>";
 
     echo "Error en la connexio</br>";
 
     exit(0);
 
     exit(0);
 
}
 
}
 
+
 
echo "buscant usuari... <b>".$username."</b><br>\n";
 
echo "buscant usuari... <b>".$username."</b><br>\n";
 +
$r = ldap_search( $ds, $ldapconfig['basedn'], 'uid=' . $username );
  
$r = ldap_search( $ds, $ldapconfig['basedn'], 'uid=' . $username );
 
 
if ($r) {
 
if ($r) {
    echo "usuari trobat: <b>".$username."</b><br>\n";
 
 
     $result = ldap_get_entries( $ds, $r);
 
     $result = ldap_get_entries( $ds, $r);
 
     var_dump($result);
 
     var_dump($result);
 
     echo "\n<br><br>\n";
 
     echo "\n<br><br>\n";
        if (count($result)>0)
+
    if (count($result)>0) {
            if($result[0]) {
+
        if($result[0]) {
 +
            echo "usuari trobat: <b>".$username."</b><br>\n";
 
             // Eps! si no, no va!
 
             // Eps! si no, no va!
 
             ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
 
             ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
 
             // check passw
 
             // check passw
 
             if (ldap_bind( $ds, $result[0]['dn'], $passw) ) {
 
             if (ldap_bind( $ds, $result[0]['dn'], $passw) ) {
                //return $result[0];
 
 
                 echo "Contrasenya OK<br>\n";
 
                 echo "Contrasenya OK<br>\n";
 
             } else {
 
             } else {
 
                 echo "Contrasenya ERRONIA<br>\n";
 
                 echo "Contrasenya ERRONIA<br>\n";
 
             }
 
             }
         }
+
         } else {
 +
echo "Usuari <b>".$username."</b> no trobat";
 +
}
 +
    }
 +
} else {
 +
echo "Error accedint a LDAP";
 
}
 
}
 
?>
 
?>
 
</syntaxhighlight>
 
</syntaxhighlight>

Revisió de 14:27, 19 abr 2018

LDAP és una especificació de servei de directori. Es sol utilitzar per centralitzar comptes d'usuari per diferents aplicacions.

L'objectiu d'aquest article és crear un directori bàsic per autenticació de diversos clients:

  • Login en GNU/Linux (Ubuntu).
  • Aplicacions web en PHP.
  • CMSs diversos com moodle o wordpress
  • ...


Introducció[modifica]

Hi ha algunes variants del protocol:

  • ldap:// (port 389 sense encriptació o amb STARTTLS)
  • ldaps:// (port 636) encriptat amb SSL

Característiques:

  • Llistat d'acrònims de LDAP: Lightweight Directory Access Protocol
  • LDAP no deixa de ser un protocol per atacar una base de dades jeràrquica (directori).
  • Cada component pot contenir subcomponents i atributs (arbre).
  • Per accedir a un element s'especifica amb el DN (DIstinguished Name) que inclou tot el "path". Per exemple, admin.enric.local s'especificaria així:
    cn=admin,dc=enric,dc=local
  • RDNs són els Relative Distinguised Names, cadascuna de les parts del "path":
    • CN = Common Name
    • DC = Domain Component
    • OU = Organizational Unit
    • UID = User IDentifier
    • GID = Group IDentifier
    • etc.

Normalment cada entrada LDAP cal adreçar-la per complet d'aquesta manera. El típic esquema sol ser:

  • dc=enric,dc=local
    • cn=admin
    • ou=Grups
      • cn=grup1
      • cn=grup2
    • ou=Usuaris
      • cn=usuari1
      • cn=usuari2
    • ou=Maquines
      • cn=pc1
      • cn=pc2


Referències[modifica]

Utilitza els següents tutorials de DigitalOcean per configurar el teu Ubuntu a que faci el login del sistema mitjançant autenticació LDAP:


Instal·lació a Debian / Ubuntu[modifica]

Primer l'instal·larem com de costum:

# apt-get install slapd ldap-utils

La via fàcil: reconfigurar els arxius amb un assistent:

# dpkg-reconfigure slapd

Evidentment, cal que recordeu la contrasenya que heu generat per l'usuari "admin".

Aquesta instal·lació bàsica ens habilitarà un LDAP. Per modificar les seves dades cal posar un editor, mireu més avall, es recomana PHPLDAPADMIN.

Seguretat LDAP[modifica]

Per fer un sistema segur del tot ens caldria, a més:

START TLS vs LDAPS

Cal tenir en compte que el sistema més acceptat actualment és START TLS (ldap/ldapi). Hi ha hagut un temps que s'ha utilitzat el LDAPS en el port 636, però està en desús ja que és un protocol diferent que requereix encriptació des del principi. En canvi, START TLS té avantatges:

  • Utilitza el mateix port 389 que el ldap sense encriptar.
  • Inicia la comunicació de forma desencriptada i en un segon pas encripta la comunicació.
  • Permet la negociació amb el client i facilita el setup i la depuració.


Editors per LDAP[modifica]

Editar els arxius de LDAP a mà és una feina dura i complexa. És convenient utilitzar eines gràfiques que ens ho posin fàcil:

  • Webmin : se suposa que hauria de permetre editar el servidor LDAP, però les proves realitzades han estat negatives.
  • Apache Directory Studio : requereix Java en el client.
  • PHPLDAPADMIN (recomanat) : interfície web. Molt còmode (llegiu més avall)
  • JXplorer : un altre client per Java. Té l'avantatge que està als repositoris de Debian/Ubuntu i es pot instal·lar simplement amb
    # apt-get install jxplorer


PhpLdapAdmin[modifica]

Segurament és el més còmode d'utilitzar, ja que no necessitem un programari en el client, i ens permet modificar el directori via web.

Instal·lació:

# apt-get install phpldapadmin

Incidències:

  1. En la configuració per defecte el programa mostra sempre en el mateix arbre (dc=example,dc=com). Si tens un altre domini diferent (és el normal) millor comenta les línies en que surt aquest example.com i automàticament mostrarà l'arbre on ens haguem loguejat. Més detalls dels ajustos aquí.
  2. En la versió d'Ubuntu 14.04 apareix un error en crear usuaris, mireu aquesta solució.

Apache Directory Studio[modifica]

ADS és una eina stand alone que ens anirà perfecte per administrar el servidor LDAP.

  • Primer instal·leu un Java JRE (si teniu instal·lat el Eclipse ja el deveu tenir).
  • Descarregueu-la de http://directory.apache.org/studio/
  • Versió Linux:
    • Es desempaqueta a un directori tipus "ApacheDirectoryStudio-linux-x86-2.0.0.v20130131" (tar xvf)
    • Convé moure aquesta carpeta al directori ~/bin de l'usuari i fer-hi un link perquè puguem executar l'aplicació directament amb
      $ ApacheDirectoryStudio

Abans de connectar-nos cal obrir el port 389 (LDAP), tingueu-ho en compte si esteu treballant en una màquina remota (AWS o el què sigui).

Tingueu en compte que també ens podem connectar de forma anònima (deixa llegir, però no escriure).

Per connectar-nos a la nostra màquina cal crear una connexió amb els paràmetres (exemples):

  • Authentication Method: Simple Authentication
  • Bind DN or user: cn=admin,dc=enric,dc=local
  • Bind password: la que hagueu posat.

NOTA: si veiem que tenim dificultats per connectar-nos, va bé primer fer una connexió anònima (sense autenticació, permet llegir els usuaris), amb el què ens trobarà el nom del domini (dc=enric,dc=local, per exemple).

Creant els primers usuaris amb Apache Directory Studio[modifica]

Per crear els usuaris amb l'Apache Directory Studio:

  • Clicar amb botó dret sobre el domini (dc=..., dc=...) -> "New Entry"
  • Crear un Organizational Unit (ou). Ens servirà de "carpeta" pels usuaris. Li podeu assignar l'atribut:
    • ou=usuaris
  • Crearem els usuaris dintre d'aquesta OU.
  • Crear un nou objecte amb les objectClass següents: "person", "uidObject" (i "top" que ens ho posa automàticament):
    • person: ens permetrà afegir els atributs:
      • cn = Common Name
      • sn = surname, ens obligarà a posar-ho.
    • uidObject: ens permetrà afegir els atributs:
      • uid = user id (per autenticació)
      • userPassword : la necessitarem per autenticar-nos. Potser la més segura és SSHA (Salted SHA1).
  • Assignar tots aquests atributs comentats

Comprovar passwords abans de fer el codi[modifica]

Amb l'Apache DS podeu comprovar l'usuari des de l'editor de passwords. Té la opció "Verify" i "Bind" (si no funcionen les dues segur que el codi PHP tampoc funcionarà).

Aquest post clarifica possibles problemes amb la password, en particular si hem afegit el "lang", cosa que no s'ha de fer i el wizard ens proposa al crear la password.


Configuració de clients LDAP[modifica]

Recorda que si estàs treballant sobre una màquina AWS hauràs d'obrir el port 389 per poder-te connectar al servei LDAP.

En aquest llibre podeu consultar els internals del sistema d'autenticació GNU/Linux.

Per habilitar els comptes d'usuaris dels clients cal fixar-se en 2 parts del sistema operatiu:

  • NSS : Name Services Switch. És un mòdul del core de Linux i que permet la resolució de noms de recursos (bàsicament usuaris, grups i hosts). Aquest sistema inventat per Sun Mircrosystems permet compatibilitzar la resolució de noms als arxius locals (p.ex. /etc/groups, shadow, etc.) i la centralització en un server d'un sistema corporatiu.
    Està centralitzat a l'arxiu /etc/nsswitch.conf
  • PAM : Pluggable Authentication Module. És un sistema modular que dona serveis d'autenticació a les aplicacions i serveis del sistema operatiu que ho demanin (aplicacions, serveis, etc.).
    Podeu trobar els arxius diversos a /etc/pam.d/


Client Ubuntu (login)[modifica]

Anem a canviar el mode d'autenticació d'un client Ubuntu perquè utilitzi el servidor LDAP. Bàsicament el que farem serà aplicar uns canvis sobre el PAM (Pluggable Authentication Module) perquè validi a través del servidor LDAP abans de provar a la BD d'usuaris de la màquina local.

IMPORTANT: quan toquem aquestes configuracions del PAM podem produir errors irrecuperables de la màquina. En aquests casos es pot intentar solventar arrencant el client en mode segur (menú d'arrencada del GRUB).

Utilitza els següents tutorials de DigitalOcean per configurar el teu Ubuntu a que faci el login del sistema mitjançant autenticació LDAP:

Si tens problemes comprova abans:

  • Que les màquines es veuen (mateixa xarxa, etc).
  • Que has configurat la xarxa de la màquina client de forma manual (/etc/network/interfaces). El Network Manager del Gnome no funciona perquè per poder iniciar sessió, abans que res cal tenir la xarxa habilitada.
  • Que el servidor LDAP està visible.
  • Que hem configurat el client correctament contra un servidor ldap://.... (no ldapi:// o ldaps:// )

Si cal reconfigurar alguna cosa pots fer:

$ sudo dpkg-reconfigure ldap-auth-config

Si es penja Ubuntu en l'arrencada[modifica]

És possible que a l'arrencada el sistema d'autenticació provoqui algun error i Ubuntu 12/14 es penji. Per solventar-ho arrenca en mode recovery i modifica /etc/nsswitch.conf, invertint l'ordre ldap compat i deixant-lo així:

passwd:     compat ldap
group:      compat ldap
shadow:     compat ldap

Habilitant canvi de password[modifica]

La comanda passwd (o el mètode gràfic) no ens funciona per canviar la contrasenya. Pots utilitzar aquest link per solventar el problema de passwd.

En realitat cal fixar-se en l'arxiu /etc/pam.d/common-password i modificar la línia del pam_ldap.so i treure el use_authtok. Ha de quedar així:

password	[success=1 user_unknown=ignore default=die]	pam_ldap.so use_authtok try_first_pass

Compartint /home centralitzat[modifica]

Un cas típic en GNU/Linux és l'ús compartit dels home directories a través de NFS. Consulta com realitzar-ho. Bàsicament caldrà:

  • Instal·lar NFS a client (nfs-common) i servidor (nfs-kernel-server)
  • Exportar carpeta /home al server (a l'arxiu /etc/exports)
  • muntar el /home al client dintre de l'arxiu /etc/fstab

Amb els ajustos per defecte, els usuaris no poden entrar quan no tenen creat un home directory en el server. Per tant, per activar un usuari cal:

  1. Crear una entrada al directori LDAP. Apunta't el UID (user ID)
  2. Crear el homedir a /home/users del servidor, i posar-li el propietari adequat amb chown utilitzant el UID enlloc del nom d'usuari, ja que el server no coneix els usuaris del LDAP (i és millor que sigui així per seguretat).
  3. També convé passar els arxius del skeleton de usuaris (arxius .profile, .bashrc, etc.) que estan a /etc/skel

Per exemple, si creem un nou usuari "pepe" al LDAP i ens dóna un UID=1005, farem (al server):

# mkdir /home/users/pepe

O bé, si volem tenir els continguts del skeleton:

# cp -r /etc/skel /home/users/pepe

I finalment:

# chown 1005 /home/users/pepe


Clients Windows (login)[modifica]

Les màquines Windows NO poden realitzar el logon directament sobre un servei LDAP.

Per realitzar això cal muntar un servei Samba com a PDC (explicat a l'article). El que sí que es pot fer és que Samba tingui una base de dades LDAP com a backend, el que ens propicia que en darrer terme tenim les contrasenyes i dades centralitzades al LDAP. Pots mirar també l'article Samba amb LDAP.


Aplicació web en PHP com a client LDAP[modifica]

Necessitem la llibreria php-ldap (es un paquet genèric que agafarà la versió de php present al sistema):

# apt-get install php-ldap
# service apache2 restart

I ja podem provar d'autenticar-nos sobre el nostre servidor.

Prova el següent codi per testejar l'aplicació via LDAP, i modifica'l afegint un formulari que permeti entrar usuari i contrasenya.

<h1>prova LDAP</h1>
 
<?php
$ldapconfig['host'] = 'localhost';
$ldapconfig['port'] = 389; // el 389 es el port per defecte
$ldapconfig['basedn'] = 'ou=Usuaris,dc=enricus,dc=xyz';
 
$username = "manolo";
$passw = "manolo123";
 
echo "Inici...</br>";
 
$ds = ldap_connect($ldapconfig['host'],$ldapconfig['port']);
 
if( !$ds ) {
    echo "Error en la connexio</br>";
    exit(0);
}
 
echo "buscant usuari... <b>".$username."</b><br>\n";
$r = ldap_search( $ds, $ldapconfig['basedn'], 'uid=' . $username );

if ($r) {
    $result = ldap_get_entries( $ds, $r);
    var_dump($result);
    echo "\n<br><br>\n";
    if (count($result)>0) {
        if($result[0]) {
            echo "usuari trobat: <b>".$username."</b><br>\n";
            // Eps! si no, no va!
            ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
            // check passw
            if (ldap_bind( $ds, $result[0]['dn'], $passw) ) {
                echo "Contrasenya OK<br>\n";
            } else {
                echo "Contrasenya ERRONIA<br>\n";
            }
        } else {
		echo "Usuari <b>".$username."</b> no trobat";
	}
    }
} else {
	echo "Error accedint a LDAP";
}
?>