OpenLDAP implementuje vše potřebné pro úspěšné provozování LDAP spojení. V článku je představen způsob, kde získat zdrojové kódy a jak je přeložit. Výsledkem je pak fungující ukázková aplikace, která umí zjistit, do jakých skupin patří zadaný uživatel.
Zdrojové kódy jsou dostupné ze stránek projektu jako .tgz archiv. Dalším potřebným balíkem, který není standardní částí systému jsou knihovny pro BerkeleyDB. Velmi pravděpodobně jsou ale dostupné v distribučních repozitářích. Vše potřebné se nainstaluje následujícím příkazem.
sudo apt-get install libdb-dev
V tuto chvíli stačí zdrojové kódy vybalit a zkompilovat. Vše je opět ukázáno v následujících řádcích.
tar xvf openldap-2.4.44.tgz ./configure --prefix=/home/user/development/openldap/ make depend make -j8 make install
Pokud všechny příkazy doběhly v pořádku, bude v adresáři /home/user/development/openldap vytvořena souborová struktura podobná té v /usr. Instalace prostředí je nyní připravena a je možné ji využít ke spuštění LDAP serveru, případně k provozování LDAP klienta.
Návod ale pokračuje dále tím, že předvede, jak si vytvořit jednoduchého vlastního klienta. Ukázkový klient provede připojení k LDAP serveru a vypíše skupiny, do kterých patří zadaný uživatel. Návod je nakonec oříznutý o poslední krok – vypsání jména skupiny, nicméně zbytek je celý funkční.
#include <iostream> #include <ldap.h> #define LDAP_SERVER "ldap://j.k.l.m:389" using namespace std; int main(int argc, char *argv[]) { LDAP *ldap; LDAPMessage *message; int rc; string base; string bind; string filter; int protocol_version = LDAP_VERSION3; int auth_method = LDAP_AUTH_SIMPLE; cout << "Try to connect to LDAP: " << LDAP_SERVER << endl; base.append("ou=groups,dc=home,dc=xyz"); filter.append("(&(cn=*)(memberUid=moperator))"); bind.append("cn=admin,dc=home,dc=xyz"); if(ldap_initialize(&ldap, LDAP_SERVER)) { cerr << "Cannot initialize LDAP connection" << endl; return -1; } rc = ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &protocol_version); if(rc != LDAP_OPT_SUCCESS) { cerr << "Cannot set protocol version error: " << rc << endl; return -1; } rc = ldap_simple_bind_s(ldap, bind.c_str(), "*********"); if(rc != LDAP_SUCCESS) { cerr << "Bind " << bind << " failed: " << rc << endl; return -1; } rc = ldap_search_s(ldap, base.c_str(), LDAP_SCOPE_SUBTREE, filter.c_str(), NULL, 0, &message); if(rc != LDAP_SUCCESS) { cerr << "Filter " << filter << " failed: " << rc << endl; return -1; } cout << "Returned " << ldap_count_entries(ldap, message) << " item" << endl; }
Zdrojový kód nemá cenu příliš komentovat, v kódu je pouze potřeba nahradit pár hodnot svými tak, aby vše dávalo smysl. Aby správně proběhly všechny funkce na přihlášení / vyhledání uživatele, je nutné mít správně nastavené veškeré cesty. Na obrázku je schéma databáze tak, jak je funkční pro tento modelový případ.
Kompilace zdrojového kódu výše se provede následujícím příkazem. V příkazu je definována cesta ke zdrojovám kódům nainstalovaným ve složce /home/user/development/. Výsledný bnární soubor se pak jmenuje ldap.
g++ -I/home/user/development/openldap/include -L/home/user/development/openldap/lib/ -DLDAP_DEPRECATED main.cpp -o ldap -lldap
Pokud něco nefunguje, je možné a vhodné zapnout logování aktivity na serveru. Provede se zapsáním příslušné hodnoty paramentru olcLogLevel podle tabulky do souboru /etc/ldap/slapd.d/cn\=config.ldif
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. # CRC32 0df45957 dn: cn=config objectClass: olcGlobal cn: config olcArgsFile: /var/run/slapd/slapd.args olcLogLevel: -1 olcPidFile: /var/run/slapd/slapd.pid olcToolThreads: 1 structuralObjectClass: olcGlobal entryUUID: 4068e9b0-a483-1035-96d4-5dd198b9b827 creatorsName: cn=config createTimestamp: 20160502072846Z entryCSN: 20160502072846.895232Z#000000#000#000000 modifiersName: cn=config modifyTimestamp: 20160502072846Z
Log se poté zapisuje do /var/log/syslog.