LDAP v.3 został zaprojektowany tak, iż umożliwia w prosty sposób obsługę różnorodnych języków. Do przechowywania wszystkich tekstowych wartości atrybutów oraz nazw wyróżnionych (DNs) używa zbioru znaków UTF-8 (Unicode Transformation Format-8). UTF-8 jest standardowym systemem kodowania znaków za pomocą którego można reprezentować tekst napisany w praktycznie wszystkich używanych językach. Format ten został zdefiniowany i zaprojektowany przez Unicode Consortium. Jego opis można znaleźć m.in. w dokumencie [RFC2279]. Dzięki tej własności w zasobach LDAP można umieszczać dane zawierające polskie znaki diakrytyczne zarówno w wartościach atrybutów jak i nazwach wyróżnionych. Dokument [RFC2253] zawiera dokładny opis formatu nazw wyróżnionych.
Istotnym faktem jest to, iż format UTF-8 jest zdefiniowany w ten sposób, że dane formatu ASCII są prawidłowymi danymi formatu UTF-8. Pozwala to więc na umieszczanie danych zawierających tylko znaki ASCII bez konieczności konwertowania ich do UTF-8, co wskazuje rownież na kompatybilność z istniejącymi anglojęzycznymi danymi katalogowymi.
2. Umieszczanie polskich nazw w serwerze LDAP za pomocą standardowych narzędzi
W przykładzie tym opierać się będziemy o serwer OpenLDAP (v. 2.0.23) działający w systemie Linux RedHat 7.2 oraz interfejsy do zarządzania danymi dostarczone razem z tym oprogramowaniem. Konfiguracja serwera LDAP stosująca polskie znaki w korzeniu głównym bazy sprowadza się do skonfigurowania pliku slapd.conf w dowolnym edytorze umożliwiającym wprowadzanie polskich znaków diakrytycznych (np. w standardzie ISO-8859-2), a następnie konwersji tego pliku do formatu UTF-8. Dla przykładu skonfigurujemy serwer slapd o przyrostku o=Uniwersytet Mikołaja Kopernika, dc=PL. Tworzymy plik slapd-pl.conf, w którym defiujemy m.in.
suffix o=Uniwersytet Mikołaja Kopernika,dc=PL
rootdn cn=root,o=Uniwersytet Mikołaja Kopernika,dc=PL
a następnie za pomocą na przykład funkcji systemowej iconv konwertujemy utworzony plik do formatu UTF-8
$ iconv -f Latin2 -t UTF-8 -o slapd.conf slapd-pl.conf
Z tak sformatowanym plikem slapd.conf można już uruchomić serwer slapd.
W podobny sposób należy konfigurować pliki konfiguracyjne ldap.conf oraz .ldaprc używane przy uruchamianiu programów klienckich. Dostęp do danych oraz ich aktualizacja odbywa sie w standardowy sposób. Najprościej jest przygotować plik LDIF zawierający dane, a następnie po skonwertowaniu go do formatu UTF-8 załadować do serwera LDAP za pomocą interfejsów ldapadd lub ldapmodify. Trudnością w uruchamianiu programów może być określanie parametrów binddn lub base zawierających polskie znaki diakrytyczne. Mimo, iż definicje nazw wyróznionych (opisane w [ RFC2253]) umożliwiają ich reprezentację w postaci stringu zawierającego kody hex, to nie wszystkie implementacje to uwzgledniają. Można podawać je w formacie UTF-8, co jednak nie jest rzeczą wygodną, lub zdefiniować w pliku ldap.conf.
Przeszukiwanie w bazie serwera LDAP realizowane za pomocą programu ldapsearch umożliwia wprowadzanie polskich znaków diakrytycznych w postaci pary kodów hex poprzedzonych znakiem "\". Dzięki temu można w przystępny sposób realizować zapytania do serwera LDAP z uwzględnieniem polskich znaków uruchamiając na przykład
$ ldapsearch "uid=Szyma\c5\84ski"
W rezultacie otrzymujemy poprawny wynik. Dane zawierające znaki spoza ASCII są wyświetlane w postaci zakodowanej w standardzie Base64.
3. Obsługa polskich znaków diakrytycznych z wykorzystaniem biblioteki Perl-LDAP
Dla ułatwienia zarządzania danymi zawierającymi polskie znaki diakrytyczne zostały przygotowane interfejsy realizujące takie zadania jak przeszukiwanie w bazie LDAP, dodawanie nowych wpisów, modyfikację oraz usuwanie danych. Narzędzia te pozwalają na wprowadzanie danych w stadardzie ISO-8859-2, bez konieczności konwertowania ich do formatu UTF-8 oraz generują czytelne rezultaty przeszukiwania. Zostały napisane w języku Perl i wykorzystują bibliotekę Perl-LDAP jako API protokołu LDAP. Składają sie z programów
oraz opcjonalnie pliku konfiguracyjnego ldap.conf.Przed użyciem programów należy upewnić się, że w systemie zainstalowane są wszystkie niezbędne biblioteki języka Perl. Wymagane są następujące pakiety:
Perl-LDAP (główny moduł to Net::LDAP) Convert::ASN1 Unicode::MapUTF8Opcjonalnie potrzebne mogą być moduły:
IO::Socket::SSL - dla nawiązywania bezpiecznych połączeń via TLS/SSL MIME::Base64 - w przypadku obsługi danych zawierających znaki spoza zbioru znaków ASCII i polskich znaków diakrytycznychPakiet Perl-LDAP dostępny jest wraz z dokumentacją na stronie domowej projektu Perl-LDAP. Można go zainstalować rownież za pomocą modułu CPAN. Jest to dużo wygodniejsze, gdyż w ten sposób automatycznie instalują sie inne wymagane moduły. Mając zainstalowany moduł CPAN należy wykonać następujące polecenia:
$ su -root
$ perl -MCPAN -e shell
$ install Net::LDAP
$ install Unicode::MapUTF8
Programy należy uruchamiać poleceniem
$ perl <nazwa programu>.pl
lub po prostu
$ ./<nazwa programu>.pl
Wywołanie każdego z programów z opcją --help spowoduje wyświetlenie składni wywołania programu oraz listy możliwych opcji. Łączenie z serwerem LDAP może odbywać się w sposób anonimowy lub za pomocą prostej autentykacji poprzez określenie parametrów BINDDN oraz PASSWORD w pliku ldap.conf lub w opcjach wywołania programu. Realizowanie połaczeń bezpiecznych za pośrednictwem protokołu TLS/SSL możliwe jest po wybraniu opcji -Z, co spowoduje wysłanie do serwera rozszerzonej operacji StartTLS. Opcjonalnie należy zdefiniować odpowiednie parametry w pliku konfiguracyjnym. Spełnione muszą być również warunki:
Uwaga
Dla poprawnego funkcjonowania operacji startTLS należy
zainstalować wersję 0.80 biblioteki IO::Socket::SSL. Najnowsza wersja (w chwili
obecnej 0.81) różni się od poprzedniej m.in. implementacją metody
socketToSSL wywoływanej przez moduł Net::LDAP podczas wysyłania
żądania startTLS, co w obecnej wersji biblioteki Perl-LDAP powoduje
wygenerowanie błędu.
a. Konfiguracja pliku ldap.conf
Poniżej przedstawiony jest opis parametrów jakie można definiować w pliku konfiguracyjnym ldap.conf. Nie trzeba wówczas podawać ich w opcjach wywołania programu.
W przypadku nawiązywania bezpiecznych połączeń za pośrednictwem protokołu TLS/SSL (ustawiona opcja -Z) można określić parametry
ln -s cacert.pem `openssl x509 -hash -noout < cacert.pem`.0
Dla poniższych przykładów zakładamy, iż parametry umożliwiające łączenie z serwerem LDAP są zdefiniowane w pliku konfiguracyjnym.
b. Wprowadzanie nowych wpisów do serwera LDAP
Dodawanie nowych wpisów do serwera LDAP realizuje program add.pl. Dane należy podawać w postaci LDIF zgodnie z formatem opisanym w [RFC2849]. Dodatkowo możliwe jest wprowadzanie polskich znaków diakrytycznych w standardzie ISO-8859-2. Dane mogą być pobierane z pliku podanego w opcji -f lub ze standardowego wejścia. Obsługiwane są również URL-e w formacie file://. Zawartość określonego pliku jest włączana podczas wczytywania danych.
Przykład
$ ./add.pl -f dane.ldif
gdzie plik dane.ldif może mieć postać
dn: ou=UCI,o=Uniwersytet Mikołaja Kopernika, dc=PL
objectclass: organizationUnit
ou: Uczelniane Centrum Informatyczne
dn: uid=Elżbieta Nowak, o=UCI,o=Uniwersytet Mikołaja Kopernika, dc=PL
objectClass: inetOrgPerson
objectClass: person
uid: Elżbieta Nowak
cn: Elżbieta Nowak
sn: Nowak
dn: uid=Sławomir Wójcik, o=UCI,o=Uniwersytet Mikołaja Kopernika, dc=PL
objectClass: inetOrgPerson
objectClass: person
uid: Sławomir Wójcik
cn: Sławomir Wójcik
sn: Wójcik
jpegPhoto:< file:///home/slawomir/zdjecie.jpg
c. Przeszukiwanie zasobów serwera LDAP
Przeszukiwanie w bazie LDAP realizuje program search.pl. Wywołanie programu w postaci
$ ./search.pl
spowoduje przeszukanie zasobów serwera LDAP za pomocą filtra "(objectclass=*)", czyli wyświetlenie wszystkich dostępnych wpisów w bazie. Chcąc zawęzić kryteria poszukiwania należy zdefiniować filtr i ewentualnie żądane atrybuty. Definicja filtra musi być zgodna z formatem opisanym w [RFC1558], może zawierać również polskie znaki diakrytyczne.
Przykład 1
$ ./search.pl "cn=*Wójcik*"
Polecenie to powoduje wyświetlenie zawartości wpisu zawierającego słowo Wójcik w atrybucie cn.
Przykład 2
$ ./search.pl "uid=*" uid
Powyższe polecenie spowoduje wyświetlenie wartości atrybutu uid wszystkich wpisów go zawierających.
Przykład 3
$ ./search.pl -s base -L > dane.ldif
Po wykonaniu powyższej komendy wszystkie atrybuty i wartości obiektu bazowego (określonego w parametrze BINDDN) zostaną zapisane w postaci LDIF w pliku dane.ldif.
d. Usuwanie wpisów z serwera LDAP
Usuwanie wpisów realizuje program delete.pl. Dane do usunięcia w postaci "<dn>" można podawać w argumentach programu (ograniczone apostrofami), lub w postaci "dn: <dn>" w pliku za pomocą opcji -f lub ze stadardowego wejścia. Program może być uruchomiony w trybie interaktywnym wymagającym potwierdzenia usunięcia wpisu, usuwa również całe poddrzewa danych.
Przykład 1
$ ./delete.pl "uid=Sławomir Wójcik,ou=UCI,o=Uniwersytet Mikołaja Kopernika,dc=PL"
Przykład 2
$ ./delete.pl -i -f dane.ldif,
gdzie plik dane.ldif ma postać
dn: uid=Elżbieta Nowak, ou=UCI, o=Uniwersytet Mikołaja Kopernika,dc=PL
dn: uid=Sławomir Wójcik, ou=UCI, o=Uniwersytet Mikołaja Kopernika, dc=PL
dn: ou=UCI, o=Uniwersytet Mikołaja Kopernika,dc=PL
Powyższe polecenie powoduje usunięcie wszystkich wpisów z pliku dane.ldif. Opcja -i powoduje usuwanie interaktywne, wymagające przy każdym wpisie potwierdzenia jego usunięcia.
Przykład 3
$ ./delete.pl "ou=UCI, o=Uniwersytet Mikołaja Kopernika, dc=PL"
W przypadku gdy dany DN jest poddrzewem polecenie to spowoduje usunięcie całego poddrzewa, z wcześnięjszą prośbą o potwierdzenie.
e. Modyfikacja istniejących wpisów w serwerze LDAP
Modyfikacje wpisów realizuje program modify.pl. Dane do aktualizacji są pobierane z pliku określonego przez opcję -f lub ze standardowego wejścia. Format danych musi być zgodny z formatem opisanym w [RFC2849] w definicji ldif-changes. Obsługiwane są aktualizacje typu add, delete, modify oraz moddn/modrdn. Dane mogą zawierać polskie znaki diakrytyczne. Obsługiwane są również URL-e postaci "file://". Separatorem poszczególnych wpisów może być pusta linia lub linia zawierająca znak "-" na początku. Aktualizacje typu modify w ramach jednego wpisu muszą być oddzielone separatorem postaci "-", wówczas następny wpis należy oddzielić pustą linią.
Przykład
$ ./modify.pl -f dane.ldif
gdzie plik dane.ldif może mieć postać:
dn: uid=Ewa Skrenty, ou=UCI, o=Uniwersytet Mikołaja Kopernika, dc=PL
changetype: add
objectclass: inetOrgPerson
objectClass: Person
cn: Ewa Skrenty
sn: Skrenty
uid: Ewa Skrenty
description: Pracownik inżynieryjno-techniczny
mail: Ewa.Skrenty@uni.torun.pl
dn: uid=Ewa Skrenty, ou=UCI, o=Uniwersytet Mikołaja Kopernika, dc=PL
changetype: modify
replace: description
description: Programista
-
add: jpegPhoto
jpegPhoto:< file:///home/efa/zdjecie.jpg
dn: uid=Józef Wójcik, ou=UCI, o=Uniwersytet Mikołaja Kopernika, dc=PL
changetype: moddn
newsuperior: ou=WCh, o=Uniwersytet Mikołaja Kopernika, dc=PL
newrdn: uid=Józef Wójcik
deleteoldrdn: 1
-
dn: uid=Elżbieta Nowak, ou=UCI, o=Uniwersytet Mikołaja Kopernika, dc=PL
changetype: delete
-
[RFC1558] Howes T., A String Representation of LDAP Search Filters,
Requests for Comments 1558, December 1993
[RFC2253] Wahl M., Kille S., Howes T, UTF-8 String Representation of Distinguished
Names, Requests for Comments 2253, December 1997
[RFC2279] Yergeau F., UTF-8, a transformation format of ISO 10646,
Requests for Comments 2279, January 1998
[RFC2849] Good G., The LDAP Data Interchange Format (LDIF) - Technical Specification,
Requests for Comments 2849, June 2000
Howes T., D.Ph., Smith M., Good G., Understanding and Deploying
LDAP Directory Servives, 1999