Ewa Skrenty
Uczelniane Centrum Informatyczne UMK
Ewa.Skrenty@uni.torun.pl

Temat zadania:

Opracowanie prototypu narzędzi do obsługi polskich znaków diakrytycznych w zasobach LDAP

(opracowanie przygotowane w ramach realizacji zadań projektu KBN)

Data opracowania: 21.05.2002

Spis treści
  1. Wprowadzenie
  2. Umieszczanie polskich nazw w serwerze LDAP za pomocą standardowych narzędzi
  3. Obsługa polskich znaków diakrytycznych z wykorzystaniem biblioteki Perl-LDAP
    1. Konfiguracja pliku ldap.conf
    2. Wprowadzanie wpisów do serwera LDAP
    3. Przeszukiwanie zasobów serwera LDAP
    4. Usuwanie wpisów z serwera LDAP
    5. Modyfikacja istniejących wpisów w serwerze LDAP
    Bibliografia

1. Wprowdzenie

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.
Archiwum z programami dostępne jest pod adresem http://ldap.uni.torun.pl/archiwum/ftp/software/interfejsy-pl-ldap-1.0.3.tar.gz

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::MapUTF8
Opcjonalnie 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 diakrytycznych
Pakiet 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.

HOST
Definiuje host, na którym jest uruchomiony serwer LDAP, domyślna wartość: localhost
PORT
Definuje port, na którym nasłuchuje serwer LDAP, domyślna wartość: 389
VERSION
Definiuje wersję protokołu LDAP, domyślna wartość: 3
BINDDN
Definuje DN, za pomocą którego następuje łączenie z serwerem LDAP
PASSWORD
Definuje hasło dla autentykacji określonej przez parametr BINDDN
BASEDN
Definiuje korzeń poddrzewa, od którego następuje przeszukiwanie bazy LDAP
SCOPE
Defniuje zakres przeszukiwania bazy LDAP (możliwe wartości to 'base', 'one' oraz 'sub'), domyślna wartość: 'sub'
DEREF
Określa sposób odsyłania aliasów przy przeszukiwaniu (możliwe wartości to 'never', 'search', 'find', 'always'), domyślna wartość: 'never'
TIMELIMIT
Definuje maksymalny czas przeszukiwania bazy LDAP (określony w sekundach), domyślna wartość: 0 (brak limitu)
SIZELIMIT
Definuje maksymalną liczba znalezionych wpisów, domyślna wartość: 0 (brak limitu)

W przypadku nawiązywania bezpiecznych połączeń za pośrednictwem protokołu TLS/SSL (ustawiona opcja -Z) można określić parametry

TLS_VERSION
Określa protokół jaki ma być użyty do nawiązania połączenia (możliwe wartości to tlsv1, sslv2, sslv3, sslv2/3), domyślna wartość: tslv1
TLS_VERIFY
Określa sposób, w jaki ma być weryfikowany certyfikat serwera, możliwe wartości to 'none' (nie będzie sprawdzany certyfikat serwera), 'optional' (weryfikacja następuje gdy serwer dostarcza certyfikat) oraz 'require' (serwer musi dostarczyć certyfikat, który będzie zweryfikowany). Domyślna wartość to 'none'. Gdy wartość zostanie ustawiona na 'optional' lub 'require' musi być również określony parametr TLS_CAPATH lub TLS_CAFILE.
TLS_CLIENTCERT
Definuje ścieżkę do pliku zawierającego certyfikat klienta w foramcie PEM.
TLS_CLIENTKEY
Definiuje ścieżkę do pliku zawierającego klucz prywatny klienta w formacie PEM
TLS_CAFILE
Definiuje ścieżkę do pliku zawierającego certyfikat urzędu certyfikującego (CA) w formacie PEM
TLS_CAPATH
Definiuje ścieżkę do katalogu zawierającego certyfikaty CA. Certyfikaty powinny być nazwane wartością 'hash' nazwy tematu certyfikatu. Do generowania takich nazw można użyć polecenia

ln -s cacert.pem `openssl x509 -hash -noout < cacert.pem`.0

TLS_CIPHERS
Definiuje zbiór metod szyfrowania, jakie są uprawnione dla połączenia, domyślna wartość: 'ALL'

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
-

Bibliografia

[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