Vorwort
Da die vorherigen Dienste alle im Intranet waren, waren die Zookeeper -Cluster -Konfigurationen alle Intranet -IP, und das externe Netzwerk öffnete keine relevanten Ports. Vor kurzem haben wir aufgrund von Geschäftsanmeldungen die Dienste von Alibaba Cloud gekauft und müssen Zookeeper -Dienste für die Öffentlichkeit eröffnen.
Frage
Zookeeper+Dubbo, wie Sie eine Sicherheitsauthentifizierung einrichten? Ich möchte nicht, dass andere Dienste eine Verbindung zu Zookeeper herstellen, da sich dieser Zookeeper -Server im externen Netzwerk befindet.
Fragen Sie die offizielle Dokumentation ab:
Zookeeper ist ein Unterprojekt von Apacahe Hadoop. Es ist ein Tree-Typ-Verzeichnisdienst, der Change Push unterstützt. Es ist als Registrierungszentrum für Dubbo Services geeignet. Es hat eine hohe industrielle Intensität und kann in Produktionsumgebungen eingesetzt werden. Es wird empfohlen, es zu verwenden.
Prozessbeschreibung:
• Wenn der Dienstanbieter startet: Schreiben Sie Ihre eigene URL -Adresse in das Verzeichnis /dubbo/com.foo.barservice/Providers
• Wenn der Serviceverbraucher startet: Abonnieren Sie die URL -Adresse der Anbieter im Verzeichnis /dubbo/com.foo.barservice/Providers. Und schreiben Sie Ihre eigene URL
• Wenn das Überwachungszentrum beginnt: Abonnieren
Unterstützt die folgenden Funktionen:
• Wenn der Anbieter über eine abnormale Abschaltung wie Stromausfall verfügt, kann das Registrierungszentrum die Anbieterinformationen automatisch löschen.
• Wenn das Registrierungszentrum neu gestartet wird, können die Registrierungsdaten automatisch wiederhergestellt werden und Abonnementanfragen können abonniert werden.
• Nach Ablauf der Sitzung können die Registrierungsdaten automatisch wiederhergestellt werden und Abonnementanforderungen können abonniert werden.
• Beim Einstellen von <Dubbo: Registrierung check = "false" /> wird die Registrierung und Abonnementanforderung fehlgeschlagen und der Hintergrund ist zeitlich auf Wiederholung festgelegt
• Die Anmeldeinformationen von Zookeeper können über <Dubbo: Registrierung username = "admin" password = "1234" /> festgelegt werden
• Der Root -Knoten von Zookeeper kann über <Dubbo: Registry Group = "Dubbo" /> eingestellt werden. Wenn Sie es nicht einstellen, verwenden Sie den rootlosen Baum.
• Unterstützt das * Wildcard -Charakter <Dubbo: Referenzgruppe = "" Version = "" />, um alle Gruppen und alle Versionen des Dienstes zu abonnieren
In Artikel 5 des offiziellen Website -Dokuments heißt es deutlich, dass Zookeeper -Anmeldeinformationen über die Felder Benutzername und Passwort festgelegt werden können.
Im Folgenden finden Sie die Beschreibung der Registrierungsparameter:
Wenn Sie die ACL jedoch über Digest auf Zookeeper einstellen und dann den entsprechenden Benutzer und das Passwort in der Dubbo -Registrierung konfigurieren, wird der Dienst nicht in Zookeeper registriert und meldet WeeererRorCode = NoAuth -Fehler.
Als ich jedoch den Quellcode mit Zookeeperregistry überprüfte, fand ich keine relevante Authentifizierung. Ich habe selten ähnliche Fragen im gesamten Netzwerk gestellt, und diese Frage schien nicht auf Beachtung zu werden.
ACL in Zookeeper
Überblick
In herkömmlichen Dateisystemen sind ACLs in zwei Dimensionen unterteilt, eine Gruppe und die andere sind Berechtigungen. Unterverzeichnisse/Dateien erben die ACLs des übergeordneten Verzeichnisses standardmäßig. In Zookeeper hat Node's ACL keine Erbschaftsbeziehung und wird unabhängig kontrolliert. Zookeeper's ACL kann aus drei Dimensionen verstanden werden: Eines ist Schema; Der zweite ist der Benutzer; und die dritte ist die Erlaubnis, die normalerweise als ausgedrückt wird als
Schema: ID: Berechtigungen
Aus diesen drei Aspekten werden Folgendes eingeführt:
Schema: Das Schema entspricht, welches Schema zur Verwaltung von Berechtigungen verwendet wird. Zookeeper implementiert ein steckbares ACL -Schema, das den ACL -Mechanismus durch Erweiterung des Schemas erweitern kann. Zookeeper-3.4.4 unterstützt standardmäßig die folgenden Systeme:
Welt: Es gibt nur eine ID darunter, nannte jemanden, Welt
Auth: Es erfordert keine ID, solange der Benutzer durch Authentifizierung Berechtigungen hat (Zookeeper unterstützt die Authentifizierung durch Kerberos und unterstützt auch die Authentifizierung in Form von Benutzername/Passwort).
Digest: Die entsprechende ID ist Benutzername: Base64 (SHA1 (Passwort)), sie muss die Authentifizierung in Form von Benutzername übergeben: Passwort
IP: Die entsprechende ID ist die IP -Adresse des Clients. Beim Einstellen können Sie ein IP -Segment wie IP festlegen: 192.168.1.0/16, was bedeutet, dass die IP -Segmente mit den ersten 16 Bit übereinstimmen
Super: In diesem Schema hat die entsprechende ID Superberechtigungen und kann alles tun (Cdrwa)
Erlaubnis: Zookeeper unterstützt derzeit die folgenden Berechtigungen:
Erstellen (c): Erstellen Sie die Berechtigung, Sie können unter dem aktuellen Knoten untergeordneter Knoten erstellen
Löschen (d): Löschen Sie Berechtigungen können Sie den aktuellen Knoten löschen
Read (R): Lesen Sie die Erlaubnis, Sie können die Daten des aktuellen Knotens abrufen. Sie können alle untergeordneten Knoten im aktuellen Knoten auflisten
Schreiben (w): Schreiben Sie die Berechtigung, Sie können Daten an den aktuellen Knoten schreiben
Admin (a): Admin -Berechtigungen können die Berechtigung des aktuellen Knotens festlegen
Kundenmanagement
Über den folgenden Befehl können wir eine Verbindung zum Client herstellen:
./zkcli.sh
helfen
[zk: localhost: 2181 (verbunden) 2] helpzookeeper -server Host: Port CMD Args verbinden Host: Port ACL getacl Pfad sync Pfad Redo Cmdno addAuth Scheme Auth Delete Path [Version] setquota -n | -B Val Pfad
Einfacher Betrieb
[ZK: Localhost: 2181 (verbunden) 12] ls /[Dubbo, Test, Zookeeper] [ZK: LOCALHOST: 2181 (verbunden) 13] Erstellen /Itstyle -Daten IP: 192.168.1.190: cdrwcreated /itstyle [ZK: Localhost: 2181 (verbunden) (verbunden) /itStyle'ip,'192.168.1.190: cdrw
ZKClient Operation Code
Java.security.NoSuchalgorithmException; import Java.util.ArrayList; Import Java.util.List; import Java.util.map; org.apache.zookeeper.data.id; import org.apache.zookeeper.data.stat; import org.apache.zookeeper.server.Auth.DigestAuthenticationProvider; private statische endgültige String -TestNode = "/Dubbo"; private statische endgültige String-ReadAuth = "Read-User: 123456"; private statische endgültige String writeAth = "Write-User: 123456"; private statische endgültige Zeichenfolge DeleteAth = "Delete-User: 123456"; private statische endgültige Zeichenfolge Allauth = "Super-Benutzer: 123456"; private statische endgültige String adminauth = "admin-user: 123456"; private statische endgültige String -Digest = "Digest"; private static void initnode () löscht NoSuchalgorithmException {Zkclient zkclient = new Zkclient (Zkaddress); System.out.println (DigestAuthenticationProvider.generatedigest (Allauth)); Zkclient.addauthinfo (Digest, Allauth.getBytes ()); if (zkclient.exists (testNode)) {zkclient.delete (testNode); System.out.println ("Knoten löschen erfolgreich!"); } List <ACL> ACLS = New ArrayList <ACL> (); ACLS.Add (neue ACL (Zoodefs.Perms.All, neue ID (Digest, DigestAuthenticationProvider.generatedigest (Allauth)))); ACLS.Add (neue ACL (Zoodefs.Perms.All, neue ID (Digest, DigestAuthenticationProvider.generatedigest (Allauth)))); ACLS.Add (New ACL (Zoodefs.Perms.Read, New ID (Digest, DigestAuthenticationProvider.generatedigest (ReadAuth)))); ACLS.Add (New ACL (Zoodefs.Perms.Write, New ID (Digest, DigestAuthenticationProvider.generatedigest (WritAuth))))); ACLS.Add (neue ACL (Zoodefs.Perms.delete, neue ID (Digest, DigestAuthenticationProvider.generatedigest (DeleteAth)))); ACLS.ADD (neue ACL (Zoodefs.Perms.Admin, neue ID (Digest, DigestAuthenticationProvider.generatedigest (adminauth)))); ZKClient.Createpersistent (TestNode, TestNode, ACLS); System.out.println (Zkclient.Readdata (TestNode)); System.out.println ("Knoten wurde erfolgreich erstellt!"); Zkclient.close (); } private static void redeTest () {zkclient zkclient = neu zkclient (Zkaddress); try {system.out.println (zkclient.readdata (testNode)); // Keine Authentifizierungsinformationen, ein Fehler tritt auf, wenn} catch (Ausnahme E) {System.err.println (e.getMessage ()); } try {zkclient.addAuthinfo (Digest, adminauth.getBytes ()); System.out.println (Zkclient.readdata (testNode)); // Die Administratorberechtigung stimmt nicht mit der Read -Berechtigung überein, und das Lesen tritt auch auf, wenn} catch (Ausnahme E) {System.err.println (e.getMessage ()); } try {zkclient.addauthinfo (Digest, ReadAuth.getBytes ()); System.out.println (Zkclient.Readdata (TestNode)); // Nur die Authentifizierungsinformationen mit Leseberechtigung können normal gelesen werden} catch (Ausnahme e) {System.err.println (e.getMessage ()); } zkclient.close (); } private static void writeTest () {zkclient zkclient = neu zkclient (Zkaddress); try {zkclient.writedata (testNode, "new-data"); // Schreiben fällt ohne Authentifizierungsinformationen} catch (Ausnahme e) {System.err.println (e.getMessage ()); } try {zkclient.addauthinfo (Digest, WriteAth.getBytes ()); zkclient.writedata (testNode, "new-data"); // Normalerweise schreiben nach Hinzufügen von Authentifizierungsinformationen} catch (Ausnahme e) {System.err.println (e.getMessage ()); } try {zkclient.addauthinfo (Digest, ReadAuth.getBytes ()); System.out.println (zkclient.readdata (testNode)); // Neue Wertverifizierung lesen} catch (Ausnahme e) {System.err.println (e.getMessage ()); } zkclient.close (); } private static void deletetest () {zkclient zkclient = new zkclient (Zkaddress); Zkclient.addauthinfo (Digest, DeleteAuth.getBytes ()); try {system.out.println (zkclient.readdata (testNode)); ZKClient.Delete (TestNode); System.out.println ("Knoten löschen erfolgreich!"); } catch (Ausnahme e) {System.err.println (e.getMessage ()); } zkclient.close (); · // Hinweis: Zkclient.setacl -Methode kann gefunden werden, um den Quellcode anzuzeigen. Readdata- und SetACl -Methoden werden aufgerufen. // Um die ACL -Attribute des Knotens zu ändern, müssen Sie sowohl gelesen als auch admin -Berechtigungen: Lesen und Admin -zkclient.addauthinfo (Digest, adminauth.getBytes ()); Zkclient.addauthinfo (Digest, ReadAuth.getBytes ()); try {list <ACL> acls = new ArrayList <ACL> (); ACLS.ADD (neue ACL (Zoodefs.Perms.All, neue ID (Digest, DigestAuthenticationProvider.generatedigest (adminauth)); System.out.println (ACLResult.GetKey); System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Zusammenfassen
Die meisten Dienste werden im Intranet eingesetzt und sind selten für das externe Netzwerk offen. Die Authentifizierung der Zookeeper -Benutzerberechtigung von Dubbo scheint jedoch nicht zu funktionieren. Wenn Sie es für die Außenwelt öffnen müssen, können Sie nur Iptables oder Firewall verwenden, um die IP -Zugriffskontrolle durchzuführen. Wenn es sich um einen Alibaba -Cloud -Server handelt, ist die Sicherheitsgruppe auch eine gute Wahl.
Das obige Beispiel für die Sicherheitsauthentifizierung des verteilten Dienstes Dubbo+Zookeeper ist der gesamte Inhalt, der vom Editor geteilt wird. Ich hoffe, es kann Ihnen eine Referenz geben und ich hoffe, Sie können Wulin.com mehr unterstützen.