Nastavitve strežnika so shranjene v posebni datoteki /etc/openldap/slapd.conf ter shemah v imeniku /etc/openldap/schema/.
Preverimo, da imamo nameščen openldap in podporne programe:
[root@system ~]# yum -y install openldap-servers openldap-clients
Preverite katero datoteko imate /etc/sysconfig/slapd ali /etc/sysconfig/ldap. V njej nastavimo:
# stare nastavitve izklopimo, uporablja se SLAPD_URLS SLAPD_LDAP=no SLAPD_LDAPI=no SLAPD_LDAPS=no # vključimo poslušanje LDAP na vtičnicah UNIX, tcp/389 ter tcp/636 SLAPD_URLS="ldapi:/// ldap:/// ldaps:///" # vključimo uporabo nastavitvene datoteke SLAPD_OPTIONS="-f /etc/openldap/slapd.conf"
Samodejni zagon vklopimo z ukazom chkconfig slapd on oziroma systemctl enable slapd.service.
Vklopimo logiranje v /var/log/ldap.log:
[root@system ~]# echo "local4.* /var/log/ldap.log" > /etc/rsyslog.d/ldap.conf [root@system ~]# cat > /etc/logrotate.d/ldap <<EOF /var/log/ldap.log { sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript } EOF [root@system ~]# systemctl restart rsyslog.service #Fedora [root@system ~]# service rsyslog restart #CentOS
Uredimo samopodpisane certifikate za imenik LDAP.
Certifikat moramo dostaviti vsem odjemalcem, ki se bodo povezovali do strežnika. Zaradi varnosti se odsvetuje uporaba certifikate izdanega pri javnih internetnih certifikatnih agencijah! Če res ne želite uporabiti samopodpisanega certitikata se posvetujte s strokovnjaki za certifikate ali z Arnesom.
Za splošno ime certifikata CN (angl. Common Name) vpišite "Polno ime organizacije, imenik LDAP", datoteko z zasebnim ključem zgenerirajte v /etc/openldap/certs/key.pem, datoteko s certifikatom pa v /etc/openldap/certs/cert.pem.
Ustvarimo zasebni ključ in zaščitimo dostop do njega:
[root@system ~]# openssl genrsa -out /etc/openldap/certs/key.pem 2048 Generating RSA private key, 2048 bit long modulus ..................+++ .................................+++ e is 65537 (0x10001) [root@system ~]# chmod g=r,o= /etc/openldap/certs/key.pem [root@system ~]# chown root:ldap /etc/openldap/certs/key.pem
Ustvarimo certifikat, naštejte vse naslove IP in imena DNS, ki jih imajo vsi strežniki LDAP. Tudi localhost, lokalne naslove in naslove IPv6:
[root@system ~]# /bin/cp -f /etc/pki/tls/openssl.cnf myssl.cnf [root@system ~]# echo "[myssl]" >>myssl.cnf [root@system ~]# echo "subjectAltName = IP:127.0.0.1, IP:0::1, DNS:localhost, DNS:localhost.localdomain, IP:10.0.99.305, DNS:ldap.os-prva.si, DNS:ldap1.os-prva.si, DNS:ldap2.os-prva.si, DNS:ldap3.os-prva.si" >>myssl.cnf [root@system ~]# openssl req -sha1 -config myssl.cnf -extensions myssl -new -x509 -key /etc/openldap/certs/key.pem -out /etc/openldap/certs/cert.pem -set_serial 20120824121259 -days 1440 -subj "/C=SI/L=Kranj/CN=Osnovna sola Janeza Novaka, imenik LDAP"
Preverimo certifikat:
[root@system ~]# openssl x509 -noout -text -in /etc/openldap/certs/cert.pem Certificate: Data: Version: 3 (0x2) Serial Number: 12:4c:b7:c7:87:2b Signature Algorithm: sha1WithRSAEncryption Issuer: C=SI, L=Kranj, CN=Osnovna sola Janeza Novaka, imenika LDAP Validity Not Before: Jul 19 09:04:34 2012 GMT Not After : Jun 28 09:04:34 2016 GMT Subject: C=SI, L=Kranj, CN=Osnovna sola Janeza Novaka, imenika LDAP Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:c8:03:ca:68:4d:e8:ee:94:c2:a6:7f:82:d0:91: aa:68:56:01:ad:d7:b8:b1:76:ae:59:dd:6c:2a:73: 20:68:63:c6:ab:c2:14:f3:e8:8c:08:df:e9:71:e6: 56:c4:ef:6f:b8:18:a7:04:bf:ab:66:27:61:17:67: 17:0a:57:e5:a3:12:09:9d:d7:15:00:59:1b:7a:75: 14:c3:24:d0:c7:c9:d4:5d:64:c1:39:53:7b:a4:e5: 2b:73:41:c0:b4:41:84:06:89:f2:ba:1a:37:cf:cb: 76:75:f4:8e:fa:9a:1d:05:30:74:c0:73:68:12:86: fe:0f:5d:6c:cc:21:39:e8:f5:f0:08:ca:9c:19:16: 6e:c9:fb:e9:cb:9e:82:26:57:78:bf:25:21:f6:2a: c1:1a:de:0e:03:3b:45:42:2a:ec:5b:17:74:ad:0a: d2:f2:6c:cb:8e:0d:e8:a8:10:d2:b6:9e:6f:13:02: e7:2b:9a:f2:07:2a:7b:5c:3a:2a:6d:59:7a:4f:22: ed:ce:8f:ea:aa:76:b8:f5:85:d8:41:18:6f:e3:f5: 64:4e:77:a8:c4:04:0e:37:29:0f:95:0f:b3:f0:56: e1:d4:c1:6c:cd:35:54:5a:15:46:08:23:3d:0d:89: d9:44:1e:d3:92:db:41:f4:42:0d:07:d1:17:dd:13: 8a:39 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Key Identifier: D6:8A:1B:0B:4F:34:DF:C9:11:FF:DA:AE:B4:85:B4:2F:45:A7:2D:B1 X509v3 Authority Key Identifier: keyid:D6:8A:1B:0B:4F:34:DF:C9:11:FF:DA:AE:B4:85:B4:2F:45:A7:2D:B1 X509v3 Basic Constraints: CA:TRUE Signature Algorithm: sha1WithRSAEncryption 01:ee:bf:2f:f1:c3:77:dc:7c:0d:74:f9:c2:26:59:fb:2d:ca: 5b:ce:d8:90:96:45:54:4c:b4:cb:4e:7d:bb:1a:54:93:43:ec: 11:6a:da:8d:3b:7e:fd:17:24:be:f4:cf:c8:1e:f8:a2:76:b4: d5:bc:1f:90:c4:49:e6:4c:c8:8b:fe:de:da:3a:71:da:f3:66: 2a:9b:3f:9d:24:94:36:d7:4a:8d:7b:69:5f:dc:b9:d3:36:32: 76:02:85:0e:70:14:b0:d4:bb:99:3b:4d:82:42:1b:00:8b:5a: 8f:28:7e:9b:02:c2:4b:3f:a6:8a:a7:e6:7b:f5:b1:5f:bb:f9: 24:1d:e3:9f:4d:0a:ff:02:1f:24:8c:c8:a6:0f:43:3a:70:51: 42:9f:0a:a1:9e:8f:59:fb:3c:8b:c3:86:81:84:d1:b6:1d:e9: d9:9d:12:03:e9:17:ae:6a:8b:25:ab:20:12:64:65:c8:be:c8: 95:0a:22:1c:20:83:a8:d9:2d:0b:68:44:6d:44:4a:a8:8d:5a: dc:37:ca:96:99:b0:44:94:ab:60:9e:4f:18:0c:af:7d:30:62: 44:fd:e2:00:21:24:d4:e2:be:c6:5b:9a:40:84:bb:44:86:fe: df:d2:59:fe:01:29:ab:08:a9:ea:a9:d5:dd:e3:6b:34:30:52: b1:77:46:cb
Namestimo ustrezne sheme:
[root@system ~]# wget http://aai.arnes.si/static/ldap/eduperson.schema-200412 -O /etc/openldap/schema/eduperson.schema [root@system ~]# wget http://aai.arnes.si/static/ldap/schac.schema-20060724 -O /etc/openldap/schema/schac.schema
Ustrezno ustvarimo in uredimo datoteko /etc/openldap/slapd.conf ter pobrišemo neuporabljeni imenik slapd.d (openldap lahko v nekaterih primerih navkljub nastavitveni datoteki prebira nastavitve iz slapd.d):
[root@system ~]# touch /etc/openldap/slapd.conf [root@system ~]# chmod o-r /etc/openldap/slapd.conf [root@system ~]# chgrp ldap /etc/openldap/slapd.conf [root@system ~]# rm -rf /etc/openldap/slapd.d
Vstavite ustrezno vsebino, dodatno morate biti pozorni na odebeljeno vsebino.
# OpenLDAP config file include /etc/openldap/schema/corba.schema include /etc/openldap/schema/core.schema include /etc/openldap/schema/cosine.schema include /etc/openldap/schema/duaconf.schema include /etc/openldap/schema/dyngroup.schema include /etc/openldap/schema/inetorgperson.schema include /etc/openldap/schema/java.schema include /etc/openldap/schema/misc.schema include /etc/openldap/schema/nis.schema include /etc/openldap/schema/openldap.schema include /etc/openldap/schema/ppolicy.schema include /etc/openldap/schema/collective.schema include /etc/openldap/schema/eduperson.schema include /etc/openldap/schema/schac.schema pidfile /var/run/openldap/slapd.pid argsfile /var/run/openldap/slapd.args # Load dynamic backend modules # - modulepath is architecture dependent value (32/64-bit system) # modulepath /usr/lib/openldap modulepath /usr/lib64/openldap # moduleload accesslog.la # moduleload auditlog.la moduleload syncprov.la TLSCertificateFile /etc/openldap/certs/cert.pem TLSCertificateKeyFile /etc/openldap/certs/key.pem # local access doesn't need SSL localSSF 128 # SSL required for any access security ssf=128 # Server ID #serverID 1 ############################################################ # Global ACLs access to * by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage by dn.exact="cn=root,dc=os-prva,dc=si" manage by * break # Permit RADIUS user access to data for authentication/authorisation access to dn.sub="dc=os-prva,dc=si" attrs=entry,eduPersonPrincipalName,userPassword,schacExpiryDate by dn="cn=radius,ou=System,dc=os-prva,dc=si" read by * break # Permit users to change their password access to dn.sub="dc=os-prva,dc=si" attrs=userPassword,shadowLastChange by self write by anonymous auth by * break # Permit users RO access to their data access to dn.sub="dc=os-prva,dc=si" by anonymous auth by self read by * break ############################################################ # DATABASE - monitor # enable server status monitoring (cn=monitor) database monitor access to * by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.exact="cn=root,dc=os-prva,dc=si" read by * none ############################################################ # DATABASE - data - 1 database bdb suffix dc=os-prva,dc=si checkpoint 1024 15 rootdn cn=root,dc=os-prva,dc=si rootpw skritogesloroot # The database directory MUST exist prior to running slapd AND # should only be accessible by the slapd and slap tools. # Mode 700 recommended. directory /var/lib/ldap # recommendation 3*cachesize idlcachesize 75000 cachesize 25000 checkpoint 1024 15 dbconfig set_cachesize 0 10485760 0 dbconfig set_lg_bsize 2097152 dbconfig set_lg_dir /var/lib/ldap dbconfig set_flags DB_LOG_AUTOREMOVE index objectClass eq,pres index ou,cn,mail,surname,givenname eq,pres,sub index uidNumber,gidNumber,loginShell eq,pres index uid,memberUid eq,pres,sub index nisMapName,nisMapEntry eq,pres,sub index eduPersonPrincipalName eq,pres index schacPersonalUniqueCode eq,pres index schacPersonalUniqueID eq,pres index schacUUID eq,pres index entryCSN eq index entryUUID eq
Vnesemo osnovne objekte s katerimi zgradimo strukturo ter dodamo testnega sistemskega uporabnika. Prave uporabnike vnašamo v ou=Users na podoben način. Datoteki predhodno ustrezno uredite.
ldapmodify -Y EXTERNAL -H ldapi:/// -f 20boot.ldif ldapmodify -Y EXTERNAL -H ldapi:/// -f 21testuser.ldif
Za dostop do imenika uredimo za vsako storitev sistemskega uporabnika in dodamo ustrezne filtre ACL. Vsak uporabnik naj ima dostop le do tistih atributov, ki jih potrebuje za delovanje. Datoteko predhodno ustrezno uredite. Odstaniti ali zakomentirati morate vnos v dn: olcDatabase={2}hdb,cn=config ter ustrezno popraviti komponento dc=os-prva.
ldapmodify -Y EXTERNAL -H ldapi:/// -f 35radius.ldif
Za dostop do LDAP uredimo nastavitve v /etc/openldap/ldap.conf za ves sistem ali za posameznega uporabnika v njegovem domačem imeniku v datoteki ~/.ldaprc. Ustrezno uredite datoteko. Če vzpostavljate dostop z drugega računalnika morate prenesti tudi certifikat strežnika iz /etc/openldap/certs/cert.pem.
$ cat ~/.ldaprc BASE dc=os-prva,dc=si URI ldap://127.0.0.1 DEREF never TLS_CACERT /etc/openldap/certs/cert.pem TLS_REQCERT demand
Izpis DN vseh objektov v dc=os-prva,dc=si, brez izpisa njihovih atributov:
[user@system ~]$ ldapsearch -x -ZZ -D cn=root,dc=os-prva,dc=si -b dc=os-prva,dc=si -H ldap://127.0.0.1 -W dn Enter LDAP Password: # extended LDIF # # LDAPv3 # basewith scope subtree # filter: (objectclass=*) # requesting: dn # # os-prva.si dn: dc=os-prva,dc=si # root, os-prva.si dn: cn=root,dc=os-prva,dc=si # People, os-prva.si dn: ou=People,dc=os-prva,dc=si # Computers, os-prva.si dn: ou=Computers,dc=os-prva,dc=si # System, os-prva.si dn: ou=System,dc=os-prva,dc=si # Groups, os-prva.si dn: ou=Groups,dc=os-prva,dc=si # eduroam, Groups, os-prva.si dn: cn=eduroam,ou=Groups,dc=os-prva,dc=si # nobody, Groups, os-prva.si dn: cn=nobody,ou=Groups,dc=os-prva,dc=si # test, System, os-prva.si dn: uid=test,ou=System,dc=os-prva,dc=si # radius, System, os-prva.si dn: cn=radius,ou=System,dc=os-prva,dc=si # search result search: 3 result: 0 Success
Dodatno: Enak izpis lahko pridobite tudi z uporabo lokalnega dostopa, vendar le kot uporabnik root:
[root@system ~]# ldapsearch -Y EXTERNAL -H ldapi:/// dn
Preizkus dostopa uporabnika radius do imenika, izpišejo se le dovoljeni podatki:
[user@system ~]$ ldapsearch -x -ZZ -D cn=radius,ou=System,dc=os-prva,dc=si -b dc=os-prva,dc=si -H ldap://127.0.0.1 -W eduPersonPrincipalName=test@os-prva.si Enter LDAP Password: # extended LDIF # # LDAPv3 # basewith scope subtree # filter: eduPersonPrincipalName=test@os-prva.si # requesting: ALL # # test, System, os-prva.si dn: uid=test,ou=System,dc=os-prva,dc=si userPassword:: c2tyaXRvZ2VzbG90ZXN0 eduPersonPrincipalName: test@os-prva.si schacExpiryDate: 99991231235959Z # search result search: 3 result: 0 Success # numResponses: 2 # numEntries: 1
OpenLDAP podpira replikacije glavni-pomožni (angl. master-slave) kot tudi replikacijo n-glavnih (angl. N-way multimaster). Redundanca glavni-pomožni zahteva večjo preudarnost pri postavitvi in analizo uporabe pri aplikacijah, hkrati pa lahko ponuja boljše performančne zmogljivosti.
Postavitev n-enakih je malce bolj zahtevna, performančno slabša, ne zahteva pa poglobljene analize aplikacij. Ker je večina postavitev imenikov v Sloveniji za manjše število uporabnikov v splošnem svetujemo postavitev n-enakih.
Najprej postavimo prvi strežnik, kot je opisano zgoraj in rezerviramo dodatni naslov IP za drugi strežnik. Strežnikov lahko dodamo tudi več, nastavitve smiselno dodamo tako kot za drugi strežnik.
Pri postavitvi strežnikov spreminjamo nastavitve na enem strežniku in nastavitveno datoteko prenesemo na ostale strežnike ali ročno ali avtomatizirano z mehanizmi kot so scp, rsync in podobni. Če želimo lahko nastavitveno datoteko shranimo v repozitorij GIT, SVN ... za spremljanje večih različic datotek. Po prenosu datoteke moramo vsak strežnik vnovič zagnati.
V datoteki /etc/sysconfig/ldap oziroma /etc/sysconfig/slapd spremenimo:
SLAPD_URLS="ldapi:/// ldap:/// ldaps:///"v vrstico:
SLAPD_URLS="ldapi:/// ldap:/// ldaps:/// ldap://10.0.99.305:6301/"
Namesto 10.0.99.305 vpišemo naslov IP strežnika LDAP. Naslove IP preverimo z ukazom ifconfig. Vrstico moramo dodati ker so nastavitvene datoteke identične in preko nje strežnik ugotovi kateri ID/naslov za replikacijo oziroma sklop nastavitev je njegov. Za replikacijo se uporabljajo ločena vrata TCP/6301.
V datoteki /etc/openldap/slapd.conf dodamo/popravimo nastavitve serverID
[...] # Server ID serverID 1 "ldap://10.0.99.305:6301/" serverID 2 "ldap://10.0.99.306:6301/" ############################################################ # Global ACLs [...]
V datoteki /etc/openldap/slapd.conf vključimo replikacijo, vsebino dodamo na koncu bloka database xxx:
[...] index entryUUID eq # Configure LDAP synchronisation engine overlay syncprov syncprov-checkpoint 10 1 syncprov-sessionlog 100 syncrepl rid=1 type=refreshAndPersist schemachecking=on retry="10 6 60 +" bindmethod=simple tls_cacert="/etc/openldap/certs/cert.pem" tls_reqcert=demand starttls=critical keepalive=10:3:1 network-timeout=1 timeout=1 provider="ldap://10.0.99.305:6301/" searchbase="dc=os-prva,dc=si" binddn="cn=root,dc=os-prva,dc=si" credentials="skritogesloroot" syncrepl rid=2 type=refreshAndPersist schemachecking=on retry="10 6 60 +" bindmethod=simple tls_cacert="/etc/openldap/certs/cert.pem" tls_reqcert=demand starttls=critical keepalive=10:3:1 network-timeout=1 timeout=1 provider="ldap://10.0.99.306:6301/" searchbase="dc=os-prva,dc=si" binddn="cn=root,dc=os-prva,dc=si" credentials="skritogesloroot" mirrormode on
Odpremo še eno okno do strežnika in spremljamo dnevnik imenika z ukazom tail -f /var/log/ldap.log.
Prvi strežnik ponovno zaženemo z ukazom service slapd restart in preverimo sporočila v dnevniški datoteki v drugem oknu. Verjetno zaznamo sporočila o nedosegljivosti drugega strežnika, kar je v tem koraku, ko še ni vzpostavljen popolnoma razumljivo:
Mar 12 14:43:45 build-c6 slapd[2861]: slap_client_connect: URI=ldap://10.0.99.306:6301/ Error, ldap_start_tls failed (-1) Mar 12 14:43:45 build-c6 slapd[2861]: do_syncrepl: rid=002 rc -1 retrying (2 retries left) Mar 12 14:43:55 build-c6 slapd[2861]: slap_client_connect: URI=ldap://10.0.99.306:6301/ Error, ldap_start_tls failed (-1) Mar 12 14:43:55 build-c6 slapd[2861]: do_syncrepl: rid=002 rc -1 retrying (1 retries left) Mar 12 14:44:05 build-c6 slapd[2861]: slap_client_connect: URI=ldap://10.0.99.306:6301/ Error, ldap_start_tls failed (-1) Mar 12 14:44:05 build-c6 slapd[2861]: do_syncrepl: rid=002 rc -1 retrying Mar 12 14:44:15 build-c6 slapd[2861]: slap_client_connect: URI=ldap://10.0.99.306:6301/ Error, ldap_start_tls failed (-1) Mar 12 14:44:15 build-c6 slapd[2861]: do_syncrepl: rid=002 rc -1 retrying
Pravilnost delovanja preverjamo v /var/log/ldap.log, kjer se beležijo napake in dostopi. Preverimo, da se podatki res sinhronizirajo, recimo tako, da dodamo uporabniško ime test2. Celotni izpis imenika pa dosežemo z ukazom ldapsearch.
[root@system ~]# ldapsearch -Y EXTERNAL -H ldapi:/// -b dc=os-prva,dc=si dn SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 # extended LDIF # # LDAPv3 # basewith scope subtree # filter: (objectclass=*) # requesting: dn # # os-prva.si dn: dc=os-prva,dc=si # root, os-prva.si dn: cn=root,dc=os-prva,dc=si # People, os-prva.si dn: ou=People,dc=os-prva,dc=si # Computers, os-prva.si dn: ou=Computers,dc=os-prva,dc=si # System, os-prva.si dn: ou=System,dc=os-prva,dc=si # Groups, os-prva.si dn: ou=Groups,dc=os-prva,dc=si # eduroam, Groups, os-prva.si dn: cn=eduroam,ou=Groups,dc=os-prva,dc=si # nobody, Groups, os-prva.si dn: cn=nobody,ou=Groups,dc=os-prva,dc=si # test, System, os-prva.si dn: uid=test,ou=System,dc=os-prva,dc=si # radius, System, os-prva.si dn: cn=radius,ou=System,dc=os-prva,dc=si # test2, System, os-prva.si dn: uid=test2,ou=System,dc=os-prva,dc=si # search result search: 2 result: 0 Success # numResponses: 12 # numEntries: 11