Skip to main content
Эта страница — справочник по безопасности коннектора ClickHouse: его identities, соединения, точный перечень привилегий, структурные ограничения, а также то, как атрибутируется каждое действие. О том, как эти элементы связаны между собой, см. architecture.

Identities

  • Клиентский сертификат mTLS коннектора, в котором в качестве common name указан ваш Organization ID, аутентифицирует каждый демон на вашей конечной точке коннектора. Команда clicklink clctl instances create использует тот же сертификат и HMAC key при обращении к конечной точке.
  • pcm_scraper и pcm_troubleshooter — это ClickHouse users только для чтения, под которыми подключаются scraper и средство диагностики. У исполнителя нет ClickHouse user.
  • ServiceAccounts для средства диагностики, по одному на каждое подготовленное развертывание, дают доступ к представлениям Kubernetes только для чтения, которые может использовать сеанс поддержки.
  • pcm-executor — это Kubernetes ServiceAccount исполнителя для управления жизненным циклом managed services. ValidatingAdmissionPolicy ограничивает его запись пространствами имен сервисов.
  • pcm-platform — это идентичность исполнителя для обновлений платформы. Ваша команда clicklink clctl platform approve выпускает для него токен на 2 часа и никогда его не продлевает; между подтверждениями у исполнителя нет доступа на запись к платформенному слою.
  • Роль IAM для каждого сервиса (по умолчанию CH-S3-<service>-<region>-00-Role) создается командой clicklink clctl executor prepare с вашими учётными данными. Она ограничена бакетами данных и backup этого сервиса, и доверие к ней есть только у Kubernetes ServiceAccount этого сервиса, поэтому ни исполнитель, ни ClickHouse не могут ее assume.
  • Instance profile EC2-виртуальной машины коннектора выполняет assume роли ECR puller только для чтения в вашей среде для прямого доступа к платформе — как для входа для загрузки чарта, так и для проверок image. CLI подтверждения использует тот же путь через instance profile; AWS-профили на workstation или SSO учётные данные его не заменяют. Другие чарт-реестры ECR используют ambient AWS учётные данные. Image pulls выполняются на ваших узлах под их собственной pull-ролью. Исполнитель не хранит учётные данные для ваших бакетов или IAM и не выполняет вызовов S3 или IAM. См. registry credentials.
  • Ваши собственные учётные данные применяют каждый grant: grant доступа для исполнителя при init --managed, бакеты и роль при prepare, половина разрешений для каждого обновления платформы при approve и очистка при teardown.

Возможности коннектора

Исходящие подключения

Каждое соединение, которое открывает коннектор, инициируется внутри вашей среды. Полный перечень: Во входящем направлении каждый демон открывает один локальный порт проверки работоспособности, на котором также отдаются его метрики Prometheus, плюс включаемый по желанию session gateway. Локальный командный API исполнителя привязан только к loopback. Больше ничего не прослушивается. ClickHouse Cloud никогда не подключается к вашей среде: он может только отвечать по двум исходящим WebSocket-соединениям.

Grant ClickHouse

При провизионировании для каждого наблюдающего компонента создаётся один пользователь с доступом только для чтения. Пользователи создаются с IDENTIFIED WITH bcrypt_hash, поэтому в SQL провизионирования содержится только хеш bcrypt с солью. Пароль в открытом виде хранится лишь в файле учётных данных, который демон читает во время выполнения. Строка ALTER USER после каждого CREATE USER выполняет ротацию хеша при --force. У исполнителя нет пользователя ClickHouse, и он никогда не подключается к ClickHouse. Grant в точности следующие, с наборами таблиц по умолчанию:
READ ON REMOTE требуется, поскольку scrape-запросы оборачивают каждую системную таблицу в clusterAllReplicas(). SYSTEM FLUSH LOGS — единственная привилегия системного уровня. Она заставляет системные таблицы *_log записывать в хранилище уже буферизованные записи, чтобы при сборе метрик были видны актуальные данные; читать или изменять что-либо она не позволяет. ClickHouse принимает эту привилегию только в глобальной области видимости и учитывает её только для таблиц логов, поэтому выданный grant шире фактически доступной возможности.
Grant system.user_directories предоставлено обоим пользователям исключительно для диагностики. clicklink clctl preflight запускается с учетными данными самого коннектора и проверяет, хранит ли инстанс пользователей ClickHouse реплицированно или локально. В этой таблице содержатся метаданные конфигурации хранилища пользователей, а не пользовательские данные. Она не входит ни в набор целей для сбора метрик, ни в список разрешённых таблиц сеанса, поэтому ни один путь вывода сбора метрик или сеанса её не читает. Без этого grant соответствующая предварительная проверка будет отмечена как пропущенная, а всё остальное продолжит выполняться. Привилегии для INSERT, DDL, управления пользователями, настроек или управления процессами отсутствуют. Если экземпляр совместно используется вторым развертыванием connector, его пользователи получают суффикс (pcm_scraper_<suffix>) с теми же наборами привилегий.

Kubernetes RBAC

Scraper и средство диагностики

У scraper и средства диагностики нет РолиКластера или ClusterRoleBinding. Chart создает роли, ограниченные Пространством имен, в Пространстве имен коннектора, а каждый пакет доступа для отдельного экземпляра создает роль в Пространстве имен ClickHouse или сервиса этого экземпляра.

Исполнитель

В управляемом режиме команда clicklink clctl init --managed (или clicklink clctl executor access grant --cluster с последующим apply --cluster) применяет grant исполнителя с вашими credentials. Этот grant включает ServiceAccount pcm-executor (в пространстве имен коннектора на Kubernetes и в clicklink-system при установке на ВМ), одну привязанную к нему РольКластера и ValidatingAdmissionPolicy pcm-executor-prefix-guard. Глаголы выдаются на уровне всего кластера, поскольку RBAC не позволяет задать префикс пространства имен. Поэтому политика допуска запрещает любую запись от pcm-executor, направленную в пространство имен за пределами префикса сервиса (по умолчанию ns-). В собственном пространстве имен исполнителя разрешены три операции записи: renewal его собственного токена, ConfigMap clicklink-instance-registry, который читает scraper, и, на Kubernetes, обновленный клиентский certificate, записываемый обратно в Secret clicklink-mtls. Политика распространяется только на этот ServiceAccount и использует failurePolicy: Fail и validationActions: [Deny]. ClusterRoleBinding применяется последней — после политики и ее привязки, — чтобы при частично примененном grant исполнитель остался вовсе без разрешений, а не с незащищенными. На ВМ команда clicklink clctl executor prepare дополнительно применяет bundle для каждого сервиса. Такой bundle состоит из ServiceAccount pcm-executor внутри ns-<name>, Role с теми же семействами ресурсов и РолиКластера, ограниченной глаголами get и delete для этого единственного пространства имен. Если такой bundle есть, исполнитель использует его для сервиса, иначе — общекластерный grant. На Kubernetes под всегда действует от имени ServiceAccount pcm-executor из пространства имен коннектора. Для get, list и watch допуск не выполняется, поэтому чтение исполнителем этих семейств ресурсов префиксом не ограничено.

Идентичность платформы

clicklink clctl platform approve применяет ту часть обновления платформы, которая относится к разрешениям, используя ваши учетные данные: Пространства имен, CustomResourceDefinitions, ServiceAccounts, РолиКластера и ClusterRoleBindings, Roles и RoleBindings, конфигурации вебхуков и допуска, PriorityClasses, а также StorageClass. Затем он применяет ServiceAccount pcm-platform, его РольКластера, ValidatingAdmissionPolicy pcm-platform-scope-guard и привязку, после чего выпускает связанный токен со сроком действия 2 часа. С этим токеном исполнитель может записывать только deployments, services, configmaps, secrets, jobs и poddisruptionbudgets, и только в тех пространствах имен платформы, которые разрешает scope guard. Он может читать pods, events, namespaces, serviceaccounts, CustomResourceDefinitions, объекты RBAC, конфигурации вебхуков, StorageClasses и PriorityClasses, чтобы убедиться, что часть с разрешениями уже на месте, прежде чем что-либо применять. Он никогда не обладает правами escalate, bind или impersonate, никогда не записывает ресурсы кластерной области видимости или объекты RBAC и не может выпустить или продлить собственный токен. Токен авторизует ровно один бандл: одобренный вами дайджест записывается в ServiceAccount, и исполнитель отклоняет любой другой.

Чего коннектор не может делать

  • Никакой записи в данные или состояние ClickHouse. Перечисленные выше grant не содержат ни INSERT, ни DDL, ни привилегий управления пользователями, настройками или процессами. Единственный grant системного класса — SYSTEM FLUSH LOGS у scraper’а — лишь заставляет таблицы логов сохранить то, что уже находится в буфере. У исполнителя нет пользователя ClickHouse. Ни один компонент не может изменять данные, схемы, пользователей или настройки через ClickHouse.
  • Никакого exec. Ни в одном RBAC нет pods/exec; ни один компонент не может выполнять команды в ваших подах.
  • Никакой записи за пределами пространств имен сервисов и платформы. У scraper’а и средства диагностики нет ни delete, ни patch. Их единственные изменения — это update по точному имени для собственного mTLS-Secret коннектора и create для serviceaccounts/token, который выпускает короткоживущие токены для их собственных ServiceAccount и не изменяет ни одного сохраненного объекта. Допуск отклоняет записи исполнителя за пределами префикса сервиса, а его записи в платформу возможны, только пока действителен выпущенный вами токен.
  • Нет разрешения выдавать разрешения. Ваши учетные данные применяют пространства имен платформы, CRD, ServiceAccount, RBAC, конфигурации вебхуков и допуска, PriorityClass и класс хранилища во время approve. Платформенная identity исполнителя не может повышать привилегии, связывать роли или выдавать себя за других. Внутри пространства имен сервиса исполнитель может создавать только те Role, которые выдают уже имеющиеся у него разрешения.
  • Никаких учетных данных для ваших бакетов или IAM. clicklink clctl executor prepare создает бакеты и сервисную роль, а clicklink clctl executor teardown удаляет их — обе команды выполняются под вашими учетными данными. Эту роль могут принять только поды соответствующего сервиса. Для прямого доступа к платформе исполнитель использует instance profile EC2-виртуальной машины коннектора, чтобы принять роль ECR puller только для чтения — как для входа при загрузке чарта, так и для проверок образов. Другие реестры чартов ECR используют окружающие учетные данные AWS; см. identities. Его единственные вызовы облачных API идут в ECR и STS; он не может читать или удалять ваши данные.
  • Никаких сведений о пароле вашего пользователя default. clicklink clctl executor prepare генерирует его на вашей стороне и показывает один раз (либо это делает clicklink clctl instances create, если вы передаете входные данные флагами). Отправляются только его хеши, поэтому ни коннектор, ни ClickHouse Cloud не смогут его восстановить.
  • Никаких входящих подключений. ClickHouse Cloud никогда не открывает соединение в вашу среду. Единственные командные каналы — два исходящих WebSocket-соединения. Средство диагностики отклоняет любую команду, если включенный вами сеанс поддержки не активен. Исполнитель принимает команды жизненного цикла только для тех сервисов, управление которыми вы поручили ClickHouse, и только в рамках указанных выше областей. Даже во время сеанса средство диагностики ограничено с обеих сторон. Запросы к ClickHouse ограничены списком разрешённых таблиц, который отклоняет query_log и text_log, поэтому доступ к ним никогда не выдается. Доступ к Kubernetes ограничен представлениями только для чтения и журналами подов, которые разрешают Role, ограниченные пространством имен.

Что требует ваших действий

  • Включение управляемого режима. Исполнитель работает, а его grant в Kubernetes существует только после того, как вы включите управляемый режим на этапе init; grant применяется с правами администратора кластера. См. управляемые сервисы.
  • Создание сервиса. clicklink clctl executor prepare выполняется с вашими учётными данными AWS и создаёт бакеты и роль IAM, а clicklink clctl instances create отправляет определение. Без обоих шагов ClickHouse Cloud не может создать сервис в вашем кластере. См. создание сервиса.
  • Обновления платформы. Каждое обновление компонентов платформы применяется только после того, как вы выполните clicklink clctl platform approve именно для этого набора; выпускаемый при этом токен истекает через 2 часа и никогда не продлевается. См. обновления платформы.
  • Очистка после удаления. Удаление сервиса удаляет только его ресурсы Kubernetes. Команда clicklink clctl executor teardown, запущенная с вашими учётными данными, удаляет роль IAM и — только при указании явных флагов — данные и резервные копии. См. удалить сервис.
  • Сеансы поддержки. Интерактивное устранение неполадок возможно только в включённом вами сеансе: по умолчанию он ограничен 4 часами, максимум — 24 часами. Отключение действует немедленно. См. сеансы поддержки.
  • Список разрешённых операторов. Каждый запрос к шлюзу должен содержать токен OIDC, подтверждённый адрес электронной почты которого указан в вашем списке разрешённых. Пустой список разрешённых означает запрет доступа. Вы управляете этим списком; см. руководство по настройке.
  • Доступность шлюза. Шлюз сеанса отключён, пока вы его не включите, и доступен только через проброс порта, если вы не настроите Входной шлюз. На виртуальной машине каждый оператор должен закрепить отпечаток его самоподписанного сертификата либо проверить его с помощью набора CA, переданного через --gateway-ca, прежде чем команды сеанса смогут подключиться к нему.
  • Исходящий сетевой трафик. При использовании CNI с принудительным применением политик ни один демон не достигнет конечной точки вашего коннектора, пока вы не укажете её CIDR в networkPolicy.allowEgressCIDRs. Исполнителю также нужны CIDR API-сервера Kubernetes (networkPolicy.apiserverCIDRs), которые init --managed определяет из VPC кластера. Если чарты платформы загружаются из Amazon ECR, добавьте также диапазоны ECR и STS.

Как определяется принадлежность доступа

  • Идентичность развертывания. Common name клиентского сертификата mTLS — это ID вашей организации, а его единственное DNS-имя привязано к хосту вашей конечной точки. Благодаря этому каждое соединение с API можно отнести к вашей организации. Обновление выполняется автоматически внутри демона; ключевой материал не проходит через руки оператора.
  • Целостность запроса. Каждый API request также несет подпись HMAC-SHA256 (Authorization: HMAC-SHA256 AccessKey=..., Signature=..., Timestamp=...), вычисленную по method, path, временной метке и hash тела с использованием пары ключей, выданной при enrollment.
  • Идентичность оператора. Вызовы Gateway относятся к адресу электронной почты, подтвержденному OIDC ID token оператора и проверенному по JWKS вашего провайдера идентификации. Имени, указанному самим пользователем, доверия нет, если доступен token.
  • Команды жизненного цикла. Исполнитель записывает каждую полученную команду в свое локальное хранилище вместе с ее origin (ClickHouse Cloud или локальный вызов clicklink clctl), стадией и результатом. Результат он сообщает обратно по командному каналу. Прочитать запись можно с помощью clicklink clctl commands list и clicklink clctl commands get; см. CLI reference.
  • Одобрения платформы. Дайджест одобренного вами bundle записывается в ServiceAccount pcm-platform. Каждый object, примененный с вашими credentials, несет hash содержимого, который исполнитель проверяет перед любой записью. Bundle с любым другим дайджестом отклоняется.
  • Журнал аудита. Каждая команда сеанса — принятая или заблокированная — добавляется в audit log в формате NDJSON вместе с идентичностью организации, полученной из командного канала. Вызовы Gateway записываются как structured строки clctl.gateway в log средства диагностики с подтвержденным адресом электронной почты оператора. При локальных изменениях сеанса на ВМ в session.json записывается пользователь хоста. Прочитать audit log можно с помощью clicklink clctl troubleshoot audit tail; см. CLI reference.

Значения по умолчанию для минимизации данных

  • query_log по умолчанию исключён из сбора метрик (scrape). Его столбцы содержат необработанный SQL с литеральными значениями, в которых могут оказаться персональные данные или секреты. Он не покидает пределы вашего периметра, пока вы не добавите его явно.
  • Средство диагностики читает только таблицы из списка разрешённых. query_log и text_log отклоняются самой конфигурацией списка разрешённых, поэтому доступ к ним никогда не выдаётся, а история запросов остаётся нечитаемой. При этом список разрешённых по умолчанию включает system.processes (текст выполняющихся запросов); сократите его (troubleshooter.allowedTables в Kubernetes, troubleshooter.allowed_tables на виртуальной машине), если эти данные должны оставаться скрытыми во время сеансов.
  • Весь вывод средства диагностики маскируется с помощью встроенных шаблонов регулярных выражений, а также любых заданных вами. Встроенные шаблоны охватывают адреса IPv4 и IPv6, bearer-токены, ключи доступа AWS, адреса электронной почты, JWT, приватные ключи SSH и учётные данные в строках соединения. При некорректном файле шаблонов демон откажется запускаться, вместо того чтобы работать без маскирования.
  • Статус управляемого сервиса — это только метаданные. Исполнитель сообщает состояние сервиса, количество реплик, версии и результаты выполнения команд. Он никогда не читает таблицы или бакеты сервиса.
  • Учётные данные минимизируются при хранении. SQL для подготовки содержит bcrypt-хеши, а не пароли в открытом виде. Пароль пользователя default управляемого сервиса показывается один раз и покидает систему только в виде хешей. Токен enrollment никогда не записывается в командную строку, на диск или в логи. Ключи хранятся в Kubernetes Secrets или в файлах с правами 0600.
Последнее изменение 7 октября 2026 г.