Skip to main content
Esta página es la referencia de seguridad del ClickHouse Connector: sus identidades, conexiones, privilegios exactos, límites estructurales y la forma en que se atribuye cada acción. Para ver cómo encajan las distintas piezas, consulte la arquitectura.

Identidades

  • El certificado de cliente mTLS del conector, que lleva el ID de su organización como nombre común, autentica cada demonio ante su endpoint del conector. clicklink clctl instances create utiliza el mismo certificado y la misma clave HMAC cuando llama al endpoint.
  • pcm_scraper y pcm_troubleshooter son los usuarios de ClickHouse de solo lectura con los que se conectan el scraper y el solucionador de problemas. El executor no tiene ningún usuario de ClickHouse.
  • Los ServiceAccounts del Troubleshooter, uno por cada implementación aprovisionada, disponen de las vistas de Kubernetes de solo lectura que puede utilizar una sesión de soporte.
  • pcm-executor es el ServiceAccount de Kubernetes del executor para el ciclo de vida de los servicios gestionados. Una ValidatingAdmissionPolicy limita sus escrituras a los espacios de nombres de los servicios.
  • pcm-platform es la identity del executor para las actualizaciones de la plataforma. Su comando clicklink clctl platform approve emite un token válido durante 2 horas y nunca lo renueva; entre aprobaciones, el executor no tiene acceso de escritura a la capa de la plataforma.
  • El rol de IAM por servicio (CH-S3-<service>-<region>-00-Role de forma predeterminada) lo crea clicklink clctl executor prepare con sus credenciales. Está acotado a los buckets de datos y de copia de seguridad de ese servicio y solo goza de la confianza del ServiceAccount de Kubernetes de ese servicio, de modo que ni el executor ni ClickHouse pueden asumirlo.
  • El perfil de instancia de la VM EC2 del conector asume el rol de pull de ECR de solo lectura de su entorno para el acceso directo a la plataforma, tanto para el inicio de sesión de charts como para las comprobaciones de imágenes. La CLI de aprobación emplea la misma ruta de perfil de instancia; los perfiles de AWS de la estación de trabajo o las credenciales de SSO no lo sustituyen. Otros registries de charts de ECR utilizan credenciales ambiente de AWS. Las descargas de imágenes se realizan en sus nodos con su propio rol de pull. El executor no guarda credenciales para sus buckets ni para IAM, y no realiza llamadas a S3 ni a IAM. Consulte credenciales del registry.
  • Sus propias credenciales aplican todos los permisos: el permiso de acceso del executor en init --managed, los buckets y el rol en prepare, la mitad correspondiente a los permisos de cada actualización de plataforma en approve y la limpieza en teardown.

Qué puede hacer el conector

Conexiones salientes

Todas las conexiones que abre el conector se originan dentro de su entorno. La lista completa: En sentido entrante, cada demonio expone un único puerto local de salud, que también sirve sus métricas de Prometheus, además del gateway de sesión opcional. La API de comandos local del executor se enlaza únicamente a loopback. Nada más queda a la escucha. ClickHouse Cloud nunca inicia conexiones hacia su entorno: solo puede responder a los dos WebSockets salientes.

Privilegios de ClickHouse

El aprovisionamiento crea un usuario de solo lectura por cada componente de observación. Los usuarios se crean con IDENTIFIED WITH bcrypt_hash, por lo que en el SQL de aprovisionamiento solo existe un hash bcrypt con sal. La contraseña en texto plano solo se encuentra en el archivo de credenciales que el demonio lee en tiempo de ejecución. La línea ALTER USER que sigue a cada CREATE USER rota el hash con --force. El executor no tiene usuario de ClickHouse y nunca se conecta a ClickHouse. Los privilegios son exactamente los siguientes, con los conjuntos de tablas predeterminados:
READ ON REMOTE es necesario porque las consultas de scrape encapsulan cada tabla del sistema en clusterAllReplicas(). SYSTEM FLUSH LOGS es el único privilegio a nivel de sistema. Hace que las tablas del sistema *_log persistan las entradas que ya tienen en búfer para que los scrapes vean datos actuales; no permite leer ni modificar nada. ClickHouse acepta ese privilegio únicamente con alcance global y solo lo aplica a las tablas de logs, por lo que el privilegio concedido es más amplio que la capacidad real.
El privilegio system.user_directories para ambos usuarios sirve para un único diagnóstico. clicklink clctl preflight se ejecuta con las credenciales del propio conector y comprueba si la instancia almacena sus usuarios de ClickHouse de forma replicada o local. La tabla contiene metadatos de configuración del almacenamiento de usuarios, no datos de usuario. No está incluida ni en el conjunto de scrape ni en la lista de permitidos de la tabla de sesión, por lo que ninguna ruta de salida de scrape o sesión la lee. Sin este privilegio, esa comprobación preflight se marca como omitida y todo lo demás continúa. No hay privilegios de INSERT, DDL, administración de usuarios, configuración ni control de procesos. Cuando una segunda implementación del conector comparte una instancia, sus usuarios llevan un sufijo (pcm_scraper_<suffix>) con los mismos conjuntos de privilegios.

RBAC de Kubernetes

Scraper y solucionador de problemas

El scraper y el solucionador de problemas no tienen ningún Rol de clúster ni ClusterRoleBinding. El chart crea Roles con ámbito de espacio de nombres en el espacio de nombres del connector, y cada paquete de acceso por instancia crea un Role en el espacio de nombres de ClickHouse o del service de esa instancia.

Executor

En modo gestionado, clicklink clctl init --managed (o clicklink clctl executor access grant --cluster seguido de apply --cluster) aplica la concesión del Executor con tus credenciales. La concesión consta de la ServiceAccount pcm-executor (en el espacio de nombres del conector en Kubernetes, o en clicklink-system en una instalación en VM), un Rol de clúster vinculado a ella y la ValidatingAdmissionPolicy pcm-executor-prefix-guard. Los verbos se conceden a nivel de clúster porque RBAC no puede expresar un prefijo de espacio de nombres. La política de admisión deniega entonces toda escritura de pcm-executor dirigida a un espacio de nombres fuera del prefijo del servicio (ns- por defecto). Su espacio de nombres de origen admite tres escrituras: la renovación de su propio token, el ConfigMap clicklink-instance-registry que lee el scraper y, en Kubernetes, el certificado de client renovado que se vuelve a escribir en el Secret clicklink-mtls. La política se aplica únicamente a esa ServiceAccount y usa failurePolicy: Fail y validationActions: [Deny]. El ClusterRoleBinding se aplica al final, después de la política y su vinculación, de modo que una concesión aplicada parcialmente deja al Executor sin permisos, en lugar de con permisos sin protección. En una VM, clicklink clctl executor prepare también aplica un paquete por servicio. El paquete consta de una ServiceAccount pcm-executor dentro de ns-<name>, un Role con las mismas familias de recursos y un Rol de clúster limitado a get y delete sobre ese único espacio de nombres. El Executor usa ese paquete para el servicio cuando está presente y, en caso contrario, la concesión a nivel de clúster. En Kubernetes, el pod de Kubernetes siempre actúa como la ServiceAccount pcm-executor del espacio de nombres del conector. La admisión no se ejecuta en get, list ni watch, por lo que las lecturas que el Executor realiza sobre estas familias de recursos no están limitadas al prefijo.

Identity de la plataforma

clicklink clctl platform approve aplica la mitad correspondiente a los permisos de una actualización de plataforma con tus credenciales: espacios de nombres, CustomResourceDefinitions, ServiceAccounts, roles de clúster y ClusterRoleBindings, Roles y RoleBindings, configuraciones de webhook y de admisión, PriorityClasses y la clase de almacenamiento. Después, aplica el ServiceAccount pcm-platform, su rol de clúster, la ValidatingAdmissionPolicy pcm-platform-scope-guard y la vinculación, y emite un token vinculado con una validez de 2 horas. Con ese token, el executor solo puede escribir deployments, services, configmaps, secrets, jobs y poddisruptionbudgets, y únicamente en los espacios de nombres de plataforma que permita el scope guard. Puede leer pods, events, namespaces, serviceaccounts, CustomResourceDefinitions, objetos RBAC, configuraciones de webhook, clases de almacenamiento y PriorityClasses para comprobar que la mitad de los permisos ya está aplicada antes de aplicar nada. Nunca dispone de escalate, bind ni impersonate, nunca escribe un tipo de ámbito de clúster ni un objeto RBAC, y no puede emitir ni renovar su propio token. El token autoriza exactamente un paquete: el resumen que aprobaste queda registrado en el ServiceAccount, y el executor rechaza cualquier otro.

Lo que el conector no puede hacer

  • Ninguna escritura sobre los datos o el estado de ClickHouse. Los grants anteriores no contienen ningún INSERT, ninguna DDL ni privilegios de gestión de usuarios, de configuración o de control de procesos. El único grant de clase de sistema, el SYSTEM FLUSH LOGS del scraper, solo hace que las log tables persistan lo que ya tienen en búfer. El executor no tiene ningún ClickHouse user. Ningún componente puede modificar datos, esquemas, usuarios ni configuración a través de ClickHouse.
  • Sin exec. Ningún RBAC contiene pods/exec; ningún componente puede ejecutar comandos en tus pods.
  • Ninguna escritura fuera de los espacios de nombres del service y de la plataforma. El scraper y el solucionador de problemas no tienen delete ni patch. Sus únicas mutaciones son el update con nombre exacto sobre el propio secreto de mTLS del conector y el create sobre serviceaccounts/token, que emite tokens de corta duración para sus propias ServiceAccounts y no modifica ningún objeto almacenado. La admission deniega las escrituras del executor fuera del prefijo del service, y sus escrituras en la plataforma solo existen mientras sea válido un token emitido por ti.
  • Sin permiso para otorgar permisos. Tus credenciales aplican los espacios de nombres, las CRD, las ServiceAccounts, el RBAC, las configuraciones de webhook y de admission, las PriorityClasses y la clase de almacenamiento de la plataforma durante approve. La identidad de plataforma del executor no puede escalar privilegios, vincular ni suplantar. Dentro de un espacio de nombres de service, el executor solo puede crear Roles que otorguen permisos que ya posee.
  • Ninguna credencial para tus buckets ni para IAM. clicklink clctl executor prepare crea los buckets y el role por service, y clicklink clctl executor teardown los elimina; ambos comandos se ejecutan con tus credenciales. El role solo puede ser asumido por los pods de ese service. Para el acceso directo a la plataforma, el executor usa el perfil de instancia de la VM EC2 del conector para asumir el role de pull de solo lectura de ECR, tanto para el inicio de sesión del chart como para las comprobaciones de imagen. Otros registros de charts de ECR usan credenciales de AWS ambientales; consulta identities. Sus únicas llamadas a APIs de la nube van a ECR y STS; no puede leer ni eliminar tus datos.
  • Ningún conocimiento de la contraseña de tu usuario default. clicklink clctl executor prepare la genera en tu lado y la muestra una sola vez (o lo hace clicklink clctl instances create, cuando pasas las entradas como flags). Solo se envían sus hashes, de modo que ni el conector ni ClickHouse Cloud pueden recuperarla.
  • Nada entrante. ClickHouse Cloud nunca abre una connection hacia tu entorno. Las únicas rutas de comandos son los dos WebSockets salientes. El solucionador de problemas rechaza todos los comandos salvo que esté activa una sesión de soporte que hayas habilitado. El executor acepta comandos de ciclo de vida solo para los services cuya gestión hayas solicitado a ClickHouse, dentro de los ámbitos anteriores. Incluso durante una sesión, el solucionador de problemas está limitado por ambos lados. Las consultas a ClickHouse se restringen a la lista de permitidos de tablas, que rechaza query_log y text_log, por lo que nunca se otorgan. El acceso a Kubernetes se limita a las vistas de solo lectura y a los logs de pods que otorgan los Roles acotados al espacio de nombres.

Qué requiere su intervención

  • Habilitar el modo gestionado. El executor se ejecuta, y su grant de Kubernetes existe, solo después de que habilite el modo gestionado en init; el grant se aplica con permisos de administrador del cluster. Consulte servicios gestionados.
  • Crear un servicio. clicklink clctl executor prepare se ejecuta con sus credenciales de AWS para crear los buckets y el rol de IAM, y clicklink clctl instances create envía la definición. ClickHouse Cloud no puede crear un servicio en su cluster sin ambos. Consulte crear un servicio.
  • Actualizaciones de la plataforma. Cada actualización de los componentes de la plataforma se aplica solo después de que ejecute clicklink clctl platform approve para ese paquete exacto; el token que genera expira a las 2 horas y nunca se renueva. Consulte actualizaciones de la plataforma.
  • Limpieza tras una eliminación. Eliminar un servicio elimina únicamente sus recursos de Kubernetes. clicklink clctl executor teardown, ejecutado con sus credenciales, elimina el rol de IAM y, solo con indicadores explícitos, los datos y los backups. Consulte eliminar un servicio.
  • Sesiones de soporte. La resolución interactiva de problemas solo se realiza dentro de una sesión que habilite, con una duración predeterminada de 4 horas y máxima de 24 horas. Deshabilitarla surte efecto de inmediato. Consulte las sesiones de soporte.
  • La lista de permitidos de operadores. Cada solicitud al gateway debe incluir un token OIDC cuyo correo electrónico certificado figure en su lista de permitidos. Una lista de permitidos vacía no permite el acceso. Usted administra la lista; consulte la guía de configuración.
  • Exposición del gateway. El gateway de sesión está desactivado salvo que lo habilite y solo es accesible mediante reenvío de puertos, a menos que opte por un Ingreso. En una VM, cada operador debe fijar la huella digital de su certificado autofirmado, o verificarlo con un CA bundle pasado como --gateway-ca, antes de que los comandos de sesión se comuniquen con él.
  • Salida de red. Con un CNI que aplica las políticas de red, ningún demonio alcanza el endpoint del conector hasta que indique sus CIDR en networkPolicy.allowEgressCIDRs. El executor también necesita los CIDR del Kubernetes API server (networkPolicy.apiserverCIDRs), que init --managed deriva de la VPC del cluster. Si los charts de la plataforma provienen de Amazon ECR, añada también los rangos de ECR y STS.

Cómo se atribuye el acceso

  • Identity de la implementación. El common name del certificado de client mTLS es el ID de tu org, y su único DNS name está vinculado al host de tu endpoint. Eso hace que toda connection a la API sea atribuible a tu org. La renewal es automática y se realiza dentro del demonio; ningún operador manipula el material de la clave.
  • Integridad de las solicitudes. Cada API request incluye además una firma HMAC-SHA256 (Authorization: HMAC-SHA256 AccessKey=..., Signature=..., Timestamp=...) sobre el method, el path, la marca de tiempo y el hash del cuerpo, usando el par de claves emitido durante la inscripción.
  • Identidad del operador. Las llamadas al gateway se atribuyen al correo electrónico atestiguado por el OIDC ID token del operador, verificado frente al JWKS de tu identity provider. Nunca se confía en un nombre autodeclarado cuando hay un token disponible.
  • Comandos de ciclo de vida. El executor registra en su almacén local cada comando que recibe, junto con su origin (ClickHouse Cloud o una llamada local a clicklink clctl), su stage y su resultado, e informa del resultado por el canal de comandos. Consulta el registro con clicklink clctl commands list y clicklink clctl commands get; véase la CLI reference.
  • Aprobaciones de plataforma. El digest del paquete que aprobaste queda registrado en el ServiceAccount pcm-platform. Cada object aplicado con tus credenciales lleva un hash de contenido, que el executor verifica antes de escribir nada. Cualquier paquete con un digest distinto se rechaza.
  • Registro de auditoría. Cada comando de sesión, aceptado o bloqueado, se añade al audit log NDJSON con la identity de la org obtenida del canal de comandos. Las llamadas al gateway se registran como líneas clctl.gateway estructuradas en el log del solucionador de problemas, con el correo electrónico atestiguado del operador. Los cambios de sesión locales en la VM registran el usuario del host en session.json. Consulta el audit log con clicklink clctl troubleshoot audit tail; véase la CLI reference.

Valores predeterminados de minimización de datos

  • query_log se excluye de los scrapes de forma predeterminada. Sus columnas contienen SQL sin procesar con valores literales, que pueden incluir datos personales o secretos. No sale de tu perímetro a menos que lo añadas explícitamente.
  • El solucionador de problemas solo lee tablas incluidas en la lista de permitidos. query_log y text_log se rechazan en la propia configuración de la lista de permitidos, de modo que nunca se conceden y el historial de consultas nunca es legible. La lista de permitidos predeterminada sí incluye system.processes (texto de las consultas en ejecución); recórtala (troubleshooter.allowedTables en Kubernetes, troubleshooter.allowed_tables en una VM) si eso debe permanecer oculto durante las sesiones.
  • Toda la salida del solucionador de problemas se redacta con patrones integrados y con los que tú definas. Los integrados cubren direcciones IPv4 e IPv6, tokens bearer, claves de acceso de AWS, correos electrónicos, JWT, claves privadas SSH y credenciales de cadenas de conexión. Si el archivo de patrones es inválido, el demonio se niega a iniciarse en lugar de ejecutarse sin redactar.
  • El estado del servicio gestionado son solo metadatos. El executor informa del estado de un servicio, el recuento de réplicas, las versiones y los resultados de los comandos. Nunca lee las tablas ni los buckets del servicio.
  • Las credenciales se minimizan en reposo. El SQL de aprovisionamiento contiene hash bcrypt, nunca contraseñas en texto plano. La contraseña del usuario default de un servicio gestionado se muestra una sola vez y solo sale en forma de hash. El token de inscripción nunca se escribe en la línea de comandos, el disco ni los logs. Las claves residen en Kubernetes Secrets o en archivos con modo 0600.