Integracja Keycloak i Lightweight Directory Access Protocol

Integracja Keycloak i Lightweight Directory Access Protocol
Andrzej Chybicki: projekty związane z wykorzystaniem sztucznej inteligencji to znacząca część naszych projektów
Integracja Keycloak i Lightweight Directory Access Protocol

Z poprzednich wpisów wiemy, że Keycloak daje nam przestrzeń do zarządzania tożsamościami użytkowników, zabezpieczania aplikacji i integracji z różnymi dostawcami. Dlatego jedną z jego kluczowych funkcji jest zdolność do integracji z katalogami Lightweight Directory Access Protocol (LDAP). Ten artykuł stanowi krótki przewodnik po eksporcie kont do federowanych realm’ów poprzez migrację użytkowników z ich poświadczeniami oraz importowanie grup za pomocą niestandardowych mapowań.

 

Zrozumienie usług katalogowych

Usługa katalogowa jest zbudowana w celu zarządzania i przechowywania danych w formacie par „klucz-wartość”. Ta struktura jest zoptymalizowana pod kątem operacji odczytu, co sprawia, że jest szczególnie dobrze dostosowana do informacji, które są często dostępne, ale rzadko aktualizowane. Dane w takim katalogu są często opisowe, służąc do szczegółowego przedstawienia różnych atrybutów jednostek.

Na przykład, wyobraź sobie używanie usługi katalogowej do zarządzania książką adresową. Każdy wpis w tej książce adresowej reprezentuje indywidualną osobę, a pary klucz-wartość przechowują jej dane kontaktowe, miejsce zatrudnienia i inne istotne informacje. Taka metoda organizacji danych jest szczególnie korzystna przy obsłudze informacji jakościowych i opisowych, które muszą być łatwo dostępne.

LDAP działa przy użyciu hierarchicznej struktury katalogowej, co umożliwia efektywne przechowywanie i dostęp do danych. Ten protokół jest powszechnie używany do śledzenia szczegółów organizacyjnych, w tym informacji o użytkownikach, zasobach i różnych jednostkach. Jego model wspiera elastyczne podejście do definiowania i zarządzania tymi jednostkami i ich atrybutami, zapewniając, że usługa katalogowa pozostaje dostosowana do różnych potrzeb organizacyjnych i skalowalna wraz z rosnącą ilością danych.

Kluczowe funkcje LDAP

    • Standaryzowany protokół: LDAP jest szeroko rozpoznawanym protokołem, wspieranym przez liczne usługi katalogowe, w tym Microsoft Active Directory, OpenLDAP i Apache Directory Server.
    • Struktura hierarchiczna: Katalogi LDAP są strukturyzowane hierarchicznie, podobnie jak drzewo, co ułatwia efektywną organizację i wyszukiwanie informacji.
    • Skalowalność: LDAP jest zoptymalizowany do zarządzania dużą ilością operacji odczytu i wyszukiwania, co czyni go idealnym dla środowisk korporacyjnych na dużą skalę z rozległymi bazami użytkowników.

Architektura LDAP 

Zrozumienie architektury LDAP jest kluczowe dla maksymalnego wykorzystania jego możliwości. Główne komponenty obejmują:

 

Drzewo informacji katalogowej (DIT)

Hierarchiczna struktura katalogu składa się z wpisów, z których każdy reprezentuje obiekt, taki jak użytkownik, grupa czy urządzenie, i jest jednoznacznie identyfikowany przez nazwę wyróżniającą (Distinguished Name, DN). DIT jest zorganizowany hierarchicznie, z korzeniem drzewa na szczycie. Poniżej korzenia znajdują się różne poziomy węzłów, z których każdy reprezentuje różne typy jednostek, takie jak organizacje, departamenty i indywidualni użytkownicy. Taka  struktura pozwala na efektywne i logiczne zarządzanie oraz dostęp do danych katalogowych.

Atrybuty / Wpisy

Atrybuty są grupowane w jednostki zwane klasami obiektów (objectClasses), które są zbiorami powiązanych atrybutów przydatnych do opisywania określonych jednostek. Tworząc wpis, można wykorzystać atrybuty zdefiniowane przez klasę obiektów, przypisując pożądaną klasę obiektów do wpisu. W rzeczywistości atrybut objectClass jest jedynym atrybutem, który można ustawić bez konieczności specyfikowania dodatkowych klas obiektów.

Na przykład, tworząc wpis reprezentujący osobę, włączenie klasy obiektów—oraz wszelkich pochodnych klas obiektów—umożliwia korzystanie ze wszystkich atrybutów związanych z tą konkretną klasą obiektów. W takim wpisie można ustawić atrybuty takie jak cn (common name) dla nazwy zwyczajowej, description dla krótkiego opisu wpisu oraz sn dla nazwiska.

Schemat 

Atrybuty i klasy obiektów są grupowane razem w tzw, schemat. Mechanizm ten dba o spójność i integralność w drzewie katalogowym, którego używamy. W przeciwieństwie do relacyjnych baz danych, te schematy to po prostu zbiory powiązanych obiektów i atrybutów. Pojedyncze drzewo informacji katalogowej (DIT) może wykorzystywać wiele schematów do tworzenia potrzebnych wpisów i atrybutów.

Schematy zazwyczaj zawierają dodatkowe specyfikacje atrybutów i mogą wymagać atrybutów określonych w innych schematach. Na przykład, klasa obiektów person wymaga włączenia atrybutu nazwiska (sn) dla wszelkich powiązanych wpisów. W przypadkach, gdy te atrybuty są nieobecne na serwerze LDAP, schemat zawierający te definicje może zostać zintegrowany ze strukturą drzewa serwera.

 

Odmiany protokołu

LDAP to w istocie protokół, który definiuje interfejs komunikacyjny do pracy z usługami katalogowymi, często określanymi jako LDAP lub ldap. Istnieje kilka odmian formatu protokołu LDAP, które warto zauważyć:

    • ldaps://: Ta odmiana oznacza LDAP zabezpieczony za pomocą SSL/TLS. Chociaż standardowy ruch LDAP jest nieszyfrowany, większość implementacji LDAP obsługuje szyfrowanie. Jednakże użycie SSL/TLS do szyfrowania LDAP jest przestarzałe, a zalecanym sposobem zabezpieczenia połączeń LDAP jest STARTTLS.
    • ldap://: Jest to standardowy protokół LDAP, który zapewnia strukturalny dostęp do usługi katalogowej.
    • ldapi://: Ta odmiana oznacza LDAP przez IPC (Inter-Process Communication). Zazwyczaj używany do bezpiecznych lokalnych połączeń z systemem LDAP do celów administracyjnych, na przykład przy użyciu wewnętrznych gniazd.

Chociaż wszystkie trzy formaty korzystają z protokołu LDAP, dwa z nich rozszerzają możliwości tej komunikacji.

 

Powrót do realm i konfiguracja LDAP

Po zapoznaniu się z teorią działania LDAP, możemy wrócić do realm, o którego konfiguracji wspominaliśmy w poprzednim poście (znajdziesz go tu), i przejść do zakładki User Federation, w której możemy wprowadzić niezbędne dane, aby połączyć się z serwerem LDAP dostarczonym przez przykładowego dostawcę.

Niezbędne informacje, których potrzebujemy, obejmują adres URL połączenia, nazwę wyróżniającą administratora LDAP (bind DN) oraz nazwę wyróżniającą użytkowników (users DN), która jest nadrzędna dla wszystkich użytkowników w drzewie LDAP. Większość atrybutów, takich jak nazwa użytkownika LDAP, UUID LDAP lub klasy obiektów użytkowników, można pozostawić na domyślnych wartościach, ponieważ są one zgodne z wymaganiami naszego dostawcy serwera LDAP.

Po zsynchronizowaniu użytkowników widzimy, że w zakładce Users pojawiły się dwa nowe wpisy. Synchronizacja z LDAP oferuje więcej możliwości niż tylko prosty import kont użytkowników. Sprawdźmy, jak działają mapery (mappers).

Przykład 1: hardcoded-attribute-mapper

Możemy oznaczyć importowanych użytkowników, przypisując im niestandardowy atrybut. Można to zrobić za pomocą hardcoded-attribute-mapper, który przypisuje nowy atrybut, authenticationMethod, każdemu nowemu użytkownikowi i nadaje mu wartość „ldap„.

W oknie Użytkownicy (Users) -> Szczegóły użytkownika (User Details) -> zakładka Atrybuty (Attributes), możemy zobaczyć, że użytkownicy pochodzący z LDAP rzeczywiście mają ten atrybut. Może on na przykład zostać uwzględniony w tokenach dostępu.

Przykład 2: group-ldap-mapper

Często w LDAP zdefiniowany jest system ról lub grup, do których należą importowani użytkownicy. Keycloak może również importować grupy i automatycznie przypisywać do nich wspomnianych użytkowników. Aby to zrobić, możemy skonfigurować kolejny mapper, tym razem typu group-ldap-mapper, jak pokazano na poniższym obrazku:

W tym przypadku nazwa wyróżniająca dla grup będzie taka sama jak DN dla wszystkich użytkowników, czyli:

ou=Users,o=66a20b93d2f2fc6db2e89ff3,dc=jumpcloud,dc=com

Grupy przechowywane w LDAP są zdefiniowane przez klasę obiektów o nazwie groupOfNames, co oznacza, że atrybutem reprezentującym członkostwo po stronie LDAP będzie zazwyczaj member.

Jak widzimy, trzy grupy zostały poprawnie zaimportowane, wraz z relacjami między grupą a jej użytkownikami. Dzięki temu administratorzy LDAP mogą łatwo uzyskać odpowiednie uprawnienia po naszej stronie realm. Następnie możemy powiązać określone role z daną grupą, aby jeszcze wygodniej zarządzać dostępem do zasobów.

Podsumowanie

Integracja Keycloak z LDAP to potężne narzędzie do zarządzania tożsamościami i bezpieczeństwem w organizacji. Ta integracja pozwala na efektywną synchronizację użytkowników i grup z LDAP, umożliwiając centralne zarządzanie uprawnieniami i dostępem do zasobów. Kluczowe kroki obejmują skonfigurowanie połączenia LDAP, synchronizację danych oraz użycie mapperów do dostosowania importowanych informacji, takich jak atrybuty i grupy użytkowników. Ważne jest, aby zrozumieć architekturę i działanie LDAP, aby w pełni wykorzystać jego możliwości. Implementacja LDAP z Keycloak nie tylko usprawnia zarządzanie kontami, ale także zwiększa bezpieczeństwo i upraszcza integrację z istniejącymi systemami. Korzystając z mapperów, możemy dodatkowo dostosować sposób importowania i wykorzystywania informacji w naszym systemie, co prowadzi do lepszej organizacji i kontroli dostępu w organizacji.