Ldap klient ja server
Sisukord
- 1 Sissejuhatus
- 2 Serveri install ja seadistus
- 3 LDAP serverisse algstruktuuri tekitamine ja kasutajate lisamine
- 4 FreeBSD poolne autentimine
- 5 Linux poolne autentimine
- 6 Haldusvahendid
- 7 Veebi haldusliides phpldapadmin
- 8 Ldap ja Apache
- 9 OpenLDAP admin parooli vahetamine
- 10 Ldapi Berkeley db remont
- 11 Logi ja debug
- 12 Berkeley Db tuunimine
- 13 PHP abil ldap kasutamine
- 14 FreeBSD süsteemis Lpdaps kasutamine
- 15 Kasulikud lisamaterjalid
Sissejuhatus
(Lightweight Directory Access Protocol) http://www.openldap.org/ on Michigani Ülikooli (University of Michigan) poolt välja töötatud kataloogiteenuse protokoll asendamaks X.500 DAP (Directory Access Protocol) protokolli. Süsteemis pakub ta võimalust ühe teenuse piires hoida ning väljastada mitmesugust kasutajakontode kohta käivat infot. Näiteks hoida lisaks kasutaja paroolile ja nimele veel tema kontaktandmeid, samba parooli jms. Samuti saab ldap’i hästi kasutada kui on mitu serverit (mail, www, samba, terminaliserver) ning oleks vaja, et samad kasutajad eksisteeriksid kõigis neis serverites. Käesolev näide sobibki sellise lahenduse loomiseks kõige paremini :)
Käesolevas õpetuses vaatleme kuidas kasutajate infot hoida ldap serveris
Selleks serverisse järgneva puukujulise struktuuri
dc: com | dc: myserver (Organisation) / \ ou: People Groups (Organisational Units, nö grupp kus hoitakse vajalikku infot) / \ .. \ uid: .. Ants test (OU-spetsiifiline data ehk kasutajad - grupid)
- Base DN: dc=myserver,dc=com
- Users: dc=myserver,dc=com,ou=People
- Groups: dc=myserver,dc=com,ou=Groups
Ehk tekitame DC myserver,com mis hoiab endas kahte OUd (organisatsional unitit) People ja Groups, millest ühte salvestame kasutajate info ja teise grupiinfo, alternatiivina Linuxi shadow ja group failidele
Serveri install ja seadistus
Installime openldap serveri
FreeBSDs käib see järgnevalt
cd /usr/ports/net/openldap24-server && make install
Süsteemi paigaldatakse ka berkeley db, mida openldab defauldis kasutab, kuid on võimalik seada see tööle ka nö näiteks postgresql peal.
genereerime serverile parooli, mille seadistame hiljem konfiguratsioonis rootpw reale
# slappasswd -s parool {SSHA}nPKG3qbPABkp21aTBZV2IpbcGUHLi3a2
liigume /usr/local/etc/openldap või linuxi puhul /etc/openldap ning avame faili slapd.conf, muudame seda vastavalt allolevale näitele
include /usr/local/etc/openldap/schema/core.schema include /usr/local/etc/openldap/schema/cosine.schema include /usr/local/etc/openldap/schema/nis.schema pidfile /var/run/ldap/slapd.pid argsfile /var/run/ldap/slapd.args database bdb suffix "dc=myserver,dc=com" rootdn "cn=Manager,dc=myserver,dc=org" rootpw {SSHA}nPKG3qbPABkp21aTBZV2IpbcGUHLi3a2 directory /var/db/openldap-data index objectClass eq index uid pres,eq,sub
Selleks, et infovahetus toimuks krüpteeritult, genereerime võtmed ja lisame konfi lõppu veel järgnevad read
# Define SSL and TLS properties (optional) TLSCertificateFile /etc/ssl/ldap.pem TLSCertificateKeyFile /etc/openldap/ssl/ldap.pem TLSCACertificateFile /etc/ssl/ldap.pem
Aga selleks, et kliendid saaksid anonüümselt audentida vastu ldap serverit, kuid mitte lugeda krütpeeritud paroole, aitavad read
access to attrs=userPassword by self write by anonymous auth by * none access to * by * read
natuke failiõigusi paika, turvalisuse huvides
chmod 440 /usr/local/etc/openldap/slapd.conf chown ldap:ldap /usr/local/etc/openldap/slapd.conf chown -R ldap:ldap /var/db/openldap*
Et slapd käivituks peale serveri booti lisame /etc/rc.conf’i
slapd_enable="YES" slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/"' slapd_sockets="/var/run/openldap/ldapi"
Peale rebooti peaks ldap kuulama 389 pordil, seda võib sockstat/netstat abil täiendavalt kontrollida
LDAP serverisse algstruktuuri tekitamine ja kasutajate lisamine
loome esimesena info.ldiff millega paneme paika kogu struktuuri
dn: ou=Groups,dc=myserver,dc=com objectClass: organizationalUnit objectClass: top ou: Groups dn: ou=People,dc=myserver,dc=com objectClass: organizationalUnit objectClass: top ou: People
Teeme failist eksportimise serverisse
# ldapadd -x -D "cn=Manager,dc=myserver,dc=com" -W -f info.ldiff Enter LDAP Password: adding new entry "ou=Groups,dc=myserver,dc=com" adding new entry "ou=People,dc=myserver,dc=com"
Kaks uute userite lisamise template’t. Slappadd’ga saab nende failide abil ldap’i kasutajad testuser ja testuser2. Hiljem võib kirjutada näiteks shellskripti, mis parameetritena võtab kasutaja parooli ja grupi ning loob automaatselt kodukatalooma ja genereerb slappasswd’ga parooli automaatselt
Kasutaja mille tekitamine info on:
cn=StupidTest User dn cn=StupidTest User,ou=People,dc=myserver,dc=com cn StupidTest User gecos Niisama ldap user gidNumber 1000 homeDirectory /home/test loginShell /bin/csh User Name testuser uidNumber 1000 Password parool
Selleks tekitame fiali testuser.ldiff millesse lisame järgneva info
# kasutaja info People's OU'sse dn: cn=StupidTest User, ou=People, dc=myserver, dc=org cn: StupidTest User sn: Dummy objectclass: top objectclass: person objectclass: posixAccount objectclass: shadowAccount uid:testuser userpassword:{SSHA}GmbwsRvJugoiT5NIIJ2bk+5YVfWMUVa1 uidnumber:1000 gidnumber:1000 gecos:Niisama ldap user loginShell:/bin/bash homeDirectory: /home/test # grupi info Groups OU'sse dn: cn=test, ou=Groups, dc=myserver, dc=org objectclass: top objectclass: posixGroup cn: test gidnumber: 1000 memberuid: test
Lisame info ldap serverisse
# ldapadd -x -D "cn=Manager,dc=myserver,dc=com" -W -f testuser.ldiff Enter LDAP Password: adding new entry "cn=StupidTest User, ou=People, dc=myserver, dc=com" adding new entry "cn=test, ou=Groups, dc=myserver, dc=com"'
Kui vaatame nüüd phpldamadminiga struktuuri näeb see välja järgnev
Loome veel ka teise kasutaja, tekitame selleks faili testuser2.ldiff
dn: cn=StupidTest User2, ou=people, dc=myserver, dc=org cn: StupidTest User2 sn: Dummy objectclass: top objectclass: person objectclass: posixAccount objectclass: shadowAccount uid:testuser2 userpassword:{SSHA}wU0T6ixZb9sU2+JTK8Au8sq7noNfMkbv uidnumber:1001 gidnumber:1001 gecos:TestUser loginShell:/bin/csh homeDirectory: /home/test2 dn: cn=test2, ou=groups, dc=test, dc=org objectclass: top objectclass: posixGroup cn: test2 gidnumber: 1001 memberuid: test2
# ldapadd -x -D "cn=Manager,dc=myserver,dc=com" -W -f testuser2.ldiff Enter LDAP Password: adding new entry "ou=Groups,dc=myserver,dc=com" adding new entry "ou=People,dc=myserver,dc=com"
Nüüd on meil kaks posix kasutajat ja gruppi, järgnevalt vaatame kuidas need kasutajad autentima panna
Kasutaja leidmine käsureal
ldapsearch -x -H ldapi:/// -D "cn=admin,dc=zoo,dc=tartu,dc=ee" -W -b "dc=zoo,dc=tartu,dc=ee" uid=otsitav_kasutaja
Kasutaja kustutamine
ldapdelete -x -H ldapi:/// -D "cn=admin,dc=zoo,dc=tartu,dc=ee" -w ldap_admini_parool "uid=kasutaja_kes_maha,ou=people,dc=zoo,dc=tartu,dc=ee"
FreeBSD poolne autentimine
http://www.freebsd.org/doc/en/articles/ldap-auth/article.html
Installime nss_ldap ja pam_ldap softi, sellekäigus paigutatakse süsteemi ka openldap-client
cd /usr/ports/net/nss_ldap && make install clean cd /usr/ports/security/pam_ldap/ && make install
lisame /etc/pam.d/ldap faili FreeBSD 5.x või kõrgema puhul ja /etc/pam.conf FreeBSD 4.x süsteemis rea
login auth sufficient /usr/local/lib/pam_ldap.so
lähme /usr/local/etc ning nimetame nss_ldap.conf.sample nss_ldap.conf loome sellest softlingi ldap.conf’ile
ln -s /usr/local/etc/ldap.conf /usr/local/etc/nss_ldap.conf
kirjutame ldap.conf’i
ssl start_tls tls_checkpeer no ldap_version 3 host 192.168.1.1 <- siia siis ldap serveri ip suffix "dc=myserver,dc=org" nss_base_passwd ou=People,dc=myserver,dc=org?sub nss_base_group ou=Group,dc=myserver,dc=org?sub nss_base_shadow ou=people,dc=myserver,dc=org?sub BASE dc=myserver, dc=org scope sub pam_password exop pam_filter objectclass=posixAccount pam_login_attribute uid pam_member_attribute memberuid
avame faili /etc/nsswitch.conf ning kirjutame sinna
passwd: files ldap group: files ldap
nüüd kirjutame /etc/pam.d/sshd konfi
auth required pam_nologin.so no_warn auth sufficient pam_opie.so no_warn no_fake_prompts auth requisite pam_opieaccess.so no_warn allow_local auth sufficient /usr/local/lib/pam_ldap.so no_warn auth required pam_unix.so no_warn try_first_pass account required pam_login_access.so account required /usr/local/lib/pam_ldap.so no_warn ignore_authinfo_unavail ignore_unknown_user
kommenteerime kõik muud read vastavalt teiste teenuste pam konfidesse, /etc/pam.d all tuleb lisada samad read, kui huvi ka neid saada ldap’ilt auth’ima, nagu ftp imap jms
# id testuser uid=1000(testuser) gid=1000 groups=1000 # id testuser2 uid=1001(testuser2) gid=1001 groups=1001
# finger testuser Login: testuser Name: Niisama ldap user Directory: /home/test Shell: /bin/csh Never logged in. No Mail. No Plan.
# ssh testuser2@localhost Password: Last login: Tue May 31 14:54:12 2005 from localhost Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD 5.4-RELEASE (GENERIC) #0: Sun May 8 10:21:06 UTC 2005 Welcome to FreeBSD! Could not chdir to home directory /home/test2: No such file or directory
viimane rida näitab, et tuleks luua ka serverisse kodukataloog userile ning see nfs’i abil jagada kliendile :)
Linux poolne autentimine
Installida tuleb samad paketid miss FreeBSD's ehk nss_ldap ja pam ldap
/etc/lpdap.conf'i võib jääda samaks mis oli BSD näiteks
pam'i konfimiseks kirjutame faili
/etc/pam.d/system-auth
read
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 plain 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
Haldusvahendid
Enda serveri lokaalsete kasutajate ldap’i viimiseks vajalikud skriptid saab http://www.padl.com/OSS/MigrationTools.html Ühtteist saab veel teha näiteks automount ja samba http://www.idealx.org/prj/samba/samba-ldap-howto.pdf ning veebiliides muretseda. Viimaseid on mitmeid kirjutatud.
Lisaks veel … Yet Another Passwd 2 LDIF Converter http://freshmeat.net/projects/yap2lc/?topic_id=861
Web-based password changing cgi script for LDAP-based user databases http://www.cloudmaster.com/~sauer/projects/fom-files/cache/90.html
Kasutajate administreerimiseks http://cpu.sourceforge.net/
Veebi haldusliides phpldapadmin
Kättesaadav urlitlt http://phpldapadmin.sourceforge.net
Phpldapadmini sisselogimiseks kasutaja "cn=Manager,dc=test,dc=org" ja parooliks see mis sai eelnevalt slapd.confi defineeritud
Uue kasutaja loomiseks tuleb seal vajutada ou=Peolpe peale, valida create a child entry, generic: unix accout ja täita väljad, paljusid neist soovitab veebiliides seejuures juba ise automaatselt.
Ldap ja Apache
htaccess vastu ldap'i audentima leidsin kõige lollikindlam panna vastu pam'i mis omakorda ldap külge ehk siis kuigi apachel on tore moodul auth_ldap teatas minu ldap server ,et kasutagem ldapv3 mitte mingit iidset protokolli. Apachet saab ka muidugi ldap'i toega kompileerida.
loomulikult siis tehtud bsd peal aga peaks toimima ka linuxil täpselt samuti. Apache 222 puhul võib olla kõik veel omasoodu erinev. ldap.conf
ssl start_tls tls_checkpeer no suffix "dc=myserver,dc=org" host 192.168.1.100 base dc=domeen,tdc=ee ldap_version 3 pam_password SSHA nss_base_passwd ou=people,dc=myserver,dc=com?sub nss_base_group ou=groups,dc=myserver,dc=com?sub
installime peale ka pam_ldap mooduli
portsude alt make mod_auth_pam'ile ja apache's read lisada
LoadModule auth_pam_module libexec/apache2/mod_auth_pam.so LoadModule auth_sys_group_module libexec/apache2/mod_auth_sys_group.so
/etc/pam.d alla tekitasin faili httpd kuhu kirjutasin read
auth sufficient /usr/local/lib/pam_ldap.so no_warn try_first_pass auth required pam_unix.so no_warn try_first_pass
ja siis lihtsalt .htaccess vajalikku kohta näiteks
AuthType Basic AuthName "secure area" require user kasutaja
FreeBSD 4.x korral tuleb muuta faili /etc/pam.conf lisades sinna
httpd auth required /usr/local/lib/pam_ldap.so httpd account required /usr/local/lib/pam_lda
OpenLDAP admin parooli vahetamine
Uue parooli tekitamine käib käsuga
# slappasswd siia-mingi-krüptiline-parool
Vastuseks tuleb miskit taolist
{SSHA}nEBrMjBpjElc7tpxN0YUZyBHkvxs6hO7
Edasi tekitad tekstifaili, newpasswd.ldif, kus sees
dn: olcDatabase={1}hdb,cn=config changetype: modify replace: olcRootPW olcRootPW: {SSHA}nEBrMjBpjElc7tpxN0YUZyBHkvxs6hO7
Seejuures vaata et õige baas ja PW sinna saaks! Ja siis lõpuks
# ldapmodify -H ldapi:// -Y EXTERNAL -f ~/newpasswd.ldif
See "-Y EXTERNAL" tähendab, et autenditakse väljaspool ldapi, ehk pead olema root.
Ldapi Berkeley db remont
Kasutades dbd backendit võib selle uuendamisel ldap mitte enam toimida selljuhul aitab näiteks
db4.5_recover -v -h /var/lib/openldap-data/ chown -R ldap\: /var/lib/openldap-data/
Logi ja debug
Logilevelite kohta ütleb man järgmist
man slapd.conf ... loglevel <integer> Specify the level at which debugging statements and operation statistics should be syslogged (currently logged to the syslogd(8) LOG_LOCAL4 facility). Log levels are additive, and available levels are: 1 trace function calls 2 debug packet handling 4 heavy trace debugging 8 connection management 16 print out packets sent and received 32 search filter processing 64 configuration file processing 128 access control list processing 256 stats log connections/operations/results 512 stats log entries sent 1024 print communication with shell backends 2048 entry parsing
syslog seadistus võiks olla järgnev /etc/syslog.conf
local4.* /var/log/ldap.log
Selleks, et ldap hakkaks logima nimetatud faili on vajalik teha veel restart syslogile
Berkeley Db tuunimine
Kasutades berkeley db'd on soovitatav andmebaasi asukohta (käesoleval juhul /var/db/openldap-data) tekitada DB_CONFIG fail. http://www.oracle.com/technology/documentation/berkeley-db/db/programmer_reference/env_db_config.html
näiteks
set_cachesize 0 8388608 8 set_lg_regionmax 1048576 set_lg_bsize 2097152
PHP abil ldap kasutamine
Alati võib ka ise midagi nokitseda abiks manual lingil http://ee.php.net/manual/en/ref.ldap.php
Vajalik on, et eelnevalt php kompileeritaks ldap toega
Ühenduse loomine
<?php
$ldapHost = "192.168.1.11";
$ldapPort = "389";
$ldapUser ="cn=Manager,dc=myserver,dc=com";
$ldapPswd ="parool";
$ldapLink =ldap_connect($ldapHost, $ldapPort)
or die("Can't establish LDAP connection");
if (ldap_set_option($ldapLink,LDAP_OPT_PROTOCOL_VERSION,3))
{
echo "Using LDAP v3";
}else{
echo "Failed to set version to protocol 3";
}
ldap_bind($ldapLink,$ldapUser,$ldapPswd)
or die("Can't bind to server.");
?>
Käivitamise järel peaks skript teatama
Using LDAP v3
Kasutajate nimekiri
<?php
$dn = " ou=People,dc=myserver,dc=com";
$attributes = array("cn", "Sn");
$filter = "(cn=*)";
$ad = ldap_connect("193.40.0.61")
or die("Couldn't connect to AD!");
ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3);
$bd = ldap_bind($ad,"cn=Manager,dc=myserver,dc=com","parool")
or die("Couldn't bind to AD!");
$result = ldap_search($ad, $dn, $filter, $attributes);
$entries = ldap_get_entries($ad, $result);
for ($i=0; $i<$entries["count"]; $i++)
{
echo $entries[$i]["cn"]
[0]."<br />";
}
ldap_unbind($ad);
?>
Kasutaja lisamine
<?php
$ad = ldap_connect("193.40.0.61")
or die("Couldn't connect to server!");
ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3);
$bd = ldap_bind($ad,"cn=Manager,dc=myserver,dc=com","parool")
or die("Couldn't bind to AD!");
$info["cn"] = "John Jones";
$info["sn"] = "Jones";
$info["objectClass"][0] = "top";
$info["objectClass"][1] = "person";
$info["objectClass"][2] = "posixAccount";
$info["objectClass"][3] = "shadowAccount";
$info["uid"] = "testuser";
$info["userpassword"] = "{SSHA}wU0T6ixZb9sU2+JTK8Au8sq7noNfMkbv";
$info["uidnumber"] = "1002";
$info["gidnumber"] = "1002";
$info["gecos"] = "TestUser";
$info["loginShell"] = "/bin/csh";
$info["homeDirectory"] = "/home/test2";
$bd = ldap_add($ad, "cn=Jobukakk7, ou=People, dc=myserver, dc=com", $info);
ldap_unbind($ad);
?>
FreeBSD süsteemis Lpdaps kasutamine
$ ldapsearch -H ldaps://
/usr/local/etc/openldap/ldap.conf faili on vaja lisada rida
TLS_REQCERT never
või teise parameetriga (allow)
Ilma võib süsteem anda järgmise vea:
"ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)"
Kasulikud lisamaterjalid
- http://kuutorvaja.eenet.ee/wiki/OpenLDAP_kasutamine_Debianiga
- http://www.gentoo.org/doc/en/ldap-howto.xml Ldap ja Gentoo
- http://www.openldap.org/pub/ksoper/OpenLDAP_TLS.html
- http://quark.humbug.org.au/publications/ldap/ldap_tut.html
- http://www.flatmtn.com/article/setting-ldap-back-sql bdb asemel sql