Пользователи, роли, права доступа, квоты, SSL/TLS, аудит, row-level security
Пользователи, роли, права доступа, квоты, SSL/TLS, аудит, row-level security
-- Базовое создание пользователя
CREATE USER IF NOT EXISTS app_user;
-- С паролем (plain text)
CREATE USER app_user IDENTIFIED BY 'password123';
-- С хэшированным паролем (SHA256)
CREATE USER app_user IDENTIFIED BY SHA256_PASSWORD 'hash_value';
-- С хэшированным паролем (double SHA256)
CREATE USER app_user IDENTIFIED BY DOUBLE_SHA1_PASSWORD 'hash_value';
-- С хэшированным паролем (bcrypt)
CREATE USER app_user IDENTIFIED BY BCRYPT_PASSWORD 'hash_value';
-- Без пароля (только для доверенных сетей)
CREATE USER app_user IDENTIFIED WITH no_password;
-- С несколькими методами аутентификации
CREATE USER app_user
IDENTIFIED BY 'password123'
AND SSL_CERTIFICATE SUBJECT 'CN=app.example.com';CREATE USER app_user
IDENTIFIED BY 'password123'
DEFAULT ROLE app_role
SETTINGS
max_memory_usage = 10000000000, -- 10 GB
max_execution_time = 60, -- 60 секунд
max_rows_to_read = 100000000, -- 100 млн строк
readonly = 1 -- Только чтение
;Важные настройки:
max_memory_usage — максимум памяти на запросmax_execution_time — таймаут выполненияmax_rows_to_read — лимит на читаемые строкиreadonly — 0=full, 1=read-only, 2=read+DDL-- Список пользователей
SELECT
name,
authentication_type,
default_roles,
settings
FROM system.users
ORDER BY name;
-- Права доступа пользователя
SHOW GRANTS FOR app_user;
-- Текущий пользователь
SELECT currentUser();-- Удаление пользователя
DROP USER IF EXISTS app_user;
-- Изменение пароля
ALTER USER app_user IDENTIFIED BY 'new_password';
-- Изменение настроек
ALTER USER app_user SETTINGS max_memory_usage = 5000000000;
-- Переименование
RENAME USER app_user TO application_user;-- Базовая роль
CREATE ROLE IF NOT EXISTS read_only;
-- Роль с правами
CREATE ROLE read_only;
GRANT SELECT ON *.* TO read_only;
-- Роль с настройками
CREATE ROLE analyst
SETTINGS
max_memory_usage = 20000000000,
max_execution_time = 300;| Роль | Права |
|---|---|
| default | Полный доступ (по умолчанию) |
| read_only | Только SELECT |
| account_admin | Управление пользователями и ролями |
-- Грант на все базы и таблицы
GRANT SELECT ON *.* TO read_only;
-- Грант на конкретную базу
GRANT SELECT ON database.* TO analyst;
-- Грант на конкретную таблицу
GRANT SELECT ON database.table TO app_user;
-- Грант на конкретные колонки
GRANT SELECT (col1, col2) ON database.table TO app_user;
-- Грант на вставку
GRANT INSERT ON database.table TO writer;
-- Грант на UPDATE/DELETE (мутации)
GRANT ALTER UPDATE, ALTER DELETE ON database.table TO editor;
-- Грант на создание таблиц
GRANT CREATE TABLE ON database.* TO admin;
-- Грант на DROP
GRANT DROP TABLE ON database.* TO admin;
-- Все привилегии
GRANT ALL ON *.* TO admin;-- Отзыв конкретного права
REVOKE DELETE ON database.* FROM app_user;
-- Отзыв всех прав
REVOKE ALL ON *.* FROM app_user;-- Назначить роль пользователю
GRANT read_only TO app_user;
-- Назначить несколько ролей
GRANT read_only, analyst TO app_user;
-- Роль по умолчанию
ALTER USER app_user DEFAULT ROLE read_only;
-- Все роли по умолчанию
ALTER USER app_user DEFAULT ROLE ALL;-- Роль с наследованием других ролей
CREATE ROLE senior_analyst;
GRANT analyst TO senior_analyst;
GRANT SELECT ON system.* TO senior_analyst;
-- senior_analyst наследует права analyst-- Квота на интервал
CREATE QUOTA default_quota
FOR INTERVAL 1 minute MAX query_selects = 100,
FOR INTERVAL 1 hour MAX query_selects = 1000,
FOR INTERVAL 1 day MAX query_selects = 10000;Типы лимитов:
query_selects — количество SELECT запросовquery_inserts — количество INSERT запросовread_rows — прочитанные строкиread_bytes — прочитанные байтыwritten_rows — записанные строкиwritten_bytes — записанные байтыresult_rows — строки результатаresult_bytes — байты результатаexecution_time — время выполнения (сек)memory_usage — использование памяти (байты)-- Назначить квоту пользователю
GRANT default_quota TO app_user;
-- Назначить квоту роли
GRANT default_quota TO read_only;
-- Квота по умолчанию для всех
GRANT default_quota TO ALL;-- Список квот
SELECT * FROM system.quotas;
-- Использование квот
SELECT
quota_name,
user_name,
interval_start,
interval_length,
duration,
elapsed,
query_selects,
read_rows,
memory_usage
FROM system.quota_usage
ORDER BY user_name;-- Создание политики
CREATE ROW POLICY user_isolation
ON events
FOR SELECT
USING user_id = currentUser()
TO app_user;
-- Политика по отделам
CREATE ROW POLICY department_isolation
ON orders
FOR SELECT
USING department_id = getSetting('department_id')
TO manager;
-- Политика с несколькими условиями
CREATE ROW POLICY region_policy
ON sales
FOR SELECT
USING region = currentUserRegion()
TO regional_manager;-- Назначить политику пользователю
GRANT ROW POLICY user_isolation TO app_user;
-- Политика для роли
GRANT ROW POLICY department_isolation TO manager;-- Таблица с tenant_id
CREATE TABLE events
(
event_time DateTime,
tenant_id String,
user_id UInt64,
data String
)
ENGINE = MergeTree()
ORDER BY (event_time, tenant_id);
-- Политика изоляции тенантов
CREATE ROW POLICY tenant_isolation
ON events
FOR SELECT
USING tenant_id = getCurrentTenant()
TO tenant_user;
-- Функция для получения tenant_id из контекста
-- (реализуется через settings или словарь)<!-- config.xml -->
<clickhouse>
<openSSL>
<server>
<!-- Сертификат -->
<certificateFile>/etc/clickhouse-server/cert.crt</certificateFile>
<privateKeyFile>/etc/clickhouse-server/cert.key</privateKeyFile>
<!-- DH параметры -->
<dhParamsFile>/etc/clickhouse-server/dhparam.pem</dhParamsFile>
<!-- CA сертификат для проверки клиентов -->
<caConfig>/etc/clickhouse-server/ca.crt</caConfig>
<!-- Режим проверки клиентов -->
<verificationMode>strict</verificationMode>
<!-- none, optional, optional_allow_expired, strict -->
<!-- Загрузка CRL -->
<loadDefaultCAFile>true</loadDefaultCAFile>
<!-- Cache сессий -->
<cacheSessions>true</cacheSessions>
<!-- Запрещённые cipher-ы -->
<disableProtocols>TLSv1,TLSv1.1</disableProtocols>
<!-- Разрешённые cipher-ы -->
<preferServerCiphers>true</preferServerCiphers>
</server>
</openSSL>
</clickhouse># clickhouse-client с SSL
clickhouse-client --secure --port 9440
# С проверкой сертификата
clickhouse-client --secure --port 9440 \
--ca-cert-file /path/to/ca.crt
# С клиентским сертификатом
clickhouse-client --secure --port 9440 \
--cert-file /path/to/client.crt \
--key-file /path/to/client.key<!-- HTTPS порт -->
<https_port>8443</https_port>
<!-- HTTP порт (можно отключить) -->
<!-- <http_port>8123</http_port> --><!-- config.xml -->
<clickhouse>
<logger>
<!-- Уровень логирования -->
<level>information</level>
<!-- Файл лога -->
<log>/var/log/clickhouse-server/clickhouse-server.log</log>
<!-- Файл ошибок -->
<errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
<!-- Размер файла до ротации -->
<size>100M</size>
<!-- Количество файлов -->
<count>3</count>
</logger>
<!-- Аудит запросов -->
<query_log>
<database>system</database>
<table>query_log</table>
<partition_by>toYYYYMM(event_date)</partition_by>
<flush_interval_milliseconds>7500</flush_interval_milliseconds>
</query_log>
</clickhouse>-- Кто и когда подключался
SELECT
user,
client_hostname,
event_time,
query
FROM system.query_log
WHERE type = 'QueryStart'
AND event_date = today()
ORDER BY event_time DESC;
-- Ошибки аутентификации
SELECT
user,
client_hostname,
event_time,
exception_text
FROM system.query_log
WHERE type = 'Exception'
AND exception_code = 192 -- AUTHENTICATION_FAILED
ORDER BY event_time DESC;
-- DDL операции
SELECT
user,
query,
event_time
FROM system.query_log
WHERE query LIKE 'CREATE%'
OR query LIKE 'DROP%'
OR query LIKE 'ALTER%'
AND event_date = today()
ORDER BY event_time DESC;-- Плохо: полный доступ приложению
GRANT ALL ON *.* TO app_user;
-- Хорошо: только необходимые права
GRANT SELECT ON database.table1 TO app_user;
GRANT INSERT ON database.table2 TO app_user;-- Плохо: гранты напрямую пользователям
GRANT SELECT ON table1 TO user1;
GRANT SELECT ON table1 TO user2;
-- Хорошо: гранты через роли
CREATE ROLE reader;
GRANT SELECT ON table1 TO reader;
GRANT reader TO user1, user2;-- Плохо: plain text пароль
CREATE USER app_user IDENTIFIED BY 'password123';
-- Хорошо: хэшированный пароль
CREATE USER app_user IDENTIFIED BY SHA256_PASSWORD 'hash';
-- Лучше: внешняя аутентификация (LDAP, Kerberos)
CREATE USER ldap_user IDENTIFIED WITH LDAP SERVER 'ldap_server';<!-- users.xml -->
<users>
<app_user>
<!-- Разрешённые хосты -->
<allowed_networks>
<ip>10.0.0.0/8</ip>
<ip>192.168.1.0/24</ip>
</allowed_networks>
<!-- Запрет localhost для production -->
<!-- <ip>::1</ip> -->
</app_user>
</users>-- Подозрительная активность
SELECT
user,
count() AS failed_attempts,
max(event_time) AS last_attempt
FROM system.query_log
WHERE type = 'Exception'
AND exception_code = 192 -- AUTHENTICATION_FAILED
AND event_date = today()
GROUP BY user
HAVING failed_attempts > 10;
-- Доступ из новых хостов
SELECT DISTINCT
user,
client_hostname,
client_ip
FROM system.query_log
WHERE event_date = today()
AND client_hostname NOT IN ('known-host-1', 'known-host-2');Изучим production best practices: конфигурация, бэкапы, обновления, масштабирование, troubleshooting.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.