What the connector can do
Outbound connections
This is the complete list of connections the connector opens. All of them originate inside your environment.
Inbound, the connector exposes only local health and metrics ports plus the opt-in session gateway. Nothing else listens, and ClickHouse Cloud never connects into your environment: it can only answer the troubleshooter’s outbound WebSocket.
ClickHouse grants
Provisioning creates one read-only user per component. The single exception to pure reads is the scraper’sSYSTEM FLUSH LOGS grant listed below, which cannot read or modify anything; it only forces log tables to persist entries they already buffer. The users are created with IDENTIFIED WITH bcrypt_hash, so only a salted bcrypt hash exists in the provisioning SQL; the plaintext password lives only in the credential file the daemon reads at runtime. The grants are exactly these, with the default table sets:
READ ON REMOTE is required because scrape queries wrap each system table in clusterAllReplicas(). SYSTEM FLUSH LOGS must be granted at the global scope because ClickHouse rejects narrower scopes for that privilege; ClickHouse only honors it for *_log system tables, so the grant is broader than the actual capability.
system.user_directories grant on both users exists for one diagnostic: clicklink clctl preflight runs with the connector’s own credentials and checks how the instance stores its ClickHouse users (replicated or local). The table holds user-storage configuration metadata, not user data, and neither the scrape set nor the session table allowlist includes it, so no scrape or session output path reads it; without the grant, that one preflight check reports itself skipped and everything else proceeds.
Beyond per-table SELECT, the one system-level grant is the scraper’s SYSTEM FLUSH LOGS: it forces the *_log system tables to persist buffered entries to disk so scrapes see current data, and does nothing else; ClickHouse only honors it for log tables even though it only accepts the grant at the global scope. There are no INSERT, DDL, user-management, settings, or process-control grants. When a second connector deployment shares an instance, its users carry a suffix (pcm_scraper_<suffix>) with the same grant sets.
Kubernetes RBAC
The chart creates namespace-scoped Roles only; there is no ClusterRole or ClusterRoleBinding.What the connector cannot do
- No writes to ClickHouse data or state. The grants above contain no
INSERT, no DDL, and no user-management, settings, or process-control privileges; the single system-class grant, the scraper’sSYSTEM FLUSH LOGS, only makes log tables persist what they already buffer. The connector cannot modify data, schemas, users, or settings. - No exec. The RBAC contains no
pods/exec; the connector cannot run commands in your pods. - No delete, no patch. The RBAC allows two mutations: the exact-name
updateon the connector’s own mTLS Secret, andcreateonserviceaccounts/token, which mints short-lived tokens for the connector’s own ServiceAccounts and modifies no stored object. - No cluster scope. Every Role is bound in a namespace; the connector cannot list or read resources outside the namespaces you granted.
- Nothing inbound. ClickHouse Cloud never opens a connection into your environment. The only command path is the troubleshooter’s outbound WebSocket, and the troubleshooter refuses every command unless a support session you enabled is active. Even during a session, the scope is bounded on both sides: ClickHouse queries are limited to the table allowlist, with
query_logandtext_logdenied by the validator regardless of configuration, and Kubernetes access is separately limited to the read-only views and pod logs the namespace-scoped Roles grant.
What requires your action
- Support sessions. Interactive troubleshooting happens only inside a session you enable, time-boxed to 4 hours by default and 24 hours at most. Disabling takes effect immediately. See support sessions.
- The operator allowlist. Every gateway request must carry an OIDC token whose attested email is on your allowlist. An empty allowlist is closed. You manage the list; see the configuration guide.
- Gateway exposure. The session gateway is off unless you enable it, and reachable only by port-forward unless you opt into an Ingress. On a VM, its self-signed certificate must be fingerprint-pinned by each operator before the session commands will talk to it.
- Network egress. Under an enforcing CNI, the connector has no egress until you allowlist the endpoint CIDRs in the chart’s NetworkPolicy.
How access is attributed
- Deployment identity. The mTLS client certificate’s common name is your org ID, with a single DNS name bound to your endpoint host, so every API connection is attributable to your org. Renewal is automatic and in-daemon; no operator handles the key material.
- Request integrity. Every API request additionally carries an HMAC-SHA256 signature (
Authorization: HMAC-SHA256 AccessKey=..., Signature=..., Timestamp=...) computed over the method, path, timestamp, and body hash, using the key pair issued at enrollment. - Operator identity. Gateway calls are attributed to the email attested by the operator’s OIDC ID token, verified against your identity provider’s JWKS; a self-reported name is never trusted where a token is available.
- Audit trail. Every gateway call and every troubleshoot command, accepted or blocked, is appended to the NDJSON audit log: gateway entries with the attested operator email, VM local session changes with the invoking host user, and session commands with the org identity carried on the authenticated channel. Read it with
clicklink clctl troubleshoot audit tail; see the CLI reference.
Data minimization defaults
query_logis excluded from scrapes by default. Its columns carry raw SQL with literal values, which can contain personal data or secrets, so it does not leave your boundary unless you add it deliberately.- The troubleshooter reads only allowlisted tables, and the validator denies
query_logandtext_logunconditionally, so query history is never readable. The default allowlist does includesystem.processes(live query text); trim the session table allowlist (troubleshooter.allowedTableson Kubernetes,troubleshooter.allowed_tableson a VM) if that must stay hidden during sessions. - All troubleshooter output is redacted with built-in patterns for IPv4 and IPv6 addresses, bearer tokens, AWS access keys, emails, JWTs, SSH private keys, and connection-string credentials, plus any patterns you define. The daemon refuses to start with an invalid patterns file rather than run unredacted.
- Credentials are minimized at rest. Provisioning SQL contains bcrypt hashes, never plaintext passwords; the enrollment token is never written to the command line, disk, or logs; keys live in Kubernetes Secrets or files with mode 0600.