Vom rula o masină virtuală în cloud-ul facultății. Pentru a porni o astfel de masină urmăriți tutorialul de la această adresă. Când creați instanța de mașină virtuală (în fereastra “Launch instance”):
Availability zone
să alegeți CI
.Flavor
alegeti c1.small
.Instance Boot Source
să alegeți Boot from Image
.Image Name
(apărută după ce efectuați pasul de mai sus) să alegeți imaginea SAISP Template v1
.
Pentru a pregăti configurația de laborator, pe mașina virtuală folosiți comenzile următoare din contul utilizatorului student
:
student@mjolnir:~/saisp$ cd saisp/ student@mjolnir:~/saisp$ wget --user=user-curs --ask-password http://repository.grid.pub.ro/cs/saisp/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
.
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
.
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 [...]
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.
Î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
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
.
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.
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?
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.
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 [...]
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.
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
.
Î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
).
Realizați următoarele căutări în baza de date LDAP de pe swarm.cs.pub.ro
:
Popescu
.@cti.pub.ro
.escu
.Vlad
sau Andrei
.Vlad
sau Andrei
.
Este recomandat să puneți expresiile de filtrare între apostroafe sau ghilimele ca să preveniți interpretarea caracterelor speciale de shell.
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
.
#!/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
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.
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.
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.
uid-amengsk.ldif
și uid-raynor.ldif
.
În final listați conținutul bazei de date.
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:
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
.
/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
).
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;
/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
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.
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.
Î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:~$
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:
localhost
wikidb
(configurat anterior)wikiuser
(configurat anterior)student
(configurat anterior)InnoDB
ca engine de stocare și UTF-8
ca set de caractere.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
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
.