Recoger registros de AWS Elastic MapReduce
En este documento se explica cómo ingerir registros de AWS Elastic MapReduce (EMR) en Google Security Operations. AWS EMR es una plataforma de Big Data nativa de la nube que procesa grandes cantidades de datos rápidamente. Al integrar los registros de EMR en Google SecOps, puedes analizar la actividad del clúster y detectar posibles amenazas de seguridad.
Antes de empezar
Asegúrate de que cumples los siguientes requisitos previos:
- Instancia de Google SecOps
- Acceso privilegiado a AWS
Configurar un segmento de Amazon S3
- Crea un segmento de Amazon S3 siguiendo esta guía del usuario: Crear un segmento.
- Guarda el nombre y la región del bucket para usarlos más adelante.
- Crea un usuario siguiendo esta guía: Crear un usuario de gestión de identidades y accesos.
- Selecciona el Usuario creado.
- Selecciona la pestaña Credenciales de seguridad.
- En la sección Claves de acceso, haz clic en Crear clave de acceso.
- Selecciona Servicio de terceros como Caso práctico.
- Haz clic en Siguiente.
- Opcional: añade 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 usarlas más adelante.
- Haz clic en Listo.
- Selecciona la pestaña Permisos.
- En la sección Políticas de permisos, haz clic en Añadir permisos.
- Selecciona Añadir permisos.
- Seleccione Adjuntar políticas directamente.
- Busca y selecciona las políticas AmazonS3FullAccess y CloudWatchLogsFullAccess.
- Haz clic en Siguiente.
- Haz clic en Añadir permisos.
Cómo configurar AWS EMR para reenviar registros
- Inicia sesión en la consola de administración de AWS.
- En la barra de búsqueda, escribe EMR y selecciona Amazon EMR en la lista de servicios.
- Haz clic en Clusters.
- Busca y selecciona el clúster de EMR para el que quieras habilitar el registro.
- En la página Detalles del clúster, haga clic en Editar.
- En la pantalla Editar clúster, ve a la sección Registro.
- Selecciona Habilitar registro.
- Especifica el segmento de S3 en el que se almacenarán los registros.
- Especifica el URI de S3 con el formato s3://your-bucket-name/(de esta forma, todos los registros de EMR se almacenarán en la raíz del bucket).
- Selecciona los siguientes tipos de registro:
- Step logs
- Application logs
- YARN logs
- System logs
- HDFS Logs(si usas Hadoop)
 
- Haz clic en Guardar.
Configurar feeds
Hay dos puntos de entrada diferentes para configurar feeds en la plataforma Google SecOps:
- Configuración de SIEM > Feeds > Añadir nuevo feed
- Centro de contenido > Paquetes de contenido > Empezar
Cómo configurar el feed de AWS EMR
- Haz clic en el paquete Amazon Cloud Platform.
- Busca el tipo de registro AWS EMR.
- Especifique los valores en los campos siguientes. - Tipo de fuente: Amazon SQS V2
- Nombre de la cola: el nombre de la cola de SQS de la que se va a leer.
- URI de S3: el URI del segmento.
- s3://your-log-bucket-name/- Sustituye your-log-bucket-namepor el nombre real de tu segmento de S3.
 
- Sustituye 
 
- Opciones de eliminación de la fuente: selecciona la opción de eliminación que prefieras según tus preferencias de ingesta. 
- Antigüedad máxima del archivo: incluye los archivos modificados en los últimos días. El valor predeterminado es 180 días. 
- ID de clave de acceso a la cola de SQS: una clave de acceso de cuenta que es una cadena alfanumérica de 20 caracteres. 
- Clave de acceso secreta de la cola de SQS: una clave de acceso de cuenta que es una cadena alfanumérica de 40 caracteres. 
 - Opciones avanzadas - Nombre del feed: un valor rellenado automáticamente que identifica el feed.
- Espacio de nombres del recurso: espacio de nombres asociado al feed.
- Etiquetas de ingestión: etiquetas aplicadas a todos los eventos de este feed.
 
- Haga clic en Crear feed. 
Para obtener más información sobre cómo configurar varios feeds para diferentes tipos de registros en esta familia de productos, consulta el artículo Configurar feeds por producto.
Tabla de asignación de UDM
| Campo de registro | Asignación de UDM | Lógica | 
|---|---|---|
| app_id | additional.fields[].key | El valor "APP" se asigna a través del analizador. | 
| app_id | additional.fields[].value.string_value | Se asigna directamente desde el campo APPdel registro sin procesar. | 
| app_name | additional.fields[].key | El valor "APPNAME" se asigna a través del analizador | 
| app_name | additional.fields[].value.string_value | Se asigna directamente desde el campo APPNAMEdel registro sin procesar. | 
| blockid | additional.fields[].key | El valor "blockid" se asigna a través del analizador. | 
| blockid | additional.fields[].value.string_value | Se asigna directamente desde el campo blockiddel registro sin procesar. | 
| bytes | network.received_bytes | Se asigna directamente desde el campo bytesdel registro sin procesar y se convierte en un entero sin signo. | 
| cliID | additional.fields[].key | El valor "cliID" se asigna a través del analizador. | 
| cliID | additional.fields[].value.string_value | Se asigna directamente desde el campo cliIDdel registro sin procesar. | 
| cmd | target.process.command_line | Se asigna directamente desde el campo cmddel registro sin procesar. | 
| comp_name | additional.fields[].key | El valor "COMP" se asigna a través del analizador. | 
| comp_name | additional.fields[].value.string_value | Se asigna directamente desde el campo COMPdel registro sin procesar. | 
| configuration_version | additional.fields[].key | El valor "configuration_version" se asigna a través del analizador. | 
| configuration_version | additional.fields[].value.string_value | Se asigna directamente desde el campo configuration_versiondel registro sin procesar y se convierte en una cadena. | 
| containerID | additional.fields[].key | El valor "containerID" se asigna a través del analizador. | 
| containerID | additional.fields[].value.string_value | Se asigna directamente desde el campo CONTAINERIDdel registro sin procesar. | 
| description | security_result.description | Se asigna directamente desde el campo descriptiondel registro sin procesar. | 
| dfs.FSNamesystem.* | additional.fields[].key | La clave se genera concatenando "dfs.FSNamesystem." con la clave de los datos JSON. | 
| dfs.FSNamesystem.* | additional.fields[].value.string_value | El valor se asigna directamente desde el valor correspondiente del objeto JSON dfs.FSNamesystem, convertido en una cadena. | 
| duration | additional.fields[].key | El valor "duration" se asigna a través del analizador. | 
| duration | additional.fields[].value.string_value | Se asigna directamente desde el campo durationdel registro sin procesar. | 
| duration | network.session_duration.seconds | Se asigna directamente desde el campo durationdel registro sin procesar y se convierte en un número entero. | 
| environment | additional.fields[].key | El valor "environment" se asigna a través del analizador. | 
| environment | additional.fields[].value.string_value | Se asigna directamente desde el campo environmentdel registro sin procesar. Se extrae del campoip_portmediante grok y la manipulación de cadenas. Se extrae del campoip_portmediante grok y la manipulación de cadenas, y se convierte en un número entero. | 
| event_type | metadata.event_type | Se determina mediante la lógica del analizador en función de la presencia de información de principalytarget. Puede serNETWORK_CONNECTION,USER_RESOURCE_ACCESS,STATUS_UPDATEoGENERIC_EVENT. | 
| file_path | target.file.full_path | Se asigna directamente desde el campo file_pathdel registro sin procesar. | 
| host | principal.hostname | Se asigna directamente desde el campo hostdel registro sin procesar. | 
| host | target.hostname | Se asigna directamente desde el campo hostdel registro sin procesar. | 
| host_ip | principal.ip | Se asigna directamente desde el campo host_ipdel registro sin procesar. | 
| host_port | principal.port | Se asigna directamente desde el campo host_portdel registro sin procesar y se convierte en un número entero. | 
| http_url | target.url | Se asigna directamente desde el campo http_urldel registro sin procesar. | 
| index | additional.fields[].key | El valor "index" se asigna a través del analizador. | 
| index | additional.fields[].value.string_value | Se asigna directamente desde el campo indexdel registro sin procesar. | 
| kind | metadata.product_event_type | Se asigna directamente desde el campo kinddel registro sin procesar. El valor "AWS_EMR" se asigna mediante el analizador El valor "AWS EMR" se asigna mediante el analizador El valor "AMAZON" se asigna mediante el analizador | 
| offset | additional.fields[].key | El valor "offset" se asigna a través del analizador. | 
| offset | additional.fields[].value.string_value | Se asigna directamente desde el campo offsetdel registro sin procesar. | 
| op | metadata.product_event_type | Se asigna directamente desde el campo opoOPERATIONdel registro sin procesar. | 
| proto | network.application_protocol | Se extrae del campo http_urlmediante grok y se convierte a mayúsculas. | 
| puppet_version | additional.fields[].key | El valor "puppet_version" se asigna a través del analizador | 
| puppet_version | additional.fields[].value.string_value | Se asigna directamente desde el campo puppet_versiondel registro sin procesar. | 
| queue_name | additional.fields[].key | El valor "queue_name" se asigna a través del analizador. | 
| queue_name | additional.fields[].value.string_value | Se asigna directamente desde el campo queue_namedel registro sin procesar. | 
| report_format | additional.fields[].key | El valor "report_format" se asigna a través del analizador. | 
| report_format | additional.fields[].value.string_value | Se asigna directamente desde el campo report_formatdel registro sin procesar y se convierte en una cadena. | 
| resource | additional.fields[].key | El valor "resource" se asigna a través del analizador. | 
| resource | additional.fields[].value.string_value | Se asigna directamente desde el campo resourcedel registro sin procesar. | 
| result | security_result.action_details | Se asigna directamente desde el campo RESULTdel registro sin procesar. | 
| security_id | additional.fields[].key | El valor "security_id" se asigna a través del analizador. | 
| security_id | additional.fields[].value.string_value | Se asigna directamente desde el campo security_iddel registro sin procesar. | 
| severity | security_result.severity | Se asigna desde el campo severitydel registro sin procesar.INFOse ha asignado aINFORMATIONALyWARNaMEDIUM. | 
| srvID | additional.fields[].key | El valor "srvID" se asigna a través del analizador. | 
| srvID | additional.fields[].value.string_value | Se asigna directamente desde el campo srvIDdel registro sin procesar. | 
| status | additional.fields[].key | El valor "status" se asigna a través del analizador. | 
| status | additional.fields[].value.string_value | Se asigna directamente desde el campo statusdel registro sin procesar. | 
| summary | security_result.summary | Se asigna directamente desde el campo summarydel registro sin procesar. | 
| target_app | target.application | Se asigna directamente desde el campo TARGETdel registro sin procesar. | 
| target_ip | target.ip | Se asigna directamente desde el campo target_ipoIPdel registro sin procesar. | 
| target_port | target.port | Se asigna directamente desde el campo target_portdel registro sin procesar y se convierte en un número entero. | 
| timestamp | metadata.event_timestamp | Se asigna directamente desde el campo timestampdel registro sin procesar y se analiza como una marca de tiempo ISO8601. | 
| timestamp | event.timestamp | Se asigna directamente desde el campo timestampdel registro sin procesar y se analiza como una marca de tiempo ISO8601. | 
| trade_date | additional.fields[].key | El valor "trade_date" se asigna a través del analizador. | 
| trade_date | additional.fields[].value.string_value | Se asigna directamente desde el campo trade_datedel registro sin procesar. | 
| transaction_uuid | additional.fields[].key | El valor "transaction_uuid" se asigna a través del analizador. | 
| transaction_uuid | additional.fields[].value.string_value | Se asigna directamente desde el campo transaction_uuiddel registro sin procesar. | 
| type | additional.fields[].key | El valor "type" se asigna a través del analizador. | 
| type | additional.fields[].value.string_value | Se asigna directamente desde el campo typedel registro sin procesar. | 
| user | target.user.userid | Se asigna directamente desde el campo USERougidel registro sin procesar. | 
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.