Seite 1 von 1

OPSI Backend forceGroups

Verfasst: 12 Mär 2015, 16:28
von stephan.holljes
Hallo,

wir haben in unserer Umgebung einen LDAP-Server mit sehr vielen Gruppen (mehr als 10000) und deshalb ist das Authentifizieren über OPSI sehr langsam und verbraucht sehr viel CPU-Zeit. Wir haben das Problem auf die Klasse BackendAccessControl beschränken können, genauer auf den Aufruf von

Code: Alles auswählen

groups = grp.getgrall()
in der Methode _pamAuthenticateUser.

Das setzen des Attributs self._forceGroups in BackendAccessControl ändert dieses Verhalten und überspringt das Abrufen aller Gruppen, jedoch wissen wir nicht wo genau dieses Attribut korrekt konfiguriert werden sollte. Ein schneller Workaround bis jetzt ist das feste Setzen von self._forceGroups in der __init__ Methode von BackendAccessControl.

Ist das Verwenden von forceGroups an dieser Stelle sinnvoll und wo muss dies konfiguriert werden?
Gibt es eventuell bessere Lösungen?

Stephan Holljes

Re: OPSI Backend forceGroups

Verfasst: 13 Mär 2015, 15:47
von n.wenselowski
Hallo Stephan,

der immer wieder neue Abruf ist insofern gewünscht, als dass man natürlich keinen "Leichen" den Zugriff gewähren will.
Durch das Setzen von forceGroups kann man die Gruppen setzen, die den Benutzern erzwungen werden.Ich würde im ersten Moment sagen, dass das nichts ist, was man für alle Benutzer will.

Ich glaube ein manuelles Setzen ist momentan nicht möglich.
Gesetzt werden müsste es im opsiconfd, wenn ich mich da richtig entsinne. Am besten dort mal einen Blick rein werfen.
Mögliche Lösung könnte auch sein, dass man die Gruppendaten eine Zeit lang als Klassenattribut vorhält.

Bei einer solch großen Umgebung gibt es hoffentlich einen Support-Vertrag - darüber unterstützen wir auch gerne und falls das Problem dringend ist, ist das definitiv die schnellste Lösung ;)


Viele Grüße

Niko

Re: OPSI Backend forceGroups

Verfasst: 18 Mär 2015, 16:49
von stephan.holljes
Hallo Niko,

ein Support-Vertrag ist für uns leider nicht möglich. Die hohe Gruppenanzahl können wir nicht beeinflussen. Unsere Abteilung betreut weniger als 100 Clients.

Sofern ich den Sourcecode richtig verstanden habe, befinden sich alle für OPSI relevanten Gruppen in dem Klassenattribut self._acl. Folgendes Patch der Datei BackendManager.py extrahiert diese Gruppen aus dem Attribut und durchsucht lediglich die relevanten Gruppen:

Code: Alles auswählen

778,788c778
< 				
< 				groups = []
< 				
< 				for (regex, acl) in self._acl:
< 					for entry in acl:
< 						if entry.get('type') == 'sys_group':
< 							group_names = entry.get('ids', [])
< 							for gn in group_names:
< 								groups.append(grp.getgrnam(gn))
< 						
< 				
---
> 				groups = grp.getgrall()

Dies ist bedeutend schneller als alle Gruppen abzufragen und funktioniert in einer kleinen Testumgebung ohne Probleme.
Führt dies unter Umständen zu falschen Authentifizierungen?

Kommentare und Kritik erwünscht.

Stephan Holljes

Re: OPSI Backend forceGroups

Verfasst: 23 Mär 2015, 19:03
von stephan.holljes
Ping?

Re: OPSI Backend forceGroups

Verfasst: 24 Mär 2015, 12:39
von n.wenselowski
Hallo Stephan,

gemach, gemach - letzte Woche war Cebit ;)

Mir gefällt die Idee, dass nur die auch in den ACL referenzierten Gruppen verwendet werden.

Den Code würde ich wie folgt noch anpassen, damit es zu keinen Problem kommt, falls der Key "type" nicht gefunden wird bzw. eine Gruppe angegeben wurde, die gar nicht existiert:
Wenn Geschwindigkeit eine Rolle spielt, würde ich außerdem anstatt einer Liste ein set verwenden - vermeidet Duplikate und hat schnellere Checks auf Mitgliedschaft eines Elements.

Code: Alles auswählen

				groups = set()

				for (_, acl) in self._acl:
					for entry in acl:
						if entry.get('type', '') == 'sys_group':
							groupNames = entry.get('ids', [])
							for groupName in groupNames:
								try:
									groups.add(grp.getgrnam(groupName))
								except KeyError:
									logger.warning("Group specified in ACL does not exist: {0}".format(groupName))
Das Problem hierbei ist, dass nur die Gruppen des Users berücksichtigt werden, die auch tatsächlich in den ACL genannt werden.
Das hebelt bspw. den Mechanismus der Readonly-Gruppe aus, da diese idR nicht in den ACL hinterlegt werden und somit nicht ermittelt werden könnte, ob ein User nur lesend Zugriff haben soll.

Das spricht momentan noch dagegen den Patch so direkt in opsi zu übernehmen.
Aber ich habe das ganze mal zum Anlass genommen die entsprechende Stelle im Backend, an welcher die Gruppen ausgelesen werden, zu überarbeiten.
Das wird dann ein Teil von 4.0.6 werden. Wenn gewünscht, kann ich nen entsprechenden Patch dafür gerne posten.


Viele Grüße

Niko

Re: OPSI Backend forceGroups

Verfasst: 25 Mär 2015, 15:57
von stephan.holljes
Hallo Niko,

super, dass diese Stelle überarbeitet wird!
Da wir bisher keine Probleme mit unserem eigenen Patch feststellen konnten, werden wir einfach auf 4.0.6 warten.
Danke für die Übernahme der Idee in OPSI!

Stephan Holljes