Ldap klient ja server

Allikas: Kuutõrvaja
Redaktsioon seisuga 1. detsember 2016, kell 16:23 kasutajalt Jj (arutelu | kaastöö) (LDAP serverisse algstruktuuri tekitamine ja kasutajate lisamine)
(erin) ←Vanem redaktsioon | Viimane redaktsiooni (erin) | Uuem redaktsioon→ (erin)

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

Ldapstruktuur.png

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.

Snapldap.jpg

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