Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Безопасность и доступ
security

Безопасность и доступ

Пользователи, роли, права доступа, квоты, SSL/TLS, аудит и политики доступа к строкам

Безопасность и доступ

Минимальные права, защита соединений и доступ арендатора только к своим строкам

#Результат урока

Вы создадите модель минимальных привилегий для загрузки, аналитики и эксплуатации, проверите row policy негативными тестами и исключите секреты из SQL и журналов.

#Пользователи и аутентификация

#Создание пользователя

-- Базовое создание пользователя CREATE USER IF NOT EXISTS app_user; -- Пароль передаётся открытым текстом 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

#Квоты (Quotas)

#Создание квоты

-- Квота на интервал 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;

#Row-Level Security (RLS)

#Политики доступа к строкам

-- Создание политики 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 или словарь)

#SSL/TLS

#Конфигурация сервера

<!-- 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>

#Подключение через SSL

# 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 порт --> <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;

#Правила для рабочей среды

#1. Принцип минимальных привилегий

-- Плохо: полный доступ приложению GRANT ALL ON *.* TO app_user; -- Хорошо: только необходимые права GRANT SELECT ON database.table1 TO app_user; GRANT INSERT ON database.table2 TO app_user;

#2. Использование ролей

-- Плохо: гранты напрямую пользователям 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;

#3. Пароли и секреты

-- Плохо: пароль открытым текстом 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';

#4. Сетевая безопасность

<!-- users.xml --> <users> <app_user> <!-- Разрешённые хосты --> <allowed_networks> <ip>10.0.0.0/8</ip> <ip>192.168.1.0/24</ip> </allowed_networks> <!-- Не разрешайте localhost, если приложению он не нужен --> <!-- <ip>::1</ip> --> </app_user> </users>

#5. Мониторинг безопасности

-- Подозрительная активность 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');

#Практика: попытка обхода

Создайте роли ingest, analyst и ops, а также двух арендаторов с row policy. Проверьте разрешённые действия и не менее пяти запретов: чужой tenant_id, прямое чтение исходной таблицы, DDL, KILL QUERY и выдачу роли. Сохраните запросы и ожидаемые коды отказа.

Права доступа — только часть эксплуатационного контура. В последнем уроке к ним добавляются SLO, резервные копии, обновления и разбор сбоев.

Далее: Эксплуатация ClickHouse