Coletar registros do conector SIEM da Akamai
Este documento explica como ingerir registros do conector SIEM da Akamai no Google Security Operations usando o Amazon S3. A integração do SIEM da Akamai fornece eventos de segurança da plataforma Akamai no formato JSON pela API de integração do SIEM. Essa integração usa o AWS Lambda para buscar eventos periodicamente da API Akamai e armazená-los no S3, onde o Google SecOps os ingere.
Antes de começar
- Uma instância do Google SecOps
- Acesso privilegiado ao Akamai Control Center com a função de usuário Gerenciar SIEM
- Credenciais da API Akamai com o serviço API SIEM ativado (nível de acesso de leitura e gravação)
- Acesso privilegiado à AWS (S3, IAM, Lambda, EventBridge)
Ativar a integração do SIEM no Akamai Control Center
- Faça login na Akamai Control Center.
- Acesse SEGURANÇA DE WEB E DATA CENTER > Configuração de segurança.
- Abra a Configuração de segurança (e a versão adequada) para coletar dados do SIEM.
- Clique em Configurações avançadas e expanda Coleta de dados para integrações de SIEM.
- Clique em Ativado para ativar o SIEM.
Escolha as políticas de segurança para as quais você quer exportar dados:
- Todas as políticas de segurança: envie dados do SIEM para eventos que violam todas ou qualquer uma das políticas de segurança na configuração de segurança.
- Políticas de segurança específicas: selecione uma ou mais políticas de segurança específicas na lista suspensa.
Opcional: se você usa o Account Protector e quer incluir o Nome de usuário não criptografado, marque a caixa de seleção Incluir nome de usuário.
Opcional: se você quiser excluir eventos de um tipo e ação de proteção específicos, clique em Adicionar exceção e selecione a proteção e as ações associadas que você não quer que o SIEM colete.
Clique em Salvar.
Copie e salve o ID da configuração de segurança (configId) na seção "Integração do SIEM". Você vai precisar disso para a configuração do Lambda.
Criar credenciais da API Akamai para integração do SIEM
- Faça login na Akamai Control Center.
- Acesse ADMINISTRADOR DA CONTA > Identidade e acesso > Clientes de API.
- Clique em Criar cliente de API.
Informe os seguintes detalhes de configuração:
- Nome do cliente da API: insira um nome descritivo (por exemplo,
Google SecOps Poller). - Serviço de API: selecione SIEM e defina o nível de acesso como LEITURA-GRAVAÇÃO.
- Nome do cliente da API: insira um nome descritivo (por exemplo,
Clique em Criar cliente de API.
Copie e salve as seguintes credenciais com segurança:
- Token do cliente
- Client Secret
- Access Token
- Host (por exemplo,
example.luna.akamaiapis.net)
Configurar o bucket do AWS S3 e o IAM para o Google SecOps
- Crie um bucket do Amazon S3 seguindo este guia do usuário: Como criar um bucket
- Salve o Nome e a Região do bucket para referência futura (por exemplo,
akamai-siem-logs). - Crie um usuário seguindo este guia: Como criar um usuário do IAM.
- Selecione o usuário criado.
- Selecione a guia Credenciais de segurança.
- Clique em Criar chave de acesso na seção Chaves de acesso.
- Selecione Serviço de terceiros como Caso de uso.
- Clique em Próxima.
- Opcional: adicione uma tag de descrição.
- Clique em Criar chave de acesso.
- Clique em Baixar arquivo .csv para salvar a chave de acesso e a chave de acesso secreta para referência futura.
- Clique em Concluído.
- Selecione a guia Permissões.
- Clique em Adicionar permissões na seção Políticas de permissões.
- Selecione Adicionar permissões.
- Selecione Anexar políticas diretamente.
- Pesquise a política AmazonS3FullAccess.
- Selecione a política.
- Clique em Próxima.
- Clique em Adicionar permissões
Configurar a política e o papel do IAM para uploads do S3
- No console da AWS, acesse IAM > Políticas > Criar política > guia JSON.
Copie e cole a política a seguir e substitua
akamai-siem-logspelo nome do bucket:JSON de política:
{ "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" } ] }Clique em Próxima.
Digite o nome da política
AkamaiSIEMtoS3Policye clique em Criar política.Acesse IAM > Papéis > Criar papel.
Selecione Serviço da AWS.
Selecione Lambda como o caso de uso.
Clique em Próxima.
Pesquise e selecione a política
AkamaiSIEMtoS3Policyque você acabou de criar.Clique em Próxima.
Digite o nome da função
AkamaiSIEMtoS3Rolee clique em Criar função.
Criar a função Lambda
- No console da AWS, acesse Lambda > Functions > Create function.
- Clique em Criar do zero.
Informe os seguintes detalhes de configuração:
Configuração Valor Nome AkamaiSIEMtoS3FunctionAmbiente de execução Python 3.13 Arquitetura x86_64 Função de execução Usar uma função Função atual AkamaiSIEMtoS3RoleClique em Criar função.
Depois que a função for criada, abra a guia Código, exclua o stub e cole o seguinte código:
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) }) }Clique em Implantar para salvar o código.
Acesse Configuração > Variáveis de ambiente.
Clique em Editar.
Clique em Adicionar variável de ambiente para cada uma das seguintes opções:
Variáveis de ambiente
Chave Valor de exemplo 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,67890LIMIT10000Clique em Salvar.
Acesse Configuração > Configuração geral.
Clique em Editar.
Mude Tempo limite para 5 minutos (300 segundos).
Clique em Salvar.
Criar uma programação do EventBridge
- Acesse Amazon EventBridge > Scheduler > Criar programação.
Informe os seguintes detalhes de configuração:
- Nome da programação: insira
AkamaiSIEMtoS3-5min. - Padrão de programação: selecione Programação recorrente.
- Tipo de programação: selecione Programação com base em taxa.
- Expressão de taxa: insira
5e selecione Minutos.
- Nome da programação: insira
Clique em Próxima.
Informe os seguintes detalhes de configuração:
- Destino: selecione Invocar AWS Lambda.
- Função Lambda: selecione
AkamaiSIEMtoS3Function.
Clique em Próxima.
Clique em Próxima (pule as configurações opcionais).
Revise e clique em Criar programação.
Configurar um feed no Google SecOps para ingerir registros do conector SIEM da Akamai
- Acesse Configurações do SIEM > Feeds.
- Clique em + Adicionar novo feed.
- No campo Nome do feed, insira um nome para o feed (por exemplo,
Akamai SIEM Connector). - Selecione Amazon S3 V2 como o Tipo de origem.
- Selecione Conector do SIEM da Akamai como o Tipo de registro.
- Clique em Próxima.
Especifique valores para os seguintes parâmetros de entrada:
- URI do S3:
s3://akamai-siem-logs/akamai-siem/ - Opções de exclusão da fonte: selecione a opção de exclusão de acordo com sua preferência.
- Idade máxima do arquivo: inclui arquivos modificados no último número de dias. O padrão é de 180 dias.
- ID da chave de acesso: chave de acesso do usuário com acesso ao bucket do S3.
- Chave de acesso secreta: chave secreta do usuário com acesso ao bucket do S3.
- Namespace do recurso: o namespace do recurso.
- Rótulos de ingestão: o rótulo aplicado aos eventos deste feed.
- URI do S3:
Clique em Próxima.
Revise a nova configuração do feed na tela Finalizar e clique em Enviar.
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.