Enmascaramiento de datos
Anonimiza la PII en la creación de un branch — políticas de enmascaramiento, la biblioteca de funciones integradas y cómo los branches enmascarados permanecen sellados hasta que el enmascaramiento se confirma.
El enmascaramiento de datos anonimiza las columnas sensibles en el momento en que se crea un branch. Adjuntas una política de enmascaramiento a la llamada de creación del branch, y las columnas coincidentes del nuevo branch se reescriben de forma irreversible — con hash, anuladas, truncadas o reemplazadas — antes de que el branch sea siquiera accesible. El branch padre nunca se modifica.
Recurres a ello para entregar datos con forma de producción a desarrollo, CI o un contratista sin entregar la PII que contienen: formas de tabla reales, recuentos de filas reales, correos electrónicos falsos.
How it works
Una política de enmascaramiento es un conjunto de reglas con nombre y alcance de proyecto. Cada regla hace coincidir columnas por patrón y nombra una función de enmascaramiento integrada:
| Campo | Significado |
|---|---|
schema_pattern | Patrón de nombre de esquema (% o * = cualquiera, _ = un carácter). El valor por defecto es *. |
table_pattern | Patrón de nombre de tabla. |
column_pattern | Patrón de nombre de columna. |
masking_fn | Una de las funciones integradas de abajo. |
fn_args | Argumentos de la función (solo mask_constant toma uno: value). |
En el momento de la creación del branch, cuando se proporciona un
masking_policy_id:
- El branch se bifurca de su padre como de costumbre (copy-on-write — instantáneo).
- El branch entra en el estado
masking. No se aprovisiona ningún endpoint y el proxy rechaza las conexiones a él: no hay ninguna ventana en la que se puedan leer los datos previos al enmascaramiento. - Un worker de enmascaramiento se conecta a la compute del branch como un rol de mínimo privilegio, descubre el esquema, hace coincidir tus reglas con él y ejecuta cada reescritura en una sola transacción.
- El branch aterriza en
readyy sus endpoints se levantan — ahora sirviendo solo datos enmascarados. Ante cualquier fallo, el branch aterriza enfailedy permanece sellado; elimínalo y reinténtalo.
Las entradas de las reglas se tratan como datos, nunca como SQL: los identificadores se entrecomillan y los valores de los argumentos se vinculan como parámetros en la ejecución, de modo que un nombre de columna o una constante hostil no puede escapar de la reescritura.
Built-in functions
| Función | Efecto |
|---|---|
mask_email | md5(value)@masked.invalid |
mask_name | Name_ + un prefijo de hash de 8 caracteres |
mask_null | NULL (la columna debe admitir nulos) |
mask_constant | Un valor fijo que proporcionas (fn_args.value) |
mask_ssn_partial | ***-**-1234 — conserva los últimos 4 dígitos |
mask_credit_card | ****-****-****-1234 — conserva los últimos 4 dígitos |
mask_ip | 0.0.0.0 |
mask_date_year | Conserva el año, trunca al 1 de enero |
mask_hash | md5(value) |
mask_shuffle | Mezcla basada en hash (la mezcla completa de caracteres está planificada) |
mask_phone | Un número sintético +1-555-XXXX |
mask_uuid | Un UUID aleatorio nuevo |
El catálogo también lo sirve la API:
curl -s https://api.test.kisenon.com/v1/masking-functions \
-H "Authorization: Bearer $KISENON_API_KEY"Managing policies
El enmascaramiento de datos se está desplegando progresivamente. El editor de políticas y el desplegable de creación de branch descritos aquí se habilitan de forma gradual; hasta que el enmascaramiento esté activo para tu cuenta, la API responde
501 not_implementedy la consola muestra un aviso de "todavía no disponible". Tus proyectos no se ven afectados mientras tanto.
En la consola, abre Project settings → Data masking para crear una política: ponle nombre, añade reglas (columnas de patrón + un desplegable de función) y guarda. La misma superficie existe en la API:
curl -s -X POST \
https://api.test.kisenon.com/v1/projects/$PROJECT_ID/masking-policies \
-H "Authorization: Bearer $KISENON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "dev-safe",
"rules": [
{"table_pattern": "users", "column_pattern": "email", "masking_fn": "mask_email"},
{"table_pattern": "users", "column_pattern": "phone", "masking_fn": "mask_null"},
{"table_pattern": "%", "column_pattern": "%ssn%", "masking_fn": "mask_ssn_partial"}
]
}'Luego crea un branch enmascarado añadiendo la política a una llamada normal de creación de branch:
curl -s -X POST \
https://api.test.kisenon.com/v1/projects/$PROJECT_ID/branches \
-H "Authorization: Bearer $KISENON_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "masked-dev", "masking_policy_id": "'$POLICY_ID'"}'El branch informa state: "masking" mientras se ejecuta la reescritura;
obsérvalo cambiar a ready en la consola (en vivo, a través del
flujo de eventos del proyecto) o sondeando
GET /v1/branches/{id}.
Good to know
- El enmascaramiento es de una sola vez, en la creación. Editar una política nunca toca los branches que ya se crearon con ella — conservan la forma de datos con la que nacieron. Vuelve a crear el branch para aplicar las nuevas reglas.
- Una política en uso no se puede eliminar. Eliminar una política con
la que se creó un branch activo devuelve
409 policy_in_use; elimina primero esos branches. - Las reglas sin coincidencia se omiten, no son fatales. Si tu esquema se desvió y un patrón no coincide con nada, el branch igualmente se completa — revisa los patrones de las reglas si una columna que esperabas enmascarada todavía tiene una forma de datos real.
- Las discrepancias de tipo hacen fallar el branch. Una regla que
coincide con una columna que su función no puede reescribir (digamos
mask_emailsobre uninteger) aborta todo el enmascaramiento — el branch aterriza enfailedy nunca se expone enmascarado a medias.