Controlar el acceso con las condiciones de gestión de identidades y accesos

En este documento se describe cómo usar las condiciones de gestión de identidades y accesos para controlar el acceso a los recursos de BigQuery.

Las condiciones de gestión de identidades y accesos te permiten conceder acceso a recursos de BigQuery solo si se cumplen las condiciones especificadas. Por ejemplo, puedes conceder acceso a un recurso durante un periodo limitado o de forma periódica durante determinadas horas del día. Puedes añadir condiciones de gestión de identidades y accesos a nivel de organización, carpeta, proyecto y conjunto de datos de los recursos. Las políticas con condiciones se heredan de los recursos secundarios. Para obtener más información sobre los niveles de recursos, consulta las jerarquías de recursos.

Las condiciones de gestión de identidades y accesos (IAM) son útiles para conceder permisos de IAM a muchos recursos relacionados simultáneamente, incluidos los recursos que aún no existen. Para conceder permisos a grupos de recursos de BigQuery que no estén relacionados, considera la posibilidad de usar etiquetas de gestión de identidades y accesos.

Antes de empezar

  1. Concede a los usuarios roles de gestión de identidades y accesos que contengan los permisos necesarios para realizar cada tarea de este documento.
  2. Habilita la API IAM.

Roles obligatorios

Para obtener los permisos que necesitas para aplicar condiciones de gestión de identidades y accesos a los recursos de BigQuery, pide a tu administrador que te asigne los siguientes roles de gestión de identidades y accesos:

Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

Estos roles predefinidos contienen los permisos necesarios para aplicar condiciones de gestión de identidades y accesos a los recursos de BigQuery. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

Se necesitan los siguientes permisos para aplicar condiciones de gestión de identidades y accesos a los recursos de BigQuery:

  • Define el acceso condicional de gestión de identidades y accesos a nivel de proyecto: resourcemanager.projects.setIamPolicy
  • Definir acceso condicional de gestión de identidades y accesos en conjuntos de datos:
    • bigquery.datasets.setIamPolicy
    • bigquery.datasets.update

También puedes obtener estos permisos con roles personalizados u otros roles predefinidos.

Si tienes previsto usar las condiciones de gestión de identidades y accesos en toda tu organización, también necesitas permisos para gestionar las políticas de la organización.

Para obtener más información sobre los roles y permisos de gestión de identidades y accesos en BigQuery, consulta la introducción a la gestión de identidades y accesos.

Habilitar la API IAM

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

Consola

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

Activar la API

gcloud

Ejecuta el comando gcloud services enable:

gcloud services enable iam.googleapis.com

Ver la política de acceso condicional de un conjunto de datos

Selecciona una de las opciones siguientes:

Consola

  1. Ve a la página BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y selecciona 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.

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

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

Haz los cambios siguientes:

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

La propiedad access del archivo JSON del recurso de 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 de conjunto de datos contiene la política de acceso.

Modificar el acceso condicional a los recursos

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

Añadir condiciones a una organización, una carpeta o un proyecto

Para añadir acceso condicional a una organización, una carpeta o un proyecto en BigQuery, consulta Permitir políticas con condiciones. Cuando cree las condiciones, consulte las tablas de formatos de atributo.

Añadir acceso condicional a un conjunto de datos

Para añadir condiciones a un conjunto de datos, selecciona uno de los siguientes métodos. Cuando crees las condiciones, consulta las tablas de formatos de atributos.

Consola

  1. Ve a la página BigQuery.

    Ir a BigQuery

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

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

  4. Haz clic en Añadir principal.

  5. En el campo New principals (Nuevos principales), introduce un principal.

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

  7. Haz clic en Añadir condición de IAM.

  8. Añada condiciones al campo condition mediante los atributos de estado.

  9. En el panel Añadir condición de IAM, haz clic en Guardar.

  10. En el panel Conceder acceso a DATASET, haga 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 conceder acceso condicional a un conjunto de datos mediante Cloud Shell, sigue las instrucciones para conceder acceso a un conjunto de datos. Puede añadir sus condiciones de acceso condicional a la sección access del archivo JSON del conjunto de datos.

Por ejemplo, si se añade lo siguiente a la sección access del archivo JSON de un conjunto de datos, se asignará el rol roles/bigquery.dataViewer a cloudysanfrancisco@gmail.com hasta el 31 de diciembre del 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 conceder acceso condicional a un conjunto de datos mediante la API de BigQuery, sigue las instrucciones para conceder acceso a un conjunto de datos con accessPolicyVersion=3 en el parámetro de solicitud.

Puede añadir entradas con condiciones de acceso a la propiedad access.condition del recurso de 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 mediante los flujos de lectura, modificación y actualización estándar sin especificar el parámetro de solicitud accessPolicyVersion.

Quitar el acceso condicional de los conjuntos de datos

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

Consola

  1. Ve a la página BigQuery.

    Ir a BigQuery

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

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

  4. Selecciona la entidad de seguridad cuyo acceso quieras revocar.

  5. Haz clic en Eliminar.

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

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 mediante Cloud Shell, sigue las instrucciones que se indican en Revocar el acceso a un conjunto de datos. Puedes quitar la entrada con la 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 mediante 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.

Puede quitar entradas con condiciones de la propiedad access del recurso de 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 mediante los flujos de lectura, modificación y actualización estándar sin especificar el parámetro de solicitud accessPolicyVersion.

Atributos de condición

Puedes definir condiciones de gestión de identidades y accesos en tus recursos de BigQuery en función de los siguientes atributos:

  • request.time: la hora a la que el usuario intenta acceder a un recurso de BigQuery. Para obtener más información y ver ejemplos, consulta el artículo Atributo de fecha y hora.
  • resource.name: la ruta del recurso de BigQuery. Para ver el formato, consulta las tablas de Formatos de atributo.
  • resource.type: el tipo de recurso de BigQuery. Para ver el formato, consulta las tablas de Formatos de atributo.
  • resource.service: el Google Cloud servicio que usa el recurso BigQuery. Para ver el formato, consulta las tablas de Formatos de atributo.
  • resource.tags: las etiquetas asociadas al recurso de BigQuery. Las etiquetas solo se admiten en recursos de conjuntos de datos, tablas y vistas de BigQuery. Para ver el formato, consulta las tablas de Formatos de atributos y de los documentos de gestión de identidades y accesos.

Formatos de atributos

Cuando crees condiciones para conjuntos de datos de BigQuery, utiliza 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 Es compatible con 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 Es compatible con 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

Haz los cambios siguientes:

  • PROJECT_ID: el ID del proyecto que contiene los recursos a los que quieres conceder acceso.
  • DATASET_ID: el ID del conjunto de datos al que vas a conceder acceso
  • TABLE_ID: el ID de la tabla o la vista a la que quieres dar acceso
  • ROUTINE_ID: el ID de la rutina a la que estás dando acceso
  • MODEL_ID: el ID del modelo al que vas a conceder acceso

Prácticas recomendadas para las condiciones

Cuando crees condiciones en BigQuery, sigue estas prácticas recomendadas:

  • Te recomendamos que uses condiciones positivas para resource.type, resource.name y resource.service para aumentar la precisión. Como los tipos no admitidos se representan con una cadena vacía, las condiciones negativas pueden coincidir con una amplia gama de recursos. Para obtener más información, consulta las condiciones negativas.
  • Las condiciones de gestión de identidades y accesos a nivel de conjunto de datos solo se deben usar en roles que se apliquen a recursos del conjunto de datos, como tablas, vistas, modelos y rutinas. No se deben usar para conceder roles que operen a nivel de conjunto de datos o proyecto, como bigquery.user o bigquery.jobUser.
  • No uses la condición resource.type == 'bigquery.googleapis.com/Dataset' en las políticas a nivel de conjunto de datos, ya que no tiene ningún efecto en la autorización. Este atributo se usa para controlar el acceso a recursos de subconjuntos de datos, como tablas, vistas, rutinas y modelos.
  • Incluye resource.type, resource.name y resource.service en tu condición, aunque no sea necesario ese nivel de especificidad. Esta práctica te ayuda a mantener las condiciones a medida que cambian los recursos de tu flujo de trabajo, de forma que otros recursos no se incluyan por error en el futuro.
  • Cuando concedas permisos, incluye el conjunto de permisos más limitado posible para asegurarte de que no das acceso excesivo por error.
  • Usa resource.name.startsWith con precaución. Las rutas de las tablas y vistas de BigQuery tienen como prefijo el ID del proyecto y el ID del conjunto de datos superiores. Si las condiciones no son lo suficientemente específicas, se podría conceder 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 concedido mediante la condición resource.name.startsWith("projects/my_project/datasets/my_dataset/tables/table_prefix") permite a los usuarios ejecutar la consulta SELECT * FROM my_dataset.table_prefix*.
  • No añadas condiciones para recursos de BigQuery que no sean conjuntos de datos, tablas, vistas, rutinas y modelos.
  • Verifica que estás concediendo los permisos correctos en el recurso adecuado. Por ejemplo, el permiso para enumerar recursos (bigquery.RESOURCE.list) debe concederse a nivel del elemento superior, pero el permiso para eliminar recursos (bigquery.RESOURCE.delete) debe concederse a nivel del recurso. Para eliminar un conjunto de datos, lo que también implica eliminar todos los recursos que contiene, se necesitan permisos de eliminación de tablas, modelos y rutinas en el conjunto de datos.
  • Ten en cuenta que las instantáneas de tablas y los viajes en el tiempo no afectan a los permisos.

Condiciones negativas

Las condiciones negativas, como resource.name != resource, pueden conceder acceso demasiado permisivo por error. 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 externos a 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 conceder acceso a todos los recursos, excepto a una tabla llamada secret. Sin embargo, el usuario puede seguir consultando esa tabla con una consulta comodín, como SELECT * from my_project.my_dataset.secre*;.

Además, las condiciones negativas en tablas, rutinas y modelos pueden dar acceso demasiado permisivo a sus conjuntos de datos principales. De este modo, los usuarios podrán eliminar esos recursos, ya que los permisos de eliminación se gestionan a nivel del conjunto de datos.

Limitaciones

  • No puedes añadir concesiones de vista autorizada, rutina autorizada ni conjunto de datos autorizado con condiciones de gestión de identidades y accesos.
  • Si se usa un accessPolicyVersion incompatible al ver un recurso con condiciones, los enlaces pueden contener withcond seguido de un valor hash. Para obtener más información, consulta Solucionar problemas de withcond en políticas y enlaces de roles.
  • Los usuarios con acceso condicional a un conjunto de datos o a 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 gestión de identidades y accesos. Sin embargo, un usuario con acceso condicional puede concederse a sí mismo el rol Administrador de BigQuery (roles/bigquery.admin) en la tabla y, a continuación, modificar las políticas de acceso a filas y columnas.
  • Los cambios en las políticas de gestión de identidades y accesos pueden tardar hasta cinco minutos en aplicarse.
  • Es posible que los usuarios con acceso condicional no puedan consultar vistas INFORMATION_SCHEMA.
  • Los usuarios que solo tienen acceso a la tabla condicional no pueden ejecutar funciones comodín de tabla.

Ejemplos

A continuación, se muestran ejemplos de casos prácticos de las condiciones de gestión de identidades y accesos en BigQuery.

Conceder acceso de lectura a una tabla específica

En este ejemplo se asigna el rol Lector de datos de BigQuery a cloudysanfrancisco@gmail.com para la tabla table_1 del conjunto de datos dataset_1. Con este rol, el usuario puede consultar la tabla y acceder a ella a través de la herramienta bq. El usuario no puede ver la tabla en la consola 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
  }
}

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

En este ejemplo se asigna el rol Lector de metadatos de BigQuery al usuario cloudysanfrancisco@gmail.com 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
  }
}

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

En este ejemplo se asigna el rol Propietario de datos de BigQuery cloudysanfrancisco@gmail.com a todas las tablas de todos los conjuntos de datos que empiezan por 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
  }
}

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

En este ejemplo se asigna el rol Propietario de datos de BigQuery a cloudysanfrancisco@gmail.com en todas las tablas, modelos y rutinas de todos los conjuntos de datos que empiecen por 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
  }
}

Siguientes pasos