Prefacio
Dado que los servicios anteriores estaban todos en la intranet, las configuraciones de clúster Zookeeper eran todas IP de Intranet, y la red externa no abrió puertos relevantes. Recientemente, debido a las actualizaciones comerciales, hemos comprado los servicios de Alibaba Cloud y necesitamos abrir los servicios de Zookeeper al público.
pregunta
Zookeeper+Dubbo, ¿cómo configurar la autenticación de seguridad? No quiero que otros servicios se conecten a Zookeeper porque este servidor Zookeeper está en la red externa.
Consulta la documentación oficial:
Zookeeper es un subproyecto de Apacahe Hadoop. Es un servicio de directorio de tipo árbol que admite el impulso de cambio. Es adecuado como centro de registro para los servicios de Dubbo. Tiene alta intensidad industrial y puede usarse en entornos de producción. Se recomienda usarlo.
Descripción del proceso:
• Cuando se inicia el proveedor de servicios: escriba su propia dirección de URL en el directorio /dubbo/com.foo.barservice/providers
• Cuando se inicia el consumidor del servicio: suscríbase a la dirección de URL del proveedor en el directorio /dubbo/com.foo.barservice/providers. Y escriba su propia dirección de URL en el directorio /dubbo/com.foo.barservice/consumers
• Cuando se inicia el centro de monitoreo: suscríbase a todas las direcciones de URL de proveedores y consumidores en el directorio /dubbo/com.foo.Barservice
Admite las siguientes funciones:
• Cuando el proveedor tiene un apagado anormal, como el apagón, el centro de registro puede eliminar automáticamente la información del proveedor.
• Cuando se reinicie el centro de registro, los datos de registro se pueden restaurar automáticamente y se pueden suscribir las solicitudes de suscripción.
• Cuando expira la sesión, los datos de registro se pueden restaurar automáticamente y las solicitudes de suscripción pueden suscribirse.
• Al configurar <Dubbo: Registry check = "False" />, se registra la solicitud de registro y suscripción y los antecedentes están programados para volver a intentarlo
• La información de inicio de sesión de Zookeeper se puede establecer a través de <dubbo: registro username = "admin" contraseña = "1234" />
• El nodo raíz de Zookeeper se puede establecer a través de <Dubbo: Registry Group = "Dubbo" />. Si no lo establece, usará el árbol sin raíces.
• Admite el * carácter comodín <dubbo: reference group = "" versión = "" /> para suscribirse a todos los grupos y todas las versiones del servicio
El artículo 5 del documento oficial del sitio web establece claramente que la información de inicio de sesión de Zookeeper se puede establecer a través de los campos de nombre de usuario y contraseña.
Los siguientes son los parámetros de registro Descripción:
Sin embargo, si establece el ACL a través de Digest en ZOOKEEPER y luego configura el usuario y la contraseña correspondientes en el registro DUBBO, el servicio no se registrará en ZOOKEEPER e informará KeeperErRRIrCode = NoAuth Error.
Sin embargo, cuando verifiqué el código fuente relacionado con el cero de Zookeeperregistry, no encontré una autenticación relevante. Raramente hice preguntas similares en toda la red, y esta pregunta no parecía recibir atención.
ACL en Zookeeper
Descripción general
En los sistemas de archivos tradicionales, los ACL se dividen en dos dimensiones, uno es un grupo y el otro es permisos. Los subdirectorios/archivos heredan las ACL del directorio principal de forma predeterminada. En Zookeeper, el ACL de Node no tiene una relación de herencia y está controlada de forma independiente. El ACL de Zookeeper se puede entender a partir de tres dimensiones: uno es esquema; El segundo es el usuario; y el tercero es el permiso, que generalmente se expresa como
Esquema: ID: permisos
Los siguientes se introducen a partir de estos tres aspectos:
Esquema: el esquema corresponde a qué esquema se utiliza para administrar los permisos. Zookeeper implementa un esquema de ACL conectable, que puede extender el mecanismo de ACL extendiendo el esquema. ZOOKEEPER-3.4.4 Admite los siguientes esquemas de forma predeterminada:
Mundo: solo hay una identificación debajo, llamada cualquiera, mundo: cualquiera representa a cualquiera y el nodo en Zookeeper que tiene permiso para todos pertenece al mundo: cualquiera
Auth: no requiere ID, siempre que el usuario a través de la autenticación tenga permisos (Zookeeper admite la autenticación a través de Kerberos, y también admite la autenticación en forma de nombre de usuario/contraseña)
Digest: su identificación correspondiente es Nombre de usuario: Base64 (SHA1 (Password)), necesita pasar la autenticación en forma de nombre de usuario: Contraseña
IP: su ID correspondiente es la dirección IP del cliente. Al configurarlo, puede establecer un segmento IP, como IP: 192.168.1.0/16, lo que significa que los segmentos IP coinciden con los primeros 16 bits
Super: En este esquema, la identificación correspondiente tiene super permisos y puede hacer cualquier cosa (CDRWA)
Permiso: Zookeeper actualmente admite los siguientes permisos:
Crear (c): Crear permiso, puede crear el nodo infantil en el nodo actual
Eliminar (d): Eliminar permisos, puede eliminar el nodo actual
Leer (R): Leer permiso, puede obtener los datos del nodo actual, puede enumerar todos los nodos infantiles en el nodo actual
Escribir (w): escribir permiso, puede escribir datos en el nodo actual
Admin (a): permisos de administración, puede establecer el permiso del nodo actual
Gestión del cliente
Podemos conectarnos al cliente a través del siguiente comando:
./zkcli.sh
ayuda
[ZK: LocalHost: 2181 (conectado) 2] Ayhebookeeper -Server Host: Port CMD Args Connect Host: Port Get Rath [Watch] ls ruta [watch] establecer datos de ruta [Versión] RMR ruta delquota [-n | -b] ruta de imprenta de ruta en la ruta de la ruta de la ruta de la ruta de la ruta de la ruta de la ruta [-E] ruta getacl sync ruta redo cmdno addauth esquema authelet ruta [versión] setquota -n | -b val ruta
Operación simple
[Zk: Localhost: 2181 (conectado) 12] LS /[Dubbo, Test, Zookeeper] [Zk: Localhost: 2181 (conectado) 13] Crear /IP de datos de estilo: 192.168.1.190: CDRWCreated /ItStyle [ZK: Localhost: 2181 (conectado) 14] Getacl /itstyle'ip,'192.168.1.190: CDRW
Código de operación de zkclient
import java.security.nosuchalgorithmexception; import java.util.arrayList; import java.util.list; import java.util.map; importar org.i0itec.zkclient.zkclient; import org.apache.zookeeper.zoodefs; importación org.apache.zookeeper.data.id; import org.apache.zookeeper.data.stat; import org.apache.zookeepers.server.auth.digestauthenticationProvider; public class acl {private static string Zkaddress = "192.168.1.190:2181"; cadena final estática privada testNode = "/dubbo"; String final estática privada ReadAuth = "User de lectura: 123456"; String final estática privada WriteAuth = "User de escritura: 123456"; static final static final de Deleteauth = "User de Delete: 123456"; cadena final estática privada Allauth = "Super-User: 123456"; Cadena final estática privada adminauth = "Admin-User: 123456"; Private static final String Digest = "Digest"; Private static void initNode () lanza NosuchalgorithMexxception {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 ("¡Eliminar el nodo exitoso!"); } List <Acl> acls = new ArrayList <Acl> (); ACLS.Add (nuevo ACL (Zoodefs.Perms.all, New ID (Digest, DigestauthenticationProvider.Generatedigest (Allauth)))); ACLS.Add (nuevo ACL (Zoodefs.Perms.all, New ID (Digest, DigestauthenticationProvider.Generatedigest (Allauth)))); ACLS.Add (nuevo ACL (ZOODEFS.Perms.Read, New ID (Digest, DigestauthenticationProvider.Generatedigest (ReadAuth)))); ACLS.Add (nuevo ACL (Zoodefs.Perms.Write, New ID (Digest, DigestauthenticationProvider.Generatedigest (WriteAuth))))); ACLS.Add (nuevo ACL (Zoodefs.Perms.Delete, New ID (Digest, DigestauthenticationProvider.Generatedigest (Deleteauth)))); ACLS.Add (nuevo ACL (Zoodefs.Perms.admin, New ID (Digest, DigestauthenticationProvider.Generatedigest (Adminauth)))); zkclient.createPersistent (testNode, testNode, acls); System.out.println (zkclient.readData (testNode)); System.out.println ("¡El nodo se creó con éxito!"); zkclient.close (); } private static void readTest () {zkclient zkclient = new ZkClient (zkaddress); intente {System.out.println (zkclient.readData (testNode)); // Sin información de autenticación, se producirá un error al leer} Catch (Exception e) {System.err.println (e.getMessage ()); } try {zkclient.addauthinfo (digest, adminauth.getBytes ()); System.out.println (zkclient.readData (testNode)); // El permiso de administrador no coincide con el permiso de lectura, y la lectura también ocurrirá al leer} Catch (Exception e) {System.err.println (e.getMessage ()); } try {zkclient.addauthinfo (digest, readAuth.getBytes ()); System.out.println (zkclient.readData (testNode)); // Solo la información de autenticación con permiso de lectura se puede leer normalmente} capt (excepción e) {system.err.println (e.getMessage ()); } zkclient.close (); } private static void writeTest () {zkclient zkclient = new ZkClient (zkaddress); Pruebe {zkclient.writedata (testNode, "nuevo data"); // escribir falla sin información de autenticación} capt (excepción e) {system.err.println (e.getMessage ()); } try {zkclient.addauthinfo (digest, writeAuth.getBytes ()); zkclient.writedata (testNode, "niew-data"); // Escribir normalmente después de agregar información de autenticación} Catch (Exception e) {System.err.println (e.getMessage ()); } try {zkclient.addauthinfo (digest, readAuth.getBytes ()); System.out.println (zkclient.readData (testNode)); // lea nueva verificación de valor} capt (excepción e) {system.err.println (e.getMessage ()); } zkclient.close (); } private static void deletetest () {zkclient zkclient = new ZkClient (zkaddress); zkclient.addauthinfo (digest, deleteauth.getbytes ()); intente {System.out.println (zkclient.readData (testNode)); zkclient.delete (testNode); System.out.println ("¡Eliminar el nodo exitoso!"); } catch (excepción e) {system.err.println (e.getMessage ()); } zkclient.close (); } private static void changleAclTest () {zkclient zkclient = new ZkClient (zkaddress); // Nota: se puede encontrar el método ZKClient.SetAcl para ver el código fuente. Se llaman a los métodos de lectura y setACL. // Entonces, para modificar los atributos de ACL del nodo, debe tener permisos de lectura y administración: leer y administrador zkclient.addauthinfo (digest, adminauth.getBytes ()); zkclient.addauthinfo (digest, readAuth.getBytes ()); intente {list <Acl> acls = new ArrayList <Acl> (); ACLS.Add (nuevo ACL (ZOODEFS.PERMS.ALL, NEW ID (Digest, DigESTauthenticationProvider.Generatedigest (adminauth))); zkclient.setacl (testNode, acls); map.Entry <List <ACL>, stat> aclresult = zkclient.getacl (testNode); System.out.println (aclResult.getKey ()); System.out.println ("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------Resumir
La mayoría de los servicios se implementan en la intranet y rara vez están abiertos a la red externa. Sin embargo, la autenticación de permiso del usuario del usuario de Dubbo en Zookeeper no parece funcionar. Si tiene que abrirlo al mundo exterior, solo puede usar iptables o firewall para realizar el control de acceso IP. Si se trata de un servidor en la nube de Alibaba, el grupo de seguridad también es una buena opción.
El ejemplo anterior de la autenticación de seguridad del servicio distribuido Dubbo+Zookeeper es todo el contenido compartido por el editor. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.