Escribir análisis de políticas en BigQuery

En esta página, se explica cómo analizar las políticas de Identity and Access Management (IAM) de forma asíncrona y escribir resultados en BigQuery. El proceso es similar al análisis de las políticas de IAM, excepto que el resultado del análisis se escribe en las tablas de BigQuery.

Antes de comenzar

Habilita Cloud Asset API.

Habilita la API

Debes habilitar la API en el proyecto o la organización que usarás para enviar la consulta. No es necesario que sea el mismo recurso al que describiste tu consulta.

Funciones y permisos requeridos

Las siguientes funciones y permisos son necesarios para ejecutar un análisis de políticas y exportar los resultados a BigQuery.

Funciones de IAM obligatorias

A fin de obtener los permisos que necesitas para analizar una política y exportar los resultados a BigQuery, pídele al administrador que te otorgue las siguientes funciones de IAM en el proyecto, la carpeta o la organización que definirás en tu consulta:

  • Editor de datos de BigQuery (roles/bigquery.dataEditor)
  • Visualizador de Cloud Asset (roles/cloudasset.viewer)
  • Para analizar políticas con funciones de IAM personalizadas, haz lo siguiente: Visualizador de funciones (roles/iam.roleViewer).
  • Para usar la CLI de Google Cloud a fin de analizar las políticas, usa: consumidor de servicios (roles/serviceusage.serviceUsageConsumer)

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso.

Estas funciones predefinidas contienen los permisos necesarios para analizar una política y exportar los resultados a BigQuery. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

  • bigquery.datasets.create
  • bigquery.jobs.create
  • bigquery.tables.create
  • bigquery.tables.get
  • bigquery.tables.updateData
  • bigquery.tables.update
  • cloudasset.assets.analyzeIamPolicy
  • cloudasset.assets.searchAllResources
  • cloudasset.assets.searchAllIamPolicies
  • Para analizar políticas con funciones personalizadas de IAM, haz lo siguiente: iam.roles.get
  • Usa la CLI de Google Cloud para analizar políticas: serviceusage.services.use

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

Permisos necesarios de Google Workspace

Si deseas ver si una principal tiene ciertas funciones o permisos como resultado de su membresía en un grupo de Google Workspace, necesitas el permiso groups.read de Google Workspace. Este permiso se encuentra dentro de la función de administrador de grupos de lectores y en funciones más potentes, como las funciones de administrador de grupos o administrador avanzado. Consulta Asigna funciones de administrador específicas para obtener más información.

Llama a AnalyzeIamPolicyLongrunning

El método AnalyzeIamPolicyLongrunning te permite emitir una solicitud de análisis y obtener resultados en el destino de BigQuery especificado.

gcloud

Antes de usar cualquiera de los datos de comando a continuación, realiza los siguientes reemplazos:

  • RESOURCE_TYPE: El tipo de recurso en el que deseas establecer el alcance de la búsqueda. Solo se analizarán las políticas de IAM permitidas para este recurso y sus descendientes. Usa los valores project, folder o organization.
  • RESOURCE_ID: Es el ID del proyecto, la carpeta o la organización de Google Cloud en el que deseas establecer el alcance de la búsqueda. Solo se analizarán las políticas de IAM permitidas para este recurso y sus descendientes. Los ID de proyecto son strings alfanuméricas, como my-project. Los ID de carpeta y organización son numéricos, como 123456789012.
  • PRINCIPAL: La principal cuyo acceso deseas analizar, con el formato PRINCIPAL_TYPE:ID (por ejemplo, user:my-user@example.com). Para obtener una lista completa de los tipos principales, consulta Identificadores principales.
  • PERMISSIONS: Una lista separada por comas de los permisos que deseas verificar, por ejemplo, compute.instances.get,compute.instances.start Si enumeras varios permisos, el Analizador de políticas verificará cualquiera de los permisos enumerados.
  • DATASET: Es el conjunto de datos de BigQuery con el formato projects/PROJECT_ID/datasets/DATASET_ID, en el que PROJECT_ID es el ID alfanumérico del proyecto de Google Cloud y DATASET_ID es el ID del conjunto de datos.
  • TABLE_PREFIX: Es el prefijo de las tablas de BigQuery en las que se escribirán los resultados del análisis. Si no existe una tabla con el prefijo especificado, BigQuery crea una tabla nueva.
  • PARTITION_KEY: Opcional. La clave de partición para la tabla particionada de BigQuery. El Analizador de políticas solo admite claves de partición REQUEST_TIME.
  • WRITE_DISPOSITION: Opcional. Especifica la acción que se produce si la tabla o partición de destino ya existe. Para obtener una lista de los valores posibles, consulta writeDisposition. De forma predeterminada, si la tabla o partición ya existe, BigQuery adjunta los datos a la tabla o a la partición más reciente.

Ejecuta el comando gcloud asset analiza-iam-policy-longrunning:

Linux, macOS o Cloud Shell

gcloud asset analyze-iam-policy-longrunning --RESOURCE_TYPE=RESOURCE_ID \
    --full-resource-name=FULL_RESOURCE_NAME \
    --identity=PRINCIPAL \
    --permissions='PERMISSIONS' \
    --bigquery-dataset=DATASET \
    --bigquery-table-prefix=TABLE_PREFIX \
    --bigquery-partition-key=PARTITION_KEY \
    --bigquery-write-disposition=WRITE_DISPOSITION

Windows (PowerShell)

gcloud asset analyze-iam-policy-longrunning --RESOURCE_TYPE=RESOURCE_ID `
    --full-resource-name=FULL_RESOURCE_NAME `
    --identity=PRINCIPAL `
    --permissions='PERMISSIONS' `
    --bigquery-dataset=DATASET `
    --bigquery-table-prefix=TABLE_PREFIX `
    --bigquery-partition-key=PARTITION_KEY `
    --bigquery-write-disposition=WRITE_DISPOSITION

Windows (cmd.exe)

gcloud asset analyze-iam-policy-longrunning --RESOURCE_TYPE=RESOURCE_ID ^
    --full-resource-name=FULL_RESOURCE_NAME ^
    --identity=PRINCIPAL ^
    --permissions='PERMISSIONS' ^
    --bigquery-dataset=DATASET ^
    --bigquery-table-prefix=TABLE_PREFIX ^
    --bigquery-partition-key=PARTITION_KEY ^
    --bigquery-write-disposition=WRITE_DISPOSITION

Deberías recibir una respuesta similar a la que figura a continuación:

Analyze IAM Policy in progress.
Use [gcloud asset operations describe projects/my-project/operations/AnalyzeIamPolicyLongrunning/1195028485971902504711950280359719028666] to check the status of the operation.

REST

Para analizar una política de permiso de IAM y exportar los resultados a BigQuery, usa el método analyzeIamPolicyLongrunning de la API de Cloud Asset Inventory.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • RESOURCE_TYPE: El tipo de recurso en el que deseas establecer el alcance de la búsqueda. Solo se analizarán las políticas de IAM permitidas para este recurso y sus descendientes. Usa los valores projects, folders o organizations.
  • RESOURCE_ID: Es el ID del proyecto, la carpeta o la organización de Google Cloud en el que deseas establecer el alcance de la búsqueda. Solo se analizarán las políticas de IAM permitidas para este recurso y sus descendientes. Los ID de proyecto son strings alfanuméricas, como my-project. Los ID de carpeta y organización son numéricos, como 123456789012.
  • FULL_RESOURCE_NAME: Opcional. El nombre completo del recurso para el que deseas analizar el acceso. Para obtener una lista de los formatos de nombres de recursos completos, consulta Formato de nombres de recursos.
  • PRINCIPAL: Opcional. La principal cuyo acceso deseas analizar, en el formato PRINCIPAL_TYPE:ID, por ejemplo, user:my-user@example.com Para obtener una lista completa de los tipos principales, consulta Identificadores principales.
  • PERMISSION_1, PERMISSION_2... PERMISSION_N: Opcional. Los permisos que deseas verificar, por ejemplo, compute.instances.get Si enumeras varios permisos, el Analizador de políticas verificará cualquiera de los permisos enumerados.
  • DATASET: Es el conjunto de datos de BigQuery con el formato projects/PROJECT_ID/datasets/DATASET_ID, en el que PROJECT_ID es el ID alfanumérico del proyecto de Google Cloud y DATASET_ID es el ID del conjunto de datos.
  • TABLE_PREFIX: Es el prefijo de las tablas de BigQuery en las que se escribirán los resultados del análisis. Si no existe una tabla con el prefijo especificado, BigQuery crea una tabla nueva.
  • PARTITION_KEY: Opcional. La clave de partición para la tabla particionada de BigQuery. El Analizador de políticas solo admite claves de partición REQUEST_TIME.
  • WRITE_DISPOSITION: Opcional. Especifica la acción que se produce si la tabla o partición de destino ya existe. Para obtener una lista de los valores posibles, consulta writeDisposition. De forma predeterminada, si la tabla o partición ya existe, BigQuery adjunta los datos a la tabla o a la partición más reciente.

Método HTTP y URL:

POST https://cloudasset.googleapis.com/v1/RESOURCE_TYPE/RESOURCE_ID:analyzeIamPolicyLongrunning

Cuerpo JSON de la solicitud:

{
  "analysisQuery": {
    "resourceSelector": {
      "fullResourceName": "FULL_RESOURCE_NAME"
    },
    "identitySelector": {
      "identity": "PRINCIPAL"
    },
    "accessSelector": {
      "permissions": [
        "PERMISSION_1",
        "PERMISSION_2",
        "PERMISSION_N"
      ]
    }
  },
  "outputConfig": {
    "bigqueryDestination": {
      "dataset": "DATASET",
      "tablePrefix": "TABLE_PREFIX",
      "partitionKey": "PARTITION_KEY",
      "writeDisposition": "WRITE_DISPOSITION"
    }
  }
}

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
  "name": "projects/my-project/operations/AnalyzeIamPolicyLongrunning/1206385342502762515812063858425027606003",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.asset.v1.AnalyzeIamPolicyLongrunningMetadata",
    "createTime": "2022-04-12T21:31:10.753173929Z"
  }
}

Visualiza los resultados del análisis de las políticas de IAM

Para ver los resultados del análisis de las políticas de IAM, sigue estos pasos:

Console

  1. Ve a la página de BigQuery en Cloud Console.
    Ir a la página de BigQuery

  2. Para mostrar las tablas y vistas en el conjunto de datos, abre el panel de navegación. En la sección Recursos, selecciona tu proyecto para expandirlo y, luego, selecciona un conjunto de datos.

  3. En la lista, seleccione las tablas con tu prefijo. La tabla con el sufijo analysis contiene la consulta y los metadatos (p. ej., el nombre de la operación, el tiempo de la solicitud y los errores no críticos). La tabla con el sufijo analysis_result es la lista de resultados de las tuplas de {identity, role(s)/permission(s), resource} junto con las políticas de IAM que generan esas tuplas.

  4. Para ver una muestra del conjunto de datos, selecciona Vista previa.

API

Para explorar los datos de tu tabla, llama a tabledata.list. En el parámetro tableId, especifica el nombre de tu tabla.

Puedes configurar los siguientes parámetros opcionales para controlar el resultado.

  • maxResults es la cantidad máxima de resultados que se mostrarán.
  • selectedFields es una lista de las columnas separadas por comas que se mostrarán, si no se especifica, se mostrarán todas las columnas.
  • startIndex es el índice basado en cero de la fila inicial que se leerá.

Los valores se muestran unidos en un objeto JSON que debes analizar, como se describe en la documentación de referencia de tabledata.list.

Consulta BigQuery

En esta sección, se proporcionan consultas de SQL de ejemplo para mostrarte cómo usar las tablas de BigQuery escritas por AnalyzeIamPolicyLongrunning. Para obtener más información sobre la sintaxis de BigQuery, consulta Sintaxis de consulta de SQL estándar.

OP_ID es necesario para la mayoría de las consultas y puedes obtenerlo de la respuesta AnalyzeIamPolicyLongrunning. Por ejemplo, en gcloud verás que OP_ID es 123456 en "Usa [gcloud asset operations describe organizations/123456789/operations/AnalyzeIamPolicyLongrunning/123456] para verificar el estado de la operación".

Enumerar operaciones

Tu tabla podría almacenar resultados de varias operaciones AnalyzeIamPolicyLongrunning. Puedes usar la siguiente consulta para enumerarlos:

SELECT DISTINCT
  requestTime,
  opName
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis`
ORDER BY 1 DESC
;

Enumera análisis de una operación

En una operación AnalyzeIamPolicyLongrunning, puede haber varios registros de análisis generados. Por ejemplo, cuando habilitas la opción analyze_service_account_impersonation en tu solicitud, el resultado podría contener un análisis principal (con analysisId 0) y varios análisis de robo de identidad de cuentas de servicio.

Puedes usar la siguiente consulta e ingresar un nombre de operación para conocer todos los análisis.

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT
  analysisId,
  requestTime,
  TO_JSON_STRING(analysis.analysisQuery, true) as analysisQuery,
  analysis.fullyExplored,
  TO_JSON_STRING(analysis.nonCriticalErrors, true) as nonCriticalErrors
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis`
WHERE opName=_opName
ORDER BY 1
;

Enumera las ACE (entradas de control de acceso) en un análisis

Una ACE es una entrada de control de acceso {identity, role(s)/permission(s), resource}. Puede usar la siguiente consulta para enumerar las ACE en un análisis.

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT DISTINCT
  ids.name AS identity,
  resources.fullResourceName AS resource,
  accesses.role AS role,
  accesses.permission AS permission
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`,
  UNNEST(analysisResult.identityList.identities) AS ids,
  UNNEST(analysisResult.accessControlLists) AS acls,
  UNNEST(acls.accesses) AS accesses,
  UNNEST(acls.resources) AS resources
WHERE opName=_opName
AND analysisId = 0
ORDER BY 1,2,3,4
;

Enumera las ACE (entradas de control de acceso) con vinculación de política de IAM en un análisis

En esta consulta, enumeramos la vinculación ACE y de la política de IAM y que esta ACE genera para un análisis.

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT
  ids.name AS identity,
  resources.fullResourceName AS resource,
  accesses.role AS role,
  accesses.permission AS permission,
  analysisResult.attachedResourceFullName as iam_policy_attached_resource,
  TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`,
  UNNEST(analysisResult.identityList.identities) AS ids,
  UNNEST(analysisResult.accessControlLists) AS acls,
  UNNEST(acls.accesses) AS accesses,
  UNNEST(acls.resources) AS resources
WHERE opName=_opName AND analysisId = 0
ORDER BY 1,2,3,4
;

Enumera las vinculaciones de políticas de IAM en un análisis

En esta consulta, enumeramos las vinculaciones de políticas de IAM que aparecen en un análisis.

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT DISTINCT
  analysisResult.attachedResourceFullName as iam_policy_attached_resource,
  TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`
WHERE opName=_opName AND analysisId = 0
ORDER BY 1, 2
;

Enumera las vinculaciones de políticas de IAM con las ACE(entrada de control de acceso) en un análisis

En esta consulta, enumeramos las vinculaciones de políticas de IAM con sus ACE derivadas en un análisis

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT
  analysisResult.attachedResourceFullName as iam_policy_attached_resource,
  TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding,
  TO_JSON_STRING(analysisResult.identityList.identities, true) as identities,
  TO_JSON_STRING(acls.accesses, true) as accesses,
  TO_JSON_STRING(acls.resources, true) as resources
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`,
  UNNEST(analysisResult.accessControlLists) AS acls
WHERE opName=_opName AND analysisId = 0
ORDER BY 1,2
;