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.

Puedes realizar las siguientes tareas con políticas 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 las tablas a las que se hace referencia en las políticas de acceso a nivel de las filas de subconsultas otorgadas)
  • 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 las tablas a las que se hace referencia en las políticas de acceso a nivel de las filas de subconsultas otorgadas)
  • 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

La función bigquery.filteredDataViewer

Cuando creas una política de acceso a nivel de las filas, BigQuery otorga automáticamente el rol bigquery.filteredDataViewer a los miembros de la lista de destinatarios. 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.

No otorgues manualmente el bigquery.filteredDataViewer con IAM. Para obtener más información, consulta las prácticas recomendadas para la seguridad a nivel de las filas.

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.

Ejemplos

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 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()));

El uso de la subconsulta en lookup_table te permite evitar crear varias políticas de acceso de fila. Por ejemplo, la declaración anterior genera el mismo resultado que la siguiente declaración 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

  1. 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.

    Ir a BigQuery

  2. Haz clic en el nombre de la tabla para ver sus detalles y, luego, haz clic en Ver políticas de acceso de fila.

    Ver políticas de acceso de fila

  3. 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.

    Detalle de las políticas de acceso de fila

  4. 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.

    Detalle de las políticas de acceso de fila

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.

Ejemplos

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 fila, 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 la columna. Para obtener este permiso con roles predefinidos, 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.

Resultado de la consulta en la tabla con la política de acceso a nivel de las filas

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?