2012. május 31., csütörtök

LDAP-Samba jelszószinkron smbkrb5pwd overlay használatával Ubuntu 12.04 alatt

Az smbkrb5pwd overlay (ha tetszik: modul) arra jó, hogy az OpenLDAP-ban megváltoztatott jelszót az OpenLDAP exop mechanizmusának használatával az LDAP-ban tárolt Samba jelszavakkal, illetve az LDAP-ban tárolt MIT-Kerberos jelszavakkal szinkronizálhassuk.
(You can read this post in English too.)
Az overlay forrása innen tölthető le, és tudomásom szerint a finn Opinsysnél dolgozó Veli-Matti műve. A használatát a világnak először ez a cikk mutatta be. Na, lássuk a fordítást.
A modul fordításához egy frissen fordított OpenLDAP kell, először ezt csináljuk meg. (A gépünkön nem  az általunk fordított OpenLDAP-ot használjuk, hanem a hivatalos csomagból tesszük fel. Az általunk fordított csomag csak az overlay lefordításához kell.)
Elsőként telepítünk mindent, ami a slapd fordításához szükséges:
sudo apt-get build-dep slapd
Települ majd egy heimdal-dev csomag is, amivel a későbbiekben még összeveszünk... Ha ezzel megvagyunk, letöltjük és fordítjuk a forrást. A fordítás gyorsan megvan, a tesztelés viszont iiiiiiiilyen hosszú. (Hosszabb. Bő egy óra, vagy ilyesmi. Nem vicc.)
sudo apt-get -b source slapd
Kelleni fog egy unzip:
sudo apt-get install unzip
Kicsomagolunk:
sudo unzip opinsys-smbkrb5pwd-19e5454.zip -d openldap-2.4.28/contrib/slapd-modules/
Odamegyünk, átnevezünk, belemegyünk:
cd openldap-2.4.28/contrib/slapd-modules/
sudo mv opinsys-smbkrb5pwd-19e5454/ smbkrb5passwd
cd smbkrb5passwd/
A fordítás a make paranncsal történik, de egy pár helyen el fog szállni, mert nincs meg minden, ami kell. Menjünk elébe a problémának:
sudo apt-get install libkrb5-dev libssl-dev
Közben törlődik a heimdal-dev csomag, amibő pedig szintén kell majd egy fájl. Hogy pontosan mi és hova, az architektúrafüggő: a csomagbab lévő libgssapi.la kell a (64 biten) /usr/lib/x86_64-linux-gnu/libgssapi.la helyre. Először csak letöltjük a csomagot (figyelj a -d kapcsolóra)
sudo apt-get -d install heimdal-dev
Majd kiharapjuk belőle a nekünk kellő fájlt:
sudo sh -c "dpkg --fsys-tarfile /var/cache/apt/archives/heimdal-dev_1.6~git20120311.dfsg.1-2_amd64.deb | tar xOf - ./usr/lib/x86_64-linux-gnu/libgssapi.la >/usr/lib/x86_64-linux-gnu/libgssapi.la"
Jöhet a fordítás (pár pillanat):
sudo make
És helyére tesszük a szép új, csillogó modulunkat:
sudo cp .libs/* /usr/lib/ldap/

Akkor eddig kész. Mielőtt használatba vennénk, próbáljunk ki két dolgot. Az egyik, hogy LDAP-adminként megváltoztatjuk egy felhasználó jelszavát:
ldappasswd -D cn=admin,dc=itthon,dc=cucc -w titok -s ujjelszo uid=suser1,ou=People,dc=itthon,dc=cucc
Ebből a stats szinten loggoló slapd a /var/log/syslog-ban ennyit mond:
slapd[1287]: conn=1199 fd=24 ACCEPT from PATH=/var/run/slapd/ldapi (PATH=/var/run/slapd/ldapi)
conn=1199 op=0 BIND dn="cn=admin,dc=itthon,dc=cucc" method=128
slapd[1287]: conn=1199 op=0 BIND dn="cn=admin,dc=itthon,dc=cucc" mech=SIMPLE ssf=0
slapd[1287]: conn=1199 op=0 RESULT tag=97 err=0 text=
slapd[1287]: conn=1199 op=1 EXT oid=1.3.6.1.4.1.4203.1.11.1
slapd[1287]: conn=1199 op=1 PASSMOD id="uid=suser1,ou=People,dc=itthon,dc=cucc" new
slapd[1287]: conn=1199 op=1 RESULT oid= err=0 text=
slapd[1287]: conn=1199 op=2 UNBIND
slapd[1287]: conn=1199 fd=24 closed
Most jelentkezzünk be suser1-gyel (és az ujjelszo-val) egy Linux kliensre, és változtassunk jelszót a passwd parancs kiadásával. A szerveren a syslog-ban ennyi van:
slapd[1287]: conn=1207 op=2 BIND dn="uid=suser1,ou=People,dc=itthon,dc=cucc" method=128
slapd[1287]: conn=1207 op=2 BIND dn="uid=suser1,ou=People,dc=itthon,dc=cucc" mech=SIMPLE ssf=0
slapd[1287]: conn=1207 op=2 RESULT tag=97 err=0 text=
slapd[1287]: conn=1207 op=3 BIND anonymous mech=implicit ssf=0
slapd[1287]: conn=1207 op=3 BIND dn="" method=128
slapd[1287]: conn=1207 op=3 RESULT tag=97 err=0 text=
slapd[1287]: conn=1207 op=4 BIND dn="uid=suser1,ou=People,dc=itthon,dc=cucc" method=128
slapd[1287]: conn=1207 op=4 BIND dn="uid=suser1,ou=People,dc=itthon,dc=cucc" mech=SIMPLE ssf=0
slapd[1287]: conn=1207 op=4 RESULT tag=97 err=0 text=
slapd[1287]: conn=1207 op=5 MOD dn="uid=suser1,ou=People,dc=itthon,dc=cucc"
slapd[1287]: conn=1207 op=5 MOD attr=userPassword
slapd[1287]: conn=1207 op=5 RESULT tag=103 err=0 text=
slapd[1287]: conn=1207 op=6 MOD dn="uid=suser1,ou=People,dc=itthon,dc=cucc"
slapd[1287]: conn=1207 op=6 MOD attr=shadowLastChange
slapd[1287]: conn=1207 op=6 RESULT tag=103 err=0 text=
slapd[1287]: conn=1207 op=7 UNBIND
slapd[1287]: conn=1207 fd=27 closed
slapd[1287]: conn=1206 op=4 UNBIND
slapd[1287]: conn=1206 fd=26 closed
A két eljárás közül egyik sem változtatja meg sem a sambaNTPassword jellemzőt, sem a Kerberos-jelszót. De az elsőben (vastaggal) van egy fontos dolog. Nem MOD, hanem PASSMOD szerepel, és előtte van egy EXT oid, azaz exop-id, azaz extended operation id. Az első eljárás nem közvetlenül az userPassword jellemző értékét írja át, hanem szól az LDAP-nak, hogy "változtasd meg a jelszót", és ilyenkor az LDAP a jelszóváltoztatáson kívül mást is képes megtenni. Például módosít más jelszavakat is. Ha szólunk neki. És most szólunk, beizzítjuk a jó kis frissen fordított modulunkat.

Készítsük el az smbkrb5pwd_betolt.ldif fájlt:
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: smbkrb5pwd
Majd adjuk hozzá az LDAP-hoz:
sudo ldapmodify -Y EXTERNAL -f smbkrb5pwd_betolt.ldif
Nézzük meg az eredményt:
sudo ldapsearch -Y EXTERNAL -b cn=module{0},cn=config 
Készítsük el az smbkrb5pwd_beallit.ldif fáljt (most csak Samba szinkronizálásra használjuk, a dolog a Kerberos-jelszónál egy fokkal bonyolultabb, és lesz még róla poszt):
dn: olcOverlay=smbkrb5pwd,olcDatabase={1}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSmbKrb5PwdConfig
olcOverlay: {1}smbkrb5pwd
olcSmbKrb5PwdEnable: samba
olcSmbKrb5PwdMustChange: 2592000
olcSmbKrb5PwdRequiredClass: posixAccount
Majd adjuk hozzá az LDAP-hoz:
sudo ldapadd -Y EXTERNAL -f smbkrb5pwd_beallit.ldif
Nézzük meg az eredményt:
sudo ldapsearch -Y EXTERNAL -b olcDatabase={1}hdb,cn=config
Ha most adjuk ki a fenti ldappaswd parancsot, akkor a syslog nem mutat újat, de az extended operation (exop) megtöténik, és a Samba jelszó is megváltozik. Kész van az userPassword - sambaNTPassword szinkronizáció! Éljen-éljen!
Na de épp az imént láttuk, hogy az exop nem fut le, ha kliensről, a passwd program használatával változtatunk jelszót. A megoldás, hogy a kliensen szerkesztjük az /etc/ldap.conf fájlt.
  • Megjegyzéssé alakítjuk a pam_password md5 bejegyzést és
  • Kivesszük a megjegyzésből a a  pam_password exop bejegyzést.
Azaz a Linuxon megváltoztatott jelszót most már a Windows is tudja.

Kedvenc felhasználónk azonban most nem tud jelszót változtatni Windows-ban. Illetve a jelszó megváltozik, de a Windows hibaüzenetet ad: A felhasználónév vagy jelszó hibás. A jelszavakban a kis- és nagybetűk meg vannak különböztetve. (XP). A jelszó megváltozik ugyan, de ez a hibaüzenet zavaró. Mi ennek az oka?
Gondoljuk át: az smb.conf-ban az ldap passwd sync = yes beállítás miatt a Samba az userPassword-öt is meg akarja változtatni, amitől viszont az LDAP az smbkrb5pwd overlay miatt változtatni akar azon a sambaNTPassword jellemzőn, amit épp maga a Samba is ír.
A megoldás, hogy az ldap passwd sync = yes helyett ldap passwd sync = only kerül az smb.conf-ba, amit egy
sudo service smbd restart
követ.

Hú. De jó.

Irodalom:
http://easierbuntu.blogspot.com/2008/05/using-apt-get-to-compile-from-source.html
http://blogger.ziesemer.com/2011/01/ldap-authentication-for-samba.html

2 megjegyzés:

Tamás Pisch írta...

Gondolkodtam azon, hogy addig is, amíg nem jön ki a Samba4 stabil verziója, használatba venném a Kerberost Samba3-mal. Tudom, hogy létezik Kerberos kliens Windowsra. A kérdésem az volna, hogy e nélkül a kliens nélkül, és Windows AD szerver nélkül működne-e a dolog (Samba3+OpenLdap+Kerberos, Windows kliensekkel)?

raerek írta...

Bocsi, nem voltam gépközelben. A válasz pedig az, hogy - ha jól értem a kérdést és neked Kerberos kell Win alól - akkor tudtommal nem. Az én kiépítésemben a Kerberos csak Linux alól fontos, és annyira kevés Win kliensem van, hogy nem igazán törődtem vele.