Uso del enmascaramiento dinámico de datos con rutas de tipos de datos SUPER
Amazon Redshift permite asociar políticas de enmascaramiento dinámico de datos a las rutas de las columnas de tipo SUPER. Para obtener más información acerca del tipo de datos SUPER, consulte Datos semiestructurados en Amazon Redshift.
Al asociar políticas de enmascaramiento a las rutas de las columnas de tipo SUPER, tenga en cuenta lo siguiente.
-
Al asociar una política de enmascaramiento a una ruta de una columna, esa columna debe definirse como el tipo de datos SUPER. Solo puede aplicar políticas de enmascaramiento a los valores escalares de la ruta SUPER. No puede aplicar políticas de enmascaramiento a estructuras o matrices complejas.
-
Puede aplicar diferentes políticas de enmascaramiento a varios valores escalares de una sola columna SUPER, siempre que las rutas SUPER no entren en conflicto. Por ejemplo, las rutas SUPER
a.b
ya.b.c
entran en conflicto porque están en la misma ruta. Además,a.b
es el principal dea.b.c
. Las rutas SUPERa.b.c
ya.b.d
no entran en conflicto. -
Amazon Redshift no puede comprobar si las rutas asociadas a una política de enmascaramiento existen en los datos y son del tipo esperado hasta que la política se aplique en el tiempo de ejecución de las consultas de los usuarios. Por ejemplo, si asocia una política de enmascaramiento que enmascara valores TEXT a una ruta SUPER que contiene un valor INT, Amazon Redshift intenta convertir el tipo de valor en la ruta.
En estas situaciones, el comportamiento de Amazon Redshift en el tiempo de ejecución depende de los ajustes de la configuración de la consulta de objetos SUPER. De forma predeterminada, Amazon Redshift está en modo laxo y resolverá las rutas que falten y las cadenas no válidas como
NULL
en la ruta SUPER dada. Para obtener más información acerca de los valores de configuración relacionados con SUPER, consulte Configuraciones SUPER. -
SUPER es un tipo sin esquema, lo que significa que Amazon Redshift no puede confirmar la existencia del valor en una ruta SUPER determinada. Si asocia una política de enmascaramiento a una ruta SUPER que no existe y Amazon Redshift está en modo laxo, Amazon Redshift resolverá la ruta hacia un valor
NULL
. Le recomendamos que tenga en cuenta el formato esperado de los objetos SUPER y la probabilidad de que tengan atributos inesperados al asociar políticas de enmascaramiento a las rutas de las columnas SUPER. Si cree que puede haber un esquema inesperado en su columna SUPER, considere asociar sus políticas de enmascaramiento directamente a la columna SUPER. Puede utilizar las funciones de información de tipo SUPER para comprobar los atributos y los tipos, y utilizarOBJECT_TRANSFORM
para enmascarar los valores. Para obtener más información acerca de las funciones de información de tipo SUPER, consulte Funciones de información acerca del tipo SUPER.
Ejemplos
Asociación de políticas de enmascaramiento a las rutas SUPER
En el siguiente ejemplo, se asocian varias políticas de enmascaramiento a varias rutas de tipo SUPER en una columna.
CREATE TABLE employees ( col_person SUPER ); INSERT INTO employees VALUES ( json_parse(' { "name": { "first": "John", "last": "Doe" }, "age": 25, "ssn": "111-22-3333", "company": "Company Inc." } ') ), ( json_parse(' { "name": { "first": "Jane", "last": "Appleseed" }, "age": 34, "ssn": "444-55-7777", "company": "Organization Org." } ') ) ; GRANT ALL ON ALL TABLES IN SCHEMA "public" TO PUBLIC; -- Create the masking policies. -- This policy converts the given name to all uppercase letters. CREATE MASKING POLICY mask_first_name WITH(first_name TEXT) USING ( UPPER(first_name) ); -- This policy replaces the given name with the fixed string 'XXXX'. CREATE MASKING POLICY mask_last_name WITH(last_name TEXT) USING ( 'XXXX'::TEXT ); -- This policy rounds down the given age to the nearest 10. CREATE MASKING POLICY mask_age WITH(age INT) USING ( (FLOOR(age::FLOAT / 10) * 10)::INT ); -- This policy converts the first five digits of the given SSN to 'XXX-XX'. CREATE MASKING POLICY mask_ssn WITH(ssn TEXT) USING ( 'XXX-XX-'::TEXT || SUBSTRING(ssn::TEXT FROM 8 FOR 4) ); -- Attach the masking policies to the employees table. ATTACH MASKING POLICY mask_first_name ON employees(col_person.name.first) TO PUBLIC; ATTACH MASKING POLICY mask_last_name ON employees(col_person.name.last) TO PUBLIC; ATTACH MASKING POLICY mask_age ON employees(col_person.age) TO PUBLIC; ATTACH MASKING POLICY mask_ssn ON employees(col_person.ssn) TO PUBLIC; -- Verify that your masking policies are attached. SELECT policy_name, TABLE_NAME, priority, input_columns, output_columns FROM svv_attached_masking_policy;
policy_name | table_name | priority | input_columns | output_columns -----------------+------------+----------+-----------------------------------+----------------------------------- mask_age | employees | 0 | ["col_person.\"age\""] | ["col_person.\"age\""] mask_first_name | employees | 0 | ["col_person.\"name\".\"first\""] | ["col_person.\"name\".\"first\""] mask_last_name | employees | 0 | ["col_person.\"name\".\"last\""] | ["col_person.\"name\".\"last\""] mask_ssn | employees | 0 | ["col_person.\"ssn\""] | ["col_person.\"ssn\""] (4 rows)
-- Observe the masking policies taking effect. SELECT col_person FROM employees ORDER BY col_person.age; -- This result is formatted for ease of reading.col_person -------------------------------- { "name": { "first": "JOHN", "last": "XXXX" }, "age": 20, "ssn": "XXX-XX-3333", "company": "Company Inc." } { "name": { "first": "JANE", "last": "XXXX" }, "age": 30, "ssn": "XXX-XX-7777", "company": "Organization Org." }
A continuación se muestran algunos ejemplos de asociaciones no válidas de políticas de enmascaramiento a rutas SUPER.
-- This attachment fails because there is already a policy -- with equal priority attached to employees.name.last, which is -- on the same SUPER path as employees.name. ATTACH MASKING POLICY mask_ssn ON employees(col_person.name) TO PUBLIC;
ERROR: DDM policy "mask_last_name" is already attached on relation "employees" column "col_person."name"."last"" with same priority
-- Create a masking policy that masks DATETIME objects. CREATE MASKING POLICY mask_date WITH(INPUT DATETIME) USING ( INPUT ); -- This attachment fails because SUPER type columns can't contain DATETIME objects. ATTACH MASKING POLICY mask_date ON employees(col_person.company) TO PUBLIC;ERROR: cannot attach masking policy for output of type "timestamp without time zone" to column "col_person."company"" of type "super
A continuación, se ofrece un ejemplo de una política de enmascaramiento a una ruta SUPER que no existe. De forma predeterminada, Amazon Redshift resolverá la ruta hacia NULL
.
ATTACH MASKING POLICY mask_first_name ON employees(col_person.not_exists) TO PUBLIC; SELECT col_person FROM employees LIMIT 1; -- This result is formatted for ease of reading.
col_person ----------------------------------- { "name": { "first": "JOHN", "last": "XXXX" }, "age": 20, "ssn": "XXX-XX-3333", "company": "Company Inc.", "not_exists": null }