Предисловие
Поскольку все предыдущие службы были во всем интрасети, конфигурации кластера Zookeeper были все интрасети IP, а внешняя сеть не открывала соответствующие порты. В последнее время, благодаря улучшению бизнеса, мы приобрели услуги Alibaba Cloud и должны открыть услуги Zookeeper для общественности.
вопрос
Zookeeper+Dubbo, как настроить аутентификацию безопасности? Я не хочу, чтобы другие службы подключались к Zookeeper, потому что этот сервер Zookeeper находится на внешней сети.
Запросите официальную документацию:
Zookeeper-это субпроект Apacahe Hadoop. Это служба каталога типа дерева, которая поддерживает толчок изменения. Он подходит в качестве регистрационного центра для Dubbo Services. Он имеет высокую интенсивность промышленности и может использоваться в производственных средах. Рекомендуется использовать его.
Описание процесса:
12
• Когда потребитель сервисов запускается: подпишитесь на адрес URL -поставщика в каталоге /dubbo/com.foo.barservice/providers. И напишите свой собственный адрес URL -адреса в каталог /dubbo/com.foo.barservice/consumers
• Когда начинается центр мониторинга: подпишитесь на все адреса URL -поставщиков и потребителей в каталоге /dubbo/com.foo.barservice
Поддерживает следующие функции:
• Когда у поставщика есть ненормальное отключение, такое как отключение электроэнергии, регистрационный центр может автоматически удалять информацию по провайдеру.
• Когда регистрационный центр перезапускается, регистрационные данные могут быть автоматически восстановлены, а запросы на подписку могут быть подписаны.
• Когда сеанс истекает, данные регистрации могут быть автоматически восстановлены, а запросы на подписку могут быть подписаны.
• При настройке <dubbo: registry check = "false" />, записан неудачный запрос на регистрацию и подписку, и фон приурочен к повторному
• Информация о входе в систему Zookeeper может быть установлена через <dubbo: реестр username = "admin" password = "1234" />
• Корневой узел Zookeeper может быть установлен через <dubbo: реестр Group = "dubbo" />. Если вы не установите, вы будете использовать дерево без корней.
• Поддерживает символ * WildCard <Dubbo: reference Group = "" version = "" />, чтобы подписаться на все группы и все версии сервиса
В статье 5 официального документа веб -сайта четко указывается, что информация о входе в систему Zookeeper может быть установлена через поля имени пользователя и пароля.
Ниже приведены описание параметров реестра:
Однако, если вы установите ACL через Digest на Zookeeper, а затем настроите соответствующий пользователь и пароль в реестре Dubbo, служба не будет зарегистрирована на Zookeeper и сообщит о ehepererRorcode = noauth.
Однако, когда я проверил исходный код, связанный с Zookeeperregistry, я не нашел соответствующей аутентификации. Я редко задавал аналогичные вопросы по всей сети, и этот вопрос, похоже, не обращал внимания.
ACL в Zookeeper
Обзор
В традиционных файловых системах ACL разделены на два измерения, одно из них - группа, а другой - разрешения. Подкатализаторы/Файлы по умолчанию наследуют ACL родительского каталога. В Zookeeper ACL узела не имеет отношений наследования и независимо контролируется. ACL Zookeeper можно понять из трех измерений: один из них - схема; Второй - пользователь; и третье - разрешение, которое обычно выражается как
Схема: ID: разрешения
Следующее введено из этих трех аспектов:
Схема: схема соответствует какой схеме используется для управления разрешениями. Zookeeper реализует схему подключения ACL, которая может расширить механизм ACL, расширяя схему. Zookeeper-3.4.4 поддерживает следующие схемы по умолчанию:
World: Под ним есть только один идентификатор, называемый любому, мир: кто -либо представляет кого -либо, а узел в Zookeeper, который имеет разрешение для всех, принадлежит миру: любой любой
Auth: он не требует идентификатора, пока пользователь через аутентификацию имеет разрешения (Zookeeper поддерживает аутентификацию через Kerberos, а также поддерживает аутентификацию в форме имени пользователя/пароля)
Дайджест: его соответствующий идентификатор - имя пользователя: Base64 (SHA1 (пароль)), он должен передать аутентификацию в форме имени пользователя: пароль
IP: его соответствующий идентификатор - IP -адрес клиента. При его настройке вы можете установить сегмент IP, такой как IP: 192.168.1.0/16, что означает, что сегменты IP совпадают с первыми 16 битами
Супер: В этой схеме соответствующий идентификатор имеет супер разрешения и может сделать что угодно (CDRWA)
разрешение: Zookeeper в настоящее время поддерживает следующие разрешения:
Создать (c): Создать разрешение, вы можете создать дочерний узел под текущим узлом
Удалить (d): удалить разрешения, вы можете удалить текущий узел
Reade (r): разрешение на чтение, вы можете получить данные текущего узла, вы можете перечислить все дочерние узлы в текущем узле
Записать (w): Написать разрешение, вы можете записать данные в текущий узел
Администратор (а): разрешения администратора, вы можете установить разрешение текущего узла
Управление клиентами
Мы можем подключиться к клиенту с помощью следующей команды:
./zkcli.sh
помощь
[ZK: Localhost: 2181 (подключен) 2] helpekeokeeper -server-хост: порт cmd args подключение хоста: port get path [watch] path [watch] установить данные пути [версия] rmr pathta delquota [-n | -b] Путь quit printwatches на | Путь getacl path Path Path Redo cmdno схема схемы Addauth
Простая операция
[ZK: Localhost: 2181 (подключен) 12] LS /[Dubbo, Test, Zookeeper] [ZK: Localhost: 2181 (подключен) 13] Create /ItStyle Data IP: 192.168.1.190: cdrwcreated /itstyle [zk: localhost: 2181 (подключен) 14] getacl /itstyle'ip,192.168.1.190: cdrw
ZKClient операционной код
Импорт java.security.nosuchalgorithmexception; import java.util.arraylist; import java.util.list; import java.util.map; импорт org.i0itec.zkclient.zkclient; import.apache.zookeeper.zoodefs; import org.apache. org.apache.zookeeper.data.id; import org.apache.zookeeper.data.stat; import org.apache.zookeeper.server.auth.digestauthenticationprovider; public class acl {частная статическая конечная строка zkaddress = "192.168.1.190:2181"; частная статическая конечная строка testnode = "/dubbo"; частная статическая конечная строка readauth = "read-user: 123456"; частная статическая финальная строка writeauth = "write-user: 123456"; Частная статическая конечная строка deleteauth = "Delete-User: 123456"; частная статическая конечная строка Allauth = "Super-User: 123456"; частная статическая финальная строка adminauth = "admin-user: 123456"; частная статическая конечная строка digest = "digest"; private static void initnode () бросает nochuchalgorithmexception {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 <Cl> acls = new ArrayList <Cl> (); acls.add (новый ACL (Zoodefs.perms.all, новый ID (Digest, DigestAuthenticationProvider.GeneratedIgest (allauth)))); acls.add (новый ACL (Zoodefs.perms.all, новый ID (Digest, DigestAuthenticationProvider.GeneratedIgest (allauth)))); acls.add (новый ACL (Zoodefs.perms.read, New Id (Digest, DigestAuthenticationProvider.GeneratedIgest (readAuth)))); acls.add (новый ACL (Zoodefs.perms.write, New Id (Digest, DigestAuthenticationProvider.GeneratedIgest (writeauth)))))); acls.add (новый ACL (Zoodefs.perms.delete, New Id (Digest, DigestAuthenticationProvider.GeneratedIgest (deleteauth)))); acls.add (новый ACL (Zoodefs.perms.admin, New Id (Digest, DigestAuthenticationProvider.GeneratedIgest (Adminauth)))); zkclient.createPersistent (testnode, testnode, acls); System.out.println (zkclient.readdata (testnode)); System.out.println («Узел был создан успешно!»); zkclient.close (); } private static void readtest () {zkclient zkclient = new zkclient (zkaddress); try {system.out.println (zkclient.readdata (testnode)); // нет информации об аутентификации, при чтении} Catch (Exception e) {System.err.println (e.getMessage ()); } try {zkclient.addauthinfo (digest, adminauth.getbytes ()); System.out.println (zkclient.readdata (testnode)); // разрешение администратора не соответствует разрешению на чтение, а чтение также будет происходить при чтении} Catch (Exception e) {System.err.println (e.getMessage ()); } try {zkclient.addauthinfo (digest, readauth.getbytes ()); System.out.println (zkclient.readdata (testnode)); // Только информация о аутентификации с разрешения на чтение может быть нормально прочитана} 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 сбои без информации об аутентификации} catch (Exception e) {System.err.println (e.getMessage ()); } try {zkclient.addauthinfo (digest, writeauth.getbytes ()); zkclient.writedata (testnode, "new-data"); // Написать нормально после добавления информации о аутентификации} Catch (Exception e) {System.err.println (e.getMessage ()); } try {zkclient.addauthinfo (digest, readauth.getbytes ()); System.out.println (zkclient.readdata (testnode)); // Читать проверку нового значения} 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 ("Узел удалить успешно!"); } catch (Exception 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 <cl> acls = new ArrayList <Cl> (); acls.add (new 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 ("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Суммировать
Большинство услуг развертываются во интрасети и редко открыты для внешней сети. Тем не менее, аутентификация разрешения пользователя Dubbo Zookeeper, похоже, не работает. Если вам нужно открыть его для внешнего мира, вы можете использовать только iptables или брандмауэр для выполнения IP -адреса. Если это облачный сервер Alibaba, группа безопасности также является хорошим выбором.
Приведенный выше пример аутентификации безопасности распределенной службы Dubbo+Zookeeper - это весь контент, разделенный редактором. Я надеюсь, что это может дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.