Usa la seguridad a nivel de las filas
En este documento, se explica cómo usar la seguridad a nivel de las filas en BigQuery para restringir el acceso a los datos a nivel de las filas de la tabla. Antes de leer este documento, familiarízate con la descripción general de la seguridad a nivel de las filas con la Introducción a la seguridad a nivel de las filas de BigQuery.
Descripción general
Puedes realizar las siguientes tareas con políticas de acceso a nivel de las filas:
- Crea o actualiza una política de acceso a nivel de las filas en una tabla
- Combina políticas de acceso a nivel de fila en una tabla.
- Enumera las políticas de acceso a nivel de las filas de una tabla
- Borra una política de acceso a nivel de las filas de una tabla
- Consulta una tabla con una política de acceso a nivel de las filas
Antes de comenzar
Otorga funciones de la Identity and Access Management (IAM) que les brindan a los usuarios los permisos necesarios para realizar cada tarea de este documento. Los permisos necesarios para realizar una tarea (si existen) se enumeran en la sección “Permisos necesarios” de la tarea.
Crea o actualiza una política de acceso a nivel de las filas
Puedes crear o actualizar una política de acceso a nivel de las filas en una tabla en BigQuery con una declaración de lenguaje de definición de datos (DDL).
Permisos necesarios
Para crear una política de acceso a nivel de las filas en una tabla de BigQuery, necesitas los siguientes permisos de IAM:
bigquery.rowAccessPolicies.create
bigquery.rowAccessPolicies.setIamPolicy
bigquery.tables.getData
(en la tabla de destino y en cualquier tabla a la que se hace referencia en las políticas de acceso a nivel de las filas de las subconsultas)bigquery.jobs.create
(para ejecutar el trabajo de consulta de DDL)
Para actualizar una política de acceso a nivel de las filas en una tabla de BigQuery, necesitas los siguientes permisos de IAM:
bigquery.rowAccessPolicies.update
bigquery.rowAccessPolicies.setIamPolicy
bigquery.tables.getData
(en la tabla de destino y en cualquier tabla a la que se hace referencia en las políticas de acceso a nivel de las filas de las subconsultas)bigquery.jobs.create
(para ejecutar el trabajo de consulta de DDL)
Cada uno de los siguientes roles predefinidos de IAM incluye los permisos que necesitas para crear y actualizar una política de acceso a nivel de las filas:
roles/bigquery.admin
roles/bigquery.dataOwner
El rol bigquery.filteredDataViewer
Cuando creas de forma correcta una política de acceso a nivel de las filas, otorgas de forma automática el rol bigquery.filteredDataViewer
a los miembros de la lista de destinatarios. El rol bigquery.filteredDataViewer
otorga la capacidad de ver las filas definidas por la expresión de filtro de la política. Cuando enumeras las políticas de acceso a nivel de las filas de una tabla en la consola de Google Cloud, este rol se muestra en asociación con los miembros de la lista de destinatarios de la política.
Consulta nuestras prácticas recomendadas para la seguridad a nivel de las filas cuando uses la función bigquery.filteredDataViewer
con la IAM.
Para obtener más información sobre las funciones de IAM y los permisos en BigQuery, consulta Funciones y permisos predefinidos.
Crea o actualiza las políticas de acceso a nivel de las filas
Para crear o actualizar una política de acceso a nivel de fila, usa una de las siguientes sentencias DDL:
CREATE ROW ACCESS POLICY
crea una nueva política de acceso a nivel de las filas.La sentencia
CREATE ROW ACCESS POLICY IF NOT EXISTS
crea una nueva política de acceso a nivel de las filas, si no existe una política de acceso a nivel de las filas con el mismo nombre en la tabla especificada.La sentencia
CREATE OR REPLACE ROW ACCESS POLICY
actualiza una política de acceso existente a nivel de fila con el mismo nombre en la tabla especificada.
Examples
Crea una nueva política de acceso de fila. El acceso a la tabla está restringido al usuario abc@example.com
. Solo son visibles las filas en las que region = 'APAC'
son visibles:
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 aplicarla 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 de fila que otorgue 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 de fila 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 de fila 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 de fila con un filtro en una columna con un 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 de fila con una subconsulta para reemplazar varias políticas con una comparación de regiones simple configurada por usuario:
Para enviar comentarios o solicitar asistencia con esta función, envía un correo electrónico a bigquery-row-level-security-support@google.com.Considera 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()));
Usar la subconsulta en lookup_table
te permite evitar crear varias políticas de acceso de fila. Por ejemplo, la instrucción anterior produce el mismo resultado que el siguiente, 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 = 'us-west1'); 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 declaración DDL CREATE ROW ACCESS POLICY
.
Combina políticas de acceso a nivel de las filas
Si dos o más políticas de acceso a nivel de las filas otorgan a un usuario o grupo acceso a la misma tabla, entonces, el usuario o grupo tiene acceso a todos los datos cubiertos por cualquiera de las políticas.
Por ejemplo, en las siguientes políticas, se otorga al usuario abc@example.com
acceso a las filas especificadas en 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 tengan el campo product_category
definido como shoes
, y 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 automóviles azules.
Este acceso es equivalente al acceso que proporciona la siguiente política de acceso a nivel de fila única:
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 el acceso que depende de que más de una condición sea verdadera, usa un filtro con un operador AND
. Por ejemplo, la siguiente política de acceso a nivel de las filas otorga a abc@example.com
acceso 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 las filas anterior, abc@example.com
podría acceder a la información sobre zapatos azules, pero no sobre zapatos rojos o automóviles azules.
Enumera las políticas de acceso a nivel de las filas de la tabla
Puedes enumerar y ver todas las políticas de acceso a nivel de fila en una tabla
a través de la consola de Google Cloud, la herramienta de línea de comandos de bq o el
método de API RowAccessPolicies.List
.
Permisos necesarios
Para enumerar las políticas de acceso a nivel de las filas en una tabla de BigQuery, necesitas el permiso bigquery.rowAccessPolicies.list
de IAM.
A fin de ver los miembros de una política de acceso a nivel de las filas en una tabla de BigQuery, necesitas el permiso bigquery.rowAccessPolicies.getIamPolicy
de IAM.
Cada uno de los siguientes roles predefinidos de IAM incluye los permisos que necesitas para enumerar y ver políticas de acceso a nivel de las filas:
roles/bigquery.admin
roles/bigquery.dataOwner
Para obtener más información sobre las funciones de IAM y los permisos en BigQuery, consulta Funciones y permisos predefinidos.
Enumera las políticas de acceso a nivel de las filas de la tabla
Para enumerar las políticas de acceso a nivel de las filas, haz lo siguiente:
Console
Para ver las políticas de acceso a nivel de las filas, ve a la página de BigQuery en la consola de Google Cloud.
Haz clic en el nombre de la tabla para ver sus detalles y, luego, haz clic en Ver políticas de acceso de fila.
Cuando se abra el panel Políticas de acceso de fila, verás una lista de todas las políticas de acceso a nivel de las filas en la tabla, por nombre y la
filter_expression
para cada política.Para ver todos los roles y los usuarios afectados por una política de acceso a nivel de las filas, 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 destinatarios tienen el rol
bigquery.filteredDataViewer
.
bq
Ingresa el comando bq ls
y proporciona la marca --row_access_policies
.
Los nombres del conjunto de datos y de la tabla son obligatorios.
bq ls --row_access_policies dataset.table
Por ejemplo, con el siguiente comando, se muestra información sobre las políticas de acceso a nivel de las filas en 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
Usa el método RowAccessPolicies.List
en la sección de referencia de la API de REST.
Borra políticas de acceso a nivel de fila
Puedes borrar una o todas las políticas de acceso a nivel de las filas en una tabla mediante una declaración de DDL, si tienes los permisos para hacerlo.
Permisos necesarios
Para descartar una política de acceso a nivel de las filas, necesitas los siguientes permisos de IAM:
bigquery.rowAccessPolicies.delete
bigquery.rowAccessPolicies.setIamPolicy
bigquery.jobs.create
(para ejecutar el trabajo de consulta de DDL)
Para descartar todas las políticas de acceso a nivel de las filas en una tabla al mismo tiempo, necesitas los siguientes permisos de IAM:
bigquery.rowAccessPolicies.delete
bigquery.rowAccessPolicies.setIamPolicy
bigquery.rowAccessPolicies.list
bigquery.jobs.create
(para ejecutar el trabajo de consulta de DDL)
Cada uno de los siguientes roles predefinidos de IAM incluye los permisos que necesitas para borrar las políticas de acceso a nivel de las filas:
roles/bigquery.admin
roles/bigquery.dataOwner
Para obtener más información sobre las funciones de IAM y los permisos en BigQuery, consulta Funciones y permisos predefinidos.
Borra políticas de acceso a nivel de fila
Para borrar una política de acceso de fila de una tabla, usa las siguientes declaraciones DDL:
La declaración
DROP ROW ACCESS POLICY
borra una política de acceso a nivel de fila en la tabla especificada.La declaración
DROP ROW ACCESS POLICY IF EXISTS
borra una política de acceso a nivel de fila si la política de acceso de fila existe en la tabla especificada.La declaración
DROP ALL ROW ACCESS POLICIES
borra todas las políticas de acceso a nivel de fila en la tabla especificada.
Examples
Borra una política de acceso a nivel de las filas de una tabla:
DROP ROW ACCESS POLICY my_row_filter ON project.dataset.my_table;
Borra todas las políticas de acceso a nivel de las filas de una tabla:
DROP ALL ROW ACCESS POLICIES ON project.dataset.my_table;
Para obtener más información sobre cómo borrar una política de acceso a nivel de fila, consulta la referencia de la sentencia DDL DROP ROW ACCESS POLICY
.
Consultar tablas con políticas de acceso de fila
Un usuario primero debe tener acceso a una tabla de BigQuery para poder consultarla, incluso si está en el grantee_list
de una política de acceso de fila en esa tabla. Sin ese permiso, la consulta falla con un error access
denied
.
Permisos necesarios
Para consultar una tabla de BigQuery con políticas de acceso a nivel de las filas, necesitas el permiso bigquery.tables.getData
de IAM y el permiso bigquery.rowAccessPolicies.getFilteredData
de IAM. Debes tener el permiso bigquery.tables.getData
de IAM en todas las tablas relevantes.
Para obtener estos permisos con funciones predefinidas, debes tener los roles roles/bigquery.dataViewer
y roles/bigquery.filteredDataViewer
de IAM.
Debes tener el permiso datacatalog.categories.fineGrainedGet
en todas las columnas relevantes con seguridad a nivel de columna. Para obtener este permiso con funciones predefinidas, necesitas el rol datacatalog.categoryFineGrainedReader
.
Ve los resultados de la consulta
En la consola de Google Cloud, cuando consultas una tabla con una política de acceso a nivel de fila, BigQuery muestra una notificación de banner que indica que los resultados se pueden filtrar por una política de acceso a nivel de fila. Esta notificación se muestra incluso si eres miembro de la lista de destinatarios de la política.
Estatística del trabajo
Cuando consultas una tabla con una política de acceso a nivel de las filas mediante la API de trabajo, BigQuery indica si la consulta lee las tablas con políticas de acceso de fila en el objeto de respuesta Job
:
Ejemplo
Esta respuesta de objeto Job
se truncó para mayor simplicidad:
{
"configuration": {
"jobType": "QUERY",
"query": {
"priority": "INTERACTIVE",
"query": "SELECT * FROM dataset.table",
"useLegacySql": false
}
},
...
"statistics": {
...
rowLevelSecurityStatistics: {
rowLevelSecurityApplied: true
},
...
},
"status": {
"state": "DONE"
},
...
}
¿Qué sigue?
Para obtener información sobre cómo funciona la seguridad a nivel de las filas con otras funciones y servicios de BigQuery, consulta Usa la seguridad a nivel de las filas con otras funciones de BigQuery.
Para obtener información sobre las prácticas recomendadas de seguridad a nivel de las filas, consulta Prácticas recomendadas para la seguridad a nivel de las filas en BigQuery.