Агент Hive — авторизатор API авторизации Hive, как и плагин Hive в Apache Ranger: HiveServer2 обращается к нему перед каждым оператором, а он отвечает по подписанным политикам сервиса данных hive. Дистрибутив поставляет его одним совместимым с Java 8 JAR-файлом agents/hive/grantforge-agent-hive-<version>.jar с перенесёнными внутрь зависимостями.
Интеграционные тесты Testcontainers в репозитории запускают JAR внутри HiveServer2 3.1.3, 4.0.1 и 4.1.0. Это не означает сертификации остальных версий. Плагин сервиса описан в разделе Apache Hive.
Как это работает
- Операторы проверяются. Для каждого объекта, который оператор читает или пишет, агент запрашивает у политик тип доступа, нужный операции, как Ranger; первый отказ завершает оператор ошибкой
Permission denied: user [alice] does not have [SELECT] privilege on [hr.salaries]. Запросы проверяются по столбцам. - Списки фильтруются.
SHOW DATABASESиSHOW TABLESпоказывают только то, что пользователь может использовать: любой доступ к базе данных или таблице либо к чему-то внутри них.USEиDESCRIBE DATABASEтребуют того же. - Запросы маскируются и фильтруются. Если у пользователя есть маскированные столбцы или фильтр строк в таблице, HiveServer2 переписывает запрос с масками и условием, поэтому соединения, условия и функции видят только то, что пользователю разрешено видеть.
- Маски нельзя обойти. Запись, изменение или экспорт таблицы, для которой у пользователя есть маска или фильтр строк, отклоняются, как Ranger делает по умолчанию.
- Права и роли принадлежат GrantForge.
GRANT,REVOKE,SHOW GRANT,CREATE ROLE,SET ROLEи остальные операторы ролей Hive отклоняются;SHOW CURRENT ROLESпоказывает роли, которые GrantForge назначил пользователю. - Небезопасные операторы отклоняются. Команды
dfs, которые обращались бы к файловой системе с правами самого HiveServer2, отклоняются. В сеансах HiveServer2 запрещены скриптыTRANSFORM, а пользователи могут менять черезSETтолько параметры, разрешённые стандартной SQL-авторизацией Hive. - Каждое решение сообщается в GrantForge с пользователем, адресом клиента, ресурсом, типом доступа, результатом, операцией и оператором.
| Операция | Тип доступа |
|---|---|
Запросы, SHOW CREATE TABLE, SHOW PARTITIONS, SHOW TBLPROPERTIES, DESCRIBE, SHOW COLUMNS, ANALYZE |
select |
INSERT, UPDATE, DELETE, MERGE, TRUNCATE, LOAD (цель) |
update |
CREATE DATABASE, CREATE TABLE, CREATE VIEW, CREATE FUNCTION |
create для создаваемого, select для читаемого |
ALTER …, MSCK |
alter |
DROP … |
drop |
LOCK, UNLOCK |
lock |
SHOW DATABASES, SHOW TABLES, USE, DESCRIBE DATABASE |
Любой доступ к объекту или к чему-то внутри него |
REPL DUMP, REPL LOAD, REPL STATUS |
repladmin |
KILL QUERY, планы ресурсов, администрирование LLAP |
serviceadmin для hiveservice |
Временные функции, ADD JAR, COMPILE |
tempudfadmin для global |
| Места, которые оператор читает или пишет | read или write для url |
Развёртывание
-
Добавьте сервис данных
hiveи настройте его политики, в том числе разрешающую всё необходимое пользователям, от имени которых HiveServer2 выполняет собственную работу, напримерhive. Откройте Права доступа к данным → Агенты, выберите сервис и выпустите токен агента. Он показывается один раз; сохраните его в файле, доступном для чтения только учётной записи HiveServer2. -
Скопируйте JAR в
libкаждого HiveServer2, например/opt/hive/lib. -
Добавьте параметры в
hiveserver2-site.xmlилиhive-site.xmlкаждого HiveServer2, заменив адрес, пути и имя экземпляра из примера:<property><name>hive.security.authorization.enabled</name><value>true</value></property> <property><name>hive.security.authorization.manager</name> <value>org.devlive.grantforge.hive.agent.GrantForgeHiveAuthorizerFactory</value></property> <property><name>hive.security.authenticator.manager</name> <value>org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator</value></property> <property><name>hive.server2.enable.doAs</name><value>false</value></property> <property><name>grantforge.server.url</name><value>https://grantforge.example.com</value></property> <property><name>grantforge.token.file</name><value>/etc/hive/grantforge.token</value></property> <property><name>grantforge.instance</name><value>hs2-1</value></property> <property><name>grantforge.cache.dir</name><value>/var/lib/hive/grantforge-cache</value></property>Каталог кеша должен быть доступен для записи учётной записи HiveServer2. Как и с Ranger,
hive.server2.enable.doAs=falseзаставляет HiveServer2 читать и писать данные от своей учётной записи, так что кто что видит, решают политики. -
Перезапустите HiveServer2. Агент запускается с первым сеансом и останавливается вместе с сервером, отправляя или сохраняя в очередь ожидающие события.
-
Закройте обходные пути мимо HiveServer2: агент проверяет только операторы, выполняемые в HiveServer2. Клиенты, обращающиеся напрямую к metastore или к файлам хранилища, например Hive CLI, Spark или клиенты HDFS, не проверяются; защитите их собственными правами metastore и HDFS или агентом HDFS.
| Параметр | Назначение |
|---|---|
grantforge.server.url, grantforge.token.file, grantforge.instance, grantforge.cache.dir |
Обязательные: сервер GrantForge, файл токена агента, имя этого HiveServer2 и доступный для записи каталог для подписанного снимка и событий в очереди |
grantforge.signing.key.file |
Необязательный файл, закрепляющий ключ подписи снимков; скопируйте открытый ключ Ed25519 X.509 в кодировке 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 МиБ) |
Агент читает параметры из конфигурационных файлов HiveServer2 и из системных свойств (-Dgrantforge.…, они имеют приоритет), но никогда — из параметров сеанса, которые может задать клиент.
Пользователи, группы и роли
Политики называют пользователя, которого HiveServer2 назначает сеансу: имя, с которым входит клиент, или краткое имя его принципала Kerberos (alice для alice@EXAMPLE.COM). Группы — это группы, которые сопоставление групп Hadoop даёт пользователю в HiveServer2, вместе с группами, в которые GrantForge включает пользователя; роли — те, что GrantForge назначает пользователю.
Решения и ограничения
- Без пригодного снимка или если политики невозможно прочитать, отклоняется любой оператор. Неиспользуемый сервис оставляет HiveServer2 без проверок, как без авторизатора.
- Токен, привязанный к сервису с типом, отличным от
hive, отклоняет всё. - Места, которые читают и пишут операторы, определяют политики
url; в отличие от Ranger, агент не обращается к правам файловой системы. - Операторы, для которых Hive не называет объект, проверяются для всех баз данных: операторам
REPLбез объекта нуженrepladmin, смене владельца таблицы или базы без объекта —alter, для базы данных*. EXPLAIN,DESCRIBE FUNCTION,SHOW FUNCTIONS,SETи другие операторы, которые не проверяет Ranger, тоже не проверяются; вызовы метаданных клиентов JDBC, напримерgetTables, не фильтруются.- Агент работает в HiveServer2. Авторизация внутри metastore не охватывается.
