2012. december 11., kedd

OpenLDAP ACL három felhasználói csoportra

Ez a cikk sokat késet, de azért megérkezett. Nagyon hosszú időt ült félkész állapotban a piszkozatok között...

Múltkor végre sikerül elég bonyolultan megoldani azt, hogy az LDAP-on belül mindenki csak ahhoz férhessen hozzá, amihez szabad neki (legalábbis remélem:)).
Ma bonyolítom a helyzetet.

Adott egy iskola, benne az
  • informatikatanárok mindenki jelszavát megváltoztathatják, kivéve egymásét,
  • a tanárok megváltoztathatják a saját és a diákok jelszavát,
  • a diákok meg csak a sajátjukat.
Ebből indultam el 2010-ben, akkor még alig konyítva az LDAP-hoz. Szerencsére Mark Ziesemer elvégezte helyettem a munka nagy részét, ami már csak azért is jó volt, mert nekem akkoriban felfogni is nehéz volt, amit írt. Szerencsére a felállás nem sokat változott máig, úgyhogy hajrá.

Kelleni fog egy memberOf overlay (hogy miért, arról Ziesemer szépen és jól ír). Először bekapcsoljuk (memberof_betolt.ldiff):
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: memberof
és:
sudo ldapmodify -Y EXTERNAL -f memberof_betolt.ldiff
Ellenőrzés:
sudo ldapsearch -Y EXTERNAL -b cn=module{0},cn=config

Aztán elindítjuk (memberof_beallit.ldiff):
dn: olcOverlay=memberof,olcDatabase={1}hdb,cn=config
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: olcConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf
és:
sudo ldapadd -Y EXTERNAL -f memberof_beallit.ldiff
Ellenőrzés:
sudo ldapsearch -Y EXTERNAL -b olcDatabase={1}hdb,cn=config

Eddig jó.

Legyen három csoportunk (infótanár, tanár, diák) (GON_csoportok.ldiff):
dn: cn=ga,ou=Groups,dc=itthon,dc=cucc
objectClass: groupOfNames
objectClass: top
cn: ga
member: cn=placeholder

dn: cn=gb,ou=Groups,dc=itthon,dc=cucc
objectClass: groupOfNames
objectClass: top
cn: gb            
member: cn=placeholder 

dn: cn=gc,ou=Groups,dc=itthon,dc=cucc
objectClass: groupOfNames
objectClass: top
cn: gc            
member: cn=placeholder
és:
ldapadd -D cn=admin,dc=itthon,dc=cucc -w titok -f GON_csoportok.ldiff

Legyenek júzereink(GON_userek.ldiff):
dn: uid=ga1,ou=People,dc=itthon,dc=cucc
uidNumber: 20001
gidNumber: 513
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: ga1
sn: ga1
cn: ga1
userPassword: ga1
loginShell: /bin/bash
homeDirectory: /home/ga1

dn: uid=ga2,ou=People,dc=itthon,dc=cucc
uidNumber: 20002
gidNumber: 513
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: ga2
sn: ga2
cn: ga2
userPassword: ga2
loginShell: /bin/bash
homeDirectory: /home/ga2

dn: uid=gb1,ou=People,dc=itthon,dc=cucc
uidNumber: 20003
gidNumber: 513
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: gb1
sn: gb1
cn: gb1
userPassword: gb1
loginShell: /bin/bash
homeDirectory: /home/gb1

dn: uid=gb2,ou=People,dc=itthon,dc=cucc
uidNumber: 20004
gidNumber: 513
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: gb2
sn: gb2
cn: gb2
userPassword: gb2
loginShell: /bin/bash
homeDirectory: /home/gb2

dn: uid=gc1,ou=People,dc=itthon,dc=cucc
gidNumber: 513
uidNumber: 20005
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: gc1
sn: gc1
cn: gc1
userPassword: gc1
loginShell: /bin/bash
homeDirectory: /home/gc1

dn: uid=gc2,ou=People,dc=itthon,dc=cucc
uidNumber: 20006
gidNumber: 513
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: gc2
sn: gc2
cn: gc2
és:
ldapadd -D cn=admin,dc=itthon,dc=cucc -w titok -f GON_userek.ldiff

Tegyük be a megfelelő usereket a megfelelő csoportokba. A csoportokban felvett member attribútumokkal párhuzamosan kialakul a júzereknél a memberOf rejtett attribútum.

Íme az új ACL, a múltkori kiegészítve ezzel az új követelménnyel, némi tisztázással:
dn: olcDatabase={1}hdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to *
  by group.exact="cn=GONldapAdmins,ou=Groups,dc=itthon,dc=cucc" write
  by * break
olcAccess: {1}to dn.subtree="cn=krbcontainer,dc=itthon,dc=cucc"
  by group.exact="cn=GONkerberosAdmins,ou=Groups,dc=itthon,dc=cucc" write
olcAccess: {2}to dn.one="dc=itthon,dc=cucc" filter=(objectClass=sambaDomain)
  by group.exact="cn=GONsambaAdmins,ou=Groups,dc=itthon,dc=cucc" write
  by * break
olcAccess: {3}to dn.subtree="ou=People,dc=itthon,dc=cucc"
  attrs=@sambaSamAccount,userPassword
  by group.exact="cn=GONsambaAdmins,ou=Groups,dc=itthon,dc=cucc" write
  by * break
olcAccess: {4}to dn.subtree="ou=Computers,dc=itthon,dc=cucc"
  by group.exact="cn=GONsambaAdmins,ou=Groups,dc=itthon,dc=cucc" write
  by * break
olcAccess: {5}to dn.subtree="ou=People,dc=itthon,dc=cucc"
  attrs=userPassword
  by self write
  by anonymous auth
  by * break
olcaccess: {6}to dn.subtree="ou=People,dc=itthon,dc=cucc"
  filter=(memberof=cn=ga,ou=Groups,dc=itthon,dc=cucc)
  attrs=userPassword
  by group.exact="cn=ga,ou=Groups,dc=itthon,dc=cucc" none
  by * break
olcaccess: {7}to dn.subtree="ou=People,dc=itthon,dc=cucc"
  attrs=userPassword
  by group.exact="cn=ga,ou=Groups,dc=itthon,dc=cucc" write
  by * break
olcaccess: {8}to dn.subtree="ou=People,dc=itthon,dc=cucc"
  filter=(memberof=cn=gc,ou=Groups,dc=itthon,dc=cucc)
  attrs=userPassword
  by group.exact="cn=gb,ou=Groups,dc=itthon,dc=cucc" write
  by * break
olcAccess: {9}to attrs=userPassword,shadowLastChange,sambaNTPassword,sambaLMPassword,sambaPwdLastSet,sambaPwdMustChange
  by self read
  by anonymous auth
  by * none
olcAccess: {10}to * by users read

Állítsuk be, és néhány ldappasswd parancs kiadásával teszteljük. Aztán öröm.

Nincsenek megjegyzések: