This is an old revision of the document!


~~SHOWSOLUTIONS~~

Laborator 1. Serviciul LDAP

Cunoștințe și abilități ce vor fi dobândite

  • Funcționarea protocolului LDAP. Cereri LDAP
  • Căutarea în baza de date LDAP
  • Folosirea bibliotecii client de LDAP
  • Autentificarea pe bază de LDAP
  • Integrarea LDAP cu alte aplicații

Pregătire infrastructură de laborator

Pentru a pregăti configurația de laborator va trebui să descărcați pe mașina fizică (mjolnir), în directorul saisp/, arhiva laboratorului (base.qcow2 există deja):

student@mjolnir:~/saisp$ wget http://elf.cs.pub.ro/saisp/res/laboratoare/base.qcow2
student@mjolnir:~/saisp$ wget http://elf.cs.pub.ro/saisp/res/laboratoare/lab-01.zip
student@mjolnir:~/saisp$ unzip lab-01.zip

În urma dezarhivării rezultă trei fișiere imagine KVM (format qcow2) și un script de pornire a mașinilor virtuale. Imaginea de bază base.qcow2 este baza pentru celelalte două fișiere: ldap-client.qcow2 și ldap-server.qcow2.

Puteți urma pașii de mai sus pentru a descărca infrastructura KVM pentru laborator pentru lucru acasă.

Pentru pornirea celor două mașini virtuale (clientul de LDAP și serverul de LDAP) rulați scriptul de pornire:

student@mjolnir:~/saisp$ ./ldap-start-kvm

Pentru accesarea celor două mașini folosiți SSH către adresele IP aferente fiecăreia. Pentru conectarea la mașina virtuală pentru serverul de LDAP folosiți comanda

student@mjolnir:~/saisp$ ssh -l root 192.168.0.2

iar pentru conectarea la clientul de LDAP folosiți comanda

student@mjolnir:~/saisp$ ssh -l root 192.168.0.3

Parola pe cele două mașini virtuale este student atât pentru utilizatorul root cât și pentru utilizatorul student.

Exerciții

01. [10p] Folosire client LDAP pentru interogare

Pentru început, ne propunem să interogăm baza de date LDAP. Cererile de interogare sunt adresate unui server, care accesează baza de date din spate și returnează informații dintr-un director. Comanda folosită pentru interogare este ldapsearch.

O modalitate simplă de interogare LDAP este chiar din cadrul serverului LDAP. Pe serverul LDAP, rulați comanda

root@ldap-server:~# ldapsearch -x -b "dc=labs,dc=cs,dc=pub,dc=ro"
# extended LDIF
#
# LDAPv3
# base <dc=labs,dc=cs,dc=pub,dc=ro> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# labs.cs.pub.ro
dn: dc=labs,dc=cs,dc=pub,dc=ro
[...]

Comanda realizează o interogare a serverului LDAP și întoarce intrările aferente arborelui/directorului dc=labs,dc=cs,dc=pub,dc=ro.

Opțiuna -x folosește autentificare simplă, în loc de SASL. În cazul de față este vorba de o conectare anonimă, fără interogare. Opțiunea -b a comenzii ldapsearch indică punctul din arborele/directorul LDAP de unde se face parcurgerea.

Dacă vrem să nu afișăm informații despre versiunea LDAP sau comentarii LDIF, atunci putem folosi opțiunea -LLL:

root@ldap-server:~# ldapsearch -x -LLL -b "dc=labs,dc=cs,dc=pub,dc=ro"
dn: dc=labs,dc=cs,dc=pub,dc=ro
[...]

Ca să interogăm serverul de LDAP de pe stația client va trebui să precizăm care este URI-ul serverului. Pentru a obține un rezultat similar, pe stația client trebuie să rulăm comanda de mai jos:

root@ldap-client:~# ldapsearch -x -LLL -H ldap://ldap-server.local -b "dc=labs,dc=cs,dc=pub,dc=ro"
dn: dc=labs,dc=cs,dc=pub,dc=ro
[...]

Opțiunea -H indică URI-ul serverului la care se face conectarea. În cazul de fața este vorba de numele (în forma multicast DNS al) serverului prefixat de șirul ldap://.

În general, conexiunile LDAP de pe un client se fac către un același server așa că se pot reține URI-ul de conectare și punctul de căutare de arbore în fișierul de configurare /etc/ldap/ldap.conf. Vom completa, folosind un editor, în fișierul de configurare /etc/ldap/ldap.conf directivele de configurare BASE (punctul de căutare – search base) și URI (URI-ul serverului). În final fișierul de configurare pe client va avea forma de mai jos:

root@ldap-client:~# cat /etc/ldap/ldap.conf
#
# LDAP Defaults
#
 
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
 
BASE	dc=labs,dc=cs,dc=pub,dc=ro
URI	ldap://ldap-server.local
 
#SIZELIMIT	12
#TIMELIMIT	15
#DEREF		never
 
# TLS certificates (needed for GnuTLS)
TLS_CACERT	/etc/ssl/certs/ca-certificates.crt

Directivele BASE și URI sunt configurate și nu mai este nevoie de folosirea opțiunilor -b (pentru BASE), respectiv -H (pentru URI) pentru comanda ldapsearch pe stația client. Acum putem rula comanda simplu:

root@ldap-client:~# ldapsearch -x -LLL
dn: dc=labs,dc=cs,dc=pub,dc=ro
[...]

02. [10p] Conectare securizată la serviciu de LDAP

Informațiile accesibile prin LDAP sunt, în general, sensibile și este necesară securizarea comunicației. Pentru aceasta serverul LDAP poate fi configurat să folosească LDAPS (LDAP cu suport SSL) sau să folosească TLS.

Folosire LDAPS (LDAP+SSL)

În cazul în care folosește LDAPS, serverul LDAP ascultă conexiuni pe portul 636 (portul aferent LDAPS), lucru care se poate observa cu ajutorul comenzii netstat:

root@ldap-server:~# netstat -tlpn | grep slapd
tcp        0      0 0.0.0.0:636             0.0.0.0:*               LISTEN      1902/slapd      
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN      1902/slapd      
tcp6       0      0 :::636                  :::*                    LISTEN      1902/slapd      
tcp6       0      0 :::389                  :::*                    LISTEN      1902/slapd 

Serverul LDAP ascultă, așadar, conexiuni nesecurizate pe portul 389 și conexiuni securizate (LDAPS) pe portul 636. Serverul LDAP poartă numele slapd (Standalone LDAP Daemon).

De pe client dacă vrem să folosim conexiune securizată, vom folosi URI-ul începând cu șirul ldaps://:

root@ldap-client:~# ldapsearch -x -LLL -H ldaps://ldap-server.local
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)

Obținem o eroare de conectare. În cazul conexiunilor LDAPS aceasta sa datorează configurării necorespunzătoare a certificatelor. Întrucât pe serverul LDAP(S) am configurat un certificat self-signed, vom ignora verificarea certificatelor. Pentru aceasta folosim un editor pentru a adăuga linia de mai jos la sfârșitul fișierului /etc/ldap/ldap.conf de pe stația client:

TLS_REQCERT	never

Acum conexiune va funcționa peste LDAPS:

root@ldap-client:~# ldapsearch -x -LLL -H ldaps://ldap-server.local
dn: dc=labs,dc=cs,dc=pub,dc=ro
[...]

Dacă dorim, putem actualiza directiva URI din fișierul /etc/ldap/ldap.conf pentru a realiza implicit conexiuni pe LDAPS:

URI	ldaps://ldap-server.local

Folosirea liniei

TLS_REQCERT     never

în fișierul /etc/ldap/ldap.conf permite conexiunea LDAPS ignorând validitatea certificatului serverului. Este o configurare rapidă, dar cu probleme de securitate. Pentru servere de producție este nevoie de verificarea validității certificatului folosind directive precum TLS_CACERT sau TLS_CACERTDIR.

Folosire LDAP cu TLS

Un alt mod de a securiza comunicația LDAP este prin intermediul suportului TLS. Suportul TLS nu necesită ca serverul să asculte conexiuni pe alt port. Se folosește inițial protocolul LDAP în clar și apoi se declanșează handshake-ul TLS în urma căruia comunicația va fi securizată. Pentru a realiza o conexiune securizată cu suport TLS, folosim opțiunea -Z a comenzii ldapsearch, la fel ca mai jos (pe stația client):

root@ldap-client:~# ldapsearch -x -LLL -Z -H ldap://ldap-server.local
dn: dc=labs,dc=cs,dc=pub,dc=ro

În general, serverul LDAP va fi configurat în așa fel încât să impună folosirea TLS pentru operațiile sensibile. În această situația absența opțiunii -Z va conduce la afișarea unui mesaj de eroare pe client.

Exercițiu: Interogare swarm.cs.pub.ro

Pe serverul swarm.cs.pub.ro rulează un server LDAP. Punctul de cautare în arbore este dc=swarm,dc=cs,dc=pub,dc=ro. Interogați serverul LDAP folosind LDAP, LDAPS și LDAP cu suport SSL. Ce moduri de interogare sunt disponibile pe server?

03. [15p] Căutare în baza de date LDAP

Output-ul comenzii de interogare LDAP a serverului swarm.cs.pub.ro este consistent. De multe ori dorim să căutăm în baza de date LDAP și să extragem doar anumite intrări similar comenzii select din SQL.

Informații din subarbori

Un prim mod de căutare este selectarea doar a intrării căutate (fără subarbore) sau doar a primului nivel din arbore, ca mai jos:

root@ldap-client:~# ldapsearch -x -LLL -s base -H ldaps://swarm.cs.pub.ro -b "dc=swarm,dc=cs,dc=pub,dc=ro"
dn: dc=swarm,dc=cs,dc=pub,dc=ro
objectClass: top
objectClass: dcObject
objectClass: organization
o: University Politehnica of Bucharest
dc: swarm
 
 
root@ldap-client:~# ldapsearch -x -LLL -s one -H ldaps://swarm.cs.pub.ro -b "dc=swarm,dc=cs,dc=pub,dc=ro"
dn: cn=admin,dc=swarm,dc=cs,dc=pub,dc=ro
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
 
dn: ou=People,dc=swarm,dc=cs,dc=pub,dc=ro
ou: People
objectClass: organizationalUnit
 
dn: ou=Group,dc=swarm,dc=cs,dc=pub,dc=ro
ou: Group
objectClass: organizationalUnit

Prima comandă extrage doar intrarea de bază, identificată de domain name-ul (DN) dc=swarm,dc=cs,dc=pub,dc=ro. A doua extrage primul nivel din arborele/directorul LDAP, adică intrarile indentificate de DN-urile cn=admin,dc=swarm,dc=cs,dc=pub,dc=ro, ou=People,dc=swarm,dc=cs,dc=pub,dc=ro, ou=Group,dc=swarm,dc=cs,dc=pub,dc=ro.

Un mod uzual de căutare este doar într-un subarbore al directorului LDAP. Astfel, dacă dorim să extragem doar intrările din grupuri, vom folosi comanda:

root@ldap-client:~# ldapsearch -x -LLL -H ldaps://swarm.cs.pub.ro -b "ou=Group,dc=swarm,dc=cs,dc=pub,dc=ro"
dn: ou=Group,dc=swarm,dc=cs,dc=pub,dc=ro
ou: Group
objectClass: organizationalUnit
 
dn: cn=rosedu,ou=Group,dc=swarm,dc=cs,dc=pub,dc=ro
cn: rosedu
[...]

Extragere de atribute

Așa cum comanda select din SQL extrage doar anumite coloane dintr-un tabel, putem selecta, folosind comanda ldapsearch anumite atribute ale intrărilor în baza de date LDAP.

Spre exemplu, dacă vrem să afișăm doar uid-ul utilizatorilor din baza de date LDAP, vom folosi comanda

root@ldap-client:~# ldapsearch -x -LLL -H ldaps://swarm.cs.pub.ro -b "dc=swarm,dc=cs,dc=pub,dc=ro" uid
[...]
dn: uid=ddvlad,ou=People,dc=swarm,dc=cs,dc=pub,dc=ro
uid: ddvlad
 
dn: uid=roxanam,ou=People,dc=swarm,dc=cs,dc=pub,dc=ro
uid: roxanam
 
dn: uid=razvan,ou=People,dc=swarm,dc=cs,dc=pub,dc=ro
uid: razvan

Folosirea atributului uid la sfârșitul comenzii de mai sus înseamnă selectarea doar a acelui câmp.

Câmpul dn va fi întotdeauna selectat pentru că indică în mod unic intrarea în LDAP.

Dacă dorim să selectăm uid-ul, adresa de e-mail și numele vom folosi comanda

root@ldap-client:~# ldapsearch -x -LLL -H ldaps://swarm.cs.pub.ro -b "dc=swarm,dc=cs,dc=pub,dc=ro" uid mail cn
[...]
dn: uid=ddvlad,ou=People,dc=swarm,dc=cs,dc=pub,dc=ro
uid: ddvlad
cn: Vlad Dogaru
mail: XXXXXXX
 
dn: uid=roxanam,ou=People,dc=swarm,dc=cs,dc=pub,dc=ro
uid: roxanam
cn: Roxana Murarus
mail: XXXXXXX
 
dn: uid=razvan,ou=People,dc=swarm,dc=cs,dc=pub,dc=ro
uid: razvan
cn: Razvan Deaconescu
mail: XXXXXXX

Altfel spus, pentru a selecta mai multe atribute le transmitem ca argument comenzii ldapsearch.

Filtrare după atribute

În SQL, clauza where permite selectarea doar anumitor intrări. La fel permite și comanda ldapsearch folosirea de filtre de căutare.

Astfel, pentru a selecta intrările de utilizator al căror prenume este Silviu vom folosi comanda

root@ldap-client:~# ldapsearch -x -LLL -H ldaps://swarm.cs.pub.ro -b "dc=swarm,dc=cs,dc=pub,dc=ro" givenName=Silviu
dn: uid=silviu,ou=People,dc=swarm,dc=cs,dc=pub,dc=ro
uid: silviu
cn: Silviu Grijincu
[...]

Dacă vrem să aflăm informații despre contul aferent lui Mihai Carabaș, și nu știm uid-ul său, vom folosi comanda

root@ldap-client:~# ldapsearch -x -LLL -H ldaps://swarm.cs.pub.ro -b "dc=swarm,dc=cs,dc=pub,dc=ro" cn="Mihai Carabas"
dn: uid=mihaic,ou=People,dc=swarm,dc=cs,dc=pub,dc=ro
uid: mihaic
sn: Carabas
[...]

Dacă știam uid-ul căutam direct după uid:

root@ldap-client:~# ldapsearch -x -LLL -H ldaps://swarm.cs.pub.ro -b "dc=swarm,dc=cs,dc=pub,dc=ro" uid=mihaic
dn: uid=mihaic,ou=People,dc=swarm,dc=cs,dc=pub,dc=ro
uid: mihaic
sn: Carabas
[...]

Filtrele de căutare (search filters) sunt expresii care fac match pe anumite atribute din intrările LDAP și le afișează doar pe acelea. Filtrele pot conține și glob-uri pentru a permite match pe mai multe valori ale atributelor. Astfel, pentru a selecta toate persoanele al căror nume de familie începe cu șirul An folosim expresia:

root@ldap-client:~# ldapsearch -x -LLL -H ldaps://swarm.cs.pub.ro -b "dc=swarm,dc=cs,dc=pub,dc=ro" sn="An*"
dn: uid=aandrei,ou=People,dc=swarm,dc=cs,dc=pub,dc=ro
uid: aandrei
cn: Alexandru Andrei
sn: Andrei
[...]

Atributul sn înseamnă numele de familie (surname) iar glob-ul An* însemnă șirurile care încep cu An.

La fel cum comanda select este combinată cu where, vom putea selecta doar anumite atribute ale unor intrări. Dacă dorim să afișăm dar cn-ul și e-mail-ul rezultatelor comenzii de mai sus, vom folosi comanda

root@ldap-client:~# ldapsearch -x -LLL -H ldaps://swarm.cs.pub.ro -b "dc=swarm,dc=cs,dc=pub,dc=ro" sn="An*" cn mail
dn: uid=aandrei,ou=People,dc=swarm,dc=cs,dc=pub,dc=ro
cn: Alexandru Andrei
mail: XXXXXXX
[...]

În cazul acesta, după comanda de căutare am precizat filtrul de căutare (sn=“An*”) și apoi atributele care vor fi selectate (cn mail).

Exerciții de căutare

Realizați următoarele căutări în baza de date LDAP de pe swarm.cs.pub.ro:

  1. Extrageți utilizatorii al căror nume de familie este Popescu.
  2. Extrageți uid-ul și cn-ul utilizatorilor a căror adresă de e-mail conține șirul @cti.pub.ro.
  3. Extrageți utilizatorii al căror nume de familie nu se termină în escu.
  4. Extrageți utilizatorii al căror prenume este Vlad sau Andrei.
  5. Extrageți uid-ul, e-mail-ul și numele de familie al utilizatorilor al căror prenume este Vlad sau Andrei.

Detalii legate de folosirea filtrelor de căutare găsiți la pagina http://www.centos.org/docs/5/html/CDS/ag/8.0/Finding_Directory_Entries-LDAP_Search_Filters.html.

Este recomandat să puneți expresiile de filtrare între apostroafe sau ghilimele ca să preveniți interpretarea caracterelor speciale de shell.

04. [15p] Folosire programatică client de LDAP

Pe stația client este instalat pachetul python-ldap util pentru programarea unui client LDAP în Python.

Fișierul de mai jos implementează căutarea intrărilor LDAP pentru utilizatorii al căror atribut cn începe cu Mihai și afișează pentru aceștia atributele cn și e-mail.

simple-ldap.py
#!/usr/bin/env python
 
import sys
import ldap
 
def main():
    ldap.set_option(ldap.OPT_PROTOCOL_VERSION, 3)
    l = ldap.initialize("ldaps://swarm.cs.pub.ro")
    entries = l.search_s("ou=People,dc=swarm,dc=cs,dc=pub,dc=ro", ldap.SCOPE_SUBTREE, '(cn=Mihai*)', ['cn', 'mail'])
 
    for dn, attrs in entries:
        print 'Found:', repr(dn)
        print attrs
 
if __name__ == "__main__":
    sys.exit(main())

Fișierul se găsește și pe stația client, în directorul /root/, și îl putem rula:

root@ldap-client:~# python simple-ldap.py 
Found: 'uid=mihai,ou=People,dc=swarm,dc=cs,dc=pub,dc=ro'
{'mail': ['XXXXXX@gmail.com'], 'cn': ['Mihai Maruseac']}
Found: 'uid=moro,ou=People,dc=swarm,dc=cs,dc=pub,dc=ro'
{'mail': ['XXXXXX@gmail.com'], 'cn': ['Mihai Morogan']}
[...]

Actualizați scriptul astfel încât sa extragă din intrările de mai sus acele intrări ale căror adresă de e-mail conține șirul @gmail.com. Apoi afișați doar atributele uid, cn și email pe o singură linie, separate prin virgulă, la fel ca mai jos:

mihai, Mihai Maruseac, XXXXXX@gmail.com
moro, Mihai Morogan, XXXXXX@gmail.com

Variabila attrs este un dicționar. Pentru a obține fiecare element numit item dintr-un dicționar d folosiți construcția d['item'].

Fiecare element din dicționarul attrs este o listă. Pentru a obține primul element (cel căutat) din listă, folosiți o expresie de forma l[0], unde l este lista.

05. [15p] Adăugare intrări în baza de date LDAP

Vrem să populăm baza de date LDAP cu intrări. Pentru aceasta trebuie redactate fișiere de configurare în format LDIF care să fie apoi adăuagate în baza de date LDAP.

Fișierele de configurare se găsesc în format LDIF pe stația client în directorul /etc/ldap/ldif/:

root@ldap-client:/etc/ldap/ldif# ls
o-protoss.ldif    ou-khalai.ldif   uid-amengsk.ldif  uid-zeratul.ldif
o-terran.ldif     ou-nerazim.ldif  uid-artanis.ldif
ou-dominion.ldif  ou-raiders.ldif  uid-raynor.ldif

Pentru a adăuga intrări în baza de date LDAP folosim comanda ldapadd. Trebuie să precizăm care este dn-ul contului de administrator (parola este student):

root@ldap-client:/etc/ldap/ldif# ldapadd -x -D cn=admin,dc=labs,dc=cs,dc=pub,dc=ro -W -f o-terran.ldif 
Enter LDAP Password: 
adding new entry "o=Terran,dc=labs,dc=cs,dc=pub,dc=ro"
 
root@ldap-client:/etc/ldap/ldif# ldapadd -x -D cn=admin,dc=labs,dc=cs,dc=pub,dc=ro -W -f ou-dominion.ldif 
Enter LDAP Password: 
adding new entry "ou=Dominion,o=Terran,dc=labs,dc=cs,dc=pub,dc=ro"
 
root@ldap-client:/etc/ldap/ldif# ldapadd -x -D cn=admin,dc=labs,dc=cs,dc=pub,dc=ro -W -f ou-raiders.ldif 
Enter LDAP Password: 
adding new entry "ou=Raiders,o=Terran,dc=labs,dc=cs,dc=pub,dc=ro"
 
root@ldap-client:/etc/ldap/ldif# ldapadd -x -D cn=admin,dc=labs,dc=cs,dc=pub,dc=ro -W -f uid-raynor.ldif 
Enter LDAP Password: 
adding new entry "uid=raynor,ou=Raiders,o=Terran,dc=labs,dc=cs,dc=pub,dc=ro"
 
root@ldap-client:/etc/ldap/ldif# ldapadd -x -D cn=admin,dc=labs,dc=cs,dc=pub,dc=ro -W -f uid-amengsk.ldif 
Enter LDAP Password: 
adding new entry "uid=amengsk,ou=Dominion,o=Terran,dc=labs,dc=cs,dc=pub,dc=ro"

Opțiunea -D precizează dn-ul utilizatorului privilegiat. Opțiunea -f precizează fișierul format LDIF care va fi adăugat. Iar opțiunea -W precizează că se va introduce parola de la intrarea standard.

Intrările adăugate se găsesc acum în baza de date LDAP:

root@ldap-client:/etc/ldap/ldif# ldapsearch -x -LLL dn
dn: dc=labs,dc=cs,dc=pub,dc=ro
 
dn: cn=admin,dc=labs,dc=cs,dc=pub,dc=ro
 
dn: o=Terran,dc=labs,dc=cs,dc=pub,dc=ro
 
dn: o=Protoss,dc=labs,dc=cs,dc=pub,dc=ro
 
dn: ou=Dominion,o=Terran,dc=labs,dc=cs,dc=pub,dc=ro
 
dn: ou=Raiders,o=Terran,dc=labs,dc=cs,dc=pub,dc=ro
 
dn: uid=raynor,ou=Raiders,o=Terran,dc=labs,dc=cs,dc=pub,dc=ro
 
dn: uid=amengsk,ou=Dominion,o=Terran,dc=labs,dc=cs,dc=pub,dc=ro

Adăugați și celelate intrări din fișierele LDIF din directorul /etc/ldap/ldif/. Există lipsuri în anumite fișiere pe care trebuie să le rezolvați.

Acolo unde vă solicită un câmp completați cu o valoare potrivită.

Creați două noi fișiere:

  • uid-vmengsk.ldif conține informații despre Valerian Mengsk (Dominion).
  • uid-horner.ldif conține informații despre Matt Horner (Raiders).

Adăugați aceste fișiere la baza de date LDAP.

Se recomandă să porniți de la fișiere existente și să le modificați pe acelea. Puteți porni de la fișierele uid-amengsk.ldif și uid-raynor.ldif.

În final listați conținutul bazei de date.

06. [20p] Adăugare conturi de utilizatori în baza de date LDAP

Pentru a putea folosi conturi din baza de date LDAP pentru anumite forme de autentificare, este necesar ca intrările să aibă ca objectClass atât posixAccount cât și shadowAccount. Cele două clase conțin informații precum uid, password, loginShell, uidNumber, gidNumber.

Trebuie, așadar, să modificăm intrările de tip utilizator existente în baza de date LDAP. Modificările se realizează tot prin intermediul unui fișier LDIF. Astfel, pentru a adăuga informații din clasa posixAccount și shadowAccount pentru utilizatorul amengsk vom folosi un fișier cu următorul conținut:

account-uid-amengsk.ldif
dn: uid=amengsk,ou=Dominion,o=Terran,dc=labs,dc=cs,dc=pub,dc=ro
changetype: modify
add: objectClass
objectClass: posixAccount
-
add: uidNumber
uidNumber: 1001
-
add: gidNumber
gidNumber: 1000
-
add: homeDirectory
homeDirectory: /home/amengsk
-
add: loginShell
loginShell: /bin/bash
-
add: gecos
gecos: Arcturus Mengsk,,,
-
add: objectClass
objectClass: shadowAccount
-

Acest fișier se găsește și pe stația client în directorul /etc/ldap/ldif/modify/, cu numele account-uid-amengsk.ldif.

Adăugăm noile informații folosind comanda ldapmodify, cu o sintaxă similară comenzii ldapadd:

root@ldap-client:/etc/ldap/ldif/modify# ldapmodify -x -D cn=admin,dc=labs,dc=cs,dc=pub,dc=ro -W -f account-uid-amengsk.ldif

Acum verificăm modificările în baza de date LDAP folosind comanda ldapsearch:

root@ldap-client:/etc/ldap/ldif/modify# ldapsearch -x -LLL uid=amengsk
dn: uid=amengsk,ou=Dominion,o=Terran,dc=labs,dc=cs,dc=pub,dc=ro
uid: amengsk
cn: Arcturus Mengsk
givenName: Arcturus
sn: Mengsk
mail: mengsk@dominion.terran.mil
objectClass: person
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uidNumber: 1001
gidNumber: 1000
homeDirectory: /home/amengsk
loginShell: /bin/bash
gecos: Arcturus Mengsk,,,

Pentru a fi informațiile complete trebuie completate câmpurile legate de parole. Pentru aceasta se folosește comanda ldappasswd:

root@ldap-client:/etc/ldap/ldif/modify# ldappasswd -x -D cn=admin,dc=labs,dc=cs,dc=pub,dc=ro -W -S uid=amengsk,ou=Dominion,o=Terran,dc=labs,dc=cs,dc=pub,dc=ro
New password: 
Re-enter new password: 
Enter LDAP Password:

Opțiunea -W folosită și în cazul comenzilor ldapadd și ldappaswd înseamnă că parola utilizatorului de bind (cel care face modificarea, în cazul de față cn=admin,dc=labs,dc=cs,dc=pub,dc=ro) se va citi de la intrarea standard. Opțiunea -S spune că parola care va fi completată utilizatorului transmis ca parametru (uid=amengsk…) va fi citită, de asemenea, de la intrarea standard. În rularea de mai sus se cere întâi parola utilizatorului primit ca parametru (introduceți ce parolă doriți), se confirmă acea parolă și apoi se cere parola de bind.

În acest moment utilizatorul are configurată parola. Pentru a verifica acest lucru, putem să citim intrarea din baza de date LDAP. Câmpul de parolă este însă accesibil doar utilizatorului propriu sau doar celui privilegiat. Vom face citirea folosind utilizatorul propriu (bind):

root@ldap-client:/etc/ldap/ldif/modify# ldapsearch -x -LLL -D 'uid=amengsk,ou=Dominion,o=Terran,dc=labs,dc=cs,dc=pub,dc=ro' -W uid=amengsk userPassword
Enter LDAP Password: 
dn: uid=amengsk,ou=Dominion,o=Terran,dc=labs,dc=cs,dc=pub,dc=ro
userPassword:: e1NTSEF9NDhXajhSbzZ6THNWZ1YrRjRnNjRITno4blNYaWhSblo=

În comanda de mai sus am realizat bind la serverul LDAP folosind chiar utilizatorul amengsk, am folosit opțiunea -W pentru a citi parola de la intrarea standard și apoi am solicitat afișarea câmpului userPassword în format base64.

Exercițiu: Realizați pașii de mai sus și pentru utilizatorii raynor, vmengsk, horner, zeratul și artanis.

Creați copii ale fișierului /etc/ldap/ldif/account-uid-mengsk.ldif, încărcați-le în baza de date LDAP și apoi configurați parola pentru fiecare utilizator. Incrementați pentru fiecare utilizator adăugat valoarea pentru numărul de UID (uidNumber).

07. [15p] Configurare suport de LDAP în DokuWiki

Folosind conturile de mai sus putem realiza autentificarea în diverse servicii care folosesc ca backend de autentificare LDAP. Un astfel de serviciu este wiki-ul de tipul DokuWiki.

Pe stația client este instalat și configurat serverul web Apache cu suport PHP și pachetul php5-ldap care oferă implementarea clientului de LDAP în PHP. Alte module (userdir, ssl) sunt configurate și activate.

Vom configura o instanță de DokuWiki în contul utilizatorului student de pe stația client. În directorul home al utilizatorului student găsiți creat directorul public_html/dokuwiki/ unde vom instala instanța de DokuWiki. Pentru instalarea instanței intrăm în directorul admin-public.git/dokuwiki/ din directorul home al utilizatorului student și rulăm scriptul de instalare dw-install. Întâi rulăm scriptul fără argumente ca să vedem ce opțiuni sunt disponibile:

student@ldap-client:~/admin-public.git/dokuwiki$ ./dw-install
DokuWiki basic installation script
  Usage:
    ./dw-install installation-directory download-url wiki-url
  Sample usage:
    ./dw-install ~/public_html/dw-test/ http://www.splitbrain.org/_media/projects/dokuwiki/dokuwiki-2011-05-25a.tgz http://swarm.cs.pub.ro/~razvan/dw-test

Apoi rulăm scriptul pentru realizarea instalării efective:

student@ldap-client:~/admin-public.git/dokuwiki$ ./dw-install ~/public_html/dokuwiki/ http://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz http://192.168.0.3/~student/dokuwiki
 
* Logging information to /tmp/tmp.anntIlR19E.
* Using download link http://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz
  * Downloading DokuWiki ... done.
* Preparing installation folder /home/student/public_html/dokuwiki/ ... done.
* Installing plugins
  * Installing plugin: Creole ... done.
  * Installing plugin: Google Analytics ... done.
  * Installing plugin: Include ... done.
  * Installing plugin: Index-Menu ... done.
  * Installing plugin: Display-Wiki-Page ...done.
  * Installing plugin: authsplit ...done.
  * Installing plugin: authchained ...done.
 
Installation complete.
1. Open in web browser: http://192.168.0.3/~student/dokuwiki/install.php
2. Fill required information to complete the basic installation.
3. Remove /home/student/public_html/dokuwiki//install.php.bak file.
4. Run:
   ./dw-post-install /home/student/public_html/dokuwiki/ /~student/dokuwiki/

Apoi parcurgem pașii de mai sus (1, 2, 3, 4) ca să definitivăm instalarea. În acest moment, la adresa http://192.168.0.3/~student/dokuwiki/ poate fi accesat wiki-ul. Se poate face autentificarea cu utilizatorul indicat la pasul 1, în interfața web de instalare/configurare a DokuWiki.

Pentru a realiza suport de autentificare prin LDAP folosim indicațiile de pe site-ul DokuWiki.

Pentru început, adăugăm în fișierul de configurare /home/student/public_html/dokuwiki/conf/local.php suportul pentru autentificarea LDAP, prin adăugarea liniilor:

$conf['authtype']       = 'authldap';
$conf['plugin']['authldap']['server']      = 'ldaps://192.168.0.2';
$conf['plugin']['authldap']['version']     = 3;
$conf['plugin']['authldap']['usertree']    = 'dc=labs,dc=cs,dc=pub,dc=ro';
$conf['plugin']['authldap']['grouptree']   = 'dc=labs,dc=cs,dc=pub,dc=ro';
$conf['plugin']['authldap']['userfilter']  = '(&(uid=%{user})(objectClass=posixAccount))';
$conf['plugin']['authldap']['groupfilter'] = '(&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))';

Dacă reaccesăm acum pagina instanței de wiki (http://192.168.0.3/~student/dokuwiki/), vom primi mesajul “User authentication is temporarily unavailable. If this situation persists, please inform your Wiki Admin.” Pentru a rezolva această problemă activăm suportul pentru LDAP în fișierul /home/student/public_html/dokuwiki/conf/plugins.local.php și activăm linia corespunzătoare modulului LDAP:

$plugins['authldap']  = 1;

Întrucât fișierul /home/student/public_html/dokuwiki/conf/plugins.local.php este posibil deținut de utilizatorul www-data, nu-l veți putea modifica. Îl puteți în schimb șterge. Pentru a-l putea edita urmați pașii

  1. Creați o copie a fișierului.
  2. Ștergeți fișierul.
  3. Redenumiți copia în numele fișierului.
  4. Editați fișierul.

Comenzile sunt următoarele:

student@ldap-client:~/public_html/dokuwiki/conf$ cp plugins.local.php tmp.plugins.php
student@ldap-client:~/public_html/dokuwiki/conf$ rm plugins.local.php 
rm: remove write-protected regular file ‘plugins.local.php’? y
student@ldap-client:~/public_html/dokuwiki/conf$ mv tmp.plugins.php plugins.local.php
student@ldap-client:~/public_html/dokuwiki/conf$ vi plugins.local.php

În acest moment configurația este finalizată, iar autentificarea pe instanța de wiki (accesibilă la http://192.168.0.3/~student/dokuwiki/) va putea fi realizată folosind conturile de utilizatori LDAP adăugate atnterior.

08. [BONUS - 10p] Configurare suport de LDAP în MediaWiki

MediaWiki este una dintre cele mai cunoscute și folosite soluții de wiki. Spre deosebire de DokuWiki folosește o bază de date. Pentru aceasta am instalat pe stația client un server MySQL.

Similar cu DokuWiki vom instala MediaWiki în directorul public_html/mediawiki/ din directorul home al utilizatorului student. Pentru instalare vom folosi fișierul arhivă mediawiki-1.22.2.tar.gz din directorul home al utilizatorului student. Vom urma indicațiile de instalare din pagina de instalare a MediaWiki.

Configurare bază de date

În primă fază vom configura baza de date. Pentru început ne vom conecta cu utilizatorul privilegiat al MySQL (parola este student):

student@ldap-client:~$ mysql -u root -pstudent
[...]
mysql> 

Astfel conectați vom crea baza de date pentru MediaWiki (denumită wikidb):

mysql> create database wikidb;
Query OK, 1 row affected (0.08 sec)

și apoi creăm utilizatorul care să fie folosit de MediaWiki pentru accesarea bazei de date (denumit wikiuser, folosibil de pe localhost):

mysql> grant index, create, select, insert, update, delete, alter, lock tables on wikidb.* to 'wikiuser'@'localhost' identified by 'student';
Query OK, 0 rows affected (0.00 sec)

Am configurat baza de date MySQL și acum putem ieși din modul de configurare:

mysql> exit
Bye
student@ldap-client:~$ 

Instalare MediaWiki

După cum am spus vom instala MediaWiki în directorul public_html/mediaiki/ din directorul home al utilizatorului student. Pentru început vom dezarhiva, în acel director, arhiva ~student/public_html/mediawiki-1.22.2.tar.gz, ca utilizatorul student. Vom rula comenzile de mai jos:

student@ldap-client:~$ ls
admin-public.git  mediawiki-1.22.2.tar.gz  public_html
student@ldap-client:~$ cd public_html/
student@ldap-client:~/public_html$ ls
dokuwiki
student@ldap-client:~/public_html$ tar xzf ../mediawiki-1.22.2.tar.gz 
student@ldap-client:~/public_html$ ls
dokuwiki  mediawiki-1.22.2
student@ldap-client:~/public_html$ mv mediawiki-1.22.2/ mediawiki
student@ldap-client:~/public_html$ ls
dokuwiki  mediawiki

Mai sus am redenumit directorul obținut după dezarhivare din mediawiki-1.22.2/ în mediawiki/.

În continuare vom rula scriptul de instalare al MediaWiki. Accesăm URL-ul aferent MediaWiki: http://192.168.0.3/~student/mediawiki/. De la acesta vom continua către pagina de configurare: http://192.168.0.3/~student/mediawiki/mw-config/index.php. În acea pagină realizăm configurarea dorită, adică pașii:

  • Limba dorită: vom opta pentru valoarea implicită (engleză).
  • Verificările de mediu vor fi trecute: vom apăsa butonul “Continue”.
  • La configurările de bază de date, vom folosi pentru diversele câmpuri următoarele valori:
    • Database host: localhost
    • Database name: wikidb (configurat anterior)
    • Database table prefix: nu completăm nimic (nu dorim să avem un prefix în numele tabelelor din baza de date)
    • Database username: wikiuser (configurat anterior)
    • Database password: student (configurat anterior)
  • În opțiunile de bază de date alegem InnoDB ca engine de stocare și UTF-8 ca set de caractere.
  • În fereastra denumită “Name” completați ce opțiuni doriți.
  • În celelalte ferestre alegeți, în continuare, ceea ce vi se pare potrivit.
  • După realizarea configurărilor de mai sus, se va rula scriptul intern de configurare.
  • Apoi se descarcă scriptul de configurare a wiki-ului. Acesta trebuie copiat în directorul de instalare al MediaWiki. Pentru aceasta, mergem în directorul unde a fost descărcat pe sistemul fizic și îl copiem în directorul de instalare folosind comanda scp:
    student@mjolnir:~/Downloads$ scp LocalSettings.php student@192.168.0.3:public_html/mediawiki/
    student@192.168.0.3's password: 
    LocalSettings.php                             100% 4296     4.2KB/s   00:00
  • Acum putem accesa wiki-ul folosind URL-ul http://192.168.0.3/~student/mediawiki/index.php/Main_Page.

Configuare autentificare prin LDAP

Pentru început trebuie să adăugăm extensia de LDAP aferentă MediaWiki. Este deja descărcată în fișierul wikimedia-mediawiki… din directorul home al utilizatorului student de pe stația client. O vom dezarhiva în subdirectorul extensions/ din directorul de instalare al MediaWiki (în cazul nostru ~student/public_html/mediawiki/):

student@ldap-client:~$ cd public_html/mediawiki/extensions/
 
student@ldap-client:~/public_html/mediawiki/extensions$ tar xzf ~/wikimedia-mediawiki-extensions-LdapAuthentication-2.0c-31-g300d43f.tar.gz
 
student@ldap-client:~/public_html/mediawiki/extensions$ ls
Cite                Poem
ConfirmEdit         README
Gadgets             Renameuser
ImageMap            SimpleAntiSpam
InputBox            SpamBlacklist
Interwiki           SyntaxHighlight_GeSHi
LocalisationUpdate  TitleBlacklist
Nuke                WikiEditor
ParserFunctions     wikimedia-mediawiki-extensions-LdapAuthentication-300d43f
PdfHandler
 
student@ldap-client:~/public_html/mediawiki/extensions$ mv wikimedia-mediawiki-extensions-LdapAuthentication-300d43f/ LdapAuthentication
 
student@ldap-client:~/public_html/mediawiki/extensions$ ls
Cite         Interwiki           PdfHandler      SpamBlacklist
ConfirmEdit  LdapAuthentication  Poem            SyntaxHighlight_GeSHi
Gadgets      LocalisationUpdate  README          TitleBlacklist
ImageMap     Nuke                Renameuser      WikiEditor
InputBox     ParserFunctions     SimpleAntiSpam

Am redenumit mai sus directorul aferent extensiei de LDAP pentru MediaWiki în LdapAuthentication/.

Pentru configurarea autentificării prin LDAP pentru MediaWiki urmărim pagina aferentă pentru configurare. Configurările vor fi realizate din directorul de instalare al MediaWiki (adică ~student/public_html/mediawiki/).

Adăugăm suport pentru autentificarea pe bază de LDAP în fișierul LocalSettings.php, folosind un editor. Le adăugăm la sfârșitul fișierului ca să avem rezultatul de mai jos:

student@ldap-client:~/public_html/mediawiki$ tail -5 LocalSettings.php
 
# End of automatically generated settings.
# Add more configuration options below.
require_once( "$IP/extensions/LdapAuthentication/LdapAuthentication.php" );
require_once( "$IP/includes/AuthPlugin.php" );
$wgAuth = new LdapAuthenticationPlugin();

Adăugăm apoi, în continuare în același fișier (LocalSettings.php) directivele de configurare specifice pentru serverul de LDAP:

$wgLDAPDomainNames = array(
  'my-ldap-server',
);
$wgLDAPServerNames = array(
  'my-ldap-server' => 'ldap-server.local',
);
$wgLDAPUseLocal = false;
$wgLDAPEncryptionType = array(
  'my-ldap-server' => 'ssl',
);
$wgLDAPPort = array(
  'my-ldap-server' => 636,
);
$wgLDAPSearchAttributes = array(
  'my-ldap-server' => 'uid'
);
$wgLDAPBaseDNs = array(
  'my-ldap-server' => 'dc=labs,dc=cs,dc=pub,dc=ro',
);
# To pull e-mail address from LDAP
$wgLDAPPreferences = array(
  'my-ldap-server' => array( 'email' => 'mail')
);
// May use debug level 3 for extensive debugging.
// $wgLDAPDebug = 1;
// $wgDebugLogGroups['ldap'] = '/tmp/debug.log';

Am marcat opțiunea de debug comentată. La nevoie poate fi decomentată și valoarea sa crescută până la 3 pentru mesaje detaliate.

O dată realizată configurația LDAP în fișierul de configurare (LocalSettings.php), va trebui să creăm tabelele aferente în baza de date. Pentru aceasta rulăm scriptul de actualizare:

student@ldap-client:~/public_html/mediawiki$ php maintenance/update.php
[...]
Creating ldap_domains table ...done.
...site_stats is populated...done.
...rev_len column of revision table already populated.
...Update 'populate rev_sha1' already logged as completed.
...img_sha1 column of image table already populated.
...protocol-relative URLs in externallinks table already fixed.
...fa_sha1 column of filearchive table already populated.
Purging caches...done.
 
Done.

După aceasta se accesează instanța de MediaWiki (http://192.168.0.3/~student/mediawiki/index.php/Main_Page) și apoi se poate folosi link-ul “Log in” pentru autentificarea folosind LDAP. La opțiunea “Your domain:” se păstrează valoarea my-ldap-server.

saisp/labs/01.1426515166.txt.gz · Last modified: 2015/03/16 16:12 by alexandru.carp
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0