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 una duración limitada o periódicamente para 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, 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.

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: La hora en la que el usuario intenta acceder a un recurso de BigQuery Para obtener más detalles y ejemplos, consulta Atributo de fecha y hora.
  • resource.name: la ruta del recurso de BigQuery. Para obtener más información sobre el formato, consulta las tablas en Formatos de atributo.
  • resource.type: el tipo de recurso de BigQuery. Para obtener más información sobre el formato, consulta las tablas en Formatos de atributo.
  • resource.service: El servicio de Google Cloud que usa el recurso de BigQuery. Para obtener más información sobre el formato, consulta las tablas en Formatos de atributo.

Formatos de atributos

Cuando crees condiciones para los 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

Cuando crees condiciones para las tablas 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

Cuando crees condiciones para las 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 los 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 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 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 compiles condiciones en BigQuery, usa las siguientes recomendaciones:

  • No uses condiciones negativas para resource.type, resource.name o resource.service, porque los tipos no compatibles usan la string 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 se necesite ese nivel de especificidad. Esta práctica ayuda a mantener las condiciones a medida que cambian los recursos del flujo de trabajo, de modo que otros recursos no se incluyan de forma involuntaria en el futuro.
  • Cuando otorgues permisos, incluye el conjunto de permisos más reducido posible para asegurarte de no otorgar acceso demasiado permisivo de manera involuntaria.
  • Ten cuidado cuando uses la frase resource.name.startsWith en tu condición, ya que las rutas de las tablas de BigQuery tienen el prefijo de su ID del proyecto superior y el ID del conjunto de datos. Las condiciones que no son lo suficientemente específicas pueden otorgar acceso demasiado permisivo. Sin embargo, la frase resource.name.startsWith es útil si deseas otorgar a tus usuarios la capacidad de ejecutar consultas comodín. Por ejemplo, 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 los recursos de BigQuery que no sean conjuntos de datos, tablas, rutinas y modelos.
  • Vuelve a verificar que otorgas 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 crear recursos (bigquery.RESOURCE.create) debe otorgarse en el nivel de recursos. La eliminación del conjunto de datos, en la que también se borran todos los recursos contenidos, requiere permisos de tabla, modelo y eliminación de rutina en el conjunto de datos.
  • Ten en cuenta que las instantáneas de tablas y viajes en el tiempo no tienen efecto en los permisos.

Condiciones negativas

Las condiciones negativas como resource.name != resource pueden otorgar acceso demasiado permisivo. Los recursos de BigQuery no compatibles tienen atributos de recursos vacíos, lo que significa que coinciden con todas las condiciones negativas. Los recursos en 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. Esta condición parece otorgar acceso a todos los recursos, excepto a una tabla llamada secret. Sin embargo, el usuario aún puede consultar esa tabla mediante una consulta comodín, como SELECT * from my_project.my_dataset.secre*;.

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

Limitaciones

  • No puedes agregar otorgamientos de vista autorizada o rutinas autorizadas con Condiciones de IAM.
  • Cuando un usuario tiene acceso condicional a un conjunto de datos o a una tabla, no puede modificar los permisos para ese recurso a través de la consola de Google Cloud. Solo se admiten la herramienta y la API de bq.
  • El control de acceso a nivel de fila y a nivel de columna no es compatible 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 INFORMATION_SCHEMA vistas.

Ejemplos

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

Otorga 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
  }
}

Otorga acceso de propietario a todas las tablas en 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
  }
}

Otorga acceso de propietario a todas las tablas, modelos y rutinas en todos los conjuntos de datos que tienen 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?