Recoger registros de gestión de identidades y accesos de AWS
En este documento se explica cómo ingerir registros de AWS IAM en Google Security Operations. El analizador transforma los registros sin procesar con formato JSON en un modelo de datos unificado (UDM) estructurado. Extrae campos relevantes, como los detalles del usuario, la información del rol, los permisos y las marcas de tiempo, y los asigna a los campos de UDM correspondientes para realizar un análisis de seguridad coherente.
Antes de empezar
- Asegúrate de que tienes una instancia de Google SecOps.
- Asegúrate de que tienes acceso con privilegios a AWS.
Configurar AWS IAM y S3
- Crea un segmento de Amazon S3 siguiendo esta guía de 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 la política AmazonS3FullAccess.
- Haz clic en Siguiente.
- Haz clic en Añadir permisos.
Configurar CloudTrail para capturar registros de IAM
- Inicia sesión en la consola de administración de AWS.
- En la barra de búsqueda, escriba y seleccione CloudTrail en la lista de servicios.
- Haz clic en Crear recorrido.
- Proporciona un nombre de ruta; por ejemplo,
IAMActivityTrail
.- Aplicar rastro a todas las regiones: selecciona Sí para registrar la actividad de todas las regiones.
- Ubicación de almacenamiento: selecciona el segmento de S3 que has creado antes o crea uno.
- Segmento de S3: introduzca un nombre para el segmento de S3. Por ejemplo,
iam-logs-bucket
. - Selecciona Crear un rol de IAM (si no lo has hecho antes).
- Eventos de gestión: selecciona Leer y Escribir para registrar los eventos de lectura y escritura de los recursos de gestión de identidades y accesos.
- Eventos de datos: habilita los eventos de datos de S3 y Lambda.
- Haz clic en Crear para crear el recorrido.
Configurar CloudTrail para exportar registros a S3
- Ve a Servicios > S3.
- Selecciona el bucket de S3 en el que se almacenan los registros de CloudTrail. Por ejemplo,
iam-logs-bucket
. - Asegúrate de que CloudTrail tenga los permisos adecuados para escribir registros en el segmento.
Añade la siguiente política si aún no está:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "CloudTrailS3Access", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::your-bucket-name/AWSLogs/*" } ] }
Habilita la gestión de versiones en el bucket de S3 para asegurarte de que los registros se almacenan con varias versiones.
Vaya a Propiedades > Versionado de cubos > Habilitar.
Opcional: Configurar Lambda para la exportación en tiempo real
- Ve a la consola de Lambda de AWS.
- Haz clic en Crear función.
- Selecciona Crear desde cero.
- Asigna el nombre
ExportIAMLogsToS3
a la función. - Selecciona un entorno de ejecución de Python 3.x.
Asigna a la función un rol de gestión de identidades y accesos que tenga permisos para hacer lo siguiente:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:GetLogEvents", "logs:FilterLogEvents", "logs:DescribeLogGroups", "logs:DescribeLogStreams" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::your-bucket-name/*" } ] }
Usa el siguiente código de Python para obtener registros de gestión de identidades y accesos y subirlos a S3:
import boto3 import gzip from io import BytesIO s3 = boto3.client('s3') logs = boto3.client('logs') def lambda_handler(event, context): log_group = event['logGroup'] log_stream = event['logStream'] log_events = logs.get_log_events( logGroupName=log_group, logStreamName=log_stream, startFromHead=True ) log_data = "\n".join([event['message'] for event in log_events['events']]) # Compress and upload to S3 compressed_data = gzip.compress(log_data.encode('utf-8')) s3.put_object( Bucket='your-s3-bucket-name', Key='iam-logs/{log_stream}.gz', Body=compressed_data )
- Sustituye
your-s3-bucket-name
por el nombre de tu segmento.
Configurar un activador de Lambda para CloudWatch Logs
- En la consola de Lambda, ve a Diseñador.
- Selecciona Añadir activador > CloudWatch Logs.
- Selecciona el grupo de registros CloudWatch Logs asociado a tus registros de IAM; por ejemplo,
/aws/cloudtrail/
. - Haz clic en Añadir.
Configurar feeds
Hay dos puntos de entrada diferentes para configurar feeds en la plataforma Google SecOps:
- Configuración de SIEM > Feeds > Añadir nuevo
- Centro de contenido > Paquetes de contenido > Empezar
Cómo configurar el feed de gestión de identidades y accesos de AWS
- Haz clic en el paquete Amazon Cloud Platform.
- Busca el tipo de registro AWS IAM.
Especifique los valores en los campos siguientes.
- Tipo de fuente: API de terceros
- Nombre de usuario: nombre de usuario para la autenticación.
- Secreto: secreto para autenticarte.
Opciones avanzadas
- Nombre del feed: 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 |
---|---|---|
Arn | entity.entity.resource.name | Se asigna directamente desde el campo Arn de los tipos de entidad USER y RESOURCE. En el caso del tipo de entidad GROUP, se asigna desde Group.Arn . |
AssumeRolePolicyDocument | entity.entity.resource.attribute.permissions.name | Se asigna directamente desde el campo AssumeRolePolicyDocument , pero solo para el tipo de entidad RESOURCE. |
CreateDate | entity.entity.user.attribute.creation_time | Se asigna directamente desde el campo CreateDate y se convierte al formato de marca de tiempo de Chronicle para el tipo de entidad USER. |
CreateDate | entity.entity.resource.attribute.creation_time | Se asigna directamente desde el campo CreateDate y se convierte al formato de marca de tiempo de Chronicle para el tipo de entidad RESOURCE. |
Group.Arn | entity.entity.resource.name | Se asigna directamente desde el campo Group.Arn del tipo de entidad GROUP. |
Group.CreateDate | entity.entity.group.attribute.creation_time | Se asigna directamente desde el campo Group.CreateDate y se convierte al formato de marca de tiempo de Chronicle. |
Group.GroupID | entity.entity.group.product_object_id | Se asigna directamente desde el campo Group.GroupID . |
Group.GroupName | entity.entity.group.group_display_name | Se asigna directamente desde el campo Group.GroupName . |
Group.GroupName | entity.entity.group.email_addresses | Se asigna directamente desde el campo Group.GroupName . |
Group.Path | entity.entity.group.attribute.labels.value | Asignada directamente desde el campo Group.Path , la clave se ha codificado de forma rígida como path . |
IsTruncated | entity.entity.group.attribute.labels.value | Se asigna directamente desde el campo IsTruncated y se convierte en una cadena. La clave se ha codificado de forma rígida como is_truncated . |
Marcador | entity.entity.group.attribute.labels.value | Asignada directamente desde el campo Marker , la clave se ha codificado de forma rígida como marker . |
PasswordLastUsed | entity.entity.user.last_login_time | Se asigna directamente desde el campo PasswordLastUsed y se convierte al formato de marca de tiempo de Chronicle. |
Ruta | entity.entity.user.attribute.labels.value | Se asigna directamente desde el campo Path del tipo de entidad USER. La clave se ha codificado de forma rígida como path . |
Ruta | entity.entity.resource.attribute.labels.value | Se asigna directamente desde el campo Path del tipo de entidad RESOURCE. La clave se codifica de forma rígida como path . |
PermissionsBoundary.PermissionsBoundaryArn | entity.entity.resource.attribute.labels.value | La clave se asigna directamente desde el campo PermissionsBoundary.PermissionsBoundaryArn y se codifica de forma rígida como permissions_boundary_arn . |
PermissionsBoundary.PermissionsBoundaryType | entity.entity.resource.attribute.labels.value | La clave se asigna directamente desde el campo PermissionsBoundary.PermissionsBoundaryType y se codifica de forma rígida como permissions_boundary_type . |
RoleID | entity.entity.resource.product_object_id | Se asigna directamente desde el campo RoleID . |
RoleLastUsed.LastUsedDate | entity.entity.resource.attribute.labels.value | La clave se asigna directamente desde el campo RoleLastUsed.LastUsedDate y se codifica de forma rígida como role_last_used_date . |
RoleLastUsed.Region | entity.entity.location.name | Se asigna directamente desde el campo RoleLastUsed.Region . |
RoleName | entity.entity.resource.attribute.roles.name | Se asigna directamente desde el campo RoleName . |
Tags.Key | entity.entity.user.attribute.labels.key | Se usa como clave del campo labels en el atributo de usuario. |
Tags.Value | entity.entity.user.attribute.labels.value | Se usa como valor del campo labels del atributo de usuario. |
UserID | entity.entity.user.product_object_id | Se asigna directamente desde el campo UserID . |
Nombre de usuario | entity.entity.user.userid | Se asigna directamente desde el campo UserName . |
Users.Arn | relations.entity.resource.name | Se asigna directamente desde el campo Users.Arn de la relación de usuario. |
Users.CreateDate | relations.entity.user.attribute.creation_time | Se asigna directamente desde el campo Users.CreateDate de la relación de usuario y se convierte al formato de marca de tiempo de Chronicle. |
Users.PasswordLastUsed | relations.entity.user.last_login_time | Se asigna directamente desde el campo Users.PasswordLastUsed de la relación de usuario y se convierte al formato de marca de tiempo de Chronicle. |
Users.Path | relations.entity.user.attribute.labels.value | La clave, que se asigna directamente desde el campo Users.Path de la relación de usuario, está codificada como path . |
Users.PermissionsBoundary.PermissionsBoundaryArn | relations.entity.resource.attribute.labels.value | La clave, que se asigna directamente desde el campo Users.PermissionsBoundary.PermissionsBoundaryArn de la relación de usuario, está codificada como permissions_boundary_arn . |
Users.PermissionsBoundary.PermissionsBoundaryType | relations.entity.resource.attribute.labels.value | La clave, que se asigna directamente desde el campo Users.PermissionsBoundary.PermissionsBoundaryType de la relación de usuario, está codificada como permissions_boundary_type . |
Users.UserID | relations.entity.user.product_object_id | Se asigna directamente desde el campo Users.UserID de la relación de usuario. |
Users.UserName | relations.entity.user.userid | Se asigna directamente desde el campo Users.UserName de la relación de usuario. |
N/A | entity.metadata.collected_timestamp | Se rellena con la marca de tiempo del evento del registro sin procesar. |
N/A | entity.metadata.vendor_name | Valor fijo establecido en el código fuente AWS . |
N/A | entity.metadata.product_name | Valor fijo establecido en el código fuente AWS IAM . |
N/A | entity.metadata.entity_type | Se determina en función de la presencia de campos específicos: USER si existe UserID , RESOURCE si existe RoleName y GROUP si existe Group.GroupName . |
N/A | entity.entity.resource.resource_subtype | Se asigna el valor User a los tipos de entidad USER y GROUP. |
N/A | entity.entity.resource.resource_type | Se define como ACCESS_POLICY para el tipo de entidad RESOURCE. |
N/A | entity.entity.resource.attribute.cloud.environment | Valor fijo establecido en el código fuente AMAZON_WEB_SERVICES . |
N/A | relations.entity_type | Codificado de forma rígida como USER para las relaciones de los usuarios dentro de un grupo. |
N/A | relations.relationship | Codificado de forma rígida como MEMBER para las relaciones de los usuarios dentro de un grupo. |
N/A | relations.direction | Codificado de forma rígida como UNIDIRECTIONAL para las relaciones de los usuarios dentro de un grupo. |
N/A | relations.entity.resource.resource_subtype | Codificado de forma rígida como User para las relaciones de los usuarios dentro de un grupo. |
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.