Агент Solr — плагин авторизации узлов: Solr спрашивает его о каждом запросе, и он отвечает по подписанным политикам сервиса данных solr. Дистрибутив поставляет его одним JAR-файлом Java 11, agents/solr/grantforge-agent-solr-<version>.jar, со встроенными и перемещёнными зависимостями.
Интеграционные тесты Testcontainers в репозитории запускают JAR внутри узлов SolrCloud версий Solr 9.8.1, 9.10.1, 9.11.0 и 10.0.0. Это не означает сертификацию всех остальных версий. Плагин сервиса описан в Apache Solr.
Как это работает
- Запросы классифицируются так же, как их классифицирует Solr. Каждый обработчик запросов называет нужное ему право, например
readилиcollection-admin-edit, как и для собственного плагина правил Solr; агент превращает это имя в тип доступа, а обработчик, который ничего не называет, решается по типу запроса. - Каждый запрос к коллекции решается и на её пути запроса. Агент решает запрос к
salesчерез/selectна коллекцииsalesи наsalesс путём/select: запрет на любом из них отклоняет запрос, так что политика может запретить один обработчик коллекции. - Команды администрируют свои коллекции. Запросу Collections API, называющему коллекции, нужен
admin_collectionна каждой из них, поэтому политика может разрешить команде создавать, перезагружать или удалять только коллекции с её префиксом. - Администраторы кластера могут всё.
adminна кластере разрешает любой запрос, как собственное право Solrall. - Политики могут действовать только для некоторых сетей. Каждая проверка несёт адрес клиента; за обратными прокси, которым доверяет агент, клиент — это последний адрес в
X-Forwarded-For, добавленный не доверенным прокси. - Проверенные роли JSON Web Token считаются группами. При JWT-аутентификации Solr роли, которые утверждение токена даёт пользователю, становятся группами решения наряду с группами, в которые GrantForge включает пользователя.
- Отказы записываются в журнал с причиной. Solr отвечает на отклонённый запрос своим 403; журнал узла называет политику GrantForge, которая его запретила, или сообщает, что ни одна его не разрешает.
- Решения кэшируются, обращения объединяются. Решения текущего снимка хранятся, по умолчанию 100 000 на 10 секунд, а новый снимок начинает заново. Одинаковые разрешённые обращения в пределах окна, по умолчанию 10 секунд, передаются одним событием доступа с их количеством; отказы передаются по одному и сразу. Каждое событие называет коллекцию и путь или кластер, а также адрес клиента.
- Узлы не проверяются. Запросы между узлами, которые Solr подписывает от имени самого узла, пропускаются; запрос без пользователя получает требование войти.
| Запрос | Нужный доступ |
|---|---|
| Поиск, получение, экспорт, запрос через любой обработчик чтения | query на коллекции и пути |
| Добавление, обновление или удаление документов | update на коллекции и пути |
| Чтение или изменение схемы коллекции | schema_read или schema_edit |
| Чтение или изменение конфигурации коллекции | config_read или config_edit |
| Запросы Collections API, называющие коллекции: создание, перезагрузка, резервное копирование, восстановление, удаление, изменение, их состояние в кластере | admin_collection на каждой названной коллекции |
| Проверки состояния; метрики | health; metrics на кластере |
| Список коллекций, состояние ядер, чтение ZooKeeper, файлового хранилища и пакетов | admin_read на кластере |
| Чтение или изменение аутентификации и авторизации | security на кластере |
| Администрирование ядер, изменения файлового хранилища и пакетов и всё, что не называет ни один обработчик | admin на кластере |
Развёртывание
-
Добавьте сервис данных
solrи настройте его политики, включаяadminна кластере для администраторов Solr. Откройте Права доступа к данным → Агенты, выберите сервис и выпустите токен агента. Он показывается только один раз; сохраните его в файл, доступный для чтения только учётной записи Solr. -
Скопируйте JAR в
server/solr-webapp/webapp/WEB-INF/libкаждого узла, например/opt/solr/server/solr-webapp/webapp/WEB-INF/lib, и перезапустите узлы по одному. -
Задайте раздел авторизации в
security.jsonкластера рядом с плагином аутентификации, заменив адрес, пути и имя экземпляра из примера:{ "authentication": { "class": "solr.BasicAuthPlugin", "blockUnknown": true, "credentials": { "solr": "<salted SHA-256 hash> <salt>" } }, "authorization": { "class": "org.devlive.grantforge.solr.agent.GrantForgeSolrAuthorizer", "grantforge.server.url": "https://grantforge.example.com", "grantforge.token.file": "/var/solr/data/grantforge.token", "grantforge.instance": "solr-cluster", "grantforge.cache.dir": "/var/solr/data/grantforge-cache" } }Загрузите его командой
bin/solr zk cp file:security.json zk:/security.json -z <zookeeper>; узлы применяют его без перезапуска. Аутентификация должна быть включена, чтобы у запросов были пользователи. -
В Solr 9 учтите менеджер безопасности Java, который Solr включает по умолчанию: храните токен, закреплённый ключ и каталог кэша внутри
SOLR_HOME, например/var/solr/data, и выдайте агенту то, что ему нужно сверх политики Solr, вserver/etc/security.policyили в собственном файле политики, который-Djava.security.propertiesдобавляет какpolicy.url.3:grant { permission java.security.SecurityPermission "getProperty.org.devlive.grantforge.solr.agent.internal.bouncycastle.*"; };Solr 10 работает без менеджера безопасности.
-
Сначала перенесите существующие права: права и роли пользователей плагина правил Solr больше не действуют. Заранее создайте соответствующие политики. Пока у агента нет первого снимка, запросы, кроме запросов между узлами, отклоняются.
| Параметр | Назначение |
|---|---|
grantforge.server.url, grantforge.token.file, grantforge.instance, grantforge.cache.dir |
Обязательные: сервер GrantForge, файл токена агента, имя для узлов кластера и каталог с правом записи для подписанного снимка и буферизованных событий |
grantforge.trusted.proxies |
Обратные прокси, чьему X-Forwarded-For доверяет агент, адреса или диапазоны через запятую; по умолчанию нет |
grantforge.signing.key.file |
Необязательный файл, закрепляющий ключ подписи снимков; скопируйте открытый ключ X.509 Ed25519 в кодировке Base64 со страницы «Агенты». Если он не задан, ключ берётся с сервера при первом обращении |
grantforge.connect.timeout.ms, grantforge.read.timeout.ms |
Тайм-ауты подключения и чтения к GrantForge, по умолчанию 5000 / 8000 миллисекунд |
grantforge.refresh.interval.ms |
Как часто агент запрашивает новые политики, по умолчанию 30000, не меньше 1000 миллисекунд |
grantforge.audit.batch.size, grantforge.audit.queue.capacity, grantforge.audit.flush.interval.ms, grantforge.audit.spool.limit.bytes |
События доступа: размер пакета (по умолчанию 500), размер очереди (по умолчанию 10000), интервал отправки (по умолчанию 5000 миллисекунд) и предел буфера на диске (по умолчанию 64 МиБ) |
grantforge.audit.fold.window.ms |
Как долго одинаковые разрешённые обращения объединяются в одно событие, по умолчанию 10000, до 3600000 миллисекунд; 0 передаёт каждое |
grantforge.decision.cache.size, grantforge.decision.cache.ttl.ms |
Наибольшее число хранимых решений, по умолчанию 100000, до 10000000, 0 — не хранить; и как долго, по умолчанию 10000, 1..3600000 миллисекунд |
Пользователи, группы и роли
Политики называют пользователя, которого удостоверяет аутентификация Solr, например пользователя basic-аутентификации или субъект JSON Web Token. Группы — это роли, которые JSON Web Token подтвердил для пользователя, вместе с группами, в которые GrantForge включает пользователя; роли — это роли, которые GrantForge выдаёт пользователю.
Решения и ограничения
- Без пригодного снимка отклоняется всё, кроме запросов между узлами. Неиспользуемый сервис оставляет Solr без проверок, как без плагина авторизации.
- Токен, привязанный к сервису с типом не
solr, отклоняет всё. - Запрос Collections API, который называет свои коллекции только в теле JSON, как некоторые запросы API v2, не называет ни одной видимой агенту коллекции, и ему нужен
adminна кластере. - Solr разрешает псевдонимы в коллекции до того, как спросить, поэтому политики называют коллекции, а не псевдонимы.
- API Solr
/admin/authorizationне может изменять правила агента: политики хранит GrantForge. - Адреса клиентов — только адреса и диапазоны; имя хоста ничему не соответствует.
- Решения хранятся
grantforge.decision.cache.ttl.ms, поэтому политика начинает или перестаёт действовать с задержкой до этого времени.
