Sicherheitsergebnisse mit Security Command Center API auflisten

Security Command Center-Ergebnisse modellieren die potenziellen Sicherheitsrisiken von Assets in einem für ein Projekt oder eine Organisation. Ein Ergebnis bezieht sich immer auf einen bestimmten Asset im Security Command Center.

In diesem Leitfaden erfahren Sie, wie Sie mit Security Command Center-Clientbibliotheken auf die Ergebnisse zugreifen. Jedes Ergebnis gehört zu einer Quelle. Die meisten Detektoren oder Anbieter von Ergebnissen liefern Ergebnisse innerhalb derselben Quelle.

Die IAM-Rollen für Security Command Center können in der Organisation, Ordner- oder Projektebene. Ihre Fähigkeit, Ergebnisse, Assets, und Sicherheitsquellen hängen von der Zugriffsebene ab. Weitere Informationen Weitere Informationen zu Security Command Center-Rollen finden Sie unter Zugriffssteuerung.

Hinweise

Bevor Sie eine Quelle einrichten, müssen Sie die folgenden Schritte ausführen:

Seitengröße

Alle Security Command Center-Listen-APIs sind paginiert. Jede Antwort gibt eine Seite mit Ergebnissen und ein Token zurück, um die nächste Seite zurückzugeben. Die Seitengröße kann konfiguriert werden. Die Standardseitengröße ist 10. Sie können ein Minimum von 1 bis zu einem Maximum von 1.000 festlegen.

Aufbewahrung von Ergebnissen

Ein Ergebnis bleibt mindestens 13 Monate lang zum Auflisten oder Abfragen verfügbar.

Security Command Center speichert Snapshots jedes Ergebnisses. A Momentaufnahme eines Ergebnisses wird mindestens 13 Monate lang aufbewahrt. Wenn alle Snapshots für ein Ergebnis gelöscht werden, kann es nicht mehr aufgelistet oder wiederhergestellt werden.

Weitere Informationen zur Datenaufbewahrung in Security Command Center finden Sie unter Datenaufbewahrung:

Alle Ergebnisse auflisten

gcloud

Führen Sie den folgenden Befehl aus, um alle Ergebnisse in einem Projekt, einem Ordner oder einer Organisation aufzulisten: Befehl:

gcloud scc findings list PARENT_ID

Ersetzen Sie PARENT_ID durch einen der folgenden Werte:

  • Eine Organisations-ID im folgenden Format: ORGANIZATION_ID (nur die numerische ID)
  • Eine Ordner-ID im folgenden Format: folders/FOLDER_ID
  • Eine Projekt-ID im folgenden Format: projects/PROJECT_ID

Weitere Beispiele erhalten Sie mit dem folgenden Befehl:

gcloud scc findings list --help

Beispiele in der Dokumentation finden Sie unter gcloud scc Ergebnisliste.

Python

from google.cloud import securitycenter

# Create a client.
client = securitycenter.SecurityCenterClient()

# 'parent' must be in one of the following formats:
#   "organizations/{organization_id}"
#   "projects/{project_id}"
#   "folders/{folder_id}"
parent = f"organizations/{organization_id}"
# The "sources/-" suffix lists findings across all sources.  You
# also use a specific source_name instead.
all_sources = f"{parent}/sources/-"
finding_result_iterator = client.list_findings(request={"parent": all_sources})
for i, finding_result in enumerate(finding_result_iterator):
    print(
        "{}: name: {} resource: {}".format(
            i, finding_result.finding.name, finding_result.finding.resource_name
        )
    )

Java

static ImmutableList<ListFindingsResult> listAllFindings(OrganizationName organizationName) {
  try (SecurityCenterClient client = SecurityCenterClient.create()) {
    // Input parameters for SourceName must be in one of the following formats:
    //    * OrganizationName organizationName = OrganizationName.of("organization-id");
    //      organizationName.getOrganization();
    //    * ProjectName projectName = ProjectName.of("project-id");
    //      projectName.getProject();
    //    * FolderName folderName = FolderName.of("folder-id");
    //      folderName.getFolder();
    //
    // "-" Indicates listing across all sources.
    SourceName sourceName = SourceName.of(organizationName.getOrganization(), "-");

    ListFindingsRequest.Builder request =
        ListFindingsRequest.newBuilder().setParent(sourceName.toString());

    // Call the API.
    ListFindingsPagedResponse response = client.listFindings(request.build());

    // This creates one list for all findings.  If your organization has a large number of
    // findings this can cause out of memory issues.  You can process them in incrementally
    // by returning the Iterable returned response.iterateAll() directly.
    ImmutableList<ListFindingsResult> results = ImmutableList.copyOf(response.iterateAll());
    System.out.println("Findings:");
    System.out.println(results);
    return results;
  } catch (IOException e) {
    throw new RuntimeException("Couldn't create client.", e);
  }
}

Go

import (
	"context"
	"fmt"
	"io"

	securitycenter "cloud.google.com/go/securitycenter/apiv1"
	"cloud.google.com/go/securitycenter/apiv1/securitycenterpb"
	"google.golang.org/api/iterator"
)

// listFindings prints all findings in orgID to w. orgID is the numeric
// identifier of the organization.
func listFindings(w io.Writer, orgID string) error {
	// orgID := "12321311"
	// Instantiate a context and a security service client to make API calls.
	ctx := context.Background()
	client, err := securitycenter.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("securitycenter.NewClient: %w", err)
	}
	defer client.Close() // Closing the client safely cleans up background resources.

	req := &securitycenterpb.ListFindingsRequest{
		// List findings across all sources.
		// Parent must be in one of the following formats:
		//		"organizations/{orgId}/sources/-"
		//		"projects/{projectId}/sources/-"
		//		"folders/{folderId}/sources/-"
		Parent: fmt.Sprintf("organizations/%s/sources/-", orgID),
	}
	it := client.ListFindings(ctx, req)
	for {
		result, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return fmt.Errorf("it.Next: %w", err)
		}
		finding := result.Finding
		fmt.Fprintf(w, "Finding Name: %s, ", finding.Name)
		fmt.Fprintf(w, "Resource Name %s, ", finding.ResourceName)
		fmt.Fprintf(w, "Category: %s\n", finding.Category)
	}
	return nil
}

Node.js

// Imports the Google Cloud client library.
const {SecurityCenterClient} = require('@google-cloud/security-center');

// Creates a new client.
const client = new SecurityCenterClient();
//  organizationId is the numeric ID of the organization.
/*
 * TODO(developer): Uncomment the following lines
 */
// const organizationId = "1234567777";

async function listAllFindings() {
  const [response] = await client.listFindings({
    // List findings across all sources.
    // parent: must be in one of the following formats:
    //    `organizations/${organization_id}/sources/-`
    //    `projects/${project_id}/sources/-`
    //    `folders/${folder_id}/sources/-`
    parent: `organizations/${organizationId}/sources/-`,
  });
  let count = 0;
  Array.from(response).forEach(result =>
    console.log(
      `${++count} ${result.finding.name} ${result.finding.resourceName}`
    )
  );
}
listAllFindings();

Die Ausgabe für jedes Ergebnis sieht in etwa so aus:

"finding": {
    "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID",
    "parent": "organizations/ORGANIZATION_ID/sources/SOURCE_ID",
    "resourceName": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
    "state": "ACTIVE",
    "category": "Malware: Cryptomining Bad Domain",
    "sourceProperties": {
      "sourceId": {
        "projectNumber": "PROJECT_NUMBER",
        "customerOrganizationNumber": "ORGANIZATION_ID"
      },
      "detectionCategory": {
        "technique": "cryptomining",
        "indicator": "domain",
        "ruleName": "bad_domain",
        "subRuleName": "cryptomining"
      },
      "detectionPriority": "LOW",
      "affectedResources": [{
        "gcpResourceName": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER"
      }],
      "evidence": [{
        "sourceLogId": {
          "projectId": "PROJECT_ID",
          "resourceContainer": "projects/PROJECT_ID",
          "timestamp": {
            "seconds": "1636566099",
            "nanos": 5.41483849E8
          },
          "insertId": "INSERT_ID"
        }
      }],
      "properties": {
        "domains": ["DOMAIN"],
        "instanceDetails": "/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_ID",
        "network": {
          "project": "PROJECT_ID",
          "location": "ZONE"
        },
        "dnsContexts": [{
          "authAnswer": true,
          "sourceIp": "SOURCE_IP_ADDRESS",
          "queryName": "DOMAIN",
          "queryType": "A",
          "responseCode": "NXDOMAIN"
        }],
        "vpc": {
          "vpcName": "default"
        }
      },
      "findingId": "FINDING_ID",
      "contextUris": {
        "mitreUri": {
          "displayName": "MITRE Link",
          "url": "https://attack.mitre.org/techniques/T1496/"
        },
        "virustotalIndicatorQueryUri": [{
          "displayName": "VirusTotal Domain Link",
          "url": "https://www.virustotal.com/gui/domain/DOMAIN/detection"
        }],
        "cloudLoggingQueryUri": [{
          "displayName": "Cloud Logging Query Link",
          "url": "https://console.cloud.google.com/logs/query;query\u003dtimestamp%3D%222021-11-10T17:41:39.541483849Z%22%0AinsertId%3D%22INSERT_ID%22%0Aresource.labels.project_id%3D%22PROJECT_ID%22?project\u003dPROJECT_ID"
        }],
        "relatedFindingUri": {
        }
      }
    },
    "securityMarks": {
      "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID/securityMarks"
    },
    "eventTime": "2021-11-10T17:41:41.594Z",
    "createTime": "2021-11-10T17:41:42.014Z",
    "severity": "LOW",
    "workflowState": "NEW",
    "canonicalName": "projects/PROJECT_NUMBER/sources/SOURCE_ID/findings/FINDING_ID",
    "mute": "UNDEFINED",
    "findingClass": "THREAT",
    "indicator": {
      "domains": ["DOMAIN"]
    }
  },
  "resource": {
    "name": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
    "projectName": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
    "projectDisplayName": "PROJECT_ID",
    "parentName": "//cloudresourcemanager.googleapis.com/organizations/ORGANIZATION_ID",
    "parentDisplayName": "PARENT_NAME",
    "type": "google.cloud.resourcemanager.Project",
    "displayName": "PROJECT_ID"
  }

Ergebnisse filtern

Ein Projekt, ein Ordner oder eine Organisation kann viele Ergebnisse enthalten. Das vorherige Beispiel verwendet keinen Filter, sodass alle Ergebnisdatensätze zurückgegeben werden. Security Command Center können Sie Ergebnisfilter verwenden, um nur Informationen über die Ergebnisse zu erhalten.

Die Ergebnisfilter sind mit "where"-Klauseln in SQL-Anweisungen vergleichbar, aber statt für Spalten gelten sie für die von der API zurückgegebenen Objekte.

Im folgenden Beispiel werden nur Ergebnisse mit der Kategorie "MEDIUM_RISK_ONE" aufgelistet. Verschiedene Ergebnisanbieter (auch als Sicherheitsquellen bezeichnet) verwenden unterschiedliche Kategorien. Informationen zu den Kategorien, die Sie in Ihrem Filter verwenden können, finden Sie in der Dokumentation des Ergebnisanbieters.

gcloud

Filtern Sie die Ergebnisse mit dem folgenden Befehl:

gcloud scc findings list PARENT_ID --source=SOURCE_ID --filter="FILTER"

Ersetzen Sie Folgendes:

  • FILTER durch den gewünschten Filter. Beispiel: gibt der folgende Filter Ergebnisse aus der Kategorie Nur MEDIUM_RISK_ONE:
    --filter="category=\"MEDIUM_RISK_ONE\""
  • PARENT_ID durch einen der folgenden Werte:
    • Eine Organisations-ID im folgenden Format: ORGANIZATION_ID (nur die numerische ID)
    • Eine Projekt-ID im folgenden Format: projects/PROJECT_ID
    • Eine Ordner-ID im folgenden Format: folders/FOLDER_ID
  • SOURCE_ID durch die ID der Sicherheitsquelle, die liefert den Ergebnistyp.

Weitere Beispiele erhalten Sie mit dem folgenden Befehl:

gcloud scc findings list --help

Beispiele in der Dokumentation finden Sie unter gcloud scc Ergebnisliste.

Python

from google.cloud import securitycenter

# Create a new client.
client = securitycenter.SecurityCenterClient()

# 'source_name' is the resource path for a source that has been
# created previously (you can use list_sources to find a specific one).
# Its format is:
# source_name = f"{parent}/sources/{source_id}"
# 'parent' must be in one of the following formats:
#   "organizations/{organization_id}"
#   "projects/{project_id}"
#   "folders/{folder_id}"
# You an also use a wild-card "-" for all sources:
#   source_name = "organizations/111122222444/sources/-"
finding_result_iterator = client.list_findings(
    request={"parent": source_name, "filter": 'category="MEDIUM_RISK_ONE"'}
)
# Iterate an print all finding names and the resource they are
# in reference to.
for i, finding_result in enumerate(finding_result_iterator):
    print(
        "{}: name: {} resource: {}".format(
            i, finding_result.finding.name, finding_result.finding.resource_name
        )
    )

Java

static ImmutableList<ListFindingsResult> listFilteredFindings(SourceName sourceName) {
  try (SecurityCenterClient client = SecurityCenterClient.create()) {
    // parentId: must be one of the following:
    //    "organization-id"
    //    "project-id"
    //    "folder-id"
    // SourceName sourceName = SourceName.of(parentId, sourceId);

    // Create filter to category of MEDIUM_RISK_ONE
    String filter = "category=\"MEDIUM_RISK_ONE\"";

    ListFindingsRequest.Builder request =
        ListFindingsRequest.newBuilder().setParent(sourceName.toString()).setFilter(filter);

    // Call the API.
    ListFindingsPagedResponse response = client.listFindings(request.build());

    // This creates one list for all findings.  If your organization has a large number of
    // findings this can cause out of memory issues.  You can process them in incrementally
    // by returning the Iterable returned response.iterateAll() directly.
    ImmutableList<ListFindingsResult> results = ImmutableList.copyOf(response.iterateAll());
    System.out.println("Findings:");
    System.out.println(results);
    return results;
  } catch (IOException e) {
    throw new RuntimeException("Couldn't create client.", e);
  }
}

Go

import (
	"context"
	"fmt"
	"io"

	securitycenter "cloud.google.com/go/securitycenter/apiv1"
	"cloud.google.com/go/securitycenter/apiv1/securitycenterpb"
	"google.golang.org/api/iterator"
)

// listFilteredFindings prints findings with category 'MEDIUM_RISK_ONE' for a
// specific source to w. sourceName is the full resource name of the source
// to search for findings under.
func listFilteredFindings(w io.Writer, sourceName string) error {
	// Specific source:
	// 		sourceName := "{parent}/sources/{sourceId}"
	// All sources:
	// 		sourceName := "{parent}/sources/-"
	// where,
	// Parent must be in one of the following formats:
	//		"organizations/{orgId}"
	//		"projects/{projectId}"
	//		"folders/{folderId}"
	// Instantiate a context and a security service client to make API calls.
	ctx := context.Background()
	client, err := securitycenter.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("securitycenter.NewClient: %w", err)
	}
	defer client.Close() // Closing the client safely cleans up background resources.

	req := &securitycenterpb.ListFindingsRequest{
		Parent: sourceName,
		Filter: `category="MEDIUM_RISK_ONE"`,
	}
	it := client.ListFindings(ctx, req)
	for {
		result, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return fmt.Errorf("it.Next: %w", err)
		}
		finding := result.Finding
		fmt.Fprintf(w, "Finding Name: %s, ", finding.Name)
		fmt.Fprintf(w, "Resource Name %s, ", finding.ResourceName)
		fmt.Fprintf(w, "Category: %s\n", finding.Category)
	}
	return nil
}

Node.js

// Imports the Google Cloud client library.
const {SecurityCenterClient} = require('@google-cloud/security-center');

// Creates a new client.
const client = new SecurityCenterClient();
//  sourceName is the full resource path of the source to search for
//  findings.
/*
 * TODO(developer): Uncomment the following lines
 */
// const sourceName = `${parent}/sources/${sourceId}`;
// where,
// parent: must be in one of the following formats:
//    `organizations/${organization_id}`
//    `projects/${project_id}`
//    `folders/${folder_id}`
async function listFilteredFindings() {
  const [response] = await client.listFindings({
    // List findings across all sources.
    parent: sourceName,
    filter: 'category="MEDIUM_RISK_ONE"',
  });
  let count = 0;
  Array.from(response).forEach(result =>
    console.log(
      `${++count} ${result.finding.name} ${result.finding.resourceName}`
    )
  );
}
listFilteredFindings();

Security Command Center unterstützt auch vollständige JSON-Arrays und Objekte als potenzielle Property-Typen. Sie können nach folgenden Kriterien filtern:

  • Arrayelemente
  • Vollständige JSON-Objekte mit partieller Stringübereinstimmung im Objekt
  • Untergeordnete JSON-Objekt-Felder

Unterstützte Operatoren

Die Abfrageanweisungen für Security Command Center-Ergebnisse unterstützen die Operatoren, die von den meisten Google Cloud APIs unterstützt werden.

Die folgende Liste zeigt die Verwendung verschiedener Operatoren:

  • state="ACTIVE" AND NOT mute="MUTED"
  • create_time>"2023-08-15T19:05:32.428Z"
  • resource.parent_name:"prod"
  • severity="CRITICAL" OR severity="HIGH"

In der folgenden Liste sind alle Operatoren und Funktionen aufgeführt, in Abfrageanweisungen für Ergebnisse unterstützt:

  • Für Strings:
    • = für vollständige Gleichheit
    • : für teilweisen Stringabgleich
  • Für Zahlen:
    • <, >, <=, >= für Ungleichungen
    • =, != für Gleichheit
  • Für boolesche Werte:
    • = für Gleichheit
  • Für logische Beziehungen:
    • AND
    • OR
    • NOT oder -
  • Für Gruppierungsausdrücke:
    • (, ) (Klammern)
  • Für Arrays:
    • contains(), eine Funktion für Ergebnisse mit einem Arrayfeld abfragen, das mindestens ein Element enthält der dem angegebenen Filter entspricht
    • containsOnly(), -Funktion zum Abfragen von Ergebnissen mit einem Arrayfeld, das nur Elemente, die dem angegebenen Filter entsprechen
  • Für IP-Adressen:
    • inIpRange(), eine Funktion zum Abfragen von IP-Adressen innerhalb eines angegebenen CIDR-Bereichs

Nach IP-Adressen filtern

Bestimmte Ergebnisattribute umfassen IP-Adressen. Sie können Ergebnisse filtern, die auf bestimmten IP-Adressen oder einem Bereich von IP-Adressen basieren.

IP-Adressen erscheinen als Zeichenfolgen in einer Vielzahl von Ergebnissen und Ergebnisattributen. einschließlich der folgenden:

  • access.caller_ip
  • connections.destinationIp
  • connections.sourceIp
  • indicator.ip_addresses

Um nach einer bestimmten IP-Adresse zu filtern, können Sie den Gleichheitsoperator verwenden, Dies wird im folgenden Beispiel gezeigt:

access.caller_ip="192.0.2.0"

Verwenden Sie die inIpRange, um Ergebnisse anhand eines IP-Adressbereichs zu filtern . Mit der Funktion inIpRange filtern Sie Ergebnisse nur auf diese Ergebnisse, die eine IP-Adresse in einem angegebenen CIDR-Bereich enthalten. Durch die Verwendung von der NOT-Operation mit inIpRange können Sie Ergebnisse nur so filtern, Ergebnisse, die eine IP-Adresse außerhalb des angegebenen CIDR-Bereichs enthalten.

Das folgende Beispiel zeigt die Syntax der Funktion inIpRange:

inIpRange(IP_FINDING_FIELD, "CIDR_RANGE")

Wenn sich die IP-Adresse in einem Array-Element in einem Ergebnisfeld befindet, das Folgendes enthält: ein Array, verwenden Sie die folgende Syntax mit der contains-Funktion und die inIpRange-Funktion:

contains(ATTRIBUTE_WITH_ARRAY, inIpRange(IP_FINDING_FIELD, "CIDR_RANGE"))

Im folgenden Beispiel wertet die Funktion inIpRange destination_ip-Element des Arrays, das in connections enthalten ist Ergebnisfeld für eine IP-Adresse, die sich im durch 192.0.2.0/24:

contains(connections, inIpRange(destination_ip, "192.0.2.0/24"))

Das folgende Beispiel zeigt einen gcloud CLI-Befehl, verwendet die Funktion inIpRange, um Ergebnisse zu filtern, die eine IP-Adresse haben Adresse im Feld connections.source_ip innerhalb eines Bereichs liegt, aber nicht in einem anderen. Das Feld connections ist ein Array-Typ-Feld, Daher wird die Funktion contains verwendet:

  gcloud scc findings list example-organization.com \
    --source=123456789012345678 \
    --filter="contains(connections, inIpRange(source_ip, "2001:db8::/32")) \
      AND NOT contains(connections, inIpRange(source_ip, "192.0.2.0/24"))

Beispiel für ein JSON-Objekt

In den Beispielen weiter unten auf dieser Seite wird davon ausgegangen, dass das folgende JSON-Objekt ein Ergebnisattribut ist:

{
  "outer_object": {
    "middle_object": {
      "deeply_nested_object": {
        "x": 123
      },
      "y": "some-string-value"
    },
    "list_middle_object": [
      {
        "v": 321,
        "w": [
          {
            "a": 3,
            "b": 4
          }
        ]
      }
    ],
    "z": "some-other-string-value",
    "u": [
      "list-element-1",
      "list-element-2",
      "list-element-3"
    ]
  }
}

Beispiel für das Filtern von Ergebnissen

Angenommen, das vorherige JSON-Beispiel ist ein Ergebnisattribut mit dem Namen my_property. Das folgende Beispiel enthält Abfragen für Ergebnisse, die das Objekt als Attribut haben. Sie können diese Filter auch mit anderen Filtern verwenden, indem Sie AND und OR in der Abfrage verwenden.

# ORGANIZATION_ID=organization-id
# SOURCE_ID="source-id"

gcloud scc findings list $ORGANIZATION_ID --source=$SOURCE_ID \
  --filter="my_property.outer_object.middle_object.deeply_nested_object.x = 123"

gcloud scc findings list $ORGANIZATION_ID --source=$SOURCE_ID \
  --filter="my_property.outer_object.middle_object.y = \"some-string-value\""

gcloud scc findings list $ORGANIZATION_ID --source=$SOURCE_ID \
  --filter="my_property.outer_object.middle_object.y : \"string-value\""

gcloud scc findings list $ORGANIZATION_ID --source=$SOURCE_ID \
  --filter="my_property.outer_object.z = \"some-other-string-value\""

gcloud scc findings list $ORGANIZATION_ID --source=$SOURCE_ID \
  --filter="my_property.outer_object.z : \"other-string-value\""

gcloud scc findings list $ORGANIZATION_ID --source=$SOURCE_ID \
  --filter="my_property.outer_object.u : \"list-element-1\""

gcloud scc findings list $ORGANIZATION_ID --source=$SOURCE_ID \
  --filter="my_property.outer_object.u : \"list-element-2\""

gcloud scc findings list $ORGANIZATION_ID --source=$SOURCE_ID \
  --filter="my_property.outer_object.u : \"list-element-3\""

Nach Arrayfeldern filtern

Beim Anrufen ListFindings, können Sie eine Teilstring-Übereinstimmung : verwenden, die eine einzelne Prüfung auf einen Teilstring Stringübereinstimmung im gesamten Inhalt des Arrays. Alternativ können Sie einen Subfilter direkt gegen Elemente des Arrays und dessen Unterfelder, indem der folgenden Funktionen:

  • Die Funktion contains(), die Ergebnisse zurückgibt, wenn Elemente der Das Array enthält den angegebenen Wert.

  • Die containsOnly()-Funktion, mit der Ergebnisse nur zurückgegeben werden, wenn alle Elemente der entspricht dem Unterfilter.

Beide Funktionen unterstützen Abfragefunktionen für Subfilter wie den Folgendes:

  • Genauer Elementabgleich: Arrayelemente abgleichen, die den genauen String "example" enthalten.
  • Operationen mit spezifischen Zahlen: Arrayelementen abgleichen, die größer oder gleich 100 sind.
  • Komplexe Filterung nach Arraystrukturen: Arrayelemente abgleichen, die das Attribut x mit einem entsprechenden Wert y enthalten.

Format der contains()-Funktion

Die Funktion contains() hat das folgende Format:

contains(ARRAY_ATTRIBUTE_NAME, SUBFILTER)

Dabei gilt:

  • ARRAY_ATTRIBUTE_NAME: Ein Feld oder Unterfeld vom Typ "Array" (eine Liste).
  • SUBFILTER: Ein Ausdruck, der die Werte definiert, nach denen im Array gesucht werden soll. Das Format des Unterfilters variiert je nachdem, ob ARRAY_ATTRIBUTE_NAME ein Array von Objekten oder ein Array von einfachen Elementen ist. Wenn das ARRAY_ATTRIBUTE_NAME ein Array von Objekten mit verschachtelten Arrays ist, können Sie mit einem Bereichsunterfilter angeben, dass alle Bedingungen innerhalb des ARRAY_ATTRIBUTE_NAME-Elements erfüllt sein sollen.

Die Security Command Center API gibt Ergebnisse zurück, bei denen ARRAY_ATTRIBUTE_NAME mindestens ein Element enthält, das dem SUBFILTER entspricht.

Format der containsOnly()-Funktion

Die Funktion containsOnly() hat das folgende Format:

containsOnly(ARRAY_ATTRIBUTE_NAME, SUBFILTER)

Ersetzen Sie Folgendes:

  • ARRAY_ATTRIBUTE_NAME: ein Feld oder Unterfeld vom Typ „Array“ (ein Liste). Wenn Sie Abfragen mit der Security Command Center API ausführen, können Sie Die containsOnly()-Funktion für alle verfügbaren Array-Attribute.

  • SUBFILTER: Ein Ausdruck, der die Werte definiert, nach denen im Array gesucht werden soll. Das Format des Unterfilters hängt davon ab, ARRAY_ATTRIBUTE_NAME ist ein Array von Objekten oder ein Array von primitiven Elementen Wenn die ARRAY_ATTRIBUTE_NAME ist ein Array von Objekten mit verschachtelten Arrays verwenden, können Sie mit einem Bereichsunterfilter angeben, dass dass alle Bedingungen innerhalb ARRAY_ATTRIBUTE_NAME-Element.

Die Security Command Center API gibt Ergebnisse zurück, bei denen alle ARRAY_ATTRIBUTE_NAME-Elemente stimmen mit SUBFILTER überein.

Unterfilter für ein Array von Objekten

Folgendes ist ein Auszug aus dem vorherigen JSON-Beispiel. Hier ist das Feld list_middle_object ein Array von Objekten:

    "list_middle_object": [
      {
        "v": 321,
        "w": [
          {
            "a": 3,
            "b": 4
          }
        ]
      }
    ]

Das folgende Beispiel fragt nach Ergebnissen ab, bei denen mindestens eines der Elemente im Feld list_middle_object das Unterfeld v mit einem Wert größer oder gleich 321 enthält:

# ORGANIZATION_ID=organization-id
# SOURCE_ID="source-id"

gcloud scc findings list $ORGANIZATION_ID --source=$SOURCE_ID \
  --filter="contains(my_property.outer_object.list_middle_object, v  >= 321)"

Praktische Beispiele mit den Funktionen contains() und containsOnly(): Siehe Ergebnisse, die ein bestimmtes Array enthalten Werte.

Unterfilter für ein Array mit einfachen Elementen

Einfache Typen sind Strings, Zahlen und boolesche Werte. Wenn Sie die Funktion contains() für ein Array verwenden möchten, das einfache Typen enthält, verwenden Sie das spezielle Schlüsselwort elem.

Folgendes ist ein Auszug aus dem vorherigen JSON-Beispiel. Hier ist das Feld u ein Array von einfachen Elementen:

"u": ["list-element-1", "list-element-2", "list-element-3"]

Im folgenden Beispiel wird nach Ergebnissen abgefragt, in denen mindestens eines der Elemente im Feld u "list-element-1" ist:

# ORGANIZATION_ID=organization-id
# SOURCE_ID="source-id"

gcloud scc findings list $ORGANIZATION_ID --source=$SOURCE_ID \
  --filter="contains(my_property.outer_object.u, elem = \"list-element-1\")"

Praktische Beispiele, die die Funktion contains() verwenden, finden Sie unter Ergebnisse, die bestimmte Arraywerte enthalten.

Bereichsunterfilter

Folgendes ist ein Auszug aus dem vorherigen JSON-Beispiel. Hier ist das Feld list_middle_object ein Array von Objekten und Objekte in diesem Array enthalten ein verschachteltes Array.

    "list_middle_object": [
      {
        "v": 321,
        "w": [
          {
            "a": 3,
            "b": 4
          }
        ]
      }
    ]

Im folgenden Beispiel wird nach Ergebnissen abgefragt, in denen beide der folgenden Bedingungen innerhalb desselben list_middle_object-Elements erfüllt sind:

  • Das Unterfeld v hat einen Wert größer oder gleich 321.
  • Das Unterfeld w enthält kein Element mit einem Attribut a, das den Wert 3 hat.
# ORGANIZATION_ID=organization-id
# SOURCE_ID="source-id"

gcloud scc findings list $ORGANIZATION_ID --source=$SOURCE_ID \
  --filter="contains(my_property.outer_object.list_middle_object, v  >= 321 AND -contains(w, a = 3))"

Praktische Beispiele, die die Funktion contains() verwenden, finden Sie unter Ergebnisse, die bestimmte Arraywerte enthalten.

Beispiel für das Sortieren von Ergebnissen

Sie können Ergebnisse nach strengen Teilfeldern sortieren, die einfache Typen sind, wie Strings, Zahlen und boolesche Werte. Angenommen, das vorherige JSON-Beispiel ist ein Ergebnisattribut mit dem Namen my_property. Das folgende Beispiel enthält Abfragen zum Sortieren der Ergebnisfelder. Das Schlüsselwort DESC gibt an, dass das Feld, dem gefolgt wird, in absteigender Reihenfolge sortiert werden muss. Die Standardreihenfolge ist aufsteigend.

# ORGANIZATION_ID=organization-id
# SOURCE_ID="source-id"

gcloud scc findings list $ORGANIZATION_ID --source=$SOURCE_ID \
  --order-by="my_property.outer_object.middle_object.deeply_nested_object.x DESC"

gcloud scc findings list $ORGANIZATION_ID --source=$SOURCE_ID \
  --order-by="my_property.outer_object.middle_object.deeply_nested_object.x"

gcloud scc findings list $ORGANIZATION_ID --source=$SOURCE_ID \
  --order-by="my_property.outer_object.middle_object.y DESC"

gcloud scc findings list $ORGANIZATION_ID --source=$SOURCE_ID \
  --order-by="my_property.outer_object.middle_object.y"

gcloud scc findings list $ORGANIZATION_ID --source=$SOURCE_ID \
  --order-by="my_property.outer_object.z DESC"

gcloud scc findings list $ORGANIZATION_ID --source=$SOURCE_ID \
  --order-by="my_property.outer_object.z"

Beispiele für Filter

In den folgenden Abschnitten finden Sie praktische Beispiele für Ergebnisfilter.

Nach Ergebnissen filtern, die nach einem bestimmten Zeitpunkt erfasst wurden

Diese Beispielfilter stimmen mit Ergebnissen überein, die erst nach Mittwoch, 5. Juni 2019, 22:12:05 Uhr (GMT) aufgetreten sind. Mit dem Filter event_time können Sie die Zeit in den folgenden Formaten und Typen angeben:

  • Unixzeit (in Millisekunden) als Ganzzahlliteral

    "event_time > 1559772725000"
    
  • RFC 3339 als String-Literal

    "event_time > \"2019-06-05T22:34:40+00:00\""
    

Nach Arrayfeldern filtern

Im folgenden Beispiel wird die Verwendung eines Teilstring-Abgleichs für ein Arrayfeld innerhalb eines Filters gezeigt:

"indicator.domains : \"website.com\""

Die Security Command Center API gibt alle Ergebnisse mit einem website.com-Teilstring innerhalb des Arrays zurück. Beispielsweise wird ein Ergebnis mit indicator.domains = [\"onewebsite.com\"] zurückgegeben, da "website.com" ein Teilstring in einem Element im Array ist.

In den folgenden Abschnitten zeigen die Beispielfilter einige Optionen für die Verwendung einer umfassenden Arrayfilterung mit der Funktion contains().

Nach dem Feld vulnerability.cve.references filtern

Im folgenden Beispiel werden Ergebnisse zurückgegeben, bei denen mindestens ein Element im Array vulnerability.cve.references sowohl ein Attribut source mit dem Wert SOURCE_OF_REFERENCE als auch ein Attribut uri mit dem Wert FILTERED_URI hat.

"contains(vulnerability.cve.references, source = \"SOURCE_OF_REFERENCE\" AND uri : \"FILTERED_URI\")"

Dabei gilt:

Nach dem Feld indicator.domains filtern

Im folgenden Beispiel werden Ergebnisse zurückgegeben, in denen mindestens eine Indikatordomain sowohl mycompanyprefix als auch .ca enthält.

"contains(indicator.domains, elem : \"mycompanyprefix\" AND elem : \".ca\")"

Nach dem Feld indicator.ip_addresses filtern

Im folgenden Beispiel werden Ergebnisse zurückgegeben, bei denen mindestens ein Element im Array indicator.ip_addresses gleich IP_ADDRESS ist.

"contains(indicator.ip_addresses, elem = \"IP_ADDRESS\")"

Ersetzen Sie IP_ADDRESS durch eine IP-Adresse, die den Ergebnissen zugeordnet ist, nach denen Sie suchen.

Nach Beauftragten im externen System filtern

Im folgenden Beispiel werden Ergebnisse zurückgegeben, bei denen mindestens ein Element im Array external_systems.EXTERNAL_SYSTEM_NAME.assignees gleich ASSIGNEE ist.

"contains(external_systems.EXTERNAL_SYSTEM_NAME.assignees, elem = \"ASSIGNEE\")"

Dabei gilt:

  • EXTERNAL_SYSTEM_NAME: Der Name eines SIEM-/SOAR-Systems eines Drittanbieters, z. B. demisto.
  • ASSIGNEE: Ein Beauftragter im externen System.

Nach dem Feld resource.folders.resource_folder filtern

Im folgenden Beispiel werden Ergebnisse zurückgegeben, bei denen mindestens ein Element im Array resource.folders.resource_folder nicht gleich FOLDER_NAME ist.

"contains(resource.folders.resource_folder, -(elem = \"FOLDER_NAME\"))"

Nach dem Feld resource.folders.resource_folder_display_name filtern

Im folgenden Beispiel werden Ergebnisse zurückgegeben, bei denen mindestens ein Element im Array resource.folders.resource_folder_display_name gleich DISPLAY_NAME ist.

"contains(resource.folders.resource_folder_display_name, elem = \"DISPLAY_NAME\")"

Ersetzen Sie DISPLAY_NAME durch den benutzerdefinierten Namen des Ordners, der den Ergebnissen zugeordnet ist, nach denen Sie suchen.

Filter enthält nur bestimmte Dienstkonten

Im folgenden Beispiel werden nur dann Ergebnisse zurückgegeben, wenn jeder iam_bindings-Eintrag "member" ist mit einem der bereitgestellten Dienstkonten identisch.

containsOnly(iam_bindings, (member = SERVICE_ACCOUNT1 OR member = SERVICE_ACCOUNT2 OR member = "SERVICE_ACCOUNT3 "))

Ersetzen Sie SERVICE_ACCOUNT1, SERVICE_ACCOUNT2 und SERVICE_ACCOUNT3 durch die E-Mail-Adressen für die Dienstkonten.

Weitere Informationen zur Verwendung der Funktionen contains() und containsOnly() in einem Ergebnis finden Sie unter Filtern nach Array-Feldern.

Nächste Schritte

Weitere Informationen zum Einrichten von Ergebnisbenachrichtigungen