- 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.
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
orders que contiene información de clientes:
masked_data_viewer:
masked_data_viewer consulta la tabla orders, ve automáticamente datos enmascarados:
Query
Response (for masked_data_viewer role)
masked_data_viewer ven los datos originales, sin enmascarar.
Enmascaramiento condicional
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
PRIORITY para controlar qué transformación se aplica. Los valores de prioridad más altos se aplican en último lugar:
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
Gestión de las políticas de enmascaramiento
Utilice funciones de reemplazo de cadenas
replace ofrece una forma práctica de enmascararlos:
| Función | Descripción |
|---|---|
replaceOne | Reemplaza la primera aparición de un patrón en una cadena de entrada con la cadena de reemplazo proporcionada. |
replaceAll | Reemplaza todas las apariciones de un patrón en una cadena de entrada con la cadena de reemplazo proporcionada. |
replaceRegexpOne | Reemplaza la primera aparición de una subcadena que coincide con un patrón de expresión regular (en sintaxis re2) en una cadena de entrada con la cadena de reemplazo proporcionada. |
replaceRegexpAll | Reemplaza todas las apariciones de una subcadena que coincide con un patrón de expresión regular (en sintaxis re2) en una cadena de entrada con la cadena de reemplazo proporcionada. |
[CUSTOMER_NAME] mediante la función replaceOne:
Query
Response
replaceRegexpOne para sustituir cualquier nombre de cliente:
Query
Response
replaceRegexpAll.
Query
\3 para sustituir el tercer grupo de captura en la cadena resultante, lo que produce:
Response
Crear VIEWs enmascaradas
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:
masked_orders:
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
SELECT sobre la vista al rol:
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:
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
VIEW independiente para los datos enmascarados, ahora crearemos columnas enmascaradas con MATERIALIZED:
SELECT * de forma predeterminada.
Query
Response
orders.
Vuelva a crear el rol que creamos anteriormente:
SELECT sobre la tabla orders:
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.
Query
Response
Utilice reglas de enmascaramiento de consultas para datos de logs
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: