Écrire une analyse de stratégie dans BigQuery

Cette page explique comment analyser les stratégies IAM (Identity and Access Management) de manière asynchrone et écrire les résultats dans BigQuery. Ce processus est semblable à l'analyse des stratégies IAM, sauf que le résultat d'analyse est écrit dans les tables BigQuery.

Avant de commencer

  • Vous devez activer l'API Cloud Translation pour votre projet.

  • Si vous utilisez l'API pour exécuter ces requêtes, vous devez configurer votre environnement et gcurl.

    1. Configurez votre environnement.

    2. Pour configurer un alias gcurl, procédez comme suit :

      Si vous utilisez une instance Compute Engine, exécutez la commande suivante.

      alias gcurl='curl -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
      -H "Content-Type: application/json" -X POST'
      

      Si vous n'utilisez pas une instance Compute Engine, exécutez la commande suivante.

      alias gcurl='curl -H "$(oauth2l header --json CREDENTIALS cloud-platform)" \
      -H "Content-Type: application/json" -X POST'
      

      CREDENTIALS correspond au chemin d'accès de votre fichier d'identifiants, par exemple ~/credentials.json.

Autorisations requises

Les autorisations suivantes sont requises pour exécuter une analyse de stratégie et écrire les résultats de l'analyse dans la destination BigQuery spécifiée :

Appel de AnalyzeIamPolicyLongrunning

La méthode AnalyzeIamPolicyLongrunning vous permet d'émettre une requête d'analyse et d'obtenir les résultats dans la destination BigQuery spécifiée.

gcloud

Vous pouvez appeler AnalyzeIamPolicyLongrunning sur votre projet compatible avec l'API à l'aide de la commande gcloud asset analyze-iam-policy-longrunning. Vous devez exécuter le SDK Cloud version 314.0.0 ou ultérieure. Vous pouvez vérifier votre version avec la commande gcloud version.

gcloud asset analyze-iam-policy-longrunning \
    --organization="ORG_ID" \
    --full-resource-name="FULL_RESOURCE_NAME" \
    --permissions="COMMA_SEPARATED_PERMISSIONS" \
    --bigquery-dataset="projects/BQ_PROJECT_ID/datasets/BQ_DATASET_NAME" \
    --bigquery-table-prefix="BQ_TABLE_PREFIX"

Par exemple, pour écrire des résultats d'analyse des utilisateurs disposant des autorisations compute.instances.get et compute.instances.start sur l'instance Compute Engine ipa-gce-instance-2 sous l'organisation 123456789 dans l'ensemble de données BigQuery projects/project1/datasets/bq-dataset-01 avec un préfixe de table en tant que some_prefix :

gcloud asset analyze-iam-policy-longrunning --organization=123456789 \
    --full-resource-name="//compute.googleapis.com/projects/project1/zones/us-central1-a/instances/ipa-gce-instance-2" \
    --permissions="compute.instances.get,compute.instances.start" \
    --bigquery-dataset="projects/project1/datasets/bq-dataset-01" \
    --bigquery-table-prefix="some_prefix"

En savoir plus sur l'aide :

gcloud asset analyze-iam-policy-longrunning --help

REST

Analysez les stratégies IAM et écrivez les résultats à l'aide de l'alias gcurl.

gcurl -d "$JSON_REQUEST" \
"https://cloudasset.googleapis.com/v1/organizations/${YOUR_ORG_ID}:analyzeIamPolicyLongrunning"

Où :

  • YOUR_ORG_ID est l'ID de l'organisation, par exemple : 123456789

  • JSON_REQUEST est la requête d'analyse au format JSON. Par exemple, pour analyser qui dispose des autorisations compute.instances.get et compute.instances.start sur l'instance Compute Engine ipa-gce-instance-2 sous l'organisation 123456789 à l'ensemble de données BigQuery projects/project1/datasets/bq-dataset-01 par un préfixe de table en tant que some_prefix :

    JSON_REQUEST='{
      "analysisQuery":{
         "scope":"organization/123456789",
         "resourceSelector":{
            "fullResourceName":"//compute.googleapis.com/projects/project1/zones/us-central1-a/instances/ipa-gce-instance-2"
         },
         "accessSelector":{
            "permissions":[
               "compute.instances.get",
               "compute.instances.start"
            ]
         }
      },
      "outputConfig":{
         "bigqueryDestination":{
            "dataset":"projects/project1/datasets/bq-dataset-01",
            "tablePrefix":"some_prefix"
         }
      }
    }'
    

Définir la clé de partition

Les tables BigQuery peuvent être partitionnées, ce qui permet d'améliorer les performances des requêtes et de réduire le coût des requêtes en filtrant les partitions. Les clés de partitionnement suivantes sont acceptées :

  • REQUEST_TIME : heure de réception de la requête

Définir la disposition d'écriture

Spécifie l'action qui se produit si la table ou la partition de destination existe déjà et qu'elle n'est pas vide. Consultez également la page Disposition d'écriture BigQuery. Les valeurs suivantes sont acceptées :

  • WRITE_APPEND : valeur par défaut. Ajoute les données à la table ou à la dernière partition.
  • WRITE_TRUNCATE : écrase la table entière ou toutes les données des partitions.
  • WRITE_EMPTY : renvoie une erreur.

Afficher les résultats d'analyse de stratégie IAM

Pour afficher votre analyse de stratégie IAM, procédez comme suit :

Console

  1. Accédez à la page "BigQuery" de Cloud Console.
    Accéder à la page BigQuery

  2. Pour afficher les tables et les vues de l'ensemble de données, ouvrez le panneau de navigation. Dans la section Ressources, sélectionnez votre projet pour le développer, puis sélectionnez un ensemble de données.

  3. Dans la liste, sélectionnez les tables avec votre préfixe. La table avec le suffixe analysis contient la requête et les métadonnées (par exemple, nom de l'opération, heure de la requête, erreurs non critiques). La table avec le suffixe analysis_result est le résultat qui répertorie les tuples de {identity, role(s)/permission(s), resource} ainsi que les stratégies IAM qui génèrent ces tuples.

  4. Pour afficher un exemple d'ensemble de données, sélectionnez Aperçu.

API

Pour parcourir les données d'une table, appelez tabledata.list. Dans le paramètre tableId, spécifiez le nom de la table.

Vous pouvez configurer les paramètres facultatifs suivants pour contrôler la sortie.

  • maxResults est le nombre maximal de résultats à renvoyer.
  • selectedFields est une liste de colonnes à renvoyer, séparées par une virgule. Si ce paramètre n'est pas spécifié, toutes les colonnes sont renvoyées.
  • startIndex est l'index basé sur zéro de la première ligne à lire.

Les valeurs renvoyées sont encapsulées dans un objet JSON que vous devez analyser, comme décrit dans la documentation de référence de tabledata.list.

Créer une requête

Pour en savoir plus sur d'autres cas d'utilisation et les options disponibles pour les requêtes, consultez la page Analyser des exemples de requêtes de stratégie IAM.

Interroger BigQuery

Cette section fournit des exemples de requêtes SQL qui vous montrent comment utiliser les tables BigQuery écrites par AnalyzeIamPolicyLongrunning. Pour en savoir plus sur la syntaxe BigQuery, consultez la section Syntaxe des requêtes en SQL standard.

OP_ID est nécessaire pour la plupart des requêtes, vous pouvez l'obtenir à partir de la réponse AnalyzeIamPolicyLongrunning. Par exemple, dans gcloud, vous trouverez OP_ID dans 123456 sous "Utiliser [gcloud asset operations describe organizations/123456789/operations/AnalyzeIamPolicyLongrunning/123456] pour vérifier l'état de l'opération".

Répertorier les opérations

La table peut stocker les résultats de plusieurs opérations AnalyzeIamPolicyLongrunning. Vous pouvez utiliser la requête suivante pour les répertorier :

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

Répertorier les analyses dans une opération

Dans une opération AnalyzeIamPolicyLongrunning, plusieurs enregistrements d'analyse peuvent être générés. Par exemple, lorsque vous activez l'option analyze_service_account_impersonation dans votre requête, le résultat peut contenir une analyse principale (avec analysisId 0) et plusieurs analyses d'usurpation d'identité du compte de service.

Vous pouvez utiliser la requête suivante pour rechercher toutes les analyses en leur attribuant un nom d'opération.

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
;

Répertorier les ACE (entrées de contrôle des accès) dans une analyse

Une ACE est une entrée de contrôle d'accès {identity, role(s)/permission(s), resource}. Vous pouvez utiliser la requête suivante pour afficher une entrée ACE dans une analyse.

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
;

Répertorier les ACE (entrées de contrôle des accès) avec une liaison de stratégie IAM dans une analyse

Dans cette requête, nous répertorions à la fois l'entrée ACE et la liaison de stratégie IAM qui génère cette ACE pour une analyse.

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
;

Répertorier les liaisons de stratégie IAM dans une analyse

Dans cette requête, nous répertorions les liaisons de stratégie IAM dans une analyse.

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
;

Répertorier les liaisons de stratégie IAM avec ACE (entrées de contrôle des accès) dans une analyse

Dans cette requête, nous répertorions les liaisons de stratégies IAM avec leurs entrées ACE dérivées dans une seule analyse.

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
;