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. Los recursos secundarios heredan las políticas de permisos con condiciones. Para obtener más información sobre los niveles de recursos, consulta 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 IAM Conditions 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 el acceso de IAM condicional a nivel del proyecto: resourcemanager.projects.setIamPolicy
  • Establece el acceso de IAM condicional en los 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 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

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

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 en el 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 en el recurso de conjunto de datos contiene la política de acceso.

Modifica el acceso condicional en los recursos

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

Cómo agregar condiciones a una organización, carpeta o proyecto

Para agregar acceso condicional a una organización, carpeta o proyecto en BigQuery, consulta Políticas de permiso con condiciones. Cuando crees 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 compiles 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 Otorgar 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.

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 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 no condicional con los flujos de lectura, modificación y actualización estándar 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 compiles 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.

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 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 no condicional con los flujos de lectura, modificación y actualización estándar 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 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 Google Cloud servicio 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 se admiten en 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

Prácticas recomendadas para las condiciones

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

  • Recomendamos usar 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 un amplio rango de recursos. Para obtener más información, consulta condiciones negativas.
  • Las condiciones de IAM a nivel del conjunto de datos solo deben usarse para roles que se apliquen a recursos dentro del conjunto de datos, como tablas, vistas, modelos y rutinas. No deben usarse 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. El objetivo de este atributo es 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 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 que no sean conjuntos de datos, tablas, vistas, rutinas y 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 otorgamientos 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, las vinculaciones pueden contener 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 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?