Серверный плагин grantforge-plugin-zookeeper задаёт тип сервиса zookeeper, его ресурсы и конфигурацию подключения. Для применения политик нужна ещё одна часть, работающая внутри самого ZooKeeper: агент, который участвует в решениях серверов по ACL как провайдер аутентификации SASL. Он находится в agents/grantforge-agent-zookeeper; команда mvn -pl agents/grantforge-agent-zookeeper -am package создаёт один совместимый с Java 8 shaded JAR со всеми его зависимостями, который в дистрибутиве лежит по пути agents/zookeeper/grantforge-agent-zookeeper-<version>.jar. Реализация рассчитана на API ZooKeeper 3.6–3.9, но совместимость с конкретными версиями ещё требует практической проверки. Это не означает, что вся матрица версий проверена или что приёмка для промышленной эксплуатации завершена.
Развёртывание
-
Установите JAR в каталог
libкаждого сервера ZooKeeper, включая все узлы, способные принимать клиентские запросы. Создайте учётные данные Agent в соответствующем сервисе данных GrantForge типаzookeeper. Сохраните токен в отдельном файле, доступном для чтения только учётной записи, от которой работает ZooKeeper; не записывайте сам токен вzoo.cfg. -
Добавьте следующие параметры в
zoo.cfgкаждого сервера, заменив адрес, пути и идентификатор экземпляра из примера.grantforge.server.url(http[s]://GrantForge),grantforge.token.file, локальныйgrantforge.cache.dirиgrantforge.instanceобязательны. Учётная запись ZooKeeper должна иметь право записи в каталог кеша.authProvider.1=org.devlive.grantforge.zookeeper.agent.GrantForgeSaslAuthenticationProvider enableEagerACLCheck=false grantforge.server.url=https://GrantForge grantforge.token.file=/etc/zookeeper/grantforge.token grantforge.cache.dir=/var/lib/zookeeper/grantforge-cache grantforge.instance=zk-1 grantforge.principal.mapping=short -
Этот провайдер заменяет штатный SASL-провайдер; не оставляйте другой провайдер, зарегистрированный для той же схемы
sasl, в какой-либо другой записиauthProvider.N. ПараметрenableEagerACLCheck=falseобязателен: если проверка включена, регистрация провайдера отклоняется и маркер не разрешает доступ. Сохраните и проверьте штатную аутентификацию ZooKeeper с SASL, JAAS и Kerberos; агент не заменяет аутентификацию. Перезапустите серверы по процедуре обслуживания ансамбля. -
При необходимости задайте
grantforge.signing.key.file— путь к файлу с закреплённым доверенным открытым ключом подписи. Значение по умолчаниюgrantforge.principal.mapping=shortпреобразуетkafka/host@REALMвkafka;fullсохраняет полный principal. Пользователи в политиках должны соответствовать полученным идентичностям.
ACL и ограничения
- Только ACL-маркер
sasl:grantforgeпередаёт решение политикам GrantForge, напримерsasl:grantforge:cdrwa, гдеc=create,d=delete,r=read,w=writeиa=admin. Остальные штатные ACL, включая другие SASL-идентичности, работают как обычно. - Маркер отказывает в доступе, если агент не запущен, нет пригодного снимка политик, его
serviceTypeотличается отzookeeperили ни одна политика не соответствует запросу/не разрешает доступ. Это не глобальный запрет: другие ACL,world:anyoneили идентичностьsuperвсё ещё могут разрешить запрос. - Политики сопоставляются с абсолютным целевым путём на сервере. Для
create/deleteэто создаваемый/удаляемый znode, а не родитель, чья ACL проверяется. Для запросов с chroot путь в политике должен включать фактический префикс chroot:/brokersвнутри chroot/kafkaсоответствует/kafka/brokers. Последовательныйcreateпроверяет абсолютный префикс запроса на сервере до добавления порядкового номера; последующиеread/deleteпроверяют полное имя созданного узла. - Штатные ACL не переносятся автоматически, а ACL не наследуются рекурсивно; новым znode нужно явно задавать ACL-маркер. Перед применением
setACLпроверьте разрешённые и отклонённые запросы на небольшом участке и сохраните независимый канал административного доступа. Не устанавливайте маркер на корневой узел без тщательной проверки, иначе можно заблокировать доступ. - Сервер без агента сопоставляет
sasl:grantforgeсо штатной SASL-идентичностьюgrantforge, а не с политиками. Поэтому агент необходим на всех узлах; частичное развёртывание не защищает ансамбль. - У запросов записи, пересланных от follower/observer к leader, на этом интерфейсе провайдера может отсутствовать клиентское соединение, поэтому контекст
clientAddressможет быть пустым. Сквозное применение политик по IP клиента во всём ансамбле не гарантируется. - Этот провайдер не может узнать окончательный результат запроса, поэтому не отправляет итоговые события аудита
AccessEventи не обеспечивает полный аудит доступа.
