Где и как задавать настройки безопасного доступа клиента к кластеру Trino, каким образом обеспечить безопасность внутри кластера и защитить доступ к внешним источникам данных: примеры конфигураций.
Как настроить безопасную работу кластера Trino
По умолчанию в Trino не включены функции обеспечения безопасности. Однако, это можно настроить для различных частей архитектуры фреймворка:
- безопасный доступ клиента к кластеру;
- безопасность внутри кластера;
- безопасный доступ к внешним источникам данных.
Поскольку доступ к кластеру Trino управляется координатором, безопасный доступ клиента к кластеру означает безопасное взаимодействие с координатором. Реализация этого включает 3 аспекта:
- шифрование данных, передаваемых от клиента к серверу, для защиты их целостности. Сервер Trino использует стандартный протокол HTTPS и шифрование TLS (SSL).
- аутентификация пользователей, что включает их идентификацию и управление именами. Trino поддерживает несколько механизмов аутентификации: простая с помощью файла паролей, LDAP, Salesforce, OAuth 2.0, сертификат безопасности, JWT-токены и протокол Kerberos.
- авторизация и контроль доступа – проверка прав каждого пользователя на манипуляции с данными. По умолчанию Trino разрешает все операции всем аутентифицированным пользователям. Чтобы изменить это, надо настроить JSON-файл, задав детальные ограничения доступа пользователей на уровне каталога, схемы или таблицы. Также возможно сделать это с помощью Open Policy Agent или Apache Ranger. Еще Trino предоставляет API , позволяющий создать собственный метод контроля доступа или расширить существующий.
Рассмотрим пример конфигурационного JSON-файла, устанавливающего детальные ограничения доступа пользователей к Postgresql. Предположим, все аутентифицированные пользователи имеют право выполнять операции SELECT на таблице orders. Пользователь student может выполнять операции SELECT на таблице orders. Пользователь anna имеет права на выполнение любых операций на таблицах orders и customers в схеме public. Также в таблице customers только anna может видеть данные в колонках name, address, phone и email. JSON-файл конфигурации, который устанавливает указанные ограничения доступа для пользователей, выглядит так:
{ "catalogs": { "postgresql": { "schemas": { "public": { "tables": { "orders": { "permissions": { "SELECT": ["*"], "INSERT": ["anna"], "UPDATE": ["anna"], "DELETE": ["anna"] } }, "customers": { "permissions": { "SELECT": ["anna"], "INSERT": ["anna"], "UPDATE": ["anna"], "DELETE": ["anna"] }, "columns": { "name": ["anna"], "address": ["anna"], "phone": ["anna"], "email": ["anna"] } } } } } } }, "users": { "anna": { "roles": ["admin"] }, "student": { "roles": ["read_only"] } }, "roles": { "admin": { "catalogs": { "postgresql": { "schemas": { "public": { "tables": { "orders": { "privileges": ["SELECT", "INSERT", "UPDATE", "DELETE"] }, "customers": { "privileges": ["SELECT", "INSERT", "UPDATE", "DELETE"], "columns": ["name", "address", "phone", "email"] } } } } } } }, "read_only": { "catalogs": { "postgresql": { "schemas": { "public": { "tables": { "orders": { "privileges": ["SELECT"] } } } } } } } } }
Этот JSON-файл должен быть доступен для конфигурации Trino, заданной в конфигурационном файле config.properties, и размещён на координаторе кластера, который отвечает за управление запросами и контроль доступа. Рабочие узлы будут получать необходимые параметры доступа от координатора и выполнять запросы в соответствии с заданными правилами. После внесения изменений в файл конфигурации следует перезапустить сервис Trino, чтобы применить новые настройки доступа.
Для обеспечения безопасности внутри кластера можно защитить внутреннюю связь между координатором и рабочими узлами. Также рекомендуется защитить секреты в файлах свойств, такие как пароли в файлах каталогов. Для этого можно использовать средства управления секретами: HashiCorp Vault, AWS Secrets Manager, Azure Key Vault, Google Secret Manager, Kubernetes Secrets, CyberArk, Bitwarden и пр.
Безопасная связь между кластером Trino и источниками данных настраивается для каждого каталога. Каждый каталог использует коннектор, который поддерживает различные конфигурации, связанные с безопасностью. Для защиты содержимого файлов свойств каталога также можно использовать средства управления секретами.
В Trino файлы конфигурации каталогов хранятся в директории etc/catalog на координаторе. Эти файлы определяют, какие коннекторы использовать и как они настроены для подключения к различным источникам данных. Сами коннекторы при этом должны быть установлены как на координаторе, так и на рабочих узлах, чтобы все узлы кластера имели доступ к необходимым библиотекам и могли эффективно взаимодействовать с подключенными источниками данных во время выполнения запросов. Поэтому соответствующие настройки обеспечения безопасности коннектора должны быть на каждом рабочем узле. Чтобы не копировать эти конфигурационные данные на каждом рабочем узле, можно использовать общий файл секретов. Как это сделать, рассмотрим далее на примере настройки общего файла секретов и его интеграции в конфигурацию коннекторов.
Сперва надо создать файл secrets.properties, который будет содержать все необходимые секреты для различных коннекторов, например, пароли для подключения к PostgreSQL и AWS S3:
postgres.password=postgres_password s3.access-key=s3_access_key s3.secret-key=s3_secret_key
Затем следует разместить этот файл на всех узлах кластера, т.е. на координаторе и всех рабочих узлах, например, в директории /etc/trino/secrets/. Для автоматизации развертывания общего файла секретов, т.е. его автоматического копирования на все узлы кластера, можно использовать конфигурационные менеджеры, такие как Ansible, Puppet или Chef.
Для обеспечения безопасности необходимо установить такие права доступа к этому файлу секретов, чтобы только сервис Trino мог его читать. Чтобы использовать созданный и распространенный общий файл секретов в конфигурации коннекторов, его следует подключить с помощью системных переменных или встроенных функций. Например, для PostgreSQL конфигурация коннектора в файле postgresql.properties может выглядеть так:
connector.name=postgresql connection-url=jdbc:postgresql://postgres-host:5432/database connection-user=postgres_user connection-password=${file:/etc/trino/secrets/secrets.properties:postgres.password}
Чтобы новые настройки вступили в силу, необходимо перезапустить сервис Trino на всех узлах кластера.
Освойте работу с Trino на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
Источники