So verwenden Sie dieselbe Bibliothek mehrmals in Name Service Switch (NSS)

8

Gibt es eine generische Lösung, um eine einzelne NSS-Bibliothek zwei (oder mehr) Mal zu verwenden?

In meinem Fall habe ich zwei LDAP-Server, einen lokalen auf dem Computer selbst und einen Remote-Server. Ich muss dafür sorgen, dass NSS mit beiden funktioniert (es verwendet die Remote-Version, wenn local keine erforderlichen Einträge hat).

Derzeit wurde es so gelöst, dass eine einzelne Bibliothek ( PADL / nss_ldap ) zweimal erstellt wird. In beiden Fällen werden vor dem Erstellen sedalle nss_ldapVorkommen in Quellen in etwas anderes geändert . Für jeden Fall wird ein anderer Text verwendet (wie nss_ldap_1und nss_ldap_2). Das Build-Ergebnis wird entsprechend umbenannt. Beide Binärdateien werden auf dem Zielsystem gespeichert und in verwiesen /etc/nsswitch.conf.

Außerdem verwenden beide Bibliotheken unterschiedliche Konfigurationsdateien in /etc/(sonst macht es keinen Sinn!). Dies ist jedoch einfach, indem Sie das Argument im configureSkript der Bibliothek ändern, die vor dem Erstellen ausgeführt wird.

Aber es fühlt sich nicht "richtig an". Gibt es einen anderen Ansatz?

Was ich mir vorstellen kann ist, dass die NSS-Bibliothek selbst mehrere Konfigurationen unterstützen könnte, so dass sie als zwei "einzelne Instanzen" funktionieren würde. Dies ist jedoch schwer zu erreichen, wenn Sie nicht Autor der Bibliothek sind. Außerdem muss die Bibliothek für beide Konfigurationen anschließend aufgerufen werden, während möglicherweise eine andere Bibliothek dazwischen liegt.

Ein anderer Ansatz wäre, eine einfache Weiterleitung zu schreiben, die nur eine andere Bibliothek mit einer anderen Konfiguration aufruft. Dies setzt jedoch wiederum voraus, dass andere Bibliotheken irgendwie rekonfigurierbar sind (wenn nur einige feste Konfigurationsdateien in /etcder Weiterleitung verwendet werden, funktioniert dies genauso wie die erste Version). Und es funktioniert auch nur einmal - wenn eine Bibliothek dreimal oder öfter verwendet wird, tritt das gleiche Problem jetzt mit der Weiterleitung selbst auf.

Adam Badura
quelle
Wow, überrascht, dass das funktioniert hat - versuchen sie nicht, aus derselben Konfigurationsdatei zu lesen? Oder haben Sie auch den Namen der Konfigurationsdatei geändert?
Derobert
1
Wie wäre es mit sss?
Stéphane Chazelas
@ StéphaneChazelas Ich denke, sssd soll mit einem autorisierenden LDAP-System arbeiten, bei dem alle LDAP-Server, über die gesprochen wird, dieselben Daten haben. OP scheint mehrere Server mit unterschiedlichen Daten zu wollen, und einige Lookups werden gegen Server1 und andere Lookups gegen Server2 durchgeführt.
Derobert
@derobert, nein, sssd sollte mit mehreren unabhängigen Anbietern zusammenarbeiten.
Stéphane Chazelas
2
Auf der anderen Seite stellen Sie möglicherweise fest, dass einige andere Probleme gelöst werden, z. B. das ordnungsgemäße Zwischenspeichern von Anmeldeinformationen und mehr Flexibilität bei der Konfiguration.
Stéphane Chazelas

Antworten:

4

Leider können Sie dies mit der NSS-Implementierung von GNU libc nicht tun. Sie haben das grundlegende Problem bemerkt, lassen Sie es mich nur aus einem anderen Blickwinkel betrachten: Die nsswitch.confSyntax erlaubt keine zusätzlichen Informationen für die NSS-Servicemodule, sodass sie sich bei wiederholten Aufrufen ohnehin nicht anders verhalten können. Es wird also weder von der libc-Seite noch von der Modulseite unterstützt. Darüber hinaus legt glibc Wert darauf, dass die Servicemodule direkt verknüpfbare gemeinsam genutzte Objekte erhalten, was jegliche Verknüpfungsprobleme ausschließt.

Sie können stattdessen ein Meta-Verzeichnis aus Ihren beiden LDAP-Verzeichnissen erstellen und dieses in Ihrer NSS-Konfiguration verwenden. OpenLDAP unterstützt dies sehr gut, siehe die slapd-meta(5)Handbuchseite oder dieses Zusammenführungs-Intro zum Beispiel. Natürlich benötigen Sie hierfür keine neue slapdInstanz, wenn Sie eine der beiden konfigurieren können.

(Und anstatt zu nss-ldapbenutzen, nss-ldapdwenn du kannst.)

Ferenc Wágner
quelle