Controla el acceso con Condiciones de IAM

En este documento, se describe cómo usar las condiciones de IAM para controlar el acceso a los recursos de BigQuery.

Condiciones de IAM te permite otorgar acceso a los recursos de BigQuery solo si se cumplen las condiciones especificadas. Por ejemplo, puedes otorgar acceso a un recurso por un período limitado o de forma periódica durante ciertas horas del día. Condiciones de IAM es compatible con el nivel de proyecto, carpeta y organización, y se pueden aplicar en conjuntos de datos, tablas, vistas, rutinas y modelos de BigQuery.

Condiciones de IAM es útil para otorgar permisos de Identity and Access Management (IAM) a muchos recursos relacionados al mismo tiempo, incluidos los que aún no existen. Para otorgar permisos a grupos no relacionados de recursos de BigQuery, considera usar etiquetas de IAM.

Antes de comenzar

Habilita la API de IAM y otorga roles de IAM que concedan a los usuarios los permisos necesarios para realizar cada tarea de este documento.

Habilita la API de IAM

Para habilitar la API de IAM, selecciona una de las siguientes opciones:

Consola

Ve a la página API de Identity and Access Management (IAM) y habilita la API.

Habilitar la API

gcloud

Ejecuta el comando gcloud services enable:

gcloud services enable iam.googleapis.com

Permisos necesarios

Para obtener el permiso que necesitas para aplicar IAM Conditions a los recursos de BigQuery, pídele a tu administrador que te otorgue el rol de Administrador de IAM del proyecto (roles/resourcemanager.projectIamAdmin) de IAM. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene el permiso resourcemanager.projects.setIamPolicy, que se requiere para aplicar Condiciones de IAM a los recursos de BigQuery.

También puedes obtener este permiso con roles personalizados o con otros roles predefinidos.

Si planeas usar Condiciones de IAM en toda tu organización, también necesitas permisos para administrar las políticas de la organización.

Para obtener más información sobre los roles y permisos de IAM en BigQuery, consulta Introducción a IAM.

Atributos de condiciones

Puedes establecer Condiciones de IAM en tus recursos de BigQuery según los siguientes atributos:

  • request.time: Es la hora en la que el usuario intenta acceder a un recurso de BigQuery. Para obtener más detalles y ejemplos, consulta el atributo de fecha y hora.
  • resource.name: la ruta del recurso de BigQuery. Para conocer el formato, consulta las tablas en Formatos de atributos.
  • resource.type: el tipo de recurso de BigQuery. Para conocer el formato, consulta las tablas en Formatos de atributos.
  • resource.service: Es el servicio de Google Cloud que usa el recurso de BigQuery. Para conocer el formato, consulta las tablas de Formatos de atributos.
  • resource.tags: Las etiquetas adjuntas al recurso de BigQuery. Las etiquetas solo son compatibles con los recursos de conjuntos de datos, tablas y vistas de BigQuery. Para conocer el formato, consulta las tablas de Formatos de atributos y en los documentos de IAM.

Formatos de atributos

Cuando crees condiciones para conjuntos de datos de BigQuery, usa los siguientes formatos:

Atributo Valor
resource.type bigquery.googleapis.com/Dataset
resource.name projects/PROJECT_ID/datasets/DATASET_ID
resource.service bigquery.googleapis.com
resource.tags Admite hasTagKey, hasTagKeyId, matchTag y matchTagId. Para obtener más información, consulta Etiquetas de recursos.

Cuando crees condiciones para tablas y vistas de BigQuery, usa los siguientes formatos:

Atributo Valor
resource.type bigquery.googleapis.com/Table
resource.name projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_ID
resource.service bigquery.googleapis.com
resource.tags Admite hasTagKey, hasTagKeyId, matchTag y matchTagId. Para obtener más información, consulta Etiquetas de recursos.

Cuando crees condiciones para rutinas de BigQuery, usa los siguientes formatos:

Atributo Valor
resource.type bigquery.googleapis.com/Routine
resource.name projects/PROJECT_ID/datasets/DATASET_ID/routines/ROUTINE_ID
resource.service bigquery.googleapis.com

Cuando crees condiciones para modelos de BigQuery, usa los siguientes formatos:

Atributo Valor
resource.type bigquery.googleapis.com/Model
resource.name projects/PROJECT_ID/datasets/DATASET_ID/models/MODEL_ID
resource.service bigquery.googleapis.com

Reemplaza lo siguiente:

  • PROJECT_ID: el ID del proyecto que contiene los recursos a los que deseas otorgar acceso.
  • DATASET_ID: el ID del conjunto de datos al que le otorgas acceso
  • TABLE_ID: el ID de la tabla o vista a la que le otorgas acceso
  • ROUTINE_ID: el ID de la rutina a la que le otorgas acceso.
  • MODEL_ID: el ID del modelo al que le otorgas acceso

Agrega condiciones a un recurso

Para agregar una condición a un conjunto de datos, una tabla, una vista, una rutina o un modelo en BigQuery, consulta Políticas de permisos con condiciones. Cuando crees tus condiciones, consulta las tablas de formato de atributos.

Prácticas recomendadas para las condiciones

Cuando crees condiciones en BigQuery, sigue las siguientes prácticas óptimas:

  • No uses condiciones negativas para resource.type, resource.name ni resource.service, ya que los tipos no compatibles usan la cadena vacía y coinciden con casi todas las condiciones negativas. Para obtener más detalles, consulta condiciones negativas.
  • Incluye resource.type, resource.name y resource.service en tu condición, incluso cuando no sea necesario ese nivel de especificidad. Esta práctica ayuda a mantener tus condiciones a medida que cambian los recursos de tu flujo de trabajo para que no se incluyan otros recursos de forma involuntaria en el futuro.
  • Cuando otorgues permisos, incluye el conjunto de permisos más limitado posible para asegurarte de no otorgar acceso demasiado permisivo por accidente.
  • Usa resource.name.startsWith con precaución. Las rutas de acceso de las tablas y las vistas de BigQuery tienen el ID del proyecto y el ID del conjunto de datos superiores como prefijos. Las condiciones poco específicas pueden otorgar demasiado acceso. Sin embargo, puedes usar el atributo resource.name.startsWith para permitir que los usuarios ejecuten consultas con comodines en tablas. Por ejemplo, el acceso otorgado con la condición resource.name.startsWith("projects/my_project/datasets/my_dataset/tables/table_prefix") permite que los usuarios ejecuten la consulta SELECT * FROM my_dataset.table_prefix*.
  • No agregues condiciones para recursos de BigQuery distintos de los conjuntos de datos, las tablas, las vistas, las rutinas y los modelos.
  • Verifica que otorgues los permisos correctos en el recurso correcto. Por ejemplo, el permiso para enumerar recursos (bigquery.RESOURCE.list) debe otorgarse a nivel superior, pero el permiso para borrar recursos (bigquery.RESOURCE.delete) debe otorgarse en el nivel de recursos. La eliminación de conjuntos de datos, en la que también se borran todos los recursos contenidos, requiere permisos de eliminación de tablas, modelos y rutinas en el conjunto de datos.
  • Ten en cuenta que las instantáneas de tablas y el viaje en el tiempo no tienen efecto en los permisos.

Condiciones negativas

Las condiciones negativas, como resource.name != resource, pueden otorgar acceso demasiado permisivo por error. Los recursos de BigQuery no compatibles tienen atributos de recursos vacíos, lo que significa que coinciden con todas las condiciones negativas. Los recursos de servicios fuera de BigQuery también pueden coincidir con condiciones negativas.

Además, las condiciones negativas crean problemas cuando los usuarios ejecutan consultas con comodines. Por ejemplo, considera la condición negativa resource.name != /projects/my_project/datasets/my_dataset/tables/secret. Al parecer, esta condición otorga acceso a todos los recursos, excepto a una tabla llamada secret. Sin embargo, el usuario aún puede consultar esa tabla con una consulta de comodín, como SELECT * from my_project.my_dataset.secre*;.

Además, las condiciones negativas en las tablas, las rutinas y los modelos pueden otorgar acceso demasiado permisivo a sus conjuntos de datos superiores. Es posible que los usuarios puedan borrar esos recursos, ya que los permisos de eliminación se administran a nivel del conjunto de datos.

Limitaciones

  • No puedes agregar autorizaciones de vistas autorizadas, rutinas autorizadas ni conjuntos de datos autorizados con condiciones de IAM.
  • Los usuarios con acceso condicional a un conjunto de datos o una tabla no pueden modificar los permisos de ese recurso a través de la consola de Google Cloud. Las modificaciones de permisos solo se admiten a través de la herramienta bq y la API de BigQuery.
  • El control de acceso a nivel de fila y de columna no se admite directamente a través de las condiciones de IAM. Sin embargo, un usuario con acceso condicional puede otorgarse el rol de administrador de BigQuery (roles/bigquery.admin) en la tabla y, luego, modificar las políticas de acceso de fila y columna.
  • Los cambios en las políticas de IAM pueden tardar hasta cinco minutos en aplicarse.
  • Es posible que los usuarios con acceso condicional no puedan consultar las vistas INFORMATION_SCHEMA.
  • Los usuarios que solo tienen acceso condicional a las tablas no pueden ejecutar funciones comodín de tablas.

Ejemplos

Los siguientes son ejemplos de casos de uso para Condiciones de IAM en BigQuery.

Otorgar acceso de lectura a una tabla específica

En este ejemplo, se otorga a cloudysanfrancisco@gmail.com el rol de visualizador de datos de BigQuery para la tabla table_1 en el conjunto de datos dataset_1. Con este rol, el usuario puede consultar la tabla y acceder a ella a través de la herramienta de bq. El usuario no puede ver la tabla en la consola de Google Cloud porque no tiene el permiso bigquery.tables.list en el conjunto de datos.

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataViewer,
  "condition": {
    "title": "Table dataset_1.table_1",
    "description": "Allowed to read table with name table_1 in dataset_1 dataset",
    "expression":
resource.name == projects/project_1/datasets/dataset_1/tables/table_1
&& resource.type == bigquery.googleapis.com/Table
  }
}

Otorga acceso de lista a un conjunto de datos específico

En este ejemplo, se otorga a cloudysanfrancisco@gmail.com el rol de visualizador de metadatos de BigQuery en el conjunto de datos dataset_2. Con este rol, el usuario puede enumerar todos los recursos del conjunto de datos, pero no puede realizar ninguna consulta en esos recursos.

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.metadataViewer,
  "condition": {
    "title": "Dataset dataset_2",
    "description": "Allowed to list resources in dataset_2 dataset",
    "expression":
resource.name == projects/project_2/datasets/dataset_2
&& resource.type == bigquery.googleapis.com/Dataset
  }
}

Otorgar acceso de propietario a todas las tablas de todos los conjuntos de datos con un prefijo específico

En este ejemplo, se otorga a cloudysanfrancisco@gmail.com el rol de propietario de datos de BigQuery en todas las tablas de todos los conjuntos de datos que comienzan con el prefijo public_:

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Tables public_",
    "description": "Allowed owner access to tables in datasets with public_ prefix",
    "expression":
resource.name.startsWith("projects/project_3/datasets/public_")
&& resource.type == bigquery.googleapis.com/Table
  }
}

Otorgar acceso de propietario a todas las tablas, los modelos y las rutinas de todos los conjuntos de datos que tengan un prefijo específico

En este ejemplo, se otorga a cloudysanfrancisco@gmail.com el rol de propietario de datos de BigQuery en todas las tablas, los modelos y las rutinas en todos los conjuntos de datos que comienzan con el prefijo general_:

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Tables general_",
    "description": "Allowed owner access to tables in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Table
  }
},
{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Models general_",
    "description": "Allowed owner access to models in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Model
  }
},
{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Routines general_",
    "description": "Allowed owner access to routines in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Routine
  }
}

¿Qué sigue?