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:

Antes de comenzar

Otorga funciones de administración de identidades y accesos (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)
  • 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)
  • 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 Google Cloud Console, 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 las filas, usa los siguientes comandos en tu declaración de DDL:

  • CREATE ROW ACCESS POLICY crea una nueva política de acceso a nivel de las filas.

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

  • CREATE OR REPLACE ROW ACCESS POLICY actualiza una política de acceso a nivel de las filas existente con el mismo nombre en la tabla especificada.

Ejemplos

Consulta la referencia de DDL para conocer la sintaxis y las opciones completas a fin de crear una política de acceso a nivel de las filas.

SQL

Puedes ejecutar estas declaraciones de DDL en la página de Cloud Console.

En la página de BigQuery, ingresa la instrucción en el editor de consultas.

Ir a BigQuery

Crea una política de acceso de fila y, luego, modificar a los beneficiarios

CREATE ROW ACCESS POLICY My_apac_filter
ON project.dataset.My_table
GRANT TO ("user:abc@example.com")
FILTER USING (region = "apac");
CREATE OR REPLACE ROW ACCESS POLICY My_apac_filter
ON project.dataset.My_table
GRANT TO ("user:xyz@example.com")
FILTER USING (region = "apac");

Crea una política de acceso de fila con varios beneficiarios

CREATE ROW ACCESS POLICY My_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 My_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));

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 las filas en una tabla en Cloud Console o mediante la herramienta de línea de comandos de bq, si tienes los permisos correctos para hacerlo.

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 Cloud Console.

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

Usa los siguientes comandos en tu declaración de DDL para borrar una política de acceso de fila de una tabla.

  • DROP ROW ACCESS POLICY borra una política de acceso a nivel de las filas en la tabla especificada.

  • DROP ROW ACCESS POLICY IF EXISTS, borra una política de acceso a nivel de las filas, solo si la política de acceso de fila existe en la tabla especificada.

  • DROP ALL ROW ACCESS POLICY borra todas las políticas de acceso a nivel de las filas en la tabla especificada.

Ejemplos

Consulta la referencia de DDL para obtener información sobre la sintaxis y las opciones completas a fin de borrar una política de acceso a nivel de las filas.

SQL

Puedes ejecutar estas declaraciones de DDL en la página de Cloud Console.

En la página de BigQuery, ingresa la instrucción en el editor de consultas.

Ir a BigQuery

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;

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.

El rol predefinido roles/bigquery.filteredDataViewer de IAM incluye los permisos que necesitas para consultar una tabla de BigQuery con políticas de acceso a nivel de las filas.

Ve los resultados de la consulta

Console

En Cloud Console, cuando consultas una tabla con una política de acceso a nivel de las filas, BigQuery muestra una notificación de banner que indica que los resultados se pueden filtrar por una política de acceso a nivel de las filas. 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?