Personal tools

Sr-12-lab-1.0

From Studia Informatyczne

Spis treści

LDAP

Konfiguracja serwera

Ćwiczenia niniejsze zakładają użycie serwera OpenLDAP. Na początek należy serwer skonfigurować i uruchomić. Dane serwera przechowywane są standardowo w katalogu /var/lib/ldap. Tworząc nową instalację należy usunąć całą zawartość tego katalogu.

Następnym krokiem jest wygenerowanie hasła dla administratora. Realizuje to komenda slappasswd(8):

# slappasswd
New password: ********
Re-enter new password: ********
{SSHA}Bcq2BUtjJPPORHIXLYSZgYgsHRAR0Erm

Hasło to należy wpisać do pliku konfiguracyjnego serwera OpenLDAP /etc/openldap/slapd.conf. W pliku tym powinny się również znaleźć inne ustawienia wymienione poniżej:

include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/rfc2307bis.schema
...
loglevel        256
... 
database        bdb
suffix          "dc=put,dc=pl"
rootdn          "cn=admin,dc=put,dc=pl"
rootpw          {SSHA}Bcq2BUtjJPPORHIXLYSZgYgsHRAR0Erm

Komenda include załącza zewnętrzne pliki konfiguracyjne. W tym przypadku załączane są pliki zawierające definicje schematów danych (zobacz niżej). Komenda loglevel ustawia poziom szczegółowości rejestracji zdarzeń zachodzących w serwerze. Wartość 256 jest polem bitowym aktywującym rejestrację wykonywanych operacji protokołu LDAP. Od komendy database rozpoczyna się definicja repozytorium danych serwera. Opcja suffix definiuje sufiks dla wszystkich obiektów przechowywanych w tym repozytorium. Administratorem tych danych będzie użytkownik identyfikowany jako cn=admin,dc=put,dc=pl.

Pozostałe ustawienia konfiguracyjne opisane są na stronie pomocy systemowej slapd.conf(5).

Schematy

Serwer OpenLDAP rozprowadzany jest łącznie z definicjami wielu standardowych schematów danych. Poniżej wymieniono te najważniejsze:

core.schema 
Podstawowe atrybuty LDAPv3 i klasy opisane w RFC 2251–2256.
cosine.schema 
Podstawowe atrybuty i klasy z projektu COSINE opisane w RFC 4524.
inetorgperson.schema 
Opis klasy inetOrgPerson i jej atrybutów zdefiniowanych w RFC 2798.
nis.schema, rfc2307bis.schema 
Klasy i atrybuty potrzebne do integracji z systemem NIS. Opis w RFC 2307.
samba3.schema 
Klasy i atrybuty do pracy serwera Samba.
java.schema 
Schemat opisany w RFC 2713 dla zapisu strumieniowego obiektów Java.
openldap.schema 
Definicje klas serwera OpenLDAP.
misc.schema 
Różne definicje uzupełniające (również eksperymentalne).
corba.schema 
Schemat do przechowywania obiektów Corby. Opis w RFC 2714.

Edycja rekordów

Podstawowe narzędzia

Po uruchomieniu serwera baza danych jest pusta, nie zawiera nawet obiektów, do których odnoszą się zapisy w głównym pliku konfiguracyjnym. Pierwszym ćwiczeniem musi więc być wykonanie dodawania rekordów do bazy informacji katalogowej. Operacje na bazie wykonywane są zawsze za pośrednictwem formatu LDIF. Poniższy plik base.ldif zawiera podstawowe obiekty przykładowego serwera LDAP:

dn:               dc=put,dc=pl
objectclass:      dcObject
objectclass:      organization
o:                Poznan University of Technology
dc:               put

dn:               cn=admin,dc=put,dc=pl
objectclass:      organizationalRole
cn:               admin

dn:               ou=people,dc=put,dc=pl
ou:               people
objectClass:      organizationalUnit
description:      Uzytkownicy

dn:               ou=groups,dc=put,dc=pl
ou:               groups
objectClass:      organizationalUnit
description:      Grupy uzytkownikow

dn:               ou=hosts,dc=put,dc=pl
ou:               hosts
objectClass:      organizationalUnit
description:      Komputery

Dodawanie rekordów do serwera LDAP umożliwia komenda ldapadd(1):

# ldapadd -x -W -h localhost -D cn=admin,dc=put,dc=pl -f base.ldif
Enter LDAP Password: ****
adding new entry "dc=put,dc=pl"
 
adding new entry "cn=admin,dc=put,dc=pl"
 
adding new entry "ou=people,dc=put,dc=pl"
 
adding new entry "ou=groups,dc=put,dc=pl"
 
adding new entry "ou=hosts,dc=put,dc=pl"

Wywołanie programu ldapadd zawiera wskazanie na komputer localhost, gdzie uruchomiony jest serwer LDAP. Domyślnie przyjmowany jest serwer wskazany w pliku /etc/openldap/ldap.conf (dalsze przykłady zakładają ustawienie tych parametrów):

host            sirius.cs.put.poznan.pl
base            dc=put,dc=pl

Pobranie rekordów z serwera wykonuje komenda ldapsearch(1):

# ldapsearch -x -b dc=put,dc=pl '(objectClass=*)'
# extended LDIF
#
# LDAPv3
# base <dc=put,dc=pl> with scope sub
# filter: (objectClass=*)
# requesting: ALL
#
 
# put.pl
dn: dc=put,dc=pl
objectClass: dcObject
objectClass: organization
o: Poznan University of Technology
dc: put
 
# admin, put.pl
dn: cn=admin,dc=put,dc=pl
objectClass: organizationalRole
cn: admin
 
...

Definicja przykładowego użytkownika:

dn:               uid=wojtek,ou=people,dc=put,dc=pl
objectClass:      account
objectClass:      posixAccount
uid:              wojtek
cn:               Kowalski
uidNumber:        2123
gidNumber:        110
homeDirectory:    /home/wojtek
userPassword:     qwerty7
description:      Uzytkownik Wojtek
loginShell:       /bin/bash

Definicja przykładowej grupy:

dn:               cn=staff,ou=groups,dc=put,dc=pl
objectClass:      namedObject
objectClass:      posixGroup
cn:               staff
gidNumber:        110

Oto przykłady innych zleceń wyszukujących atrybuty obiektów z bazy informacji katalogowej:

# ldapsearch -x -b dc=put,dc=pl '(objectClass=organizationalUnit)' ou
# ldapsearch -x -b ou=people,dc=put,dc=pl -s one '(objectClass=*)'
# ldapsearch -x -b dc=put,dc=pl '(&(objectClass=posixAccount)(uid=wojtek))'

Dodawanie i usuwanie atrybutów w bazie danych wymaga również przygotowania odpowiedniego pliku w formacie LDIF. Poniższy przykład powoduje usunięcie atrybutu description z obiektu uid=wojtek,ou=people,dc=put,dc=pl:

dn:               uid=wojtek,ou=people,dc=put,dc=pl
changetype:       modify
delete:           description

Zawartość odpowiedniego pliku LDIF należy przetworzyć programem ldapmodify(1):

# ldapmodify -x -W -D cn=admin,dc=put,dc=pl -f delete.ldif
modifying entry "uid=wojtek,ou=people,dc=put,dc=pl"

Modyfikacja atrybutów wymaga ich usunięcia i późniejszego dodania:

dn:               uid=wojtek,ou=people,dc=put,dc=pl
changetype:       modify
delete:           cn
-
add:              cn
cn:               Wojciech Kowalski

Usuwanie całych obiektów realizowane jest komendą ldapdelete(1):

# ldappdelete -x -W -D cn=admin,dc=put,dc=pl uid=wojtek,ou=people,dc=put,dc=pl

Dostęp poprzez przeglądarkę

Wyszukiwanie danych z serwera LDAP można również realizować poprzez przeglądarkę, posiłkując się specjalnie przygotowanymi adresami URL wg. poniższego schematu:

ldap://hostname:port/base_dn?attributes?scope?filter

Przykładem może być poniższy adres-zapytanie:

ldap://localhost/dc=put,dc=pl??sub?(objectClass=posixAccount)

Graficzna przeglądarka GQ

Program GQ domyślnie umożliwia przeglądanie w trybie anonimowym, a więc bez możliwości wprowadzania modyfikacji do serwera. Przejście do trybu edycji wymaga modyfikacji konfiguracji w menu File/Preferences i następnie w zakładce Servers.

Edytor graficzny GQ
Edytor graficzny GQ

Inne narzędzia

slapadd 
Program pozwala na zainicjowanie pustej bazy danych.
slapcat 
Wyświetla zawartość bazy danych w formacie LDIF. Program może być wykorzystany do tworzenia kopii zapasowych.
slapindex 
Program przebudowuje indeksy bazy danych.

Prawa dostępu

Prawa dostępu użytkowników do serwera LDAP zapisane są w głównym pliku konfiguracyjnym /etc/openldap/slapd.conf. Oto przykładowe reguły:

access to attrs=userPassword
       by self write
       by * auth
 
access to *
       by self write
       by * read

Powyższe reguły dają prawo właścicielowi do modyfikacji własnego hasła i pozostałych atrybutów oraz prawo do odczytu wszystkich pozostałych rekordów.

Integracja z systemem

Moduł nss_ldap

W pliku /etc/nsswitch.conf należy zaznaczyć, że dane mają pochodzić z serwera LDAP:

passwd: files ldap

Biblioteka libnss_ldap.so łączy się z serwerem LDAP odczytując swoją konfigurację z pliku /etc/ldap.conf. Zawartość pliku wskazuje na serwer LDAP:

host         127.0.0.1
base         dc=put,dc=pl
rootbinddn   cn=admin,dc=put,dc=pl
pam_filter   objectClass=posixAccount
pam_password crypt
ssl          no
nss_base_passwd   ou=people,dc=put,dc=pl
nss_base_shadow   ou=people,dc=put,dc=pl
nss_base_group    ou=groups,dc=put,dc=pl
nss_base_hosts    ou=hosts,dc=put,dc=pl

Poprawne skonfigurowany system powinien dawać możliwość odczytania informacji o nowych użytkownikach:

# getent passwd wojtek
wojtek:x:2123:110:Wojciech Kowalski:/home/wojtek:/bin/bash

Ustawienie parametru rootbinddn umożliwia zmianę hasła zwykłym poleceniem passwd przez administratora systemu. Hasło dostępu do serwera LDAP przechowywane jest w postaci jawnej w pliku /etc/ldap.secret, który powinien być zabezpieczony przed niepowołanym dostępem (prawa 0600).

Moduł pam_ldap

Logowanie na konto użytkownika z serwera LDAP wymaga skonfigurowania modułu PAM. W przypadku pracy interaktywnej zmianie musi ulec więc plik /etc/pam.d/login:

#%PAM-1.0
auth      required       pam_securetty.so
auth      required       pam_nologin.so
auth      sufficient     pam_ldap.so
auth      required       pam_unix2.so    use_first_pass
auth      required       pam_env.so
auth      required       pam_mail.so
account   sufficient     pam_ldap.so
account   required       pam_unix2.so
password  required       pam_pwcheck.so  nullok
password  sufficient     pam_ldap.so     use_first_pass
password  required       pam_unix2.so    nullok use_first_pass use_authtok
session   required       pam_unix2.so    none
session   required       pam_limits.so

Powyższa konfiguracja umożliwia również zmianę hasła użytkownika. Konfigurację warto sprawdzić wykonując następujące testy:

  1. Zmiana hasła użytkownika LDAP.
  2. Zmiana hasła użytkownika lokalnego (np. root).

Znaki narodowe

Serwery LDAPv3 przechowują wartości atrybutów stosując kodowanie UTF-8. Wprowadzenie łańcuchów tekstowych zawierających znaki spoza podstawowego zestawu ASCII jest możliwe poprzez aplikacje graficzne, lub wsadowo po zakodowaniu zgodnie ze standardem Base64. Można do tego celu wykorzystać program mimencode(1):

# printf "Łukasz Żółtkiewicz" | mimencode
xYF1a2FzeiDFu8OzxYJ0a2lld2ljeg==

Tak zakodowane wartości atrybutów w formacie LDIF zapisywane są z użyciem podwójnego znaku ":":

dn:               uid=lukasz,ou=people,dc=put,dc=pl
objectClass:      account
objectClass:      posixAccount
cn::              xYF1a2FzeiDFu8OzxYJ0a2lld2ljeg==
...

Do konwersji plików tekstowych kodowanych w innym formacie niż UTF-8 najlepiej wykorzystać program iconv(1), np.:

# iconv -f ISO8859-2 -t UTF-8 dane.txt > wynik.txt

Bezpieczeństwo — SSL/TLS

Dostęp do serwera LDAP może być realizowany w sposób bezpieczny za pośrednictwem protokołu SSL/TLS. Praca protokołów bezpieczeństwa wymaga dostępu do odpowiednich certyfikatów. Uzyskanie ich wymaga wykonania następujących kroków.

Utworzenie urzędu certyfikującego:

# /usr/share/ssl/misc/CA.sh/CA.sh -newca

Utworzenie certyfikatu:

# openssl req -new -nodes -keyout newreq.pem -out newreq.pem

Podpisanie certyfikatu:

# /usr/share/ssl/misc/CA.sh/CA.sh -sign

Instalacja:

# cp demoCA/cacert.pem /etc/openldap/cacert.pem
# mv newcert.pem /etc/openldap/ldap-crt.pem
# mv newreq.pem /etc/openldap/ldap-key.pem
# chmod 600 /etc/openldap/ldap-key.pem
# chown ldap /etc/openldap/ldap-key.pem

Konfiguracja serwera (plik /etc/openldap/slapd.conf):

TLSCACertificateFile /etc/openldap/cacert.pem
TLSCertificateFile /etc/openldap/ldap-crt.pem
TLSCertificateKeyFile /etc/openldap/ldap-key.pem

Konfiguracja klientów (plik /etc/openldap/ldap.conf):

tls_cacert /etc/openldap/cacert.pem

Konfiguracja modułu nss_ldap (plik /etc/ldap.conf):

ssl start_tls

Integracja z innymi aplikacjami

Samba

Ze względu na przechowywanie w drzewie katalogowym wielu dodatkowych atrybutów, baza informacji katalogowej powinna zostać uzupełniona dodatkowymi indeksami. Wymaga to po pierwsze modyfikacji odpowiednich zapisów w pliku /etc/openldap/slapd.conf:

# Indices to maintain
index objectClass eq
index cn          pres,sub,eq
index sn          pres,sub,eq
## required to support pdb_getsampwnam
index uid         pres,sub,eq
## required to support pdb_getsambapwrid()
index displayName pres,sub,eq
## uncomment these if you are storing posixAccount and
## posixGroup entries in the directory as well
index uidNumber   eq
index gidNumber   eq
index memberUid   eq
index sambaSID    eq
index sambaPrimaryGroupSID eq
index sambaDomainName eq
index default     sub

Następnie należy wymienione indeksy fizycznie utworzyć:

# /etc/init.d/ldap stop
# slapindex
# /etc/init.d/ldap start

Serwer Samba musi mieć dostęp do danych przechowywanych na serwerze LDAP. Dostęp ten uzyskuje podając hasło, które należy zainicjować wydając komendę:

# smbpasswd -w hasło

Hasło jest zapisywane w pliku /etc/samba/secrets.tdb.

Zadania

  1. Skonfiguruj i uruchom serwer OpenLDAP zaczynając od pustej bazy informacji katalogowej.
  2. Dodaj podstawowe rekordy do bazy informacji katalogowej oraz rekordy opisujące kilku użytkowników i kilka grup użytkowników.
  3. Przećwicz przeszukiwanie struktury katalogowej. Wykorzystaj różne zakresy przeszukiwania (base, one, sub). Wyświetl konkretne, wybrane atrybuty odnalezionych obiektów. Posłuż się filtrami zawierającymi złożone warunki (koniunkcja, alternatywa, negacja).
  4. Dokonaj modyfikacji wybranych atrybutów obiektów.
  5. Przećwicz dostęp do serwera LDAP z poziomu przeglądarki internetowej. Wykorzystaj w tym celu przeglądarkę Konqueror pochodzącą ze środowiska graficznego KDE.
  6. Przećwicz dostęp do serwera LDAP poprzez klienta graficznego GQ.
  7. Ogranicz prawa dostępu do wybranych fragmentów drzewa katalogowego. Ograniczenie powinno dotyczyć wybranych użytkowników. Sprawdź różnice pomiędzy prawami auth, compare i search.
  8. Zintegruj usługę LDAP z systemem operacyjnym poprzez udostępnienie użytkowników zdefiniowanych w bazie informacji katalogowej. Użytkownicy powinni mieć możliwość normalnego zalogowania się do systemu.
  9. Przećwicz wprowadzanie do usługi katalogowej napisów zawierających polskie litery.
  10. Zabezpiecz dostęp do serwera LDAP wykorzystując protokół SSL/TLS.