머리말
이전 서비스는 모두 인트라넷에 있었기 때문에 Zookeeper 클러스터 구성은 모두 인트라넷 IP였으며 외부 네트워크는 관련 포트를 열지 않았습니다. 최근 비즈니스 업그레이드로 인해 Alibaba Cloud의 서비스를 구매했으며 대중에게 사육사 서비스를 개설해야합니다.
질문
Zookeeper+Dubbo, 보안 인증을 설정하는 방법? 이 Zookeeper 서버가 외부 네트워크에 있기 때문에 다른 서비스가 Zookeeper에 연결하는 것을 원하지 않습니다.
공식 문서 쿼리 :
Zookeeper는 Apacahe Hadoop의 하위 프로젝트입니다. 변경 푸시를 지원하는 트리 타입 디렉토리 서비스입니다. Dubbo Services의 등록 센터로 적합합니다. 산업 강도가 높고 생산 환경에서 사용할 수 있습니다. 사용하는 것이 좋습니다.
프로세스 설명 :
• 서비스 제공 업체가 시작될 때 : 자신의 URL 주소를 /dubbo/com.foo.barservice/providers 디렉토리에 작성하십시오.
• 서비스 소비자가 시작될 때 : /dubbo/com.foo.barservice/providers 디렉토리의 제공자 URL 주소를 구독하십시오. 자신의 URL 주소를 /dubbo/com.foo.barservice/consumers 디렉토리에 작성하십시오.
• 모니터링 센터가 시작될 때 : 모든 공급자 및 소비자 URL 주소를 구독하여 /dubbo/com.foo.barservice 디렉토리
다음 기능을 지원합니다.
• 공급자에게 정전과 같은 비정상적인 종료가 있으면 등록 센터는 공급자 정보를 자동으로 삭제할 수 있습니다.
• 등록 센터가 다시 시작되면 등록 데이터를 자동으로 복원하고 구독 요청을 구독 할 수 있습니다.
• 세션이 만료되면 등록 데이터를 자동으로 복원하고 구독 요청을 구독 할 수 있습니다.
• <dubbo : registry check = "false"를 설정할 때 등록 및 구독 요청이 실패하고 배경이 재 시도됩니다.
• Zookeeper 로그인 정보는 <dubbo : registry username = "admin"password = "1234" />를 통해 설정할 수 있습니다.
• Zookeeper의 루트 노드는 <dubbo : registry group = "dubbo" />를 통해 설정할 수 있습니다. 설정하지 않으면 루트리스 트리를 사용합니다.
• * 와일드 카드 문자 <dubbo : 참조 그룹 = ""버전 = " /> 모든 그룹과 모든 버전의 서비스를 구독합니다.
공식 웹 사이트 문서 제 5 조에 따르면 Zookeeper 로그인 정보는 사용자 이름 및 비밀번호 필드를 통해 설정할 수 있습니다.
다음은 레지스트리 매개 변수 설명입니다.
그러나 Zookeeper의 Digest를 통해 ACL을 설정 한 다음 Dubbo Registry에서 해당 사용자 및 비밀번호를 구성하면 서비스가 Zookeeper에 등록되지 않으며 KeeperErrorCode = NoAuth 오류를보고합니다.
그러나 ZookeeperRegistry 관련 소스 코드를 확인했을 때 관련 인증이 없습니다. 나는 전체 네트워크에서 비슷한 질문을 거의하지 않았 으며이 질문은주의를 기울이지 않은 것 같습니다.
동물원의 ACL
개요
기존 파일 시스템에서 ACL은 두 차원으로 나뉘어져 있으며, 하나는 그룹이고 다른 하나는 권한입니다. 하위 디렉터/파일은 기본적으로 상위 디렉토리의 ACL을 상속합니다. 사육사에서 Node의 ACL은 상속 관계가 없으며 독립적으로 제어됩니다. Zookeeper의 ACL은 3 차원에서 이해할 수 있습니다. 하나는 구성표입니다. 두 번째는 사용자입니다. 그리고 세 번째는 허가이며, 일반적으로
체계 : ID : 권한
다음은이 세 가지 측면에서 소개됩니다.
체계 : 체계는 권한을 관리하는 데 사용되는 체계에 해당합니다. Zookeeper는 플러그 가능한 ACL 방식을 구현하여 체계를 확장하여 ACL 메커니즘을 확장 할 수 있습니다. Zookeeper-3.4.4는 기본적으로 다음 체계를 지원합니다.
세계 : 그 아래에는 하나의 신분증이 있는데, 누구나, 세계 : 누구든지 누구나 대표하고 모든 사람에게 허가를받는 Zookeeper의 노드는 누구나 다음과 같습니다.
AUTH : 사용자가 인증을 통한 권한이있는 한 ID가 필요하지 않습니다 (Zookeeper는 Kerberos를 통한 인증을 지원하고 사용자 이름/암호 형식으로 인증을 지원합니다).
DIGEST : 해당 ID는 사용자 이름 : Base64 (SHA1 (Password))입니다. 사용자 이름 : 비밀번호 형식으로 인증을 전달해야합니다.
IP : 해당 ID는 클라이언트의 IP 주소입니다. 설정할 때 IP : 192.168.1.0/16과 같은 IP 세그먼트를 설정할 수 있습니다. 즉, IP 세그먼트가 처음 16 비트와 일치 함을 의미합니다.
SUPER :이 체계에서 해당 ID에는 수퍼 권한이 있으며 무엇이든 할 수 있습니다 (CDRWA).
허가 : Zookeeper는 현재 다음과 같은 권한을 뒷받침합니다.
생성 (c) : 권한을 만들면 현재 노드에서 하위 노드를 만들 수 있습니다.
삭제 (d) : 권한 삭제, 현재 노드를 삭제할 수 있습니다
읽기 (R) : 읽기 권한, 현재 노드의 데이터를 얻을 수 있고 현재 노드에 모든 자식 노드를 나열 할 수 있습니다.
쓰기 (w) : 쓰기 권한, 현재 노드에 데이터를 쓸 수 있습니다.
admin (a) : 관리자 권한, 현재 노드의 허가를 설정할 수 있습니다.
고객 관리
다음 명령을 통해 클라이언트에 연결할 수 있습니다.
./zkcli.sh
돕다
[ZK : LocalHost : 2181 (Connected) 2] HELPZOOKEEREPER- 호스트 : 포트 CMD ARGS CONNECT 호스트 : 포트 GET 경로 [시계] LS 경로 [시계] 경로 데이터 설정 [버전] RMR 경로 Delquota [-N | -B] Path Quit Printwatches [-S] getAcl 경로 동기화 경로 redo cmdno addauth scheme auth delete path [version] setquota -n | -b val path
간단한 작동
[ZK : LocalHost : 2181 (Connected) 12] LS /[Dubbo, Test, Zookeeper] [ZK : LocalHost : 2181 (Connected) 13] CREATE /ITSTYLE DATA IP : 192.168.1.190 : CDRWCREATED /ITSTYLE [ZK : LocalHost : 2181 (Connected) 14] GetAcl /Uit'ip,'192.168.
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.zoodefs; import org.apache.zookeper.zookeper org.apache.zookeeper.data.id; import org.apache.zookeeper.data.stat; import org.apache.zookeeper.server.auth.auth.digestauthenticationprovider; public class acl {private static final string zkaddress = "192.168.190:2181"; 개인 정적 최종 문자열 testnode = "/dubbo"; 개인 정적 최종 문자열 readauth = "read-user : 123456"; 개인 정적 최종 문자열 writeauth = "쓰기 사용자 : 123456"; 개인 정적 최종 문자열 deleteauth = "delete-user : 123456"; 개인 정적 최종 문자열 allauth = "슈퍼 사용자 : 123456"; 개인 정적 최종 문자열 adminauth = "관리자 : 123456"; 개인 정적 최종 문자열 다이제스트 = "다이제스트"; private static void initnode ()는 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 ( "노드 삭제 성공!"); } list <Acl> acls = new ArrayList <Acl> (); acls.add (new ACL (zoodefs.perms.all, new id (digest, digestauthenticationprovider.generatedigest (allauth)))); acls.add (new ACL (zoodefs.perms.all, new 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 (writeauth))))); acls.add (new ACL (zoodefs.perms.delete, new ID (digest, digestauthenticationProvider.generatedIgest (deleteauth)))); acls.add (new ACL (zoodefs.perms.admin, new id (digest, digestauthenticationprovider.generatedigest (adminauth)))); zkclient.createPersistent (TestNode, TestNode, ACL); System.out.println (zkclient.readdata (testnode)); System.out.println ( "노드가 성공적으로 생성되었습니다!"); zkclient.close (); } private static void ReadTest () {zkclient zkclient = new zkclient (zkaddress); {system.out.println (zkclient.readdata (testnode)); // 인증 정보가 없으면} catch (예외 e) {system.err.println (e.getMessage ()); } try {zkclient.addauthinfo (digest, adminauth.getBytes ()); system.out.println (zkclient.readdata (testnode)); // admin 권한은 읽기 권한과 일치하지 않으며 reading} catch (예외 e) {system.err.println (e.getMessage ()); } try {zkclient.addauthinfo (digest, readauth.getBytes ()); system.out.println (zkclient.readdata (testnode)); // 읽기 권한이있는 인증 정보 만 읽을 수 있습니다} catch (예외 e) {system.err.println (e.getMessage ()); } zkclient.close (); } private static void writeTest () {zkclient zkclient = new zkclient (zkaddress); try {zkclient.writedata (testnode, "new-data"); // 인증 정보없이 쓰기 실패} catch (예외 e) {system.err.println (e.getMessage ()); } try {zkclient.addauthinfo (digest, writeAuth.getBytes ()); zkclient.writedata (TestNode, "New-Data"); // 인증 정보를 추가 한 후 정상적으로 쓰기} catch (예외 e) {System.err.println (e.getMessage ()); } try {zkclient.addauthinfo (digest, readauth.getBytes ()); System.out.println (zkclient.readdata (testnode)); // 새 값 verification} catch (예외 e) {System.err.println (e.getMessage ()); } zkclient.close (); } private static void deletetest () {zkclient zkclient = new zkclient (zkaddress); zkclient.addauthinfo (digest, deleteauth.getBytes ()); {system.out.println (zkclient.readdata (testnode)); zkclient.delete (TestNode); System.out.println ( "노드 삭제 성공!"); } catch (예외 e) {System.err.println (e.getMessage ()); } zkclient.close (); } private static void ChangeAcltest () {zkclient zkclient = new zkclient (zkaddress); // 참고 : zkclient.setAcl 메소드는 소스 코드를 볼 수 있습니다. readData 및 setAcl 메소드가 호출됩니다. // 노드의 ACL 속성을 수정하려면 읽기 및 관리자 권한이 모두 있어야합니다. 읽기 및 admin zkclient.addauthinfo (digest, adminauth.getBytes ()); zkclient.addauthinfo (digest, readauth.getBytes ()); try {list <acl> acls = new arraylist <acl> (); acls.add (new ACL (zoodefs.perms.all, new id (digest, digestauthenticationprovider.generateGest (adminauth))); zkclient.setAcl (testnode, acls); map.Entry <acl>, stat> aclresult = zkclient.getacl (testnode); system.out.println (aclresult.getkey ())}} {system.err.println (e.getMessage ()); System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------요약
대부분의 서비스는 인트라넷에 배포되며 외부 네트워크에 거의 열리지 않습니다. 그러나 Dubbo의 Zookeeper 사용자 권한 인증은 작동하지 않는 것 같습니다. 외부 세계에 열어야하는 경우 iptables 또는 방화벽을 사용하여 IP 액세스 제어를 수행 할 수 있습니다. 알리바바 클라우드 서버 인 경우 보안 그룹도 선택합니다.
분산 서비스 Dubbo+Zookeeper의 보안 인증의 위의 예는 편집자가 공유하는 전체 컨텐츠입니다. 나는 그것이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.