Kompilace OpenLDAP

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.

Schéma testovací LDAP databáze
Schéma testovací LDAP databáze

 

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.

 


Posted

in

, ,

by