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. Puedes agregar condiciones de IAM a nivel de la organización, la carpeta, el proyecto y el conjunto de datos de los recursos. Las políticas de permisos con condiciones se heredan en los recursos secundarios. Para obtener más información sobre los niveles de recursos, consulta las jerarquías de recursos.

Las condiciones de IAM son útiles para otorgar permisos de Identity and Access Management (IAM) a muchos recursos relacionados de forma simultánea, 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

  1. Otorga a los usuarios roles de IAM que contengan los permisos necesarios para realizar cada tarea de este documento.
  2. Habilita la API de IAM.

Roles obligatorios

Para obtener los permisos que necesitas para aplicar condiciones de IAM a los recursos de BigQuery, pídele a tu administrador que te otorgue los siguientes roles de IAM:

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Estos roles predefinidos contienen los permisos necesarios para aplicar condiciones de IAM a los recursos de BigQuery. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para aplicar condiciones de IAM a los recursos de BigQuery:

  • Establece acceso condicional a IAM a nivel del proyecto: resourcemanager.projects.setIamPolicy
  • Establece acceso condicional de IAM en conjuntos de datos:
    • bigquery.datasets.setIamPolicy
    • bigquery.datasets.update

También puedes obtener estos permisos 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.

Habilita la API de IAM

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

Consola

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

Habilitar la API

gcloud

Ejecuta el comando gcloud services enable:

gcloud services enable iam.googleapis.com

Cómo ver la política de acceso condicional en un conjunto de datos

Selecciona una de las siguientes opciones:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y elige un conjunto de datos.

  3. Haz clic en Compartir > Permisos.

  4. Junto al rol asociado, haz clic en condición:TITLE para ver la condición de ese rol.

bq

Para ver o actualizar las políticas de acceso condicional en Cloud Shell, debes usar la versión 503.0.0 o una posterior de Cloud Shell.

Para obtener una política de acceso existente y enviarla a un archivo local en JSON, usa el comando bq show en Cloud Shell:

bq show --format=prettyjson PROJECT_ID:DATASET > PATH_TO_FILE

Reemplaza lo siguiente:

  • PROJECT_ID: El ID de tu proyecto
  • DATASET: nombre del conjunto de datos.
  • PATH_TO_FILE: la ruta al archivo JSON en tu máquina local

La propiedad access del archivo JSON del recurso del conjunto de datos contiene la política de acceso.

API

Para ver la política de acceso de un conjunto de datos con condiciones, llama a datasets.get con accessPolicyVersion=3 como parámetro de solicitud. La propiedad access del recurso del conjunto de datos contiene la política de acceso.

Modificar el acceso condicional a los recursos

En las siguientes secciones, se describe cómo agregar o quitar el acceso condicional a diferentes recursos.

Agrega condiciones a una organización, una carpeta o un proyecto

Para agregar acceso condicional a una organización, una carpeta o un proyecto en BigQuery, consulta Políticas de permisos con condiciones. Cuando compiles tus condiciones, consulta las tablas de formato de atributos.

Agrega acceso condicional al conjunto de datos

Para agregar condiciones a un conjunto de datos, selecciona uno de los siguientes métodos. Cuando crees tus condiciones, consulta las tablas de formato de atributos.

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y elige un conjunto de datos.

  3. En el panel de detalles, haz clic en Compartir > Permisos.

  4. Haz clic en Agregar principal.

  5. En el campo Principales nuevas, ingresa una principal.

  6. En la lista Elegir un rol, elige un rol predefinido o una rol personalizado.

  7. Haz clic en Agregar condición de IAM.

  8. Agrega condiciones al campo condition con los atributos de condición.

  9. En el panel Agregar condición de IAM, haz clic en Guardar.

  10. En el panel Otorga acceso a DATASET, haz clic en Guardar.

bq

Para ver o actualizar las políticas de acceso condicional en Cloud Shell, debes usar la versión 503.0.0 o una posterior de Cloud Shell.

Para otorgar acceso condicional a un conjunto de datos con Cloud Shell, sigue las instrucciones para otorgar acceso a un conjunto de datos. Puedes agregar tus condiciones de acceso condicional a la sección access del archivo JSON del conjunto de datos.

Por ejemplo, la siguiente adición a la sección access del archivo JSON de un conjunto de datos otorgaría el rol roles/bigquery.dataViewer a cloudysanfrancisco@gmail.com hasta el 31 de diciembre de 2032:

"access": [
  {
    "role": "roles/bigquery.dataViewer",
    "userByEmail": "cloudysanfrancisco@gmail.com",
    "condition": {
      "title": "Grant roles/bigquery.dataViewer until 2033",
      "description": "Role expires on December 31, 2032.",
      "expression": "request.time < timestamp('2032-12-31T12:00:00Z')"
    }
  }
]

API

Para otorgar acceso condicional a un conjunto de datos con la API de BigQuery, sigue las instrucciones para otorgar acceso a un conjunto de datos con accessPolicyVersion=3 en el parámetro de la solicitud.

Puedes agregar entradas con condiciones de acceso a la propiedad access.condition del recurso del conjunto de datos.

En el caso de los conjuntos de datos que tienen políticas de acceso condicional, los usuarios pueden actualizar la configuración de acceso incondicional con los flujos estándar de lectura, modificación y actualización sin especificar el parámetro de solicitud accessPolicyVersion.

Cómo quitar el acceso condicional de los conjuntos de datos

Para quitar condiciones de un conjunto de datos, selecciona uno de los siguientes métodos. Cuando crees tus condiciones, consulta las tablas de formato de atributos.

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y elige un conjunto de datos.

  3. En el panel de detalles, haz clic en Compartir > Permisos.

  4. Selecciona el principal cuyo acceso deseas revocar.

  5. Haz clic en Borrar.

  6. En el cuadro de diálogo ¿Quieres borrar el principal?, haz clic en Borrar.

bq

Para ver o actualizar las políticas de acceso condicional en Cloud Shell, debes usar la versión 503.0.0 o una posterior de Cloud Shell.

Para quitar el acceso condicional a un conjunto de datos con Cloud Shell, sigue las instrucciones que se indican en Revoca el acceso a un conjunto de datos. Puedes quitar la entrada con condición de la sección access del archivo JSON del conjunto de datos.

API

Para revocar el acceso condicional a un conjunto de datos con la API de BigQuery, sigue las instrucciones para revocar el acceso a un conjunto de datos con accessPolicyVersion=3 en el parámetro de la solicitud.

Puedes quitar entradas con condiciones de la propiedad access del recurso del conjunto de datos.

En el caso de los conjuntos de datos que tienen políticas de acceso condicional, los usuarios pueden actualizar la configuración de acceso incondicional con los flujos estándar de lectura, modificación y actualización sin especificar el parámetro de solicitud accessPolicyVersion.

Atributos de condiciones

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

  • request.time: Es la fecha y 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 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 en Formatos de atributos.
  • resource.tags: Son las etiquetas adjuntas al recurso de BigQuery. Las etiquetas solo se admiten en los recursos de conjuntos de datos, tablas y vistas de BigQuery. Para conocer el formato, consulta las tablas en Formatos de atributos y en la documentación de IAM.

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
resource.tags Admite hasTagKey, hasTagKeyId, matchTag y matchTagId. Para obtener más información, consulta Etiquetas de recursos.

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

Prácticas recomendadas para las condiciones

Cuando compiles condiciones en BigQuery, usa las siguientes prácticas recomendadas:

  • Te recomendamos que uses condiciones positivas para resource.type, resource.name y resource.service para obtener mayor precisión. Dado que los tipos no admitidos se representan con una cadena vacía, las condiciones negativas pueden coincidir con una amplia variedad de recursos. Para obtener más información, consulta condiciones negativas.
  • Las condiciones de IAM a nivel del conjunto de datos solo se deben usar para los roles que se aplican a los recursos dentro del conjunto de datos, como tablas, vistas, modelos y rutinas. No se deben usar para otorgar roles que operan a nivel del conjunto de datos o del proyecto, como bigquery.user o bigquery.jobUser.
  • No uses la condición resource.type == 'bigquery.googleapis.com/Dataset' para las políticas a nivel del conjunto de datos, ya que no tiene efecto en la autorización. Este atributo está diseñado para controlar el acceso a los recursos de subconjuntos de datos, como tablas, vistas, rutinas y modelos.
  • Incluye resource.type, resource.name y resource.service en tu condición, incluso cuando ese nivel de especificidad no sea necesario. Esta práctica ayuda a mantener tus condiciones a medida que cambian los recursos en tu 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 forma involuntaria.
  • Usa resource.name.startsWith con precaución. Las rutas de acceso a las tablas y vistas de BigQuery tienen como prefijo el ID del proyecto principal y el ID del conjunto de datos. Las condiciones que no son lo suficientemente específicas podrían otorgar demasiado acceso. Sin embargo, puedes usar el atributo resource.name.startsWith para permitir que los usuarios ejecuten consultas con comodines en las 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 los recursos de BigQuery que no sean conjuntos de datos, tablas, vistas, rutinas y modelos.
  • Verifica que estés otorgando 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. Para borrar un conjunto de datos, lo que también borra todos los recursos que contiene, se requieren 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 afectan los permisos.

Condiciones negativas

Las condiciones negativas, como resource.name != resource, pueden otorgar acceso demasiado permisivo de forma involuntaria. Los recursos de BigQuery no admitidos 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 generan problemas cuando los usuarios ejecutan búsquedas 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 con una consulta de comodín, como SELECT * from my_project.my_dataset.secre*;.

Además, las condiciones negativas en tablas, rutinas y modelos pueden otorgar un acceso demasiado permisivo a sus conjuntos de datos principales. 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 permisos de vista autorizada, rutina autorizada ni conjunto de datos autorizado con condiciones de IAM.
  • Si se usa un accessPolicyVersion incompatible mientras se visualiza un recurso con condiciones, es posible que las vinculaciones contengan withcond seguido de un valor de hash. Para obtener más información, consulta Solución de problemas de withcond en políticas y vinculaciones de roles.
  • 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 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 de INFORMATION_SCHEMA.
  • Los usuarios con acceso condicional a la tabla no pueden ejecutar funciones comodín de tabla.

Ejemplos

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

Cómo 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 debigquery.tables.listen 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 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
  }
}

Otorga acceso de propietario a todas las tablas, los modelos y las 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?