Raccogliere i log EDR di Digital Guardian
Questo documento spiega come importare i log EDR di Digital Guardian in Google Security Operations utilizzando Google Cloud Storage V2 tramite una funzione Cloud Run.
Digital Guardian (in precedenza Digital Guardian) di Fortra è una piattaforma completa di prevenzione della perdita di dati e rilevamento e risposta degli endpoint che fornisce visibilità su eventi di sistema, utente e dati su endpoint, reti e applicazioni cloud. Il servizio Analytics & Reporting Cloud (ARC) offre funzionalità avanzate di analisi, flusso di lavoro e reporting per una protezione olistica dei dati. La funzione Cloud Run esegue l'autenticazione all'API ARC Export utilizzando OAuth 2.0, recupera i dati di esportazione, conferma il segnalibro per passare al blocco successivo, scrive i risultati come NDJSON in un bucket GCS e Google SecOps li acquisisce tramite un feed GCS V2.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Un'istanza Google SecOps
- Un progetto Google Cloud con le seguenti API abilitate:
- Cloud Storage
- Cloud Run Functions
- Cloud Scheduler
- Pub/Sub
- Cloud Build
- Autorizzazioni per creare e gestire bucket Cloud Storage, funzioni Cloud Run, argomenti Pub/Sub e job Cloud Scheduler
- Accesso privilegiato alla console di gestione Digital Guardian (DGMC)
- Accesso alle impostazioni del tenant di Digital Guardian Analytics & Reporting Cloud (ARC)
- Autorizzazioni di amministratore per configurare i servizi cloud in DGMC
- Un profilo di esportazione creato in DGMC con un GUID valido
Creare un bucket Google Cloud Storage
- Vai alla console Google Cloud.
- Seleziona il tuo progetto o creane uno nuovo.
- Nel menu di navigazione, vai a Cloud Storage > Bucket.
- Fai clic su Crea bucket.
Fornisci i seguenti dettagli di configurazione:
Impostazione Valore Assegna un nome al bucket Inserisci un nome univoco globale (ad esempio digitalguardian-edr-logs).Tipo di località Scegli in base alle tue esigenze (regione singola, doppia regione, più regioni) Località Seleziona la località più vicina alla tua istanza Google SecOps (ad esempio us-central1).Classe di archiviazione Standard (consigliato per i log a cui si accede di frequente) Controllo dell'accesso Uniforme (consigliato) Strumenti di protezione (Facoltativo) Attiva il controllo delle versioni degli oggetti o la policy di conservazione Fai clic su Crea.
Raccogliere le credenziali API di Digital Guardian
Per consentire alla funzione Cloud Run di recuperare i dati di esportazione da Digital Guardian ARC, devi ottenere le credenziali API e configurare un profilo di esportazione.
Ottenere le credenziali API da DGMC
- Accedi alla console di gestione Digital Guardian (DGMC).
- Vai a Sistema > Configurazione > Servizi cloud.
Nella sezione Accesso API, individua e registra i seguenti valori:
- ID accesso API: è l'ID client per l'autenticazione OAuth 2.0.
- API Access Secret: è il client secret per l'autenticazione OAuth 2.0.
- URL di base di Access Gateway: l'endpoint del gateway API (ad esempio,
https://accessgw-usw.msp.digitalguardian.com). - URL del server di autorizzazione: l'endpoint del token OAuth 2.0 (ad esempio,
https://authsrv.msp.digitalguardian.com/as/token.oauth2).
Creare e configurare un profilo di esportazione
- Nella console di gestione Digital Guardian (DGMC), vai a Amministrazione > Report > Esporta profili.
- Fai clic su Crea profilo di esportazione o seleziona un profilo di esportazione esistente.
- Configura il profilo di esportazione con le seguenti impostazioni:
- Nome profilo: inserisci un nome descrittivo (ad esempio,
Google SecOps SIEM Integration). - Origine dati: seleziona Eventi o Avvisi a seconda dei dati che vuoi esportare.
- Formato di esportazione: seleziona Tabella JSON appiattita (opzione consigliata per le integrazioni SIEM).
- Campi: seleziona i campi da includere nell'esportazione.
- Filtri: configura i filtri per limitare i dati esportati (facoltativo).
- Nome profilo: inserisci un nome descrittivo (ad esempio,
- Fai clic su Salva per creare il profilo di esportazione.
Dopo averlo salvato, individua il profilo di esportazione nell'elenco e copia il GUID dall'URL del profilo di esportazione o dalla pagina dei dettagli.
Riepilogo delle credenziali del record
Salva le seguenti informazioni per configurare le variabili di ambiente della funzione Cloud Run:
- ID client (ID accesso API): da DGMC Cloud Services
- Client secret (API Access Secret): da DGMC Cloud Services
- URL del server di autorizzazione: ad esempio,
https://authsrv.msp.digitalguardian.com/as/token.oauth2 - URL di base di Access Gateway: ad esempio,
https://accessgw-usw.msp.digitalguardian.com - Export Profile GUID: dal profilo di esportazione creato in DGMC
Testare l'accesso API
Verifica che le credenziali siano valide eseguendo questi comandi:
# Step 1: Obtain OAuth 2.0 access token curl -s -X POST \ -d "grant_type=client_credentials&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&scope=client" \ "https://authsrv.msp.digitalguardian.com/as/token.oauth2"# Step 2: Test export endpoint with the access token curl -s -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ "https://accessgw-usw.msp.digitalguardian.com/rest/1.0/export/YOUR_EXPORT_PROFILE_GUID"Una risposta positiva restituisce un documento JSON contenente i dati di esportazione. Se ricevi un errore di autenticazione, verifica l'ID accesso API e il segreto in DGMC Cloud Services.
Crea un account di servizio per la funzione Cloud Run
- Nella console Google Cloud, vai a IAM e amministrazione > Service account.
- Fai clic su Crea account di servizio.
- Fornisci i seguenti dettagli di configurazione:
- Nome service account: inserisci
digitalguardian-ingestion(o un nome descrittivo). - Descrizione service account: inserisci
Service account for Digital Guardian EDR Cloud Run function to write logs to GCS.
- Nome service account: inserisci
- Fai clic su Crea e continua.
- Nella sezione Concedi a questo account di servizio l'accesso al progetto, aggiungi i seguenti ruoli:
- Amministratore oggetti Storage (per leggere/scrivere oggetti nel bucket Cloud Storage)
- Cloud Run Invoker (per consentire a Cloud Scheduler di richiamare la funzione)
- Fai clic su Continua.
Fai clic su Fine.
Crea un argomento Pub/Sub
Cloud Scheduler attiva la funzione Cloud Run tramite un argomento Pub/Sub.
- Nella console Google Cloud, vai a Pub/Sub > Argomenti.
- Fai clic su Crea argomento.
- Nel campo ID argomento, inserisci
digitalguardian-edr-trigger. - Lascia le impostazioni predefinite.
Fai clic su Crea.
Crea la funzione Cloud Run
Crea una funzione Cloud Run che esegue l'autenticazione in Digital Guardian ARC utilizzando le credenziali client OAuth 2.0, recupera i dati di esportazione, conferma il segnalibro per passare al blocco successivo e scrive i risultati come NDJSON in GCS.
Prepara i file di origine della funzione
Crea i due file seguenti per il deployment della funzione Cloud Run.
requirements.txt
functions-framework==3.* google-cloud-storage==2.* urllib3==2.*main.py
"""Cloud Run function to ingest Digital Guardian EDR logs into GCS.""" import json import os import time import urllib.parse from datetime import datetime, timezone import functions_framework import urllib3 from google.cloud import storage GCS_BUCKET = os.environ["GCS_BUCKET"] GCS_PREFIX = os.environ.get("GCS_PREFIX", "digitalguardian_edr") STATE_KEY = os.environ.get("STATE_KEY", "digitalguardian_edr_state.json") AUTH_SERVER_URL = os.environ["AUTH_SERVER_URL"] ARC_SERVER_URL = os.environ["ARC_SERVER_URL"] CLIENT_ID = os.environ["CLIENT_ID"] CLIENT_SECRET = os.environ["CLIENT_SECRET"] EXPORT_PROFILE_GUID = os.environ["EXPORT_PROFILE_GUID"] MAX_RECORDS = int(os.environ.get("MAX_RECORDS", "10000")) http = urllib3.PoolManager() gcs = storage.Client() def _get_access_token() -> str: """Obtain an OAuth 2.0 access token using client credentials grant.""" body = urllib.parse.urlencode({ "grant_type": "client_credentials", "client_id": CLIENT_ID, "client_secret": CLIENT_SECRET, "scope": "client", }) resp = http.request( "POST", AUTH_SERVER_URL, body=body, headers={"Content-Type": "application/x-www-form-urlencoded"}, ) if resp.status != 200: raise RuntimeError( f"OAuth token request failed: {resp.status} — " f"{resp.data.decode('utf-8')}" ) token_data = json.loads(resp.data.decode("utf-8")) return token_data["access_token"] def _arc_get(token: str, path: str, retries: int = 5) -> dict: """Execute a GET request against the ARC API with retry on 429.""" url = f"{ARC_SERVER_URL}{path}" headers = { "Authorization": f"Bearer {token}", "Accept": "application/json", } backoff = 2 for attempt in range(retries): resp = http.request("GET", url, headers=headers) if resp.status == 200: return json.loads(resp.data.decode("utf-8")) if resp.status == 429: wait = backoff * (2 ** attempt) print( f"Rate limited (429). Retrying in {wait}s " f"(attempt {attempt + 1}/{retries})." ) time.sleep(wait) continue raise RuntimeError( f"ARC API error: {resp.status} — {resp.data.decode('utf-8')}" ) raise RuntimeError( "ARC API rate limit exceeded after maximum retries." ) def _arc_acknowledge(token: str) -> None: """POST to the acknowledge endpoint to advance the export bookmark.""" url = ( f"{ARC_SERVER_URL}/rest/1.0/export/" f"{EXPORT_PROFILE_GUID}/acknowledge" ) headers = { "Authorization": f"Bearer {token}", "Accept": "application/json", } resp = http.request("POST", url, headers=headers) if resp.status not in (200, 204): raise RuntimeError( f"ARC acknowledge failed: {resp.status} — " f"{resp.data.decode('utf-8')}" ) print("Export bookmark acknowledged successfully.") def _load_state() -> dict: """Load the last run state from GCS.""" bucket = gcs.bugcs.bucketUCKET) blob = bucket.blob(f"{GCS_PREFIX}/{STATE_KEY}") if blob.exists(): return json.loads(blob.downlodownload_as_text return {} def _save_state(state: dict) -> None: """Persist run state to GCS.""" bucket = gcs.bugcs.bucketUCKET) blob = bucket.blob(f"{GCS_PREFIX}/{STATE_KEY}") blob.uploadupload_from_string json.dumps(state), content_type="application/json" ) def _fetch_export(token: str) -> list: """Fetch export data from the ARC Export API.""" path = f"/rest/1.0/export/{EXPORT_PROFILE_GUID}" data = _arc_get(token, path) records = data if isinstance(data, list) else data.get("data", []) return records[:MAX_RECORDS] def _write_ndjson(records: list, run_ts: str) -> str: """Write records as NDJSON to GCS and return the blob path.""" bucket = gcs.bugcs.bucketUCKET) blob_path = ( f"{GCS_PREFIX}/year={run_ts[:4]}/month={run_ts[5:7]}/" f"day={run_ts[8:10]}/{run_ts}_export.ndjson" ) blob = bucket.blob(blob_path) ndjson = "\n".join( json.dumps(r, separators=(",", ":")) for r in records ) blob.uploadupload_from_stringn, content_type="application/x-ndjson") return blob_path @functions_framework.cloud_event def main(cloud_event): """Entry point triggered by Pub/Sub via Cloud Scheduler.""" state = _load_state() now = datetime.now(timezone.utc) print("Authenticating to Digital Guardian ARC.") token = _get_access_token() print( f"Fetching export data for profile {EXPORT_PROFILE_GUID}." ) records = _fetch_export(token) if not records: print("No new export data found.") return "OK" run_ts = now.strftime("%Y-%m-%dT%H%M%SZ") blob_path = _write_ndjson(records, run_ts) print( f"Wrote {len(records)} records to " f"gs://{GCS_BUCKET}/{blob_path}." ) _arc_acknowledge(token) state["last_run"] = now.isoformat() state["records_written"] = len(records) _save_state(state) print(f"State updated. last_run={now.isoformat()}.") return "OK"
Esegui il deployment della funzione Cloud Run
- Salva entrambi i file (
main.pyerequirements.txt) in una directory locale (ad esempio,digitalguardian-function/). - Apri Cloud Shell o un terminale con l'interfaccia a riga di comando
gcloudinstallata. Esegui questo comando per eseguire il deployment della funzione:
gcloud functions deploy digitalguardian-edr-to-gcs \ --gen2 \ --region=us-central1 \ --runtime=python312 \ --trigger-topic=digitalguardian-edr-trigger \ --entry-point=main \ --memory=512MB \ --timeout=540s \ --service-account=digitalguardian-ingestion@PROJECT_ID.iam.gserviceaccount.com \ --set-env-vars=\ "GCS_BUCKET=digitalguardian-edr-logs",\ "GCS_PREFIX=digitalguardian_edr",\ "STATE_KEY=digitalguardian_edr_state.json",\ "AUTH_SERVER_URL=https://authsrv.msp.digitalguardian.com/as/token.oauth2",\ "ARC_SERVER_URL=https://accessgw-usw.msp.digitalguardian.com",\ "CLIENT_ID=YOUR_CLIENT_ID",\ "CLIENT_SECRET=YOUR_CLIENT_SECRET",\ "EXPORT_PROFILE_GUID=YOUR_EXPORT_PROFILE_GUID",\ "MAX_RECORDS=10000"Sostituisci i seguenti valori segnaposto:
PROJECT_ID: l'ID del tuo progetto Google Cloud.digitalguardian-edr-logs: il nome del bucket GCS.YOUR_CLIENT_ID: il tuo ID accesso API Digital Guardian.YOUR_CLIENT_SECRET: il segreto di accesso all'API Digital Guardian.YOUR_EXPORT_PROFILE_GUID: il GUID del profilo di esportazione di DGMC.
Verifica il deployment controllando lo stato della funzione:
gcloud functions describe digitalguardian-edr-to-gcs --region=us-central1 --gen2
Riferimento alle variabili di ambiente
| Variabile | Obbligatorio | Predefinito | Descrizione |
|---|---|---|---|
GCS_BUCKET |
Sì | Nome del bucket GCS per l'archiviazione dell'output NDJSON | |
GCS_PREFIX |
No | digitalguardian_edr |
Prefisso oggetto (percorso della cartella) all'interno del bucket |
STATE_KEY |
No | digitalguardian_edr_state.json |
Nome del blob per il file di stato all'interno del prefisso |
AUTH_SERVER_URL |
Sì | URL del server di autorizzazione OAuth 2.0 | |
ARC_SERVER_URL |
Sì | URL di base di ARC Access Gateway | |
CLIENT_ID |
Sì | ID accesso API di DGMC | |
CLIENT_SECRET |
Sì | API Access Secret da DGMC | |
EXPORT_PROFILE_GUID |
Sì | Esportare il GUID del profilo da DGMC | |
MAX_RECORDS |
No | 10000 |
Numero massimo di record da scrivere per esecuzione |
Crea un job Cloud Scheduler
Cloud Scheduler attiva la funzione Cloud Run a intervalli regolari tramite l'argomento Pub/Sub.
- Nella console Google Cloud, vai a Cloud Scheduler.
- Fai clic su Crea job.
Fornisci i seguenti dettagli di configurazione:
- Nome: inserisci
digitalguardian-edr-ingestion-schedule. - Regione: seleziona la stessa regione della tua funzione Cloud Run (ad esempio,
us-central1). Frequenza: inserisci
*/5 * * * *(ogni 5 minuti).Fuso orario: seleziona il fuso orario che preferisci (ad esempio,
UTC).
- Nome: inserisci
Fai clic su Continua.
Nella sezione Configura l'esecuzione:
- Tipo di target: seleziona Pub/Sub.
- Argomento: seleziona
digitalguardian-edr-trigger. - Corpo del messaggio: inserisci
{"run": true}.
Fai clic su Continua.
Nella sezione Configura le impostazioni facoltative:
- Numero massimo di nuovi tentativi: inserisci
3. - Durata minima di backoff: inserisci
5s. - Durata massima backoff: inserisci
60s.
- Numero massimo di nuovi tentativi: inserisci
Fai clic su Crea.
Per eseguire un test immediato, fai clic sui tre puntini (…) accanto al nome del job e seleziona Forza esecuzione.
Recupera l'account di servizio Google SecOps e configura il feed
Google SecOps utilizza un account di servizio univoco per leggere i dati dal tuo bucket GCS. Devi concedere a questo account di servizio l'accesso al tuo bucket.
Recupera l'email del account di servizio
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo feed.
- Fai clic su Configura un singolo feed.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio,
Digital Guardian EDR Logs). - Seleziona Google Cloud Storage V2 come Tipo di origine.
- Seleziona Digital Guardian EDR come Tipo di log.
Fai clic su Ottieni service account. Verrà visualizzata un'email univoca del account di servizio, ad esempio:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comCopia questo indirizzo email per utilizzarlo nel passaggio successivo.
Fai clic su Avanti.
Specifica i valori per i seguenti parametri di input:
URL bucket di archiviazione: inserisci l'URI del bucket GCS:
gs://digitalguardian-edr-logs/digitalguardian_edr/- Sostituisci
digitalguardian-edr-logscon il nome del tuo bucket GCS. - Sostituisci
digitalguardian_edrcon il valoreGCS_PREFIXconfigurato.
- Sostituisci
Opzione di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze:
- Mai: non elimina mai i file dopo i trasferimenti (opzione consigliata per i test).
- Elimina file trasferiti: elimina i file dopo il trasferimento riuscito.
Elimina file trasferiti e directory vuote: elimina i file e le directory vuote dopo il trasferimento riuscito.
Età massima file: includi i file modificati nell'ultimo numero di giorni (il valore predefinito è 180 giorni).
Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset.
Etichette di importazione: l'etichetta da applicare agli eventi di questo feed.
Fai clic su Avanti.
Controlla la nuova configurazione del feed nella schermata Finalizza e poi fai clic su Invia.
Concedi le autorizzazioni IAM al account di servizio Google SecOps
Il account di servizio Google SecOps deve disporre del ruolo Visualizzatore oggetti Storage sul bucket Cloud Storage.
- Vai a Cloud Storage > Bucket.
- Fai clic sul nome del bucket (ad esempio
digitalguardian-edr-logs). - Vai alla scheda Autorizzazioni.
- Fai clic su Concedi l'accesso.
- Fornisci i seguenti dettagli di configurazione:
- Aggiungi entità: incolla l'email dell'account di servizio Google SecOps (ad esempio,
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com). - Assegna ruoli: seleziona Visualizzatore oggetti Storage.
- Aggiungi entità: incolla l'email dell'account di servizio Google SecOps (ad esempio,
Fai clic su Salva.
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logic |
|---|---|---|
| Applicazione | target.application | Valore copiato direttamente |
| Applicazione | target.process.command_line | Imposta su %{Application} se la regola corrisponde a Printer. |
| Bytes_Written | network.sent_bytes | Valore copiato direttamente e convertito in uinteger |
| Categoria, Computer_Name, Dettaglio | metadata.description | Imposta %{Detail} se Category == "Policies" e Computer_Name è vuoto; altrimenti imposta %{message} su grok_parse_failure |
| Command_Line, Command_Line1 | principal.process.command_line | Valore di Command_Line dopo la rimozione delle virgolette finali se non è vuoto, altrimenti di Command_Line1 dopo la rimozione delle virgolette finali |
| Computer_Name, source | principal.hostname | Valore di computerName se non è vuoto, altrimenti impostato su %{source} |
| Destination_Device_Serial_Number, Destination_Device_Serial_Number1 | Estratto utilizzando il pattern Grok per la gestione delle virgolette | |
| Destination_Directory, Destination_File | target.file.full_path | Concatenato da Destination_Directory e Destination_File se entrambi non sono vuoti |
| Destination_Drive_Type | security_result.detection_fields | Unito a destination_drive_type_label (chiave: Destination_Drive_Type, valore: %{Destination_Drive_Type}) |
| Destination_File | target.file.names | Unito da Destination_File |
| Destination_File_Extension | target.file.mime_type | Valore copiato direttamente |
| Dll_SHA1_Hash | target.process.file.sha1 | Valore copiato subito dopo la conversione in minuscolo |
| Email_Address | principal.user.email_addresses | Unito da Email_Address |
| Email_Sender, Email_Subject | network.email.from | Impostato su %{Email_Sender} se non è vuoto |
| Email_Sender, Email_Subject | network.email.subject | Unito dall'oggetto (%{Email_Subject}) se Email_Sender non è vuoto |
| File_Extension | principal.process.file.mime_type | Valore copiato direttamente |
| IP_Address, source_ip | principal.ip | Unito da source_ip se non è vuoto, altrimenti da IP_Address |
| Local_Port, source_port | principal.port | Valore di source_port se non è vuoto e convertito in numero intero, altrimenti da Local_Port e convertito in numero intero |
| MD5_Checksum | target.process.file.md5 | Valore copiato subito dopo la conversione in minuscolo |
| Network_Direction | network.direction | Impostato su INBOUND se True, altrimenti OUTBOUND se False |
| Process_PID | principal.process.pid | Valore copiato direttamente |
| Process_SHA256_Hash | target.process.file.sha256 | Valore copiato subito dopo la conversione in minuscolo |
| Product_Version | metadata.product_version | Valore copiato direttamente |
| Protocollo | network.ip_protocol | Imposta su ICMP se == "1" |
| Remote_Port | target.port | Valore copiato direttamente e convertito in numero intero |
| Regola | security_result.rule_name | Valore copiato direttamente |
| Regola | metadata.event_type | Impostato su PROCESS_UNCATEGORIZED se corrisponde a .Printer., altrimenti FILE_MOVE se corrisponde a DLP.* |
| Gravità | security_result.severity | Imposta su LOW se <=3, MEDIUM se <=6, HIGH se <=8, CRITICAL se <=10 dopo la conversione in numero intero |
| Gravità | security_result.severity_details | Valore copiato direttamente |
| Source_Directory, Source_File | src.file.full_path | Concatenato da Source_Directory e Source_File se entrambi non sono vuoti |
| Source_Drive_Type | security_result.detection_fields | Unito a source_drive_type_label (chiave: Source_Drive_Type, valore: %{Source_Drive_Type}) |
| Source_File | src.file.names | Unito da Source_File |
| Source_File_Extension | src.file.mime_type | Valore copiato direttamente |
| URL_Path, http_url | target.url | Valore di http_url se non è vuoto, altrimenti di URL_Path |
| User_Name | principal.user.userid | Valore di userName dopo l'estrazione di grok |
| User_Name | principal.administrative_domain | Valore di domainName dopo l'estrazione grok |
| Was_Removable | security_result.detection_fields | Unito a was_removable_label (chiave: Was_Removable, valore: %{Was_Removable}) |
| Was_Source_Removable | security_result.detection_fields | Unito a was_source_removable_label (chiave: Was_Source_Removable, valore: %{Was_Source_Removable}) |
| computerName, destination_ip, protocol, source_ip, IP_Address, destination, userName, Process_PID, Category, Computer_Name | metadata.event_type | Impostato inizialmente su GENERIC_EVENT; NETWORK_HTTP se protocollo == HTTPS e (destination_ip o computerName); NETWORK_CONNECTION se (source_ip o IP_Address) e destination_ip; USER_UNCATEGORIZED se userName non è vuoto; SCAN_PROCESS se Process_PID non è vuoto |
| destination_ip | target.ip | Unito da destination_ip |
| incidents_url, matched_policies_by_severity | security_result | Unita a _sr (rule_name: %{matched_policies_by_severity}, url_back_to_product: %{incidents_url}) |
| protocollo | network.application_protocol | Imposta su HTTPS se protocollo == HTTP o HTTPS |
| security_action | security_result.action | Unito da security_action |
| metadata.product_name | Imposta su "Enterprise DLP Platform" | |
| metadata.vendor_name | Impostato su "DigitalGuardian" |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.