Uwaga:
Ten dokument zawiera błędy lub nie jest już aktualizowany.
|
Autoryzacja LDAP w Gentoo
1.
Wprowadzenie do OpenLDAP
Co to jest LDAP?
Pod pojęciem LDAP kryje się lekki protokół dostępu do katalogów
(Lightweight Directory Access Protocol). Jest oparty na X.500 i zawiera
w sobie większość jego podstawowych funkcji, a jest pozbawiony jego funkcji
zaawansowanych. Czym jest X.500?
X.500 jest modelem usług katalogowych w ujęciu OSI. Zawiera
definicje przestrzeni nazw i protokołów zapytań oraz aktualizacji
katalogów. Zwykle jest jednak zbyt rozbudowanym rozwiązaniem.
LDAP, tak jak X.500, zawiera model danych i przestrzeni nazw dla
katalogu oraz dla protokołu. Został tak zaprojektowany, aby działać
bezpośrednio nad stosem TCP/IP. Można go postrzegać jako uproszczoną wersję
X.500.
Nie rozumiem. Co to jest katalog?
Katalog jest wyspecjalizowaną bazą danych zaprojektowaną dla dużej ilości
zapytań i małej ilości aktualizacji. W przeciwieństwie do zwykłych baz danych
nie zawiera wsparcia dla transakcji odwrotnych. Katalogi można łatwo kopiować
w celu podwyższenia dostępności i niezawodności. Kiedy są kopiowane może
dochodzić do pewnych niezgodności, trwających tak długo, jak długo będą się
synchronizowały.
W jaki sposób rozmieszczono informacje?
Wszystkie informacje wewnątrz katalogu rozmieszczone są w określonej
hierarchii. Jeśli zechcemy odczytać dane wewnątrz katalogu, katalog musi
wiedzieć w jaki sposób zgromadzić dane wewnątrz drzewa. Przyjrzyjmy się
fikcyjnej firmie i jej strukturze organizacji:
Listing 1.1: Struktura organizacji dla GenFic, fikcyjnej firmy Gentoo. |
dc: com
|
dc: genfic
/ \
ou: ludzie serwery
/ \ ..
uid: .. john
|
W związku z tym, że dane do bazy nie są wprowadzane kolejno jak na powyższym
grafie każda jej część musi posiadać określoną nazwę. Większość dystrybucji LDAP
(wliczając w to OpenLDAP) posiada już sporą ilość zdefiniowanych (i ogólnie
przyjętych) schematów, takich jak inetorgperson, powszechnie używany schemat
definiowania użytkowników.
Zainteresowanym użytkownikom polecam przeczytanie dokumentu OpenLDAP Admin Guide.
Zatem... Po co to wszystko?
LDAP można używać do kilku rzeczy. W tym dokumencie opisujemy scentralizowane
zarządzanie kontami użytkowników poprzez przechowywanie ich w jednym, należącym
do LDAP miejscu (co nie znaczy, że znajdują się na jednym serwerze, LDAP
pozwala na rozdysponowanie tej informacji na wielu serwerach). Za pomocą LDAP
można dokonać jednak znacznie więcej.
-
Zarządzanie infrastrukturą kluczy publicznych
-
Wspólny harmonogram
-
Wspólna książka adresów
-
Przechowywanie informacji DHCP i DNS
-
Wytyczne konfiguracji kategorii systemów - System Class Configuration
Directives (śledzenie konfiguracji oddzielnych serwerów)
- ...
2.
Konfiguracja OpenLDAP
Konfiguracja wstępna
Uwaga:
W tym dokumencie będziemy używać przykładowego adresu genfic.com. Oczywiście w
każdym przypadku użytkownik musi zmienić ten adres na swój własny. Należy się
upewnić czy najwyższy węzeł jest oficjalną domeną wysokiego poziomu (net, com,
cc, be, ...).
|
Wpierw należy zainstalować wszelkie potrzebne komponenty na serwerze:
Listing 2.1: Instalacja OpenLDAP |
# emerge openldap pam_ldap nss_ldap migrationtools
# chown ldap:ldap /var/lib/openldap-ldbm /var/lib/openldap-data /var/lib/openldap-slurp
|
Następnie edytujemy plik /etc/openldap/slapd.conf dodając
następujące linijki po core.schema:
Listing 2.2: /etc/openldap/slapd.conf |
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
password-hash {md5}
TLSCertificateFile /etc/ssl/ldap.pem
TLSCertificateKeyFile /etc/openldap/ssl/ldap.pem
TLSCACertificateFile /etc/ssl/ldap.pem
database ldbm
suffix "dc=genfic,dc=com"
rootdn "cn=Manager,dc=genfic,dc=com"
rootpw {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
directory /var/lib/openldap-ldbm
index objectClass eq
|
Następnie edytujemy plik konfiguracyjny LDAP:
Listing 2.3: /etc/openldap/ldap.conf |
# nano -w /etc/openldap/ldap.conf
BASE dc=genfic, dc=com
URI ldaps://auth.genfic.com:636/
TLS_REQCERT allow
|
Później, aby zabezpieczyć katalog należy wygenerować certyfikat SSL. Należy
odpowiedzieć jak najlepiej na pytania, które zostaną nam zadane. Kiedy
zostaniemy zapytani o Common Name wpisujemy nazwę za pomocą której
klienci będą mogli łączyć się z serwerem. Z reguły będzie to pełna nazwa domeny
(np. auth.genfic.com).
Listing 2.4: Generowanie certyfikatu SSL |
# cd /etc/ssl
# openssl req -config /etc/ssl/openssl.cnf -new -x509 -nodes -out \
ldap.pem -keyout /etc/openldap/ssl/ldap.pem -days 999999
# chown ldap:ldap /etc/openldap/ssl/ldap.pem
|
Edytujemy plik /etc/conf.d/slapd i dodajemy następującą linijkę,
jednocześnie zakomentowując domyślną:
Listing 2.5: /etc/conf.d/slapd |
OPTS="-h 'ldaps:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock'"
|
Uruchamiamy slapd:
Listing 2.6: Uruchamianie SLAPd. |
# /etc/init.d/slapd start
|
Możemy przetestować program używając polecenia:
Listing 2.7: Przetestuj demona SLAPd. |
# ldapsearch -D "cn=Manager,dc=genfic,dc=com" -W
|
Jeśli otrzymamy błąd, należy uruchomić usługę dodając parametr -d 255.
Spowoduje to dokładniejsze opisanie błędu i znacznie pomoże w rozwiązaniu
zaistniałego problemu.
3.
Eksportowanie istniejących danych
Eksportowanie kont użytkowników
Pora na wyeksportowanie kont użytkowników. Otwieramy plik
/usr/share/migrationtools/migrate_common.ph i edytujemy go w
następujący sposób:
Listing 3.1: /usr/share/migrationtools/migrate_common.ph |
$DEFAULT_BASE = "dc=genfic,dc=com";
$EXTENDED_SCHEMA = 1;
|
Teraz czas na uruchomienie skryptów eksportujących:
Listing 3.2: Uruchamianie skryptów eksportujących. |
# export ETC_SHADOW=/etc/shadow
# cd /usr/share/migrationtools
# ./migrate_base.pl > /tmp/base.ldif
# ./migrate_group.pl /etc/group /tmp/group.ldif
# ./migrate_hosts.pl /etc/hosts /tmp/hosts.ldif
# ./migrate_passwd.pl /etc/passwd /tmp/passwd.ldif
|
W tym kroku wyeksportowaliśmy pliki do formatu ldif obsługiwanego przez LDAP.
Teraz dodajemy te pliki do naszego katalogu:
Listing 3.3: Import danych do naszego katalogu. |
# ldapadd -D "cn=Manager,dc=genfic,dc=com" -W -f /tmp/base.ldif
# ldapadd -D "cn=Manager,dc=genfic,dc=com" -W -f /tmp/group.ldif
# ldapadd -D "cn=Manager,dc=genfic,dc=com" -W -f /tmp/passwd.ldif
# ldapadd -D "cn=Manager,dc=genfic,dc=com" -W -f /tmp/hosts.ldif
|
Jeżeli natrafimy na błąd w plikach ldif, można wznowić proces od miejsca,
w którym został przerwany, używając polecenia ldapadd -c.
4.
Konfiguracja klienta
Konfiguracja PAM
Następnie należy skonfigurować PAM tak, aby zezwolić na autoryzację LDAP. Po
pierwsze należy zainstalować sys-auth/pam_ldap, co umożliwi współpracę
PAM z LDAP oraz sys-auth/nss_ldap dzięki czemu system może pobierać z
innych komputerów informacje o LDAP (z czego korzysta
nsswitch.conf).
Listing 4.1: Instalacja pam_ldap and nss_ldap |
# emerge pam_ldap nss_ldap
|
Następnie otwieramy plik /etc/pam.d/system-auth i poprawiamy w nim
wpisy na poniższe:
Listing 4.2: /etc/pam.d/system-auth |
auth required pam_env.so
auth sufficient pam_unix.so likeauth nullok shadow
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account requisite pam_unix.so
account sufficient pam_localuser.so
account required pam_ldap.so
password required pam_cracklib.so retry=3
password sufficient pam_unix.so nullok use_authtok shadow md5
password sufficient pam_ldap.so use_authtok use_first_pass
password required pam_deny.so
session required pam_limits.so
session required pam_unix.so
session required pam_mkhomedir.so skel=/etc/skel/ umask=0066
session optional pam_ldap.so
|
Plik /etc/ldap.conf edytujemy, aby wyglądał następująco:
Listing 4.3: /etc/ldap.conf |
ssl start_tls
ssl on
suffix "dc=genfic,dc=com"
uri ldaps://auth.genfic.com/
pam_password exop
ldap_version 3
pam_filter objectclass=posixAccount
pam_login_attribute uid
pam_member_attribute memberuid
nss_base_passwd ou=People,dc=genfic,dc=com
nss_base_shadow ou=People,dc=genfic,dc=com
nss_base_group ou=Group,dc=genfic,dc=com
nss_base_hosts ou=Hosts,dc=genfic,dc=com
scope one
|
Następnie kopiujemy plik ldap.conf z serwera do klientów tak, aby
były w stanie dostrzec, że znajdują się w środowisku LDAP.
Listing 4.4: Kopiowanie ldap.conf dla OpanLDAP |
# scp ldap-server:/etc/openldap/ldap.conf /etc/openldap
|
Na koniec konfigurujemy swoich klientów tak, aby sprawdzały LDAP dla kont
systemowych:
Listing 4.5: /etc/nsswitch.conf |
passwd: files ldap
group: files ldap
shadow: files ldap
|
Aby przetestować zmiany należy wpisać:
Listing 4.6: Testowanie autoryzacji LDAP: |
# getent passwd|grep 0:0
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
|
Jedna z linijek, które dodaliśmy do /etc/ldap.conf została
zakomentowana (linia rootbinddn). Nie będziemy jej potrzebować, dopóki
nie zechcemy zmienić hasła roota lub zwykłego użytkownika. W takim wypadku
będziemy zmuszeni umieścić to hasło w pliku /etc/ldap.secret, w
dodatku otwartym tekstem. Jest to NIEBEZPIECZNE i dlatego plik
ten MUSI mieć prawa dostępu o wartości 600. Osobiście zwykle mam ten plik
pusty, a kiedy zachodzi potrzeba zmiany użytkownikowi hasła robię to zarówno w
ldap jak i w pliku /etc/passwd. Zapisuje tam hasło na 10 sekund na
czas kiedy dokonuję zmian i zaraz po ich wprowadzeniu je usuwam.
5.
Ustawienia bezpieczeństwa dla OpenLDAP
Prawa dostępu OpenLDAP
Jeśli przyjrzymy się plikowi /etc/openldap/slapd.conf zauważymy, że
służy on do precyzowania ACL-i (praw dostępu) dotyczących odczytu i zapisu
danych przez użytkowników:
Listing 5.1: /etc/openldap/slapd.conf |
access to *
by dn="uid=root,ou=people,dc=genfic,dc=com" write
by users read
by anonymous auth
access to attrs=userPassword,gecos,description,loginShell
by self write
|
Dzięki temu użytkownik zyska dostęp do wszystkiego co może być w stanie zmienić.
Będzie miał prawo do zapisu własnych informacji oraz do odczytu informacji
innych użytkowników. Anonimowi użytkownicy mogą wysłać login i hasło tak, aby
się zalogować. Są cztery poziomy dostępu, kolejno, od najniższego do
najwyższego: auth (autoryzacja), search (wyszukiwanie),
read (odczyt) oraz zapis (zapis).
Następny ACL jest znacznie bezpieczniejszy, ponieważ blokuje normalnym
użytkownikom dostęp do ukrytych haseł innych osób:
Listing 5.2: /etc/openldap/slapd.conf |
access to attrs="userPassword"
by dn="uid=root,ou=people,dc=genfic,dc=com" write
by dn="uid=John,ou=People,dc=genfic,dc=com" write
by anonymous auth
by self write
by * none
access to *
by dn="uid=root,ou=People,dc=genfic,dc=com" write
by * search
|
Taka konfiguracja zapewnia superużytkownikowi oraz użytkownikowi "john" dostęp
do odczytu (read), zapisu (write) oraz wyszukiwania (search) wszystkiego
poniżej drzewa dc=genfic,dc=com. Pozwala również użytkownikowi na
zmianę własnego userPassword. W ostatecznym rozrachunku wszyscy
pozostali muszą jedynie wiedzieć, że mają możliwość wyszukiwania (tj. mają
dostęp do filtra wyszukującego), jednak nie mogą odczytać wyników wyszukiwania.
Możliwe jest posiadanie wielu ACL-i, warto jednak w związku z kolejnością ich
przetwarzania zachować zasadę, że najwyższy stopień powinien być najbardziej
restrykcyjnym.
6.
Praca z OpenLDAP
Utrzymywanie katalogu
Teraz możemy rozpocząć korzystanie z katalogu do autoryzacji użytkowników w
takich programach jak apache, proftpd, qmail czy samba. Możemy administrować
nim przy użyciu Webmina, który posiada bardzo przejrzysty i ergonomiczny
interfejs. Możemy również korzystać z gq lub directory_administrator.
7.
Podziękowania
Chcieliśmy podziękować Mattowi Helerowi za użyczenie nam swojego komputera na
cele tego przewodnika. Podziękowania należą się również ludziom z kanału #ldap
w sieci freenode (irc.freenode.net).
Materiał udostępniany na podstawie licencji Creative Commons -
Attribution / Share Alike.
|