Saltar al contenido principal
El enmascaramiento de datos es una técnica de protección de datos en la que los datos originales se sustituyen por una versión que mantiene su formato y estructura, pero elimina cualquier información de identificación personal (PII) o información confidencial. Esta guía muestra cómo enmascarar datos en ClickHouse mediante varios enfoques:
  • Políticas de enmascaramiento (ClickHouse Cloud, 25.12+): Enmascaramiento dinámico nativo aplicado en tiempo de consulta para usuarios/roles específicos
  • Funciones de reemplazo de cadena: Enmascaramiento básico mediante funciones integradas
  • Masked views: Creación de vistas con lógica de transformación
  • Columnas materializadas: Almacenamiento de versiones enmascaradas junto con los datos originales
  • Reglas de enmascaramiento de consulta: Enmascaramiento de datos confidenciales en los logs (ClickHouse OSS)

Usar políticas de enmascaramiento (ClickHouse Cloud)

Las políticas de enmascaramiento están disponibles en ClickHouse Cloud a partir de la versión 25.12.
La sentencia CREATE MASKING POLICY ofrece una forma nativa de enmascarar dinámicamente los valores de las columnas para usuarios o roles específicos en el momento de la consulta. A diferencia de otros enfoques, las políticas de enmascaramiento no requieren crear vistas independientes ni almacenar datos enmascarados; la transformación se aplica de forma transparente cuando los usuarios consultan la tabla.

Política básica de enmascaramiento

Para demostrar las políticas de enmascaramiento, vamos a crear una tabla orders que contiene información de clientes:
Ahora cree un rol para los usuarios que deban ver los datos enmascarados:
Cree una política de enmascaramiento que se aplique al rol masked_data_viewer:
Cuando un usuario con el rol masked_data_viewer consulta la tabla orders, ve automáticamente datos enmascarados:
Query
Response (for masked_data_viewer role)
Los usuarios que no tienen el rol masked_data_viewer ven los datos originales, sin enmascarar.

Enmascaramiento condicional

Puedes usar la cláusula WHERE para aplicar el enmascaramiento solo a filas concretas. Por ejemplo, para enmascarar únicamente los pedidos de alto valor:

Múltiples políticas con prioridad

Cuando se aplican varias políticas de enmascaramiento a la misma columna, usa la cláusula PRIORITY para controlar qué transformación se aplica. Los valores de prioridad más altos se aplican en último lugar:
En este ejemplo, para los pedidos con total_amount > 100, la política refined_masking (prioridad 10) prevalece sobre la política basic_masking (prioridad 0) para la columna name, mientras que email sigue usando el enmascaramiento básico.

Enmascaramiento basado en hash

En los casos en los que necesite un enmascaramiento consistente (la misma entrada siempre produce la misma salida enmascarada), use funciones hash:

Gestión de las políticas de enmascaramiento

Ver todas las políticas de enmascaramiento:
Eliminar una política de enmascaramiento:
Reemplace una política existente:
Para más detalles, consulte la documentación de CREATE MASKING POLICY.

Utilice funciones de reemplazo de cadenas

Para casos básicos de enmascaramiento de datos, la familia de funciones replace ofrece una forma práctica de enmascararlos: Por ejemplo, puede reemplazar el nombre “John Smith” por un marcador [CUSTOMER_NAME] mediante la función replaceOne:
Query
Response
De forma más general, puedes usar replaceRegexpOne para sustituir cualquier nombre de cliente:
Query
Response
O bien, puede enmascarar un número de seguro social, dejando solo los últimos 4 dígitos con la función replaceRegexpAll.
Query
En la consulta anterior, se utiliza \3 para sustituir el tercer grupo de captura en la cadena resultante, lo que produce:
Response

Crear VIEWs enmascaradas

Se puede usar una VIEW junto con las funciones de cadena mencionadas anteriormente para aplicar transformaciones a las columnas que contienen datos sensibles antes de presentarlos al usuario. De este modo, los datos originales permanecen inalterados y los usuarios que consultan la vista solo ven los datos enmascarados. Para ilustrarlo, imaginemos que tenemos una tabla que almacena registros de pedidos de clientes. Queremos asegurarnos de que un grupo de empleados pueda ver la información, pero no queremos que vea toda la información de los clientes. Ejecute la siguiente consulta para crear una tabla de ejemplo orders e insertar en ella algunos registros ficticios de pedidos de clientes:
Cree una vista llamada masked_orders:
En la cláusula SELECT de la consulta anterior para crear la vista, definimos transformaciones con replaceRegexpOne en los campos name, email, phone y shipping_address, que contienen información sensible y que queremos enmascarar parcialmente. Seleccione los datos de la vista:
Query
Response
Tenga en cuenta que los datos devueltos por la vista están parcialmente enmascarados, lo que oculta la información confidencial. También puede crear varias vistas, con distintos niveles de ofuscación según el nivel de acceso privilegiado a la información que tenga quien la consulte. Para garantizar que los usuarios solo puedan acceder a la vista que devuelve los datos enmascarados, y no a la tabla con los datos originales sin enmascarar, debe usar Control de acceso basado en roles para asegurarse de que determinados roles solo tengan privilegios de SELECT sobre la vista. Primero, cree el rol:
A continuación, otorgue privilegios SELECT sobre la vista al rol:
Dado que los roles de ClickHouse son acumulativos, debes asegurarte de que los usuarios que solo deben ver la vista enmascarada no tengan ningún privilegio SELECT sobre la tabla base a través de ningún rol. Por tanto, para mayor seguridad, deberías revocar explícitamente el acceso a la tabla base:
Por último, asigna el rol a los usuarios adecuados:
Esto garantiza que los usuarios con el rol masked_orders_viewer solo puedan ver los datos enmascarados de la vista, y no los datos originales sin enmascarar de la tabla.

Use columnas MATERIALIZED y restricciones de acceso por columna

En los casos en que no desee crear una vista independiente, puede almacenar versiones enmascaradas de sus datos junto con los datos originales. Para ello, puede usar columnas materializadas. Los valores de estas columnas se calculan automáticamente según la expresión materializada especificada cuando se insertan filas, y puede utilizarlas para crear nuevas columnas con versiones enmascaradas de los datos. Retomando el ejemplo anterior, en lugar de crear una VIEW independiente para los datos enmascarados, ahora crearemos columnas enmascaradas con MATERIALIZED:
Si ahora ejecuta la siguiente consulta SELECT, verá que los datos enmascarados se ‘materializan’ en el momento de la inserción y se almacenan junto con los datos originales sin enmascarar. Es necesario seleccionar explícitamente las columnas enmascaradas, ya que ClickHouse no incluye automáticamente las columnas materializadas en las consultas SELECT * de forma predeterminada.
Query
Response
Para garantizar que los usuarios solo puedan acceder a las columnas que contienen datos enmascarados, puede volver a usar el Control de acceso basado en roles para asegurarse de que determinados roles solo tengan permisos de SELECT sobre las columnas enmascaradas de orders. Vuelva a crear el rol que creamos anteriormente:
A continuación, concede el permiso SELECT sobre la tabla orders:
Revoque el acceso a las columnas confidenciales:
Por último, asigne el rol a los usuarios correspondientes:
Si quieres almacenar solo los datos enmascarados en la tabla orders, puedes marcar como EPHEMERAL las columnas sensibles sin enmascarar, lo que garantiza que las columnas de este tipo no se almacenen en la tabla.
Si ejecutamos la misma consulta que antes, ahora verás que en la tabla solo se insertaron los datos enmascarados materializados:
Query
Response

Utilice reglas de enmascaramiento de consultas para datos de logs

Si usa ClickHouse OSS y desea enmascarar específicamente los datos de logs, puede usar query masking rules (enmascaramiento de logs) para enmascarar datos. Para ello, puede definir reglas de enmascaramiento basadas en expresiones regulares en la configuración del servidor. Estas reglas se aplican a las consultas y a todos los mensajes de log antes de almacenarse en los logs del servidor o en las tablas del sistema (como system.query_log, system.text_log y system.processes). Esto ayuda a evitar que los datos sensibles se filtren en los logs. Tenga en cuenta que esto no enmascara los datos en los resultados de las consultas. Por ejemplo, para enmascarar un número de seguridad social, podría añadir la siguiente regla a su configuración del servidor:
Última modificación el 12 de junio de 2026