Новый инструмент для GreenPlum и PosgreSQL
Работа в DNS - подписывайся!
В DNS для задач аналитики используется GreenPlum. GreenPlum — это горизонтально-масштабируемая MPP версия PostgreSQL. Для того, чтобы доставить до аналитика данные с "боевой" БД, используется множество инструментов. Мы расскажем про инструмент управления правами пользователей и ресурсными группами, который был разработан в DNS .
С чего все начиналось
Для инженера данных управление правами доступа к объектам БД является рутиной: количество объектов в БД растет, пользователи добавляются... Стандартным решением этой задачи является написание SQL-скриптов. Но насколько масштабируемое это решение? Есть ли более удобный вариант управления правами? Поиск ответа на эти вопросы выявил необходимость реализации собственного решения.
Итогом разработки стал GreenPlum Permission Manager (далее — GPPM)
GreenPlum Permission Manager (сокр. GPPM) — приложение с web-интерфейсом, предоставляющее следующий функционал:
• Управление ролями (создание, изменение, удаление)
• Управление группами ролей (добавление, исключение)
• Представление ролей и связей между ними в виде графа и таблицы
• Выдача прав роли (на чтение, редактирование и т. д.): БД, схемы и конкретной таблицы
• Просмотр итоговых прав роли на объект: БД, схему, таблицу
• Просмотр дефолтных прав роли для выбранной базы
• Управление ресурсными группами (создание, изменение, удаление)
• Управление членами ресурсной группы (добавление, исключение)
• Аутентификация пользователя в GUI по email и паролю (поддерживается LDAP)
• Поддержка переключения между несколькими СУБД
• Разграничение прав редактирования СУБД через GUI (до уровня роли, базы, схемы)
Продукт уже выложен на github!

Демонстрация
Для краткого знакомства запустим GPPM через Docker:
docker run -it --rm \
-p 80:80 -p 8080:8080 \
-v gppm-data:/var/lib/postgresql/9.6 \
-e SECRET_KEY=HF2IxPeglDZdEVp4702u4mxOpoNcInXnZj80d1Ab \
-e ENCODING_KEY=SCW2TcT1ko4RaTEXFDXmSsGPIRey0kvNvJz8v0zO73k= \
ostapkonst/gppm
Заходим на http://localhost и вводим данные аутентификации:
email: admin@gppm.com
password: admin
Далее нужно создать контекст, т. е. соединение с СУБД.
После создания контекста произойдет автоматическое переключение на него. Активируются дополнительные пункты меню. С их помощью реализуется описанный выше функционал.
Примеры
Как выдать права на чтение всех таблиц в схеме для роли?
Ситуация стандартная: пришел новый пользователь, требуется создать роль и выдать права.
Создадим роль "grantor". Переходим в "Create Role", задаем имя роли в поле "Role Name" (пароль генерируется автоматически) и нажимаем на "Save".
Выдадим права роли. Переходим в "Schemas", нажимаем на "Connection" и выбираем базу, с которой продолжим работу. Выбрав базу, в списке появятся схемы выбранной базы (слева). Нажав на схему, обновится список правил (ролей и прав), которые применяются к схеме (справа). Нажимаем на "New Rule". В появившемся диалоговом окне задаются права на выбранную роль. Выбираем роль "grantor" и право "Usage" в качестве предоставляемого роли. В этом же окне выдаем права на чтение всех таблиц в схеме нажатием на "Grant SELECT to all tables". Через "Save" применяем правила и закрываем диалоговое окно.
В результате новое правило отобразится в списке.
Итог: роли "grantor" стало доступно чтение из всех таблиц схемы.
Как передать права другим ролям?
Представим себе ситуацию, когда появилась новая роль "grantee", которой нужны те же права, что и у "grantor".
Как быстро их предоставить? Воспользуемся механизмом добавления одной роли в качестве члена (member) другой. Существует два инструмента, которые по-разному представляют членство ролей:
В виде графа. Переходим в "Role Groups" и видим граф ролей: роли — вершины графа, членство — его дуги.
Граф ориентированный и не содержит циклов. Направление дуг указывает, какая роль (начало) какой (конец) передает права (предоставляет членство). Выберем роли "grantor" и "grantee" через Ctrl + Click. В зависимости от типа и количества выделенных объектов меняются доступные опции в меню (справа). Для двух объектов появится пункт "Connect Members", по умолчанию он не активен. Переместим "grantor" в секцию "Groups" через Drag&Drop. Нажимаем (на уже активный) "Connect Members".
В результате появится дуга, идущая от "grantor" к "grantee".
Итог: роль "grantee" наследует права "grantor".
Далее — альтернативный вариант.
В виде таблицы. Переходим в "Role Memberes" и видим таблицу. В таблице для каждой роли сопоставляется список тех ролей, чьи права она наследует в колонке "Belong To Roles" и кому наследует — "Members Of Role".
Нажимаем на редактировать (иконка карандаша), открывается диалоговое окно. В нем уже выбрана роль, связи которой редактируем. Переходим во вкладку "Childs" и добавляем новый пункт (иконка плюса). В список "Childs Of Role" добавится пустая строка, нажав на которую можно выбрать роль. Добавим роль "grantee" и нажмем на "Save".
В результате в колонке "Members Of Role" для "grantor" добавится роль "grantee". Для "grantee" роль "grantor" появится в колонке "BelongTo Roles".
Итог: роль "grantee" наследует права "grantor".
Как посмотреть итоговые права?
Когда пользователей много (на данный момент в GreenPlum их более 200), появляется сложность с определением того, какими правами обладает пользователь к конкретной базе, схеме, таблице. Для этих целей в GPPM существует инструмент, который собирает итоговые права для каждой роли на выбранную сущность БД.
Просмотр итоговых прав. Переходим в "Results" и видим таблицу (слева) с боковым меню (справа), которое содержит пункты: "Database", "Schema", "Table". В зависимости от уровня, до которого вы хотите посмотреть права, будут зависеть, какие колонки отобразятся в таблице. Зададим все три пункта для просмотра того, какие права предоставлены ролям на таблицу.
В результате в колонке "Grantee" увидим роли "grantor" и "grantee" с проставленной "галкой" в колонке "Select".
Роль "grantee" будет серой, т. к. получила права через другую роль (через "grantor").
Итог: для таблицы получили список ролей и прав, которыми они (роли) обладают.
В данной статье освещена только базовая часть доступного функционала. Но уже она позволяет повысить скорость и удобство работы с правами пользователей в GreenPlum и PosgreSQL :)

Статью написал инженер данных направления Управление данными Остап :)
Наши предыдущие статьи:
Направление Управление данными
Что изучить начинающему аналитику данных