Prefácio
Como os serviços anteriores estavam todos na intranet, as configurações de cluster do Zookeeper eram todas IP da intranet e a rede externa não abriu portas relevantes. Recentemente, devido a atualizações de negócios, adquirimos os serviços da Alibaba Cloud e precisamos abrir serviços do Zookeeper ao público.
pergunta
Zookeeper+Dubbo, como configurar a autenticação de segurança? Não quero que outros serviços se conectem ao Zookeeper porque este servidor Zookeeper está na rede externa.
Consulte a documentação oficial:
Zookeeper é um sub-projeto de Apacahe Hadoop. É um serviço de diretório do tipo árvore que suporta push de mudança. É adequado como um centro de registro para serviços de Dubbo. Possui alta intensidade industrial e pode ser usado em ambientes de produção. Recomenda -se usá -lo.
Descrição do processo:
• Quando o provedor de serviços iniciar: Escreva seu próprio endereço de URL para o diretório /dubbo/com.foo.barservice/providers
• Quando o consumidor de serviço iniciar: assine o endereço da URL do provedor no diretório /dubbo/com.foo.barsservice/providers. E escreva seu próprio endereço de URL para o diretório /dubbo/com.foo.barsservice/consumers
• Quando o centro de monitoramento inicia: assine todos os endereços de provedor e URL do consumidor no diretório /dubbo/com.foo.barService
Suporta as seguintes funções:
• Quando o provedor tiver um desligamento anormal, como a queda de energia, o Centro de Registro pode excluir automaticamente as informações do provedor.
• Quando o Centro de Registro é reiniciado, os dados de registro podem ser restaurados automaticamente e solicitações de assinatura podem ser assinadas.
• Quando a sessão expirar, os dados de registro podem ser restaurados automaticamente e solicitações de assinatura podem ser inscritas.
• Ao definir <Dubbo: Registry check = "false" />, a solicitação de registro e assinatura falhou é registrada e o plano de fundo é cronometrado para tentar novamente
• As informações de login do Zookeeper podem ser definidas através de <Dubbo: Registry UserName = "Admin" Password = "1234" />
• O nó raiz do Zookeeper pode ser definido através de <Dubbo: Registry Group = "Dubbo" />. Se você não o definir, usará a árvore sem raízes.
• Suporta o caráter * Wildcard <Dubbo: Reference Group = "" Version = "" /> para se inscrever em todos os grupos e todas as versões do serviço
O artigo 5 do documento oficial do site afirma claramente que as informações de login do Zookeeper podem ser definidas através dos campos de nome de usuário e senha.
A seguir, são apresentados os parâmetros do registro descrição:
No entanto, se você definir o ACL através do Digest no Zookeeper e configurar o usuário e a senha correspondentes no Registro Dubbo, o Serviço não será registrado no Zookeeper e relatará o erro KeeperErrorCode = Noauth.
No entanto, quando verifiquei o código -fonte relacionado ao ZookeeperRegistry, não encontrei autenticação relevante. Eu raramente fazia perguntas semelhantes em toda a rede, e essa pergunta não parecia prestar atenção.
ACL em Zookeeper
Visão geral
Nos sistemas de arquivos tradicionais, as ACLs são divididas em duas dimensões, um é um grupo e o outro é permissões. Subdiretos/arquivos herdam as ACLs do diretório pai por padrão. No Zookeeper, o ACL do Node não tem relação de herança e é controlado de forma independente. O ACL do Zookeeper pode ser entendido a partir de três dimensões: um é um esquema; O segundo é o usuário; e o terceiro é a permissão, que geralmente é expressa como
Esquema: ID: Permissões
Os seguintes são introduzidos a partir desses três aspectos:
Esquema: o esquema corresponde a qual esquema é usado para gerenciar permissões. O Zookeeper implementa um esquema de LCA regulável, que pode estender o mecanismo da ACL, estendendo o esquema. Zookeeper-3.4.4 suporta os seguintes esquemas por padrão:
Mundo: Existe apenas um ID abaixo dele, chamado de qualquer pessoa, mundo: alguém representa alguém e o nó em Zookeeper que tem permissão para todos pertencem ao mundo: qualquer um
Auth: não requer ID, desde que o usuário por meio de autenticação tenha permissões (o Zookeeper suporta autenticação através de Kerberos e também suporta autenticação na forma de nome de usuário/senha)
Digest: seu ID correspondente é nome de usuário: base64 (sha1 (senha)), ele precisa passar a autenticação na forma de nome de usuário: senha
IP: Seu ID correspondente é o endereço IP do cliente. Ao defini -lo, você pode definir um segmento IP, como IP: 192.168.1.0/16, o que significa que os segmentos IP correspondem aos 16 primeiros bits
Super: Neste esquema, o ID correspondente tem super permissões e pode fazer qualquer coisa (CDRWA)
Permissão: o Zookeeper atualmente suporta as seguintes permissões:
Criar (c): Crie permissão, você pode criar um nó infantil no nó atual
Excluir (d): Excluir permissões, você pode excluir o nó atual
Leia (R): Leia a permissão, você pode obter os dados do nó atual, você pode listar todos os nós filhos no nó atual
Write (W): Escreva permissão, você pode escrever dados para o nó atual
Admin (a): permissões de administrador, você pode definir a permissão do nó atual
Gerenciamento de clientes
Podemos nos conectar ao cliente através do seguinte comando:
./zkcli.sh
ajuda
[ZK: localhost: 2181 (conectado) 2] helpzookeeper -server host: porta cmd args conectar host: porta get path [watch] ls caminho [relógio] defina dados de caminho [versão] rmr path delquota [-n | -b] pathwer PrintWatches on | GetACl Path Sync Path REdo CMDNO Addauth Scheme Auth Excluir Path [versão] setQuota -n | -b Val caminho
Operação simples
[ZK: localhost: 2181 (conectado) 12] LS /[DUBBO, TEST, Zookeeper] [ZK: localhost: 2181 (conectado) 13] Criar /itstyle Dados IP: 192.168.1.190: CDRWCREATED /ITSTYLE [ZK: LocalHost: 2181 (conectado) 14] /itstyle'ip.'192.168.1.190: cdrw
Código de operação ZKClient
importar java.Security.NosuchalGorithMexception; importar java.util.ArrayList; importar java.util.list; importar java.util.map; importar org.i0itec.zkclient.zkclient; importz.apacheookeeper.ZoodEfSest; org.apache.zookeeper.data.id; importar org.apache.zookeeper.data.stat; importar org.apache.zookeeper.server.auth.digestauthenticationProvider; classe pública LCL {private Static Final String Zkaddress = "192.18.1.190; String final estática privada testNode = "/dubbo"; String final estática privada Readauth = "Leitura-usuário: 123456"; WriteAuth de sequência final estática privada = "Usuador de gravação: 123456"; String final estática privada DeleteAuth = "Delete-User: 123456"; String final estática privada Allauth = "Super-usuário: 123456"; String final estática privada Adminauth = "Admin-User: 123456"; String final estática privada Digest = "Digest"; private estático void initNode () lança 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 exclua bem -sucedido!"); } Lista <Cl> ACLS = new ArrayList <CCl> (); ACLS.Add (novo ACL (Zoodefs.perms.all, novo ID (Digest, DigestauthenticationProvider.Generatedigest (Allauth)))); ACLS.Add (novo ACL (Zoodefs.perms.all, novo ID (Digest, DigestauthenticationProvider.Generatedigest (Allauth)))); ACLS.Add (novo ACL (Zoodefs.perms.read, novo ID (Digest, DigestauthenticationProvider.Generatedigest (readauth)))); ACLS.Add (novo ACL (Zoodefs.perms.write, novo ID (Digest, DigestauthenticationProvider.Generatedigest (WriteAuth))))); ACLS.Add (novo ACL (Zoodefs.perms.Delete, novo ID (Digest, DigestauthenticationProvider.Generatedigest (DeleteAuth)))); ACLS.Add (novo ACL (Zoodefs.perms.admin, novo ID (Digest, DigestauthenticationProvider.Generatedigest (Adminauth)))); zkclient.createPersistent (testNode, testNode, ACLS); System.out.println (zkclient.readData (testNode)); System.out.println ("O nó foi criado com sucesso!"); zkclient.close (); } private static void readTest () {zkclient zkclient = new zkclient (zkaddress); tente {System.out.println (zkclient.readData (testNode)); // Nenhuma informação de autenticação, ocorrerá um erro ao ler} catch (Exceção e) {System.err.println (e.getMessage ()); } tente {zkclient.addauthinfo (Digest, Adminauth.getBytes ()); System.out.println (zkclient.readData (testNode)); // A permissão do administrador não corresponde à permissão de leitura, e a leitura também ocorrerá ao ler} catch (exceção e) {System.err.println (e.getMessage ()); } tente {zkclient.addauthinfo (Digest, reedauth.getBytes ()); System.out.println (zkclient.readData (testNode)); // apenas as informações de autenticação com permissão de leitura podem ser lidas normalmente} catch (Exceção e) {System.err.println (e.getMessage ()); } zkclient.close (); } private static void writEtest () {zkclient zkclient = new zkclient (zkaddress); tente {zkclient.WritedAtATA (testNode, "new-Data"); // A gravação falha sem informações de autenticação} Catch (Exceção e) {System.err.println (e.getMessage ()); } tente {zkclient.addauthinfo (Digest, writeauth.getbytes ()); zkclient.WritedAtATA (TestNode, "new-Data"); // Escreva normalmente após a adição de informações de autenticação} (Exceção e) {System.err.println (e.getMessage ()); } tente {zkclient.addauthinfo (Digest, reedauth.getBytes ()); System.out.println (zkclient.readData (testNode)); // Leia a nova verificação do valor} Catch (Exceção e) {System.err.println (e.getMessage ()); } zkclient.close (); } private estático void deleteTest () {zkclient zkclient = new zkclient (zkaddress); zkclient.addauthinfo (Digest, deleteauth.getBytes ()); tente {System.out.println (zkclient.readData (testNode)); zkclient.Delete (testNode); System.out.println ("Node exclua bem -sucedido!"); } catch (Exceção e) {System.err.println (e.getMessage ()); } zkclient.close (); } private static void changeAclTest () {zkclient zkclient = new zkclient (zkaddress); // Nota: o método zkclient.setacl pode ser encontrado para visualizar o código -fonte. Os métodos ReadData e Setacl são chamados. // Então, para modificar os atributos da ACL do nó, você deve ter permissões de leitura e administração: leia e admin zkclient.addauthinfo (Digest, Adminauth.getBytes ()); zkclient.addauthinfo (Digest, reedauth.getBytes ()); tente {list <Cl> ACLS = new ArrayList <CCL> (); ACLS.Add (New ACL (ZoodEfs.perms.all, novo ID (Digest, DigestauthenticationProvider.Generatedigest (Adminauth))); Zkclient.setacl (testNode, ACLS); map.entry <List <Cl>, Stat> AclResult = Zkclient.get.get.getn (testn); System.out.println (aclResult.getKey ()); System.out.println ("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Resumir
A maioria dos serviços é implantada na intranet e raramente é aberta à rede externa. No entanto, a autenticação de permissão do usuário do Zookeeper de Dubbo não parece funcionar. Se você precisar abri -lo ao mundo exterior, só poderá usar iptables ou firewall para executar o controle de acesso IP. Se for um servidor em nuvem do Alibaba, o grupo de segurança também é uma boa escolha.
O exemplo acima de autenticação de segurança do serviço distribuído Dubbo+Zookeeper é o conteúdo inteiro compartilhado pelo editor. Espero que possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.