Агент HBase — сопроцессор master, регионов и region server: HBase спрашивает его о каждой операции, каждом чтении и каждой записи, и он отвечает по подписанным политикам сервиса данных hbase. Дистрибутив поставляет его одним совместимым с Java 8 JAR-файлом agents/hbase/grantforge-agent-hbase-<version>.jar с перемещёнными внутрь зависимостями.
Интеграционные тесты Testcontainers в репозитории запускают JAR внутри HBase 2.5.16, 2.6.7 и 3.0.0. Это не сертифицирует все остальные версии. Плагин сервиса описан на странице Apache HBase.
Как это работает
- Каждый запрос проверяется в каждой названной им области. В HBase право охватывает всё в своей области, поэтому агент решает запрос на уровне его пространства имён, таблицы, семейства столбцов и столбца: запрет в любой из них отклоняет запрос, разрешение в любой — даёт доступ.
- Владельцы пространства имён владеют его таблицами.
createиadminна пространстве имён позволяют создать его, создавать в нём таблицы и управлять ими без политики на каждую таблицу. - Чтение возвращает то, что можно читать. Если пользователь может читать только часть таблицы, например одно семейство столбцов, get и scan возвращают эти столбцы вместо ошибки; пользователю, которому нельзя читать ничего из таблицы, отказывают.
- Списки опускают то, чем нельзя пользоваться. Список пространств имён и таблиц показывает только те, которыми пользователь может пользоваться или внутри которых может пользоваться чем-то, а список снимков — только снимки таблиц, которыми он управляет; описание пространства имён, которым он не может пользоваться, отклоняется.
- Отказы объясняют причину. Клиент получает
Permission denied: user bob has no read on table sales:items (no GrantForge policy allows it)или политику, которая запретила доступ. - Решения сохраняются, обращения объединяются. Решения текущего снимка хранятся, по умолчанию 100 000 штук в течение 10 секунд, а новый снимок начинает с чистого листа. Одинаковые разрешённые обращения в пределах окна, по умолчанию 10 секунд, передаются одним событием доступа с их числом; отказы передаются по одному и сразу.
- Серверы не проверяются. Суперпользователи HBase, указанные в
hbase.superuser, и собственная работа серверов не проверяются и не попадают в аудит. Таблицы пространства имёнhbase, напримерhbase:meta, может читать любой, как это нужно клиентам.
| Операция | Нужный доступ |
|---|---|
| Get, scan | read на таблице или на возвращаемых столбцах |
| Put, increment, append, delete столбцов | write на каждом записываемом столбце |
| Delete семейства столбцов или строки | write на каждом семействе столбцов, так как HBase удаляет строку по семействам |
| Check-and-mutate | read на сравниваемом столбце или на таблице при фильтре и write на записываемом |
| Создание таблицы | create на пространстве имён |
| Удаление, очистка, изменение, включение, отключение, flush, split, слияние, компактация | admin или create на таблице |
| Перемещение, назначение, снятие назначения, перевод в offline | admin на таблице |
| Создание, восстановление, удаление или вывод списка снимков | admin на таблице; для клонирования также нужен create на целевом пространстве имён |
| Массовая загрузка | create на таблице |
| Создание, изменение, удаление пространства имён | admin на пространстве имён |
| Описание пространства имён; списки пространств имён и таблиц | Любой доступ к нему самому или к его содержимому |
| Балансировщик, остановка кластера, квоты, узлы репликации, группы region server, процедуры, вывод из эксплуатации, остановка region server, смена WAL | admin на global |
Развёртывание
-
Добавьте сервис данных
hbaseи настройте его политики. Откройте Права доступа к данным → Агенты, выберите сервис и выпустите токен агента. Он показывается один раз; сохраните его в файл, доступный для чтения только учётной записи HBase. -
Скопируйте JAR в
libкаждого master и region server, например/opt/hbase/lib. -
Добавьте параметры в
hbase-site.xmlкаждого узла, заменив примеры адреса, путей и имени экземпляра:<property><name>hbase.coprocessor.master.classes</name> <value>org.devlive.grantforge.hbase.agent.GrantForgeHBaseCoprocessor</value></property> <property><name>hbase.coprocessor.region.classes</name> <value>org.devlive.grantforge.hbase.agent.GrantForgeHBaseCoprocessor</value></property> <property><name>hbase.coprocessor.regionserver.classes</name> <value>org.devlive.grantforge.hbase.agent.GrantForgeHBaseCoprocessor</value></property> <property><name>grantforge.server.url</name><value>https://grantforge.example.com</value></property> <property><name>grantforge.token.file</name><value>/etc/hbase/grantforge.token</value></property> <property><name>grantforge.instance</name><value>regionserver-1</value></property> <property><name>grantforge.cache.dir</name><value>/var/lib/hbase/grantforge-cache</value></property>Каталог кэша должен быть доступен для записи учётной записи HBase. Замените собственный
AccessControllerHBase в списках сопроцессоров, а не загружайте оба. -
Перезапускайте master и region server по одному. Пока у агента нет первого снимка, все запросы, кроме запросов суперпользователей, отклоняются.
-
Сначала перенесите существующие права: права, сохранённые
AccessControllerHBase вhbase:acl, перестают действовать. Заранее выведите их черезuser_permissionи создайте соответствующие политики.
| Параметр | Назначение |
|---|---|
grantforge.server.url, grantforge.token.file, grantforge.instance, grantforge.cache.dir |
Обязательные: сервер GrantForge, файл токена агента, имя этого master или region server и доступный для записи каталог для подписанного снимка и событий в очереди |
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 МиБ) |
grantforge.audit.fold.window.ms |
Сколько времени одинаковые разрешённые обращения объединяются в одно событие, по умолчанию 10000, не больше 3600000 миллисекунд; 0 передаёт каждое |
grantforge.decision.cache.size, grantforge.decision.cache.ttl.ms |
Наибольшее число хранимых решений, по умолчанию 100000, не больше 10000000, 0 не хранит ни одного; и как долго, по умолчанию 10000, 1..3600000 миллисекунд |
HBase запускает сопроцессор для master, для region server и для каждого открываемого региона; все они используют один агент, один кэш решений и одно объединение событий.
Пользователи, группы и роли
Политики называют короткое имя, которое HBase присваивает пользователю подключения: имя пользователя простой аутентификации или короткое имя принципала Kerberos по hadoop.security.auth_to_local. Группы — это группы, которые сопоставление групп Hadoop даёт пользователю на сервере, вместе с группами, в которые его включает GrantForge; роли — те, что назначает GrantForge.
Решения и ограничения
- Без пригодного снимка отклоняется всё, кроме запросов суперпользователей и чтения пространства имён
hbase. Неиспользуемый сервис оставляет HBase без проверок, как без авторизатора. - Токен, привязанный к сервису, тип которого не
hbase, отклоняет всё. - Команды HBase
grant,revokeиuser_permissionзавершаются ошибкой AccessController is not loaded: права — это политики GrantForge. - Вызовы конечных точек сопроцессоров не проверяются; загружайте только те, которым доверяете.
- Здесь HBase не даёт создателю таблицы собственных прав; политика на пространстве имён, как выше, даёт владельцам их таблицы.
- HBase записывает некоторые отказы в журнал вместо того, чтобы вернуть их, например при переключении балансировщика: переключатель остаётся как был, но клиент об этом не узнаёт.
- Решения хранятся
grantforge.decision.cache.ttl.ms, поэтому период действия политики начинается или заканчивается с задержкой до этого значения. - Права HBase на уровне ячеек и метки видимости не охвачены. Столбцы сравниваются как текст UTF-8.
