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 шире фактически доступной возможности.
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.