Forense en Entorns Cloud
Introducció
La computació en núvol ha transformat radicalment el model forense. En un entorn on les proves digitals es troben en servidors de tercers, en múltiples regions geogràfiques i en una infraestructura efímera que pot desaparèixer en qüestions de minuts, el forense tradicional (disco dur → còpia bit a bit → anàlisi) resulta inaplicable.
El forense en cloud requereix un enfocament diferent: forense basat en logs, preservació ràpida i coordinació legal amb els proveïdors del cloud.
flowchart TB
subgraph Cloud Provider
LOGS[Logs de servei\nCloudTrail/Activity Log]
STORAGE[Objectes emmagatzemats\nS3/Blob Storage]
VPC[Registres de xarxa\nVPC Flow Logs]
VM[Imatges de màquines\nEC2/VM Snapshots]
end
subgraph Forense
PRESERVE[Preservació\nimmediata]
COLLECT[Col·lecció\nfora del núvol]
ANALYZE[Anàlisi\nLocal/SIEM]
REPORT[Informe\ni cadena custòdia]
end
INCIDENT[Incident detectat] --> PRESERVE
LOGS --> PRESERVE
STORAGE --> PRESERVE
VPC --> PRESERVE
VM --> PRESERVE
PRESERVE --> COLLECT --> ANALYZE --> REPORT
Característiques del Núvol que Afecten el Forense
1. Multi-tenancy
Les infraestructures de cloud comparteixen recursos físics entre múltiples clients. No és possible accedir als logs d'altres clients (i no hauria de ser-ho), ni exigir que el proveïdor ens doni accés físic als servidors.
2. Elasticitat i Efemeralitat
Els contenidors, funcions serverless i instàncies auto-escaled poden viure únicament minuts. Si no hi ha logging adequat, les evidències desapareixen.
# ❌ Problema: una Lambda function s'ha executat i s'ha eliminat
# La instància ja no existeix, però els logs romanen a CloudWatch
aws logs filter-log-events \
--log-group-name /aws/lambda/my-function \
--start-time $(date -d '2024-01-15 08:00:00' +%s000) \
--end-time $(date -d '2024-01-15 10:00:00' +%s000)
3. Distribució Geogràfica
Les dades poden estar en múltiples regions. Cada region pot estar sota una jurisdicció legal diferent:
Dades a us-east-1 → Llei nord-americana (CLOUD Act)
Dades a eu-west-1 → RGPD europeu
Dades a ap-southeast-1 → Llei de Singapur
4. Dependència del Proveïdor
L'accés als logs depèn del proveïdor. En casos d'investigació judicial, pot ser necessari un requeriment judicial (subpoena) per obtenir logs que el client no ha configurat.
Fases Forenses en Cloud
Fase 1: Identificació i Preservació Immediata
El temps és crític en un entorn cloud. Els logs per defecte s'eliminen passats 90 dies (a vegades menys). Primer de tot:
# AWS: Preservar logs de CloudTrail (auditoria d'accions d'API)
# CloudTrail registra totes les accions d'AWS (qui va fer què, quan)
# Exportar logs d'una finestra de temps específica
aws cloudtrail lookup-events \
--start-time 2024-01-15T08:00:00Z \
--end-time 2024-01-15T12:00:00Z \
--query 'Events[*].{Time:EventTime,User:Username,Event:EventName,Source:EventSource}' \
--output table > cloudtrail-NOMCOGNOM-$(date +%Y%m%d).json
# Crear un snapshot de la instància EC2 compromesa IMMEDIATAMENT
# (abans que l'atacant la pugui eliminar)
aws ec2 create-snapshot \
--volume-id vol-0123456789abcdef0 \
--description "FORENSE-INCIDENT-2024-01-15-NOMCOGNOM" \
--tag-specifications 'ResourceType=snapshot,Tags=[{Key=Purpose,Value=Forensics},{Key=Analyst,Value=NOMCOGNOM}]'
# Azure: Logs d'activitat i snapshots
# Exportar activitat dels últims 30 dies
az monitor activity-log list \
--start-time 2024-01-15T08:00:00Z \
--end-time 2024-01-15T12:00:00Z \
--output json > azure-activity-NOMCOGNOM.json
# Crear snapshot del disc d'una VM
az snapshot create \
--resource-group rg-forensics \
--name snap-incident-20240115-NOMCOGNOM \
--source /subscriptions/.../resourceGroups/.../providers/Microsoft.Compute/disks/vm-disk \
--tags purpose=forensics analyst=NOMCOGNOM
Fase 2: Col·lecció d'Evidències
# Descarregar logs de CloudWatch (AWS)
# Aquests logs provenen de les aplicacions que s'executen en el cloud
aws logs create-export-task \
--log-group-name /aws/ec2/instance-i-0123456789 \
--from 1705312800000 \
--to 1705327200000 \
--destination s3-forensics-bucket-NOMCOGNOM \
--destination-prefix forensics/2024-01-15/
# Verificar la integritat dels logs descarregats
md5sum cloudtrail-NOMCOGNOM-*.json > checksums-NOMCOGNOM.md5
sha256sum cloudtrail-NOMCOGNOM-*.json >> checksums-NOMCOGNOM.sha256
# Script Python per a la recopilació automatitzada d'evidències AWS
import boto3
import json
import hashlib
import datetime
def collect_forensic_evidence(incident_time_start, incident_time_end, analyst):
"""
Recopila evidències forenses d'AWS per a un incident.
"""
session = boto3.Session()
evidence = {
'analyst': analyst,
'collection_time': datetime.datetime.utcnow().isoformat(),
'incident_window': {
'start': incident_time_start,
'end': incident_time_end
},
'evidence': []
}
# 1. CloudTrail - Accions d'API
ct_client = session.client('cloudtrail')
events = ct_client.lookup_events(
StartTime=incident_time_start,
EndTime=incident_time_end
)
evidence['evidence'].append({
'type': 'cloudtrail',
'count': len(events['Events']),
'data': events['Events']
})
# 2. VPC Flow Logs - Tràfic de xarxa
# (requereix que els Flow Logs estiguin activats prèviament)
# 3. Guardar amb hash per a cadena de custòdia
evidence_json = json.dumps(evidence, default=str, indent=2)
evidence_hash = hashlib.sha256(evidence_json.encode()).hexdigest()
evidence['integrity_hash'] = evidence_hash
filename = f"evidence_{analyst}_{datetime.datetime.utcnow().strftime('%Y%m%d_%H%M%S')}.json"
with open(filename, 'w') as f:
f.write(json.dumps(evidence, default=str, indent=2))
print(f"[+] Evidències guardades: {filename}")
print(f"[+] Hash SHA-256: {evidence_hash}")
return filename
# Usar el script
collect_forensic_evidence(
incident_time_start=datetime.datetime(2024, 1, 15, 8, 0, 0),
incident_time_end=datetime.datetime(2024, 1, 15, 12, 0, 0),
analyst="NOMCOGNOM"
)
Fase 3: Anàlisi de Logs Cloud
Anàlisi de CloudTrail (AWS)
CloudTrail registra totes les accions sobre l'API d'AWS. En un incident, busquem:
# Accions des d'una IP sospitosa
cat cloudtrail-*.json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for event in data.get('Records', []):
ip = event.get('sourceIPAddress', '')
if ip == '185.220.101.50': # IP sospitosa
print(f'{event[\"eventTime\"]} | {event[\"userIdentity\"][\"arn\"]} | {event[\"eventName\"]} | {ip}')
"
# Accions fora d'horari laboral (atac nocturn)
python3 -c "
import json
with open('cloudtrail-events.json') as f:
data = json.load(f)
for event in data.get('Records', []):
hour = int(event['eventTime'][11:13]) # Hora UTC
if hour < 6 or hour > 22: # Fora de 6am-10pm
print(f'Accio nocturna: {event[\"eventTime\"]} | {event[\"eventName\"]} | {event[\"userIdentity\"].get(\"arn\", \"N/A\")}')
"
# Accions de creació/eliminació de recursos (possible exfiltració o sabotatge)
python3 -c "
import json
suspicious_actions = ['CreateUser', 'AttachUserPolicy', 'CreateAccessKey',
'DeleteBucket', 'StopInstances', 'TerminateInstances']
with open('cloudtrail-events.json') as f:
data = json.load(f)
for event in data.get('Records', []):
if event['eventName'] in suspicious_actions:
print(f'SUSPICIOUS: {event[\"eventTime\"]} | {event[\"eventName\"]} | {event[\"userIdentity\"].get(\"arn\")}')
"
Reconèixer el patró d'un incident típic
Patró 1: Credential Compromise (credencials AWS robades)
1. AccessKey usada des d'una IP desconeguda (sovint TOR o VPN)
2. ListBuckets, GetObject (reconeixement d'S3)
3. CreateUser, AttachAdminPolicy (persistència)
4. LargeFileDownload (exfiltració)
Patró 2: Insider Threat
1. Accions fora d'horari laboral
2. Descàrrega massiva de dades (GetObject en volum)
3. Creació de snapshots de BBDD (dump)
4. Accés a recursos fora del seu departament
Requeriments Legals: RGPD i NIS2
Notificació de Brecxa de Dades (RGPD Art. 33)
## Timeline legal obligatòria
T+0h: Detecció de l'incident
T+4h: Avaluació inicial: dades personals afectades? Quantes?
T+24h: Decisió de notificació: si >250 afectats o risc alt → OBLIGATORI notificar
T+72h: TERMINI MÀXIM per notificar a l'AEPD (Agència Espanyola de Protecció de Dades)
T+?: Si hi ha risc alt per als afectats → notificar-los individualment (sense termini
màxim fix, però "sense dilació indeguda")
# Plantilla de notificació a l'AEPD (formulari disponible a aepd.es)
# Informació mínima requerida:
# - Naturalesa de la violació
# - Categories i volum aproximat de dades afectades
# - Categories i nombre aproximat d'interessats afectats
# - Mesures adoptades per remediar la violació
# - Mesures per a reduir possibles efectes adversos
NIS2 (Directiva de Seguretat de Xarxes)
La Directiva NIS2 (2022/2555) estableix terminis similars per als operadors de serveis essencials (energia, transport, banca, sanitat, infraestructura digital):
| Termini | Requisit |
|---|---|
| 24 hores | Alerta prèvia a l'autoritat competent (CCN-CERT / INCIBE-CERT) |
| 72 hores | Notificació completa de l'incident |
| 1 mes | Informe final amb anàlisi i mesures adoptades |
Miniactivitat
Un hospital de la xarxa pública experimenta un ransomware que xifra totes les histories clíniques digitals (45.000 pacients). L'atac es detecta el dilluns a les 8:00h.
- Quins organismes ha de notificar l'hospital i en quins terminis?
- L'hospital és un operador de servei essencial per a NIS2? Per quin motiu?
- Quines dades personals es consideren "categoria especial" per al RGPD i per quin motiu l'impacte és major?
Eines d'anàlisi de logs Cloud
# Desplegar Wazuh com a SIEM per a logs cloud
# (configuració per a AWS CloudTrail)
version: '3'
services:
wazuh-manager:
image: wazuh/wazuh-manager:4.8.0
container_name: wazuh-forense-NOMCOGNOM
ports:
- "1514:1514"
- "1515:1515"
- "514:514/udp"
- "55000:55000"
volumes:
- ./wazuh/config:/var/ossec/etc
- ./wazuh/logs:/var/ossec/logs
environment:
- INDEXER_URL=https://wazuh-indexer:9200
- INDEXER_USERNAME=admin
- INDEXER_PASSWORD=SecretPassword
Exercici pràctic
Analitza un incident simulat en AWS:
Descarrega el fitxer cloudtrail-incident.json des del Moodle. Conté el log de CloudTrail d'un incident real (anonimitzat). Realitza:
- Identifica les IP que han accedit
- Construeix una línia temporal de les accions
- Identifica el patró de l'atac (quin dels dos patrons típics?)
- Determina quines dades han pogut ser exfiltrades
- Redacta l'informe de notificació a l'AEPD (si aplica)
Lliura l'anàlisi en un document forense_cloud_NOMCOGNOM.md.