Préface
Étant donné que les services précédents étaient tous dans l'intranet, les configurations de cluster Zookeeper étaient toutes des IP intranet et le réseau externe n'a pas ouvert les ports pertinents. Récemment, en raison de mises à niveau des entreprises, nous avons acheté les services d'Alibaba Cloud et devons ouvrir des services de gardien de zoo au public.
question
ZooKeeper + Dubbo, comment configurer l'authentification de la sécurité? Je ne veux pas que d'autres services se connectent à Zookeeper car ce serveur Zookeeper est sur le réseau externe.
Interroger la documentation officielle:
Zookeeper est un sous-projet d'Apacahe Hadoop. Il s'agit d'un service d'annuaire de type arborescence qui prend en charge le changement de poussée. Il convient en tant que centre d'enregistrement pour les services Dubbo. Il a une intensité industrielle élevée et peut être utilisé dans des environnements de production. Il est recommandé de l'utiliser.
Description du processus:
• Lorsque le fournisseur de services démarre: rédigez votre propre adresse URL dans le répertoire /dubbo/com.foo.barservice/providers
• Lorsque le consommateur de services démarre: abonnez-vous à l'adresse URL du fournisseur dans le répertoire /dubbo/com.foo.barservice/providers. Et rédigez votre propre adresse URL dans le répertoire /dubbo/com.foo.barservice/Consumers
• Lorsque le centre de surveillance commence: Abonnez-vous à toutes les adresses URL des fournisseurs et des consommateurs dans le répertoire /dubbo/com.foo.barservice
Prend en charge les fonctions suivantes:
• Lorsque le fournisseur a un arrêt anormal tel que la panne de courant, le centre d'enregistrement peut supprimer automatiquement les informations du fournisseur.
• Lorsque le centre d'enregistrement est redémarré, les données d'enregistrement peuvent être automatiquement restaurées et les demandes d'abonnement peuvent être abonnées.
• Lorsque la session expire, les données d'enregistrement peuvent être automatiquement restaurées et les demandes d'abonnement peuvent être abonnées.
• Lors de la définition de <bbo: registre check = "false" />, la demande d'enregistrement et d'abonnement a échoué est enregistrée et l'arrière-plan est chronométré pour réessayer
• Les informations de connexion Zookeeper peuvent être définies via <Dubbo: Registry username = "admin" mot de passe = "1234" />
• Le nœud racine de Zookeeper peut être défini via <Dubbo: Registry Group = "Dubbo" />. Si vous ne le définissez pas, vous utiliserez l'arbre sans racine.
4
L'article 5 du document officiel du site Web stipule clairement que les informations de connexion ZooKeeper peuvent être définies via les champs de nom d'utilisateur et de mot de passe.
Voici les paramètres de registre Description:
Cependant, si vous définissez l'ACL via Digest sur ZooKeeper, puis configurez l'utilisateur et le mot de passe correspondants sur le registre Dubbo, le service ne sera pas enregistré sur ZooKeeper et rapportera WeeterErrorCode = NoAuthr.
Cependant, lorsque j'ai vérifié le code source lié à ZookeeperRegistry, je n'ai trouvé aucune authentification pertinente. J'ai rarement posé des questions similaires sur l'ensemble du réseau, et cette question ne semblait pas faire attention.
ACL dans Zookeeper
Aperçu
Dans les systèmes de fichiers traditionnels, les ACL sont divisés en deux dimensions, l'une est un groupe et l'autre est des autorisations. Les sous-répertoires / fichiers héritent les ACL du répertoire parent par défaut. Dans Zookeeper, le LCA de Node n'a aucune relation d'héritage et est contrôlé indépendamment. Le LCA de Zookeeper peut être compris à partir de trois dimensions: un schéma est un schéma; Le second est l'utilisateur; et le troisième est l'autorisation, qui est généralement exprimée comme
Schéma: ID: autorisation
Les éléments suivants sont introduits à partir de ces trois aspects:
Schéma: le schéma correspond au schéma utilisé pour gérer les autorisations. Zookeeper implémente un schéma de LCA enfichable, qui peut étendre le mécanisme ACL en étendant le schéma. Zookeeper-3.4.4 prend en charge les schémas suivants par défaut:
monde: il n'y a qu'un seul identifiant en dessous, appelé n'importe qui, monde: quiconque représente n'importe qui, et le nœud de Zookeeper qui a la permission à tout le monde appartient au monde: n'importe qui
AUTH: Il ne nécessite pas d'identification, tant que l'utilisateur par l'authentification a des autorisations (Zookeeper prend en charge l'authentification via Kerberos, et prend également en charge l'authentification sous la forme de nom d'utilisateur / mot de passe)
Digest: Son ID correspondant est le nom d'utilisateur: Base64 (Sha1 (mot de passe)), il doit passer l'authentification sous la forme de nom d'utilisateur: mot de passe
IP: Son ID correspondant est l'adresse IP du client. Lorsque vous le définissez, vous pouvez définir un segment IP, tel que IP: 192.168.1.0/16, ce qui signifie que les segments IP correspondent aux 16 premiers bits
Super: Dans ce schéma, l'ID correspondant a des super autorisations et peut tout faire (cdrwa)
Permission: ZooKeeper prend actuellement en charge les autorisations suivantes:
Créer (c): créer une autorisation, vous pouvez créer un nœud enfant sous le nœud actuel
Supprimer (d): supprimer les autorisations, vous pouvez supprimer le nœud actuel
Lire (r): Lire la permission, vous pouvez obtenir les données du nœud actuel, vous pouvez répertorier tous les nœuds enfants dans le nœud actuel
Écrire (w): Écrire l'autorisation, vous pouvez écrire des données sur le nœud actuel
Admin (A): Administration Administration, vous pouvez définir l'autorisation du nœud actuel
Gestion des clients
Nous pouvons nous connecter au client via la commande suivante:
./zkcli.sh
aide
[ZK: localhost: 2181 (connecté) 2] Hostzookeeper -server hôte: port cmd args connect host: port get pathy [watch] LS chemin [watch] se définir les données de chemin [version] rmr pathy delquota [-n | -b] path itters printwatches on | off [-s] [-e] chemin de chemin de chemin ACL [watch] clôture LS2 PATHAL [WATCH] PATAL DATAC ACL ACL STATAC GetAcl Path Sync Path Redoo CMDNO AddAuth Scheme Authre Delete Path [Version] SetQuota -N | -B Val Path
Opération simple
[ZK: localhost: 2181 (connecté) 12] LS / [Dubbo, test, zookeeper] [ZK: localhost: 2181 (connecté) 13] Créer / itstyle Data IP: 192.168.1.190: Cdrwcreated / itstyle [ZK: LocalHost: 2181 (connecté) 14] Getacl /itstyle'ip, '192.168.1.190: CDRW
Code d'opération ZKClient
import java.security.nosuchalgorithmexception; import java.util.arraylist; import java.util.list; import java.util.map; import org.i0itec.zkclient.zkclient; import org.apache.zookeeper.acl; import; org.apache.zookeeper.data.id; import org.apache.zookeeper.data.stat; import org.apache.zookeeper.server.auth.digestauthenticationProvider; classe publique ACL {chaîne finale statique privée zkaddress = "192.168.1.190:2181"; chaîne finale statique privée testNode = "/ dubbo"; chaîne finale statique privée readauth = "lecture-utilisateur: 123456"; chaîne finale statique privée writeAuth = "write-user: 123456"; chaîne finale statique privée DeleteAuth = "Delete-user: 123456"; chaîne finale statique privée allAuth = "Super-utilisateur: 123456"; chaîne finale statique privée admintauth = "admin-user: 123456"; String final statique privé Digest = "Digest"; private static void initNode () lève 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 ("Node Supprimer réussi!"); } List <cl> acls = new ArrayList <Cl> (); ACLS.ADD (New ACL (zoods.perms.all, new ID (Digest, DigestAuthenticationProvider.GenerateDigest (allAuth)))); ACLS.ADD (New ACL (zoods.perms.all, new ID (Digest, DigestAuthenticationProvider.GenerateDigest (allAuth)))); ACLS.Add (New ACL (zoods.perms.read, new ID (Digest, DigestAuthenticationProvider.GenerateDigest (readAuth)))); ACLS.Add (New ACL (zoods.perms.write, new ID (Digest, DigestAuthenticationProvider.Generatedigest (WriteAuth))))); ACLS.ADD (New ACL (zoods.perms.delete, nouvel ID (Digest, DigestAuthenticationProvider.GeneratediGest (DeleteAuth)))); ACLS.Add (New ACL (zoods.perms.admin, nouveau ID (Digest, DigestAuthenticationProvider.Generatedigest (adminauth)))); zkClient.CreatePeSistent (testNode, testNode, ACLS); System.out.println (zkclient.readdata (testNode)); System.out.println ("Node a été créé avec succès!"); zkclient.close (); } private static void readtest () {zkclient zkclient = new ZkClient (zkaddress); try {System.out.println (zkclient.readdata (testNode)); // aucune information d'authentification, une erreur se produira lors de la lecture} catch (exception e) {System.err.println (e.getMessage ()); } essayez {zkclient.addauthinfo (digest, adminauth.getBytes ()); System.out.println (zkclient.readdata (testNode)); // L'autorisation de l'administrateur ne correspond pas à l'autorisation de lecture, et la lecture se produira également lors de la lecture} catch (exception e) {System.err.println (e.getMessage ()); } essayez {zkclient.addauthinfo (digest, readAuth.getBytes ()); System.out.println (zkclient.readdata (testNode)); // seules les informations d'authentification avec l'autorisation de lecture peuvent être lues normalement} catch (exception e) {System.err.println (e.getMessage ()); } zkclient.close (); } private static void writeTest () {zkclient zkclient = new ZkClient (zkaddress); try {zkclient.writeData (testNode, "new-data"); // write échoue sans information d'authentification} catch (exception e) {System.err.println (e.getMessage ()); } essayez {zkclient.addauthinfo (digest, writeAuth.getBytes ()); zkclient.writedata (testNode, "new-data"); // écrivez normalement après avoir ajouté des informations d'authentification} catch (exception e) {System.err.println (e.getMessage ()); } essayez {zkclient.addauthinfo (digest, readAuth.getBytes ()); System.out.println (zkclient.readdata (testNode)); // Lire la nouvelle vérification de valeur} catch (exception 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 ("Node Supprimer réussi!"); } catch (exception e) {System.err.println (e.getMessage ()); } zkclient.close (); } private static void ChangeAclTest () {zkclient zkclient = new ZkClient (zkaddress); // Remarque: la méthode zkclient.setacl peut être trouvée pour afficher le code source. Les méthodes ReadData et SetACl sont appelées. // Pour modifier les attributs ACL du nœud, vous devez avoir à la fois des autorisations de lecture et d'administration: lire et administrer zkclient.addauthinfo (digest, adminauth.getbytes ()); zkclient.addauthinfo (digest, readauth.getBytes ()); try {list <cl> acls = new ArrayList <Cl> (); ACLS.ADDD (New ACL (zoods.perms.all, new ID (Digest, DigestAuthenticationProvider.Generatedigest (adminauth))); zkclient.setacl (testNode, ACLS); Map.Entry <list <cl>, stat> aclresult = zkclient.getacl (testnode); System.out.Println (aclresult.); } Catch (exception e) {System.err.println (e.getMessage ());} zkclient.close ();} public static void main (String [] args) lance l'exception {initNode (); System.out.println ("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Résumer
La plupart des services sont déployés sur l'intranet et sont rarement ouverts au réseau externe. Cependant, l'authentification de la permission de l'utilisateur de Zookeeper de Dubbo ne semble pas fonctionner. Si vous devez l'ouvrir au monde extérieur, vous ne pouvez utiliser que des iptables ou un pare-feu pour effectuer un contrôle d'accès IP. S'il s'agit d'un serveur Cloud Alibaba, le groupe de sécurité est également un bon choix.
L'exemple ci-dessus de l'authentification de sécurité du service distribué Dubbo + Zookeeper est l'ensemble du contenu partagé par l'éditeur. J'espère que cela pourra vous donner une référence et j'espère que vous pourrez soutenir Wulin.com plus.