Exfiltration : restauration de la sauvegarde Cloud SQL dans l'organisation externe

Ce document décrit un type de résultat de détection de menace dans Security Command Center. Ces résultats sont générés par les détecteurs de menaces lorsqu'ils détectent une menace potentielle dans vos ressources cloud. Pour obtenir la liste complète des résultats de détection de menace disponibles, consultez cet index.

Présentation

L'exfiltration de données d'une sauvegarde Cloud SQL est détectée en examinant les journaux d'audit pour déterminer si les données de la sauvegarde ont été restaurées sur une instance Cloud SQL en dehors de l'organisation ou du projet. Tous les types d'instances et de sauvegardes Cloud SQL sont compatibles.

Event Threat Detection est la source de ce résultat.

Actions à mettre en place

Pour traiter ce résultat, procédez comme suit :

Étape 1 : Examiner les détails du résultat

  1. Ouvrez un résultat Exfiltration: Cloud SQL Restore Backup to External Organization, comme indiqué dans la section Examiner les résultats.
  2. Dans l'onglet Résumé du panneau "Détails du résultat", examinez les informations des sections suivantes :

    • Risque détecté, en particulier les champs suivants :
      • Adresse e-mail du compte principal : compte utilisé pour exfiltrer les données.
      • Sources d'exfiltration : détails concernant l'instance Cloud SQL à partir de laquelle la sauvegarde a été créée.
      • Cibles d'exfiltration : détails concernant l'instance Cloud SQL dans laquelle les données de sauvegarde ont été restaurées.
    • Ressource concernée, en particulier les champs suivants :
      • Nom complet de la ressource : nom de ressource de la sauvegarde qui a été restaurée.
      • Nom complet du projet : projetcontenant Google Cloud l'instance Cloud SQL à partir de laquelle la sauvegarde a été créée.
  3. Liens associés, en particulier les champs suivants :

    • URI Cloud Logging : lien vers les entrées Logging.
    • Méthode MITRE ATT&CK : lien vers la documentation MITRE ATT&CK.
    • Résultats associés : liens vers d'éventuels résultats associés.
  4. Cliquez sur l'onglet JSON.

  5. Dans le fichier JSON, notez les champs suivants.

    • resource:
      • parent_name: nom de ressource de l'instance Cloud SQL à partir de laquelle la sauvegarde a été créée
    • evidence:
      • sourceLogId:
        • projectId : le Google Cloud projet qui contient l'ensemble de données BigQuery source.
    • properties:
      • restoreToExternalInstance:
        • backupId : ID de l'exécution de sauvegarde qui a été restaurée

Étape 2 : Vérifier les autorisations et les paramètres

  1. Dans la console Google Cloud , accédez à la page IAM.

    Accéder à IAM

  2. Si nécessaire, sélectionnez le projet de l'instance listée dans le champ projectId du fichier JSON du résultat (voir Étape 1).

  3. Sur la page qui s'affiche, dans la zone Filtre, saisissez l'adresse e-mail indiquée dans Adresse e-mail du compte principal (voir Étape 1) et vérifiez les autorisations attribuées au compte.

Étape 3 : Vérifier les journaux

  1. Dans la console Google Cloud , accédez à l'explorateur de journaux en cliquant sur le lien dans l'URI Cloud Logging (voir Étape 1). La page Explorateur de journaux inclut tous les journaux liés à l'instance Cloud SQL concernée.

Étape 4 : Rechercher des méthodes d'attaque et de réponse

  1. Examinez l'entrée du framework MITRE ATT&CK pour ce type de résultat : Exfiltration over Web Service: Exfiltration to Cloud Storage (Exfiltration via service Web : Exfiltration vers Cloud Storage).
  2. Consultez les résultats associés en cliquant sur le lien correspondant dans la ligne Résultats associés. (from Étape 1). Le type des résultats associés est le même, sur la même instance Cloud SQL.
  3. Pour élaborer un plan de réponse, combinez les résultats de vos enquêtes avec la recherche MITRE.

Étape 5 : Mettre en œuvre votre plan de réponse

Le plan de réponse suivant peut être adapté à ce résultat, mais il peut également avoir un impact sur vos opérations. Veillez à bien évaluer les informations que vous collectez dans votre enquête pour déterminer quelle est la meilleure réponse à apporter aux problèmes soulevés par les résultats.

  • Contactez le propriétaire du projet contenant les données exfiltrées.
  • Envisagez de révoquer les autorisations du compte principal indiqué dans la ligne Adresse e-mail du compte principal de l'onglet Résumé des détails du résultat jusqu'à la fin de l'enquête.
  • Pour mettre fin à toute exfiltration, ajoutez des stratégies IAM restrictives sur les instances Cloud SQL concernées.
  • Pour limiter l'accès à l'API Cloud SQL Admin, utilisez VPC Service Controls.
  • Pour identifier et corriger les rôles trop permissifs, utilisez l'outil de recommandation IAM.

Exemple de fichier JSON de résultat

Voici un exemple de fichier JSON de résultat.

{
    "finding": {
      "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID",
      "parent": "organizations/ORGANIZATION_ID/sources/SOURCE_ID",
      "resource_name": "//cloudsql.googleapis.com/projects/SOURCE_PROJECT_ID/instances/SOURCE_INSTANCE_NAME/backupRuns/BACKUP_ID",
      "state": "ACTIVE",
      "category": "Exfiltration: CloudSQL Restore Backup to External Organization",
      "sourceProperties": {
        "sourceId": {
          "projectNumber": "SOURCE_PROJECT_NUMBER",
          "customerOrganizationNumber": "ORGANIZATION_ID"
        },
        "detectionCategory": {
          "technique": "backup_exfiltration",
          "indicator": "audit_log",
          "ruleName": "cloudsql_exfil",
          "subRuleName": "restore_to_external_instance"
        },
        "detectionPriority": "HIGH",
        "affectedResources": [
          {
            "gcpResourceName": "//cloudresourcemanager.googleapis.com/projects/SOURCE_PROJECT_NUMBER"
          },
          {
            "gcpResourceName": "//cloudsql.googleapis.com/projects/SOURCE_PROJECT_ID/instances/SOURCE_INSTANCE_NAME"
          },
          {
            "gcpResourceName": "//cloudsql.googleapis.com/projects/TARGET_PROJECT_ID/instances/TARGET_INSTANCE_NAME"
          },
        ],
        "evidence": [{
          "sourceLogId": {
            "projectId": "SOURCE_PROJECT_ID",
            "resourceContainer": "projects/SOURCE_PROJECT_ID",
            "timestamp": {
              "seconds": "0",
              "nanos": 0.0
            },
            "insertId": "INSERT_ID"
          }
        }],
        "properties": {
          "restoreToExternalInstance": {
            "principalEmail": "PRINCIPAL_EMAIL",
            "sourceCloudsqlInstanceResource": "//cloudsql.googleapis.com/projects/SOURCE_PROJECT_ID/instances/SOURCE_INSTANCE_NAME",
            "backupId": "BACKUP_ID",
            "targetCloudsqlInstanceResource": "//cloudsql.googleapis.com/projects/TARGET_PROJECT_ID/instances/TARGET_INSTANCE_NAME"
          }
        },
        "findingId": "FINDING_ID",
        "contextUris": {
          "mitreUri": {
            "displayName": "MITRE Link",
            "url": "https://attack.mitre.org/techniques/T1567/002/"
          },
          "cloudLoggingQueryUri": [{
            "displayName": "Cloud Logging Query Link",
            "url": "LOGGING_LINK"
          }],
          "relatedFindingUri": {
            "displayName": "Related CloudSQL Exfiltration findings",
            "url": "RELATED_FINDINGS_LINK"
          }
        }
      },
      "securityMarks": {
        "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID/securityMarks"
      },
      "eventTime": "2022-01-19T21:36:07.901Z",
      "createTime": "2022-01-19T21:36:08.695Z",
      "severity": "HIGH",
      "workflowState": "NEW",
      "canonicalName": "projects/SOURCE_PROJECT_NUMBER/sources/SOURCE_ID/findings/FINDING_ID"
      "mute": "UNDEFINED",
      "findingClass": "THREAT",
      "mitreAttack": {
        "primaryTactic": "EXFILTRATION",
        "primaryTechniques": ["EXFILTRATION_OVER_WEB_SERVICE", "EXFILTRATION_TO_CLOUD_STORAGE"]
      },
      "access": {
        "principalEmail": "PRINCIPAL_EMAIL",
        "callerIp": "IP",
        "callerIpGeo": {
        },
        "serviceName": "cloudsql.googleapis.com",
        "methodName": "cloudsql.instances.restoreBackup"
      },
      "exfiltration": {
        "sources": [
          {
            "name": "//cloudsql.googleapis.com/projects/SOURCE_PROJECT_ID/instances/SOURCE_INSTANCE_NAME"
          }
        ],
        "targets": [
          {
            "name": "//cloudsql.googleapis.com/projects/TARGET_PROJECT_ID/instances/TARGET_INSTANCE_NAME"
          }
        ]
      }
    },
    "resource": {
      "name": "//cloudsql.googleapis.com/projects/SOURCE_PROJECT_ID/instances/SOURCE_INSTANCE_NAME/backupRuns/BACKUP_ID",
      "projectName": "//cloudresourcemanager.googleapis.com/projects/SOURCE_PROJECT_NUMBER",
      "projectDisplayName": "SOURCE_PROJECT_ID",
      "parentName": "//cloudsql.googleapis.com/projects/SOURCE_PROJECT_ID/instances/SOURCE_INSTANCE_NAME",
      "parentDisplayName": "SOURCE_INSTANCE_NAME",
      "type": "google.cloud.sql.Instance",
      "folders": [{
        "resourceFolder": "//cloudresourcemanager.googleapis.com/folders/FOLDER_NUMBER",
        "resourceFolderDisplayName": "FOLDER_ID"
      }],
      "displayName": "mysql-backup-restore-instance"
    }
}

Étape suivante