GrantForge

    Поисковые движки

    Агент Elasticsearch

    Запустить агент Elasticsearch рядом с кластером, чтобы политики GrantForge становились собственными ролями Elasticsearch, выданными внутренним пользователям и сопоставленными с пользователями других областей, с безопасностью на уровне полей и документов там, где её даёт лицензия, шаблоны индексов оставались шаблонами и новые индексы были доступны сразу, а обращения сообщались из файлов журнала аудита.

    Агент Elasticsearch — это сервис рядом с кластером. Он поддерживает собственный контроль доступа Elasticsearch в соответствии с подписанными политиками сервиса данных elasticsearch: одна роль на пользователя, которая содержит ровно то, что ему дают политики, с безопасностью на уровне полей и документов там, где её даёт лицензия кластера. Внутренний (native) пользователь носит роль среди собственных ролей; пользователь другой области (realm), например LDAP, SAML или OpenID Connect, получает её через сопоставление ролей по своему имени. Затем Elasticsearch сам проверяет каждый запрос, а агент никогда не стоит между клиентами и кластером. Дистрибутив поставляет его как исполняемый JAR agents/elasticsearch/grantforge-agent-elasticsearch-<version>.jar, которому нужна Java 17 или новее.

    Интеграционные тесты Testcontainers в репозитории запускают агент и поставляемый JAR на Elasticsearch 8.19, 9.3, 9.4 и 9.5 с включённой безопасностью. Это не означает сертификацию всех остальных версий; агент отклоняет кластеры старше 8.19, кластеры без безопасности и кластеры OpenSearch, которые ведёт агент OpenSearch. О сервисном плагине см. Elasticsearch.

    Как это работает

    • Одна роль на пользователя содержит то, что даёт GrantForge. Для каждого пользователя, которому политики что-то дают, агент ведёт роль с его именем, grantforge_alice для alice. Её метаданные называют пользователя и помечают роль как роль агента, и агент не считает своей ни одну роль без этой метки, поэтому не меняет никаких других ролей.
    • Внутренние пользователи носят роль; другие области получают её по имени. Агент добавляет роль к ролям внутреннего пользователя и сохраняет все остальные его роли. Сопоставления ролей действуют во всех областях, кроме внутренней и файловой, поэтому агент ведёт также одноимённое сопоставление ролей, которое выдаёт роль имени пользователя, — для пользователей, входящих через LDAP, Active Directory, SAML, OpenID Connect, JWT, Kerberos или PKI. Файловую область нельзя изменить через API Elasticsearch; её пользователи роль не получают.
    • Шаблоны индексов остаются шаблонами. Шаблон индекса из политики, например logs-*, выдаётся как шаблон там, где все политики решают одинаково по всему шаблону: любая политика любого вида, чьи индексы пересекаются с шаблоном, покрывает его целиком. Агент решает это точно, с помощью конечных автоматов шаблонов. Индексы, созданные позже, например завтрашние журналы, тогда сразу доступны, в том числе когда их создаёт первый записанный документ. Где политика внутри шаблона решает иначе, например запрет logs-secret внутри logs-*, агент выдаёт каждый индекс и поток данных кластера по имени, а новые — при следующей синхронизации.
    • Безопасность на уровне полей — только где ниже решается иначе. Индекс, который пользователь может читать целиком и где ни одна политика не может отнять поле, читается без безопасности на уровне полей, поэтому поля, добавленные позже, читаются сразу. Иначе пользователь читает поля, которые разрешает политика, из тех, что есть в его документах и что названы в политиках, каждое вместе с мультиполями, например name.keyword вместе с name.
    • Фильтры строк — это безопасность на уровне документов. Фильтр строк становится запросом записи. API validate Elasticsearch проверяет каждый запрос до выдачи; запрос, который Elasticsearch не выполнил бы, не показывает пользователю ни одного документа и записывается в журнал.
    • Ниже Platinum — никогда больше, чем разрешают политики. Безопасность на уровне документов и полей есть в Elasticsearch начиная с лицензии Platinum, а ниже неё он отключает любую роль, которая её использует. Агент читает лицензию при каждой синхронизации. Ниже Platinum чтение, которому нужна любая из них, потому что политика ограничивает поля или документы индекса, не выдаётся вовсе, и агент записывает в журнал, какой пользователь не может читать какой индекс и почему; чтение целых индексов и всё остальное выдаётся как обычно.
    • Одна запись на набор привилегий. Индексы и шаблоны с одинаковыми привилегиями делят одну запись; записи никогда не пересекаются, поскольку Elasticsearch объединяет безопасность на уровне полей и документов пересекающихся записей.
    • Политики текущего момента. Каждая синхронизация планирует по политикам в том виде, в каком они действуют в этот момент, поэтому сроки действия начинаются и заканчиваются вовремя.
    • Роли внутренних пользователей — это группы. Политика для группы действует для внутренних пользователей, у которых есть роль с таким именем, вместе с группами, в которые GrantForge помещает пользователей.
    • Ручные изменения отменяются. При каждой синхронизации агент сравнивает свои роли, сопоставления ролей и роли внутренних пользователей с тем, что хранит Elasticsearch; отличия записываются заново, а роль одного пользователя, которую носит другой, отбирается. Роли записываются до выдачи, одним запросом, и отбираются до удаления. Если ничего не изменилось, агент ничего не отправляет; изменение, которое Elasticsearch отклоняет, записывается в журнал и не останавливает остальные.
    • Роли вне GrantForge сообщаются. Elasticsearch выдаёт то, что даёт любая из ролей пользователя, поэтому агент не может отнять то, что даёт другая роль. Он однократно предупреждает о каждой такой роли, которую носит внутренний пользователь или выдаёт сопоставление ролей по его имени, и которая даёт то, что запрещает политика, называя роль, пользователя, доступ, индекс и политику, а также о пользователях с ролью superuser, которых не ограничивает ни одна роль.
    • Обращения берутся из файлов журнала аудита. Elasticsearch пишет журнал аудита только в файл на каждом узле. Агент читает указанные ему файлы с того места, где закончилось последнее чтение, следует за ними при ротации и сообщает события access_granted и access_denied. Каждое событие называет пользователя, тип доступа, каждый затронутый индекс или поток данных либо кластер и сообщает, решил ли это GrantForge или разрешила роль вне GrantForge.
    Действие Событие доступа
    indices:data/read/*: поиск, получение, подсчёт read на каждом индексе или потоке данных
    indices:data/write/index, update, bulk index
    indices:data/write/delete delete
    indices:admin/create, auto_create, data_stream/create create_index
    indices:admin/delete, data_stream/delete delete_index
    indices:admin/get, mappings/get, settings/get, resolve/* view_index_metadata
    indices:monitor/*; прочие indices:admin/* monitor; manage
    cluster:monitor/*, cluster:admin/snapshot/* и repository/*, slm/* cluster_monitor, create_snapshot, manage_slm на кластере
    Шаблоны индексов и компонентов, конвейеры приёма, cluster:admin/ilm/* manage_index_templates, manage_ingest_pipelines, manage_ilm на кластере

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

    1. Добавьте сервис данных elasticsearch и настройте его политики. Откройте Права доступа к данным → Агенты, выберите сервис и выпустите токен агента. Он показывается только один раз; сохраните его в файл, который может читать только учётная запись агента.

    2. Дайте агенту пользователя с кластерной привилегией manage_security, которая управляет ролями, сопоставлениями ролей и пользователями, и с правом читать отображения каждого индекса и проверять запросы, например пользователя с ролью superuser. Он может входить по паролю, по API-ключу, созданному этим пользователем, или по клиентскому сертификату, который область PKI сопоставляет с ним.

    3. Чтобы сообщать об обращениях, включите журнал аудита (xpack.security.audit.enabled: true), для которого нужна лицензия Gold или выше, и дайте агенту читать файлы аудита узлов, <имя кластера>_audit.json в каталоге журналов каждого узла: запустите агент на узле или соберите файлы в каталог, который он может читать. xpack.security.audit.logfile.events.include: access_granted, access_denied ограничивает журнал тем, о чём сообщает агент.

    4. Напишите файл параметров, заменив примерные адреса, пути и имена:

      grantforge.server.url=https://grantforge.example.com
      grantforge.token.file=/etc/grantforge/elasticsearch-agent.token
      grantforge.instance=elasticsearch-agent-1
      grantforge.cache.dir=/var/lib/grantforge/elasticsearch-agent
      grantforge.elasticsearch.hosts=https://es1.internal:9200,https://es2.internal:9200
      grantforge.elasticsearch.user=grantforge
      grantforge.elasticsearch.password.file=/etc/grantforge/elasticsearch-agent.password
      grantforge.elasticsearch.tls.ca=/etc/grantforge/http_ca.crt
      grantforge.audit.log.files=/var/log/elasticsearch/production_audit.json

      Эти пути находятся на машине агента, а каталог кэша должен быть доступен для записи. Файлы паролей и ключей читаются в UTF-8 с обрезкой пробелов.

    5. Запустите агент, например как службу systemd:

      java -jar agents/elasticsearch/grantforge-agent-elasticsearch-<version>.jar /etc/grantforge/elasticsearch-agent.properties

      Замените <version> версией дистрибутива. Параметры, переданные как java -Dgrantforge.…=… -jar …, переопределяют файл. По SIGTERM агент корректно останавливается и отправляет или откладывает ожидающие события; Elasticsearch сохраняет то, что получил.

    6. Перенесите существующие роли в политики: роли, которые пользователи носят вне GrantForge, продолжают действовать наряду с ролями агента. Создайте соответствующие политики, затем отберите эти роли у пользователей; предупреждения агента называют роли, которые дают то, что запрещает политика.

    Параметр Назначение
    grantforge.server.url, grantforge.token.file, grantforge.instance, grantforge.cache.dir Обязательно: сервер GrantForge, файл токена агента, имя этого агента и доступный для записи каталог для подписанного снимка, отложенных событий и позиций чтения журнала аудита
    grantforge.signing.key.file Необязательный файл, закрепляющий ключ подписи снимков; скопируйте открытый ключ X.509 Ed25519 в Base64 со страницы «Агенты». Если не задан, ключ берётся с сервера при первом обращении
    grantforge.elasticsearch.hosts Обязательно: узлы в виде URL, по очереди, если один недоступен; без схемы узел считается https, порт по умолчанию 9200
    grantforge.elasticsearch.user, grantforge.elasticsearch.password.file Пользователь агента и файл его пароля
    grantforge.elasticsearch.api.key.file Вместо этого: файл закодированного API-ключа в том виде, в каком его возвращает Elasticsearch при создании
    grantforge.elasticsearch.tls.cert, grantforge.elasticsearch.tls.key Вместо этого: клиентский PEM-сертификат и его закрытый ключ, вместе, для входа по сертификату; grantforge.elasticsearch.tls.key.passphrase.file содержит парольную фразу зашифрованного ключа
    grantforge.elasticsearch.ssl.verification.mode full (по умолчанию) проверяет сертификаты и имена узлов, certificate — только сертификаты, none — ничего
    grantforge.elasticsearch.tls.ca PEM-сертификаты CA, которыми проверяются узлы, например http_ca.crt Elasticsearch; пусто — доверие тому, чему доверяет Java
    grantforge.elasticsearch.timeout.ms Сколько могут занимать подключение и запрос, по умолчанию 30000, диапазон 1..600000 миллисекунд
    grantforge.elasticsearch.role.prefix Начало имён ролей агента, по умолчанию grantforge_; строчные буквы, цифры, дефисы и подчёркивания, оканчивается подчёркиванием, не более 32 символов. Агенту принадлежат помеченные им роли, имена которых начинаются с него
    grantforge.elasticsearch.unmanaged.users Пользователи, которых агент не трогает, через запятую, например сервисные учётные записи; своего пользователя, зарезервированных пользователей Elasticsearch и пользователей с ролью superuser он не трогает никогда
    grantforge.sync.interval.ms Как часто агент приводит Elasticsearch в соответствие, по умолчанию 10000, диапазон 1000..3600000 миллисекунд
    grantforge.audit.log.files Файлы журнала аудита для чтения, через запятую; без них агент не читает журнал аудита и не сообщает об обращениях
    grantforge.audit.log.interval.ms, grantforge.audit.log.max.lines Как часто читаются файлы, по умолчанию 5000 миллисекунд, и наибольшее число строк, которое одно чтение берёт из каждого, по умолчанию 5000, чтобы накопившееся читалось за несколько проходов
    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 — отправлять каждое

    Пользователи, группы и роли

    Политики называют пользователей Elasticsearch по их именам пользователей. Агент ведёт роли для внутренних пользователей, для пользователей, названных в политиках, которые могут входить через другую область, и для пользователей, для которых он уже вёл роли; зарезервированных пользователей Elasticsearch, например kibana_system, он не трогает. Группы — это остальные роли внутреннего пользователя вместе с группами, в которые GrantForge помещает пользователя; группы, которые каталог выдаёт при входе, агенту неизвестны, поэтому задайте таким пользователям группы в GrantForge. Роли — это роли, которые GrantForge даёт пользователю.

    Решения и ограничения

    • Без снимка агент ничего не меняет. Неиспользуемый сервис или токен, привязанный к сервису с типом не elasticsearch, ничего не выдают: агент отбирает свои роли и удаляет их вместе с сопоставлениями ролей, и действуют собственные роли Elasticsearch.
    • Пока агент не работает, Elasticsearch сохраняет то, что получил последним; изменения политик ждут агента. Изменение доходит до Elasticsearch в пределах интервала обновления и интервала синхронизации.
    • Индексы, выданные по имени, а не через шаблон, получают привилегии при следующей синхронизации.
    • Ниже Platinum пользователь, чтение индекса которым ограничивает политика, не читает из него ничего; ниже Gold агент не сообщает об обращениях.
    • Сопоставление ролей по имени пользователя действует в каждой области с таким именем пользователя; политики называют пользователей, а не области.
    • Псевдонимы ведут к индексам за ними, поэтому политики называют индексы и потоки данных, а не псевдонимы. Индексы, имена которых начинаются с точки, доступны только через шаблоны политик, начинающиеся с точки.
    • Пространства (spaces) и привилегии приложений Kibana агент не ведёт.

    Связанные руководства

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