Usar la seguridad a nivel de fila
En este documento se explica cómo usar la seguridad a nivel de fila en BigQuery para restringir el acceso a los datos a nivel de fila de la tabla. Antes de leer este documento, familiarícese con la descripción general de la seguridad a nivel de fila en la introducción a la seguridad a nivel de fila de BigQuery.
Puedes realizar las siguientes tareas con políticas de acceso a nivel de fila:
- Crea o actualiza una política de acceso a nivel de fila en una tabla
- Combinar políticas de acceso a nivel de fila en una tabla
- Mostrar las políticas de acceso a nivel de fila de una tabla
- Eliminar una política de acceso a nivel de fila de una tabla
- Consultar una tabla con una política de acceso a nivel de fila
Limitaciones
Cuando selecciona una tabla en la consola Google Cloud , la pestaña Vista previa no puede mostrar vistas previas de tablas con políticas de acceso a las filas. Para ver el contenido de la tabla, ejecuta una consulta.
Antes de empezar
Concede roles de gestión de identidades y accesos (IAM) que proporcionen a los usuarios los permisos necesarios para realizar cada tarea de este documento. Los permisos necesarios para realizar una tarea (si los hay) se indican en la sección "Permisos necesarios" de la tarea.
Crear o actualizar una política de acceso a nivel de fila
Puedes crear o actualizar una política de acceso a nivel de fila en una tabla de BigQuery con una instrucción del lenguaje de definición de datos (DDL).
Permisos obligatorios
Para crear una política de acceso a nivel de fila en una tabla de BigQuery, necesitas los siguientes permisos de gestión de identidades y accesos:
bigquery.rowAccessPolicies.create
bigquery.rowAccessPolicies.setIamPolicy
bigquery.tables.getData
(en la tabla de destino y en cualquier tabla a la que se haga referencia en las políticas de acceso a nivel de fila de subconsultas concedidas)bigquery.jobs.create
(para ejecutar el trabajo de consulta DDL)
Para actualizar una política de acceso a nivel de fila en una tabla de BigQuery, necesitas los siguientes permisos de gestión de identidades y accesos:
bigquery.rowAccessPolicies.update
bigquery.rowAccessPolicies.setIamPolicy
bigquery.tables.getData
(en la tabla de destino y en cualquier tabla a la que se haga referencia en las políticas de acceso a nivel de fila de subconsultas concedidas)bigquery.jobs.create
(para ejecutar el trabajo de consulta DDL)
Cada uno de los siguientes roles de gestión de identidades y accesos predefinidos incluye los permisos que necesitas para crear y actualizar una política de acceso a nivel de fila:
roles/bigquery.admin
roles/bigquery.dataOwner
Rol bigquery.filteredDataViewer
Cuando creas una política de acceso a nivel de fila, BigQuery asigna automáticamente el rol bigquery.filteredDataViewer
a los miembros de la lista de beneficiarios. Cuando consultas las políticas de acceso a nivel de fila de una tabla en la consola de Google Cloud , este rol se muestra asociado a los miembros de la lista de beneficiarios de la política.
Crear o actualizar políticas de acceso a nivel de fila
Para crear o actualizar una política de acceso a nivel de fila, usa una de las siguientes instrucciones DDL:
El
CREATE ROW ACCESS POLICY
crea una política de acceso a nivel de fila.La instrucción
CREATE ROW ACCESS POLICY IF NOT EXISTS
crea una política de acceso a nivel de fila si no existe ninguna con el mismo nombre en la tabla especificada.La instrucción
CREATE OR REPLACE ROW ACCESS POLICY
actualiza una política de acceso a nivel de fila con el mismo nombre en la tabla especificada.
Ejemplos
Crea una política de acceso a filas. El acceso a la tabla está restringido al usuario abc@example.com
. Solo se muestran las filas en las que region = 'APAC'
:
CREATE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (region = 'APAC');
Actualiza la política de acceso para que se aplique a la cuenta de servicio example@exampleproject.iam.gserviceaccount.com
:
CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('serviceAccount:example@exampleproject.iam.gserviceaccount.com') FILTER USING (region = 'APAC');
Crea una política de acceso a filas que conceda acceso a un usuario y a dos grupos:
CREATE ROW ACCESS POLICY sales_us_filter ON project.dataset.my_table GRANT TO ('user:john@example.com', 'group:sales-us@example.com', 'group:sales-managers@example.com') FILTER USING (region = 'US');
Crea una política de acceso a las filas con allAuthenticatedUsers
como beneficiarios:
CREATE ROW ACCESS POLICY us_filter ON project.dataset.my_table GRANT TO ('allAuthenticatedUsers') FILTER USING (region = 'US');
Crea una política de acceso a filas con un filtro basado en el usuario actual:
CREATE ROW ACCESS POLICY my_row_filter ON dataset.my_table GRANT TO ('domain:example.com') FILTER USING (email = SESSION_USER());
Crea una política de acceso a filas con un filtro en una columna de tipo ARRAY
:
CREATE ROW ACCESS POLICY my_reports_filter ON project.dataset.my_table GRANT TO ('domain:example.com') FILTER USING (SESSION_USER() IN UNNEST(reporting_chain));
Crea una política de acceso a filas con una subconsulta para sustituir varias políticas por una comparación de regiones configurada por usuario:
Consulta la siguiente tabla, lookup_table
:
+-----------------+--------------+ | email | region | +-----------------+--------------+ | xyz@example.com | europe-west1 | | abc@example.com | us-west1 | | abc@example.com | us-west2 | +-----------------+--------------+
CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('domain:example.com') FILTER USING (region IN ( SELECT region FROM lookup_table WHERE email = SESSION_USER()));
Si usas la subconsulta en lookup_table
, no tendrás que crear varias políticas de acceso a las filas. Por ejemplo, la instrucción anterior produce el mismo resultado que la siguiente, pero con menos consultas:
CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (region IN ('us-west1', 'us-west2')); CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('user:xyz@example.com') FILTER USING (region = 'europe-west1');
Para obtener más información sobre la sintaxis y las opciones disponibles, consulta la referencia de la instrucción DDL CREATE ROW ACCESS POLICY
.
Combinar políticas de acceso a nivel de fila
Si dos o más políticas de acceso a nivel de fila conceden acceso a un usuario o a un grupo a la misma tabla, el usuario o el grupo tendrá acceso a todos los datos cubiertos por cualquiera de las políticas.
Por ejemplo, las siguientes políticas conceden al usuario abc@example.com
acceso a las filas especificadas de la tabla my_table
:
CREATE ROW ACCESS POLICY shoes ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (product_category = 'shoes');
CREATE OR REPLACE ROW ACCESS POLICY blue_products ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (color = 'blue');
En el ejemplo anterior, el usuario abc@example.com
tiene acceso a las filas de la tabla my_table
que tienen el campo product_category
definido como shoes
. Además, abc@example.com
también tiene acceso a las filas que tienen el campo color
definido como blue
.
Por ejemplo, abc@example.com
podría acceder a las filas con información sobre zapatos rojos y coches azules.
Este acceso equivale al acceso proporcionado por la siguiente política de acceso a nivel de fila:
CREATE ROW ACCESS POLICY shoes_and_blue_products ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (product_category = 'shoes' OR color = 'blue');
Por otro lado, para especificar un acceso que dependa de que se cumplan varias condiciones, usa un filtro con el operador AND
. Por ejemplo, la siguiente política de acceso a nivel de fila
concede acceso a abc@example.com
solo a las filas que tienen el campo product_category
definido como shoes
y el campo color
definido como blue
:
CREATE ROW ACCESS POLICY blue_shoes ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (product_category = 'shoes' AND color = 'blue');
Con la política de acceso a nivel de fila anterior, abc@example.com
podría acceder a información sobre zapatos azules, pero no sobre zapatos rojos ni coches azules.
Mostrar políticas de acceso a nivel de fila de una tabla
Puedes enumerar y ver todas las políticas de acceso a nivel de fila de una tabla mediante la consola de Google Cloud , la herramienta de línea de comandos bq o el método de API RowAccessPolicies.List
.
Permisos obligatorios
Para enumerar las políticas de acceso a nivel de fila de una tabla de BigQuery, necesitas el permiso bigquery.rowAccessPolicies.list
de gestión de identidades y accesos.
Para ver los miembros de una política de acceso a nivel de fila en una tabla de BigQuery, necesitas el permiso de gestión de identidades y accesos bigquery.rowAccessPolicies.getIamPolicy
.
Cada uno de los siguientes roles de gestión de identidades y accesos predefinidos incluye los permisos que necesitas para enumerar y ver las políticas de acceso a nivel de fila:
roles/bigquery.admin
roles/bigquery.dataOwner
Para obtener más información sobre los roles y permisos de gestión de identidades y accesos en BigQuery, consulta el artículo sobre roles y permisos predefinidos.
Mostrar políticas de acceso a nivel de fila de una tabla
Para mostrar las políticas de acceso a nivel de fila, haz lo siguiente:
Consola
Para ver las políticas de acceso a nivel de fila, ve a la página de BigQuery en la Google Cloud consola.
Haga clic en el nombre de la tabla para ver sus detalles y, a continuación, en Ver políticas de acceso a las filas.
Cuando se abra el panel Políticas de acceso a filas, verás una lista con todas las políticas de acceso a nivel de fila de la tabla, ordenadas por nombre, y el
filter_expression
de cada política.Para ver todos los roles y usuarios afectados por una política de acceso a nivel de fila, haz clic en VER junto a la política. Por ejemplo, en la siguiente imagen, puedes ver en el panel Ver permisos que los miembros de la lista de beneficiarios tienen el rol
bigquery.filteredDataViewer
.
bq
Introduce el comando bq ls
y proporciona la marca --row_access_policies
.
Es obligatorio indicar los nombres del conjunto de datos y de la tabla.
bq ls --row_access_policies dataset.table
Por ejemplo, el siguiente comando muestra información sobre las políticas de acceso a nivel de fila de una tabla llamada my_table
en un conjunto de datos con el ID my_dataset
:
bq ls --row_access_policies my_dataset.my_table
API
Utilice el método RowAccessPolicies.List
de la sección de referencia de la API REST.
Eliminar políticas de acceso a nivel de fila
Puedes eliminar una o todas las políticas de acceso a nivel de fila de una tabla mediante una instrucción DDL, si tienes los permisos necesarios.
Permisos obligatorios
Para eliminar una política de acceso a nivel de fila, necesitas los siguientes permisos de gestión de identidades y accesos:
bigquery.rowAccessPolicies.delete
bigquery.rowAccessPolicies.setIamPolicy
bigquery.jobs.create
(para ejecutar el trabajo de consulta DDL)
Para eliminar todas las políticas de acceso a nivel de fila de una tabla al mismo tiempo, necesitas los siguientes permisos de gestión de identidades y accesos:
bigquery.rowAccessPolicies.delete
bigquery.rowAccessPolicies.setIamPolicy
bigquery.rowAccessPolicies.list
bigquery.jobs.create
(para ejecutar el trabajo de consulta DDL)
Cada uno de los siguientes roles de gestión de identidades y accesos predefinidos incluye los permisos que necesitas para eliminar políticas de acceso a nivel de fila:
roles/bigquery.admin
roles/bigquery.dataOwner
Para obtener más información sobre los roles y permisos de gestión de identidades y accesos en BigQuery, consulta el artículo sobre roles y permisos predefinidos.
Eliminar políticas de acceso a nivel de fila
Para eliminar una política de acceso a filas de una tabla, usa las siguientes instrucciones de DDL:
La instrucción
DROP ROW ACCESS POLICY
elimina una política de acceso a nivel de fila en la tabla especificada.La instrucción
DROP ROW ACCESS POLICY IF EXISTS
elimina una política de acceso a nivel de fila si existe en la tabla especificada.La instrucción
DROP ALL ROW ACCESS POLICIES
elimina todas las políticas de acceso a nivel de fila de la tabla especificada.
Ejemplos
Eliminar una política de acceso a nivel de fila de una tabla:
DROP ROW ACCESS POLICY my_row_filter ON project.dataset.my_table;
Elimina todas las políticas de acceso a nivel de fila de una tabla:
DROP ALL ROW ACCESS POLICIES ON project.dataset.my_table;
Para obtener más información sobre cómo eliminar una política de acceso a nivel de fila, consulta la referencia de la instrucción DDL DROP ROW ACCESS POLICY
.
Consultar tablas con políticas de acceso a filas
Un usuario debe tener acceso a una tabla de BigQuery para poder consultarla, aunque esté en el grantee_list
de una política de acceso a las filas de esa tabla. Sin ese permiso, la consulta falla y devuelve un error access
denied
.
Permisos obligatorios
Para consultar una tabla de BigQuery con políticas de acceso a nivel de las filas, debes tener el permiso bigquery.tables.getData
en la tabla. También necesitas el permiso bigquery.rowAccessPolicies.getFilteredData
.
Para obtener estos permisos con roles predefinidos, debes tener asignado el rol roles/bigquery.dataViewer
en la tabla mediante gestión de identidades y accesos, así como el rol de gestión de identidades y accesos roles/bigquery.filteredDataViewer
en la tabla a través de la política de acceso a nivel de fila.
Debe tener el permiso datacatalog.categories.fineGrainedGet
en todas las columnas pertinentes con seguridad a nivel de columna. Para obtener este permiso con roles predefinidos, necesitas el rol datacatalog.categoryFineGrainedReader
.
Ver los resultados de una consulta
En la Google Cloud consola, cuando consultas una tabla con una política de acceso a nivel de fila, BigQuery muestra un banner que indica que los resultados pueden estar filtrados por una política de acceso a nivel de fila. Este aviso se muestra aunque seas miembro de la lista de beneficiarios de la política.
Estadísticas de tareas
Cuando consultas una tabla con una política de acceso a nivel de las filas mediante la API Jobs, BigQuery indica si la consulta lee alguna tabla con políticas de acceso a nivel de las filas en el objeto de respuesta Job
:
Ejemplo
Esta respuesta de objeto Job
se ha truncado para simplificarla:
{
"configuration": {
"jobType": "QUERY",
"query": {
"priority": "INTERACTIVE",
"query": "SELECT * FROM dataset.table",
"useLegacySql": false
}
},
...
"statistics": {
...
rowLevelSecurityStatistics: {
rowLevelSecurityApplied: true
},
...
},
"status": {
"state": "DONE"
},
...
}
Siguientes pasos
Para obtener información sobre cómo funciona la seguridad a nivel de fila con otras funciones y servicios de BigQuery, consulte el artículo Usar la seguridad a nivel de fila con otras funciones de BigQuery.
Para obtener información sobre las prácticas recomendadas para la seguridad a nivel de fila, consulta el artículo Prácticas recomendadas para la seguridad a nivel de fila en BigQuery.