Una petición frecuente de los clientes es una manera de identificar PII dentro de sus bases de datos. He pensado en mostrar un breve ejemplo de cómo hacerlo.
Historia de usuario: "Quiero identificar números de tarjetas de crédito y de la seguridad social sin cifrar dentro de los documentos para asegurarme de que los desarrolladores no están almacenando cosas que no deberían en la base de datos".
Antecedentes: N1QL tiene un "tokenizador"a partir de la versión 4.6. Combine esto con funciones regex en N1QL, índices secundarios específicos y disponemos de un potente conjunto de herramientas para identificar patrones dentro de la base de datos.
Ejemplo de solución: He creado una consulta para identificar números de la seguridad social sin cifrar almacenados en un bucket (el bucket "por defecto" en este caso). Busco cualquier patrón de dígitos que coincida con xxx-xx-xxxx o xxxxxxxxx. La función TOKENS me permite tratar un documento como una matriz de cadenas. Usé la bandera "specials" para decirle a N1QL que mantenga estas cadenas intactas. Si no utilizo esta opción, se eliminarán los espacios y los guiones y se ignorarán los elementos que sigan a estos caracteres. Luego busco cualquier expresión regular que coincida con un elemento dentro de la matriz de tokens.
1 2 3 4 5 |
SELECCIONAR * DESDE por defecto DONDE CUALQUIER v EN TOKENS(por defecto, {"especiales":verdadero}) SATISFACE REGEXP_LIKE(TOSTRING(v),'(\\d{3}-\\d{2}-\\d{4})|(\\b\\d{9}\\b)') FIN |
La identificación de números de tarjetas de crédito sin cifrar almacenados en un cubo utiliza el mismo enfoque:
1 2 3 4 5 |
SELECCIONAR * DESDE por defecto DONDE CUALQUIER v EN TOKENS(por defecto, {"especiales":verdadero}) SATISFACE REGEXP_LIKE(TOSTRING(v),'(\\d{4}-\\d{4}-\\d{4}-\\d{4}))|(\\b\\d{16}\\b)') FIN |
Para acelerar el tiempo de procesamiento, utilizo índices secundarios optimizados en memoria (MOI) para las consultas anteriores. Cada mutación en Couchbase se envía asíncronamente al proyector del índice. Los MOI tienen la ventaja añadida de actualizar la información contenida en el índice cada 20 ms. Los índices también hacen uso de la tokenización.
1 2 3 4 5 6 |
CREAR ÍNDICE `find_pii_ssn` EN `por defecto`( (DISTINTO (ARRAY `v` PARA `v` EN TOKENS(auto, {"especiales": verdadero}) FIN))) DONDE CUALQUIER `v` EN TOKENS(auto, {"especiales": verdadero}) SATISFACE REGEXP_LIKE(TO_STRING(`v`), "(\\d{3}-\\d{2}-\\d{4})|(\\b\\d{9}\\b)") FIN |
...y para tarjetas de crédito no encriptadas
1 2 3 4 5 6 |
CREAR ÍNDICE `find_pii_ccn` EN `por defecto`( (DISTINTO (ARRAY `v` PARA `v` EN TOKENS(auto, {"especiales": verdadero}) FIN))) DONDE cualquier `v` EN TOKENS(auto, {"especiales": verdadero}) SATISFACE REGEXP_LIKE(TO_STRING(`v`), "(\\d{4}-\\d{4}-\\d{4}-\\d{4}))|(\\b\\d{16}\\b)") FIN |
Pruébalo: Docker es mi forma favorita de crear un entorno de desarrollo. Un repositorio fácil de usar para los ejemplos anteriores está en github: n1ql-query-nodejs . Utiliza docker-compose para construir dos servicios:
- Un servicio de clúster Couchbase de nodo único.
- Un servicio nodejs para aprovisionar el clúster Couchbase con 250.000 perfiles de usuario e índices para varios ejemplos, incluida la búsqueda de PII sin cifrar.