Raccogliere i log del connettore SIEM di Akamai
Questo documento spiega come importare i log del connettore SIEM Akamai in Google Security Operations utilizzando Amazon S3. L'integrazione SIEM di Akamai fornisce eventi di sicurezza dalla piattaforma Akamai in formato JSON tramite l'API di integrazione SIEM. Questa integrazione utilizza AWS Lambda per recuperare periodicamente gli eventi dall'API Akamai e archiviarli in S3, dove vengono importati da Google SecOps.
Prima di iniziare
- Un'istanza Google SecOps
- Accesso privilegiato ad Akamai Control Center con il ruolo utente Gestisci SIEM
- Credenziali API Akamai con il servizio API SIEM abilitato (livello di accesso READ-WRITE)
- Accesso privilegiato ad AWS (S3, IAM, Lambda, EventBridge)
Abilitare l'integrazione SIEM in Akamai Control Center
- Accedi ad Akamai Control Center.
- Vai a WEB & DATA CENTER SECURITY > Security Configuration.
- Apri la configurazione di sicurezza (e la versione appropriata) per cui vuoi raccogliere i dati SIEM.
- Fai clic su Impostazioni avanzate ed espandi Raccolta dati per le integrazioni SIEM.
- Fai clic su On per attivare SIEM.
Scegli le norme di sicurezza per le quali vuoi esportare i dati:
- Tutte le norme di sicurezza: invia i dati SIEM per gli eventi che violano una o tutte le norme di sicurezza all'interno della configurazione di sicurezza.
- Policy di sicurezza specifiche: seleziona una o più policy di sicurezza specifiche dall'elenco a discesa.
(Facoltativo) Se utilizzi Account Protector e vuoi includere il nome utente non criptato, seleziona la casella di controllo Includi nome utente.
(Facoltativo) Se vuoi escludere eventi appartenenti a un tipo e a un'azione di protezione specifici, fai clic su Aggiungi eccezione, seleziona la protezione e le azioni associate che non vuoi che SIEM raccolga.
Fai clic su Salva.
Copia e salva l'ID configurazione di sicurezza (configId) dalla sezione Integrazione SIEM. Ti servirà per la configurazione di Lambda.
Crea credenziali API Akamai per l'integrazione SIEM
- Accedi ad Akamai Control Center.
- Vai ad AMMINISTRATORE ACCOUNT > Identità e accesso > Client API.
- Fai clic su Crea client API.
Fornisci i seguenti dettagli di configurazione:
- Nome client API: inserisci un nome descrittivo (ad esempio,
Google SecOps Poller). - Servizio API: seleziona SIEM e imposta il livello di accesso su READ-WRITE.
- Nome client API: inserisci un nome descrittivo (ad esempio,
Fai clic su Crea client API.
Copia e salva in modo sicuro le seguenti credenziali:
- Client Token
- Client secret
- Token di accesso
- Host (ad esempio,
example.luna.akamaiapis.net)
Configura il bucket AWS S3 e IAM per Google SecOps
- Crea un bucket Amazon S3 seguendo questa guida utente: Creazione di un bucket
- Salva il nome e la regione del bucket per riferimento futuro (ad esempio,
akamai-siem-logs). - Crea un utente seguendo questa guida utente: Creazione di un utente IAM.
- Seleziona l'utente creato.
- Seleziona la scheda Credenziali di sicurezza.
- Fai clic su Crea chiave di accesso nella sezione Chiavi di accesso.
- Seleziona Servizio di terze parti come Caso d'uso.
- Fai clic su Avanti.
- (Facoltativo) Aggiungi il tag della descrizione.
- Fai clic su Crea chiave di accesso.
- Fai clic su Scarica file .csv per salvare la chiave di accesso e la chiave di accesso segreta per riferimento futuro.
- Fai clic su Fine.
- Seleziona la scheda Autorizzazioni.
- Fai clic su Aggiungi autorizzazioni nella sezione Norme relative alle autorizzazioni.
- Seleziona Aggiungi autorizzazioni.
- Seleziona Allega direttamente i criteri.
- Cerca i criteri AmazonS3FullAccess.
- Seleziona la policy.
- Fai clic su Avanti.
- Fai clic su Aggiungi autorizzazioni.
Configura il ruolo e il criterio IAM per i caricamenti S3
- Nella console AWS, vai a IAM > Policy > Crea policy > Scheda JSON.
Copia e incolla la seguente policy e sostituisci
akamai-siem-logscon il nome del tuo bucket:JSON delle policy:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutObjects", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::akamai-siem-logs/*" }, { "Sid": "AllowGetStateObject", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::akamai-siem-logs/akamai-siem/state.json" } ] }Fai clic su Avanti.
Inserisci il nome del criterio
AkamaiSIEMtoS3Policye fai clic su Crea criterio.Vai a IAM > Ruoli > Crea ruolo.
Seleziona Servizio AWS.
Seleziona Lambda come caso d'uso.
Fai clic su Avanti.
Cerca e seleziona la policy
AkamaiSIEMtoS3Policyche hai appena creato.Fai clic su Avanti.
Inserisci il nome del ruolo
AkamaiSIEMtoS3Rolee fai clic su Crea ruolo.
Crea la funzione Lambda
- Nella console AWS, vai a Lambda > Funzioni > Crea funzione.
- Fai clic su Autore da zero.
Fornisci i seguenti dettagli di configurazione:
Impostazione Valore Nome AkamaiSIEMtoS3FunctionRuntime Python 3.13 Architettura x86_64 Ruolo di esecuzione Utilizzare un ruolo esistente Ruolo esistente AkamaiSIEMtoS3RoleFai clic su Crea funzione.
Dopo aver creato la funzione, apri la scheda Codice, elimina lo stub e incolla il seguente codice:
import json import boto3 import os import urllib3 import hmac import hashlib import base64 from datetime import datetime from urllib.parse import urlparse, urljoin # Configuration from environment variables S3_BUCKET = os.environ['S3_BUCKET'] S3_PREFIX = os.environ.get('S3_PREFIX', 'akamai-siem/') STATE_KEY = os.environ.get('STATE_KEY', 'akamai-siem/state.json') AKAMAI_HOST = os.environ['AKAMAI_HOST'] AKAMAI_CLIENT_TOKEN = os.environ['AKAMAI_CLIENT_TOKEN'] AKAMAI_CLIENT_SECRET = os.environ['AKAMAI_CLIENT_SECRET'] AKAMAI_ACCESS_TOKEN = os.environ['AKAMAI_ACCESS_TOKEN'] AKAMAI_CONFIG_IDS = os.environ['AKAMAI_CONFIG_IDS'].split(',') LIMIT = int(os.environ.get('LIMIT', '10000')) s3_client = boto3.client('s3') http = urllib3.PoolManager() def load_state(): """Load offset state from S3""" try: response = s3_client.get_object(Bucket=S3_BUCKET, Key=STATE_KEY) return json.loads(response['Body'].read().decode('utf-8')) except s3_client.exceptions.NoSuchKey: return {} except Exception as e: print(f"Error loading state: {e}") return {} def save_state(state): """Save offset state to S3""" try: s3_client.put_object( Bucket=S3_BUCKET, Key=STATE_KEY, Body=json.dumps(state, indent=2).encode('utf-8'), ContentType='application/json' ) except Exception as e: print(f"Error saving state: {e}") def make_edgegrid_auth_header(url, method='GET'): """Create EdgeGrid authentication header""" timestamp = datetime.utcnow().strftime('%Y%m%dT%H:%M:%S+0000') nonce = base64.b64encode(os.urandom(16)).decode('utf-8') parsed_url = urlparse(url) relative_url = parsed_url.path if parsed_url.query: relative_url += '?' + parsed_url.query auth_header = f'EG1-HMAC-SHA256 ' \ f'client_token={AKAMAI_CLIENT_TOKEN};' \ f'access_token={AKAMAI_ACCESS_TOKEN};' \ f'timestamp={timestamp};' \ f'nonce={nonce};' data_to_sign = '\t'.join([ method, parsed_url.scheme, parsed_url.netloc, relative_url, '', # Request body for GET '', # No additional headers ]) signing_key = hmac.new( AKAMAI_CLIENT_SECRET.encode('utf-8'), timestamp.encode('utf-8'), hashlib.sha256 ).digest() auth_signature = base64.b64encode( hmac.new( signing_key, (data_to_sign + auth_header).encode('utf-8'), hashlib.sha256 ).digest() ).decode('utf-8') return auth_header + f'signature={auth_signature}' def fetch_akamai_events(config_id, offset=None): """Fetch events from Akamai SIEM API""" base_url = f'https://{AKAMAI_HOST}' endpoint = f'/siem/v1/configs/{config_id}' params = f'limit={LIMIT}' if offset: params += f'&offset={offset}' url = f'{base_url}{endpoint}?{params}' try: headers = { 'Authorization': make_edgegrid_auth_header(url) } response = http.request('GET', url, headers=headers, timeout=120) if response.status != 200: print(f"Error response {response.status}: {response.data.decode('utf-8')}") return [], offset # Parse multi-JSON response (newline-delimited JSON) lines = response.data.decode('utf-8').strip().split('\n') events = [] new_offset = offset for line in lines: if not line.strip(): continue try: obj = json.loads(line) # Check if this is offset context (metadata object with offset) if 'offset' in obj and ('total' in obj or 'responseContext' in obj): new_offset = obj.get('offset') continue # This is an event events.append(obj) except json.JSONDecodeError as e: print(f"Warning: Failed to parse line: {e}") continue return events, new_offset except Exception as e: print(f"Error fetching events for config {config_id}: {e}") return [], offset def lambda_handler(event, context): """Lambda handler - fetches Akamai events and writes to S3""" print(f"Starting Akamai SIEM fetch at {datetime.utcnow().isoformat()}Z") state = load_state() total_events = 0 for config_id in AKAMAI_CONFIG_IDS: config_id = config_id.strip() if not config_id: continue print(f"Fetching events for config: {config_id}") current_offset = state.get(config_id) events, new_offset = fetch_akamai_events(config_id, current_offset) if events: print(f"Fetched {len(events)} events for config {config_id}") # Write events to S3 as newline-delimited JSON timestamp = datetime.utcnow().strftime('%Y%m%d_%H%M%S') s3_key = f'{S3_PREFIX}{config_id}/{timestamp}.json' payload = '\n'.join(json.dumps(event) for event in events) try: s3_client.put_object( Bucket=S3_BUCKET, Key=s3_key, Body=payload.encode('utf-8'), ContentType='application/json' ) print(f"Wrote {len(events)} events to s3://{S3_BUCKET}/{s3_key}") # Update offset only after successful write if new_offset: state[config_id] = new_offset total_events += len(events) except Exception as e: print(f"Error writing to S3: {e}") else: print(f"No new events for config {config_id}") # Save updated state save_state(state) return { 'statusCode': 200, 'body': json.dumps({ 'message': f'Successfully processed {total_events} events', 'configs_processed': len(AKAMAI_CONFIG_IDS) }) }Fai clic su Esegui il deployment per salvare il codice.
Vai a Configurazione > Variabili di ambiente.
Fai clic su Modifica.
Fai clic su Aggiungi variabile di ambiente per ciascuna delle seguenti variabili:
Variabili di ambiente
Chiave Valore di esempio S3_BUCKETakamai-siem-logsS3_PREFIXakamai-siem/STATE_KEYakamai-siem/state.jsonAKAMAI_HOSTexample.luna.akamaiapis.netAKAMAI_CLIENT_TOKENyour-client-tokenAKAMAI_CLIENT_SECRETyour-client-secretAKAMAI_ACCESS_TOKENyour-access-tokenAKAMAI_CONFIG_IDS12345,67890LIMIT10000Fai clic su Salva.
Vai a Configurazione > Configurazione generale.
Fai clic su Modifica.
Modifica Timeout impostandolo su 5 minuti (300 secondi).
Fai clic su Salva.
Creare una pianificazione EventBridge
- Vai a Amazon EventBridge > Scheduler > Crea pianificazione.
Fornisci i seguenti dettagli di configurazione:
- Nome pianificazione: inserisci
AkamaiSIEMtoS3-5min. - Modello di programmazione: seleziona Programmazione ricorrente.
- Tipo di programmazione: seleziona Programmazione basata sulla tariffa.
- Espressione di frequenza: inserisci
5e seleziona Minuti.
- Nome pianificazione: inserisci
Fai clic su Avanti.
Fornisci i seguenti dettagli di configurazione:
- Destinazione: seleziona AWS Lambda Invoke.
- Funzione Lambda: seleziona
AkamaiSIEMtoS3Function.
Fai clic su Avanti.
Fai clic su Avanti (salta le impostazioni facoltative).
Rivedi e fai clic su Crea pianificazione.
Configura un feed in Google SecOps per importare i log del connettore SIEM Akamai
- Vai a Impostazioni SIEM > Feed.
- Fai clic su + Aggiungi nuovo feed.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio,
Akamai SIEM Connector). - Seleziona Amazon S3 V2 come Tipo di origine.
- Seleziona Akamai SIEM Connector come Tipo di log.
- Fai clic su Avanti.
Specifica i valori per i seguenti parametri di input:
- URI S3:
s3://akamai-siem-logs/akamai-siem/ - Opzioni di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze.
- Età massima del file: includi i file modificati nell'ultimo numero di giorni. Il valore predefinito è 180 giorni.
- ID chiave di accesso: chiave di accesso utente con accesso al bucket S3.
- Chiave di accesso segreta: chiave segreta dell'utente con accesso al bucket S3.
- Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset.
- Etichette di importazione: l'etichetta applicata agli eventi di questo feed.
- URI S3:
Fai clic su Avanti.
Controlla la nuova configurazione del feed nella schermata Finalizza e poi fai clic su Invia.
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.