Recopila registros de funciones de AWS Lambda
En este documento, se explica cómo transferir registros de funciones de AWS Lambda a Google Security Operations con Amazon S3.
AWS Lambda es un servicio de procesamiento sin servidores que ejecuta tu código en respuesta a eventos y administra automáticamente los recursos de procesamiento subyacentes. Lambda envía automáticamente todos los registros de funciones (registros de la plataforma, registros de extensiones y resultados de la aplicación) a Amazon CloudWatch Logs, lo que crea un grupo de registros por función. Esta integración usa Amazon Data Firehose para transmitir eventos de registro de Lambda desde CloudWatch Logs a un bucket de S3, que luego Google SecOps ingiere con un feed de Amazon S3 V2.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Una instancia de Google SecOps
- Acceso con privilegios a la Consola de administración de AWS con permisos para administrar lo siguiente:
- AWS Lambda (funciones, configuración de registros)
- Amazon CloudWatch Logs (grupos de registros, filtros de suscripción)
- Amazon Data Firehose (flujos de entrega)
- Amazon S3 (buckets)
- IAM de AWS (roles, políticas y usuarios)
Verifica el grupo de registros de CloudWatch Logs para tu función de Lambda
AWS Lambda crea automáticamente un grupo de registros de CloudWatch Logs para cada función cuando se invoca por primera vez. La convención de nomenclatura predeterminada del grupo de registros es la siguiente:
/aws/lambda/<function-name>
Para verificar, haz lo siguiente:
- En la consola de AWS, ve a CloudWatch > Logs > Log groups.
- Busca
/aws/lambda/. Confirma que exista un grupo de registros para cada función Lambda cuyos registros desees transferir.
Configura un bucket de AWS S3
- Crea un bucket de Amazon S3 siguiendo esta guía del usuario: Cómo crear un bucket.
- Guarda el Nombre y la Región del bucket para consultarlos en el futuro (por ejemplo,
lambda-logs-to-secops).
Configura un rol de IAM para Amazon Data Firehose
Amazon Data Firehose requiere un rol de IAM para escribir registros en tu bucket de S3.
Crea la política de IAM
- En la consola de AWS, ve a IAM > Políticas > Crear política.
- Selecciona la pestaña JSON.
Pega la siguiente política (reemplaza
lambda-logs-to-secopspor el nombre de tu bucket real):{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3Delivery", "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::lambda-logs-to-secops", "arn:aws:s3:::lambda-logs-to-secops/*" ] }, { "Sid": "CloudWatchLogging", "Effect": "Allow", "Action": [ "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:log-group:/aws/kinesisfirehose/lambda-logs-to-secops:log-stream:*" } ] }Haz clic en Siguiente.
En el campo Nombre de la política, ingresa
LambdaLogsFirehoseS3Policy.Haz clic en Crear política.
Crea el rol de IAM
- Ve a IAM > Roles > Crear rol.
- Selecciona Política de confianza personalizada.
Pega la siguiente política de confianza:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "firehose.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }Haz clic en Siguiente.
Busca y selecciona LambdaLogsFirehoseS3Policy.
Haz clic en Siguiente.
En el campo Nombre del rol, ingresa
LambdaLogsFirehoseToS3Role.Haz clic en Crear rol.
Crea el flujo de Amazon Kinesis Data Firehose
- Abre la consola de Kinesis en https://console.aws.amazon.com/kinesis.
- En el panel de navegación, selecciona Amazon Data Firehose.
- Haz clic en Crear flujo de Firehose.
- En Elige la fuente y el destino, proporciona la siguiente configuración:
- Fuente: Selecciona PUT directo.
- Destino: Selecciona Amazon S3.
- En el campo Nombre de la transmisión de Firehose, ingresa
lambda-logs-to-secops. En Transform records, en la sección Decompress source records from Amazon CloudWatch Logs, haz lo siguiente:
- Selecciona Activar la descompresión.
- No selecciones Activar la extracción de mensajes.
En Configuración de destino, haz lo siguiente:
- Bucket de S3: Selecciona el bucket de S3
lambda-logs-to-secops. - Prefijo del bucket de S3 (opcional): Ingresa
lambda-logs/. - Prefijo de salida de error del bucket de S3 (opcional): Ingresa
firehose-errors/.
- Bucket de S3: Selecciona el bucket de S3
En Sugerencias de búfer, haz lo siguiente:
- Tamaño del búfer:
5MiB (predeterminado). - Intervalo de búfer:
300segundos (predeterminado).
- Tamaño del búfer:
En Configuración avanzada, haz lo siguiente:
- Encriptación del servidor: Opcional. Habilita esta opción si se requiere encriptación.
- Registro de errores: Selecciona Habilitado (recomendado).
- Permisos: Selecciona Elegir un rol de IAM existente y, luego, elige
LambdaLogsFirehoseToS3Role.
Haz clic en Crear flujo de Firehose.
Espera a que el Estado de la transmisión muestre Activo.
Configura un rol de IAM para CloudWatch Logs
CloudWatch Logs requiere un rol de IAM para enviar datos de registro al flujo de Firehose.
Crea la política de IAM
- Ve a IAM > Políticas > Crear política.
- Selecciona la pestaña JSON.
Pega la siguiente política (reemplaza
<region>y<account-id>por tu región de AWS y tu ID de cuenta):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "firehose:PutRecord", "firehose:PutRecordBatch" ], "Resource": "arn:aws:firehose:<region>:<account-id>:deliverystream/lambda-logs-to-secops" } ] }Haz clic en Siguiente.
En el campo Nombre de la política, ingresa
LambdaLogsCWLtoFirehosePolicy.Haz clic en Crear política.
Crea el rol de IAM
- Ve a IAM > Roles > Crear rol.
- Selecciona Política de confianza personalizada.
Pega la siguiente política de confianza (reemplaza
<region>por tu región de AWS):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.<region>.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }Haz clic en Siguiente.
Busca y selecciona LambdaLogsCWLtoFirehosePolicy.
Haz clic en Siguiente.
En el campo Nombre del rol, ingresa
LambdaLogsCWLtoFirehoseRole.Haz clic en Crear rol.
Crea un filtro de suscripción de CloudWatch Logs
- En la consola de AWS, ve a CloudWatch > Logs > Log groups.
- Selecciona el grupo de registros
/aws/lambda/<function-name>. - Selecciona la pestaña Filtros de suscripción.
- Haz clic en Crear > Crear filtro de suscripción de Amazon Data Firehose.
- Proporciona los siguientes detalles de configuración:
- Destino: Selecciona la transmisión de Firehose
lambda-logs-to-secops. - Otorgar permiso: Selecciona el rol
LambdaLogsCWLtoFirehoseRole. - Nombre del filtro de suscripción: Ingresa un nombre descriptivo (por ejemplo,
lambda-logs-to-secops-filter). - Formato de registro: Selecciona Otro.
- Patrón de filtro de suscripción: Déjalo vacío para enviar todos los eventos de registro de la función Lambda.
- Destino: Selecciona la transmisión de Firehose
Haz clic en Iniciar transmisión.
Configura un usuario de IAM para Google SecOps
Google SecOps necesita un usuario de IAM con acceso al bucket de S3 para transferir los registros entregados.
- Crea un usuario siguiendo esta guía del usuario: Cómo crear un usuario de IAM.
- Selecciona el usuario creado.
- Selecciona la pestaña Credenciales de seguridad.
- Haz clic en Crear clave de acceso en la sección Claves de acceso.
- Selecciona Servicio de terceros como Caso de uso.
- Haz clic en Siguiente.
- Opcional: Agrega una etiqueta de descripción.
- Haz clic en Crear clave de acceso.
- Haz clic en Descargar archivo .csv para guardar la clave de acceso y la clave de acceso secreta para consultarlas en el futuro.
- Haz clic en Listo.
- Selecciona la pestaña Permisos.
- Haz clic en Agregar permisos en la sección Políticas de permisos.
- Selecciona Agregar permisos.
- Selecciona Adjuntar políticas directamente.
- Busca la política AmazonS3FullAccess.
- Selecciona la política.
- Haz clic en Siguiente.
- Haz clic en Agregar permisos.
Configura un feed en Google SecOps para transferir registros de funciones de AWS Lambda
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar feed nuevo.
- En la siguiente página, haz clic en Configurar un solo feed.
- Ingresa un nombre único para el Nombre del feed.
- Selecciona Amazon S3 V2 como el Tipo de fuente.
- Selecciona AWS Lambda Function como el Tipo de registro.
- Haz clic en Siguiente y, luego, en Enviar.
- Especifica valores para los siguientes campos:
- URI de S3:
s3://lambda-logs-to-secops/lambda-logs/ - Opción de eliminación del código fuente: Selecciona la opción de eliminación según tu preferencia.
- Antigüedad máxima del archivo: Incluye los archivos modificados en la cantidad de días más reciente (el valor predeterminado es de 180 días).
- ID de clave de acceso: Clave de acceso del usuario con acceso al bucket de S3
- Clave de acceso secreta: Clave secreta del usuario con acceso al bucket de S3
- Espacio de nombres del recurso: Es el espacio de nombres del recurso.
- Etiquetas de transferencia: Es la etiqueta que se aplicará a los eventos de este feed.
- URI de S3:
- Haz clic en Siguiente y, luego, en Enviar.
Tabla de asignación de UDM
| Campo de registro | Asignación de UDM | Lógica |
|---|---|---|
Activity_id_label |
additional.fields |
Combinado |
Arrays_label |
additional.fields |
Combinado |
Name_label |
additional.fields |
Combinado |
Type_1_label |
additional.fields |
Combinado |
Type_id_label |
additional.fields |
Combinado |
Type_label |
additional.fields |
Combinado |
Uid_label |
additional.fields |
Combinado |
Uid_label_1 |
additional.fields |
Combinado |
Value_label |
additional.fields |
Combinado |
__type_label |
additional.fields |
Combinado |
attempts_label |
additional.fields |
Combinado |
class_name_label |
additional.fields |
Combinado |
contentType_label |
additional.fields |
Combinado |
env_label |
additional.fields |
Combinado |
extendedRequestId_label |
additional.fields |
Combinado |
feature_name_label |
additional.fields |
Combinado |
line_number_label |
additional.fields |
Combinado |
logType_label |
additional.fields |
Combinado |
product_name_label |
additional.fields |
Combinado |
requestid_label |
additional.fields |
Combinado |
sourceAccount_label |
additional.fields |
Combinado |
stack_label |
additional.fields |
Combinado |
totalRetryDelay_label |
additional.fields |
Combinado |
vendor_name_label |
additional.fields |
Combinado |
version_label |
additional.fields |
Combinado |
has_principal |
extensions.auth.type |
Asignado: true → AUTHTYPE_UNSPECIFIED |
description |
metadata.description |
Asignado directamente |
file_desc |
metadata.description |
Asignado directamente |
Time |
metadata.event_timestamp |
Se analizó como UNIX |
time |
metadata.event_timestamp |
Se analizó como yyyy-MM-ddTHH:mm:ss.SSSZ |
has_principal |
metadata.event_type |
Asignado: true → USER_LOGIN, true → NETWORK_HTTP, true → NETWORK_CONNECTION, "true"… |
has_principal_user |
metadata.event_type |
Asignado: true → USER_RESOURCE_ACCESS |
Api.Operation |
metadata.product_event_type |
Asignado directamente |
name |
metadata.product_event_type |
Asignado directamente |
Api.Request.Uid |
metadata.product_log_id |
Asignado directamente |
id |
metadata.product_log_id |
Asignado directamente |
meta_data.requestId |
metadata.product_log_id |
Asignado directamente |
Metadata.Version |
metadata.product_version |
Asignado directamente |
version |
metadata.product_version |
Asignado directamente |
meta_data.httpStatusCode |
network.http.response_code |
Asignado directamente |
Http_request.User_agent |
network.http.user_agent |
Asignado directamente |
Actor.Invoked_by |
principal.administrative_domain |
Asignado directamente |
Src_endpoint.Domain |
principal.asset.hostname |
Asignado directamente |
Src_endpoint.Domain |
principal.hostname |
Asignado directamente |
Cloud.Region |
principal.resource.attribute.cloud.availability_zone |
Asignado directamente |
Actor.User.Name |
principal.user.userid |
Asignado directamente |
Status |
security_result.action_details |
Asignado directamente |
Category_name |
security_result.category_details |
Combinado |
error |
security_result.description |
Asignado directamente |
errorMessage |
security_result.description |
Asignado directamente |
Metadata_uid_label |
security_result.detection_fields |
Combinado |
category_uid_label |
security_result.detection_fields |
Combinado |
class_uid_label |
security_result.detection_fields |
Combinado |
errorType_label |
security_result.detection_fields |
Combinado |
event_code_label |
security_result.detection_fields |
Combinado |
fault_label |
security_result.detection_fields |
Combinado |
functionName_label |
security_result.detection_fields |
Combinado |
severity_id_label |
security_result.detection_fields |
Combinado |
sourceArn_label |
security_result.detection_fields |
Combinado |
type_name_label |
security_result.detection_fields |
Combinado |
type_uid_label |
security_result.detection_fields |
Combinado |
user_type_label |
security_result.detection_fields |
Combinado |
Severity |
security_result.severity |
Asignado: Informational → INFORMATIONAL |
severity |
security_result.severity |
Asignado: INFO → INFORMATIONAL |
msg |
security_result.summary |
Asignado directamente |
Api.Service.Name |
target.application |
Asignado directamente |
service |
target.application |
Asignado directamente |
size |
target.file.size |
Asignado directamente |
filename |
target.process.file.full_path |
Asignado directamente |
Activity_name |
target.resource.name |
Asignado directamente |
targetVar |
target.resource.name |
Asignado directamente |
| N/A | extensions.auth.type |
Constante: AUTHTYPE_UNSPECIFIED |
| N/A | metadata.event_type |
Constante: USER_UNCATEGORIZED |
| N/A | metadata.product_name |
Constante: AWS_Lambda_Function |
| N/A | metadata.vendor_name |
Constante: AWS_Lambda_Function |
| N/A | principal.resource.attribute.cloud.environment |
Constante: AMAZON_WEB_SERVICES |
| N/A | security_result.severity |
Constante: INFORMATIONAL |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.