GrantForge

    Плагины

    Агент Apache ZooKeeper

    Разверните агент на каждом узле ZooKeeper, чтобы применять политики GrantForge через ACL-маркеры.

    Серверный плагин 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, но совместимость с конкретными версиями ещё требует практической проверки. Это не означает, что вся матрица версий проверена или что приёмка для промышленной эксплуатации завершена.

    Развёртывание

    1. Установите JAR в каталог lib каждого сервера ZooKeeper, включая все узлы, способные принимать клиентские запросы. Создайте учётные данные Agent в соответствующем сервисе данных GrantForge типа zookeeper. Сохраните токен в отдельном файле, доступном для чтения только учётной записи, от которой работает ZooKeeper; не записывайте сам токен в zoo.cfg.

    2. Добавьте следующие параметры в 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
    3. Этот провайдер заменяет штатный SASL-провайдер; не оставляйте другой провайдер, зарегистрированный для той же схемы sasl, в какой-либо другой записи authProvider.N. Параметр enableEagerACLCheck=false обязателен: если проверка включена, регистрация провайдера отклоняется и маркер не разрешает доступ. Сохраните и проверьте штатную аутентификацию ZooKeeper с SASL, JAAS и Kerberos; агент не заменяет аутентификацию. Перезапустите серверы по процедуре обслуживания ансамбля.

    4. При необходимости задайте 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 и не обеспечивает полный аудит доступа.

    Редактировать эту страницу на GitHub