Recopila registros de AWS IAM
En este documento, se explica cómo transferir registros de IAM de AWS a 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 detalles del usuario, información del rol, permisos y marcas de tiempo, y los asigna a los campos correspondientes del UDM para realizar un análisis de seguridad coherente.
Antes de comenzar
- Asegúrate de tener una instancia de Google SecOps.
- Asegúrate de tener acceso con privilegios a AWS.
Configura IAM y S3 de AWS
- 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 usarlos más adelante.
- 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 el 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 usarlas más adelante.
- 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 y selecciona la política AmazonS3FullAccess.
- Haz clic en Siguiente.
- Haz clic en Agregar permisos.
Configura CloudTrail para capturar registros de IAM
- Accede a la consola de administración de AWS.
- En la barra de búsqueda, escribe y selecciona CloudTrail en la lista de servicios.
- Haz clic en Crear ruta.
- Proporciona un Nombre de ruta, por ejemplo,
IAMActivityTrail
.- Aplicar el rastro a todas las regiones: Selecciona Sí para registrar la actividad en todas las regiones.
- Ubicación de almacenamiento: Selecciona el bucket de S3 que creaste antes o crea uno nuevo.
- Bucket de S3: Ingresa un nombre para el bucket de S3, por ejemplo,
iam-logs-bucket
. - Selecciona Crear un nuevo rol de IAM (si no lo creaste antes).
- Eventos de administración: Selecciona Lectura y Escritura para capturar los eventos de lectura y escritura en los recursos de IAM.
- Eventos de datos: Habilita los eventos de datos de S3 y Lambda.
- Haz clic en Crear para crear el registro de seguimiento.
Configura 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 bucket.
Agrega la siguiente política si aún no está presente:
{ "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 el control de versiones en el bucket de S3 para asegurarte de que los registros se almacenen con varias versiones.
Ve a Propiedades > Control de versiones de buckets > Habilitar.
Opcional: Configura Lambda para la exportación en tiempo real
- Ve a la consola de Lambda de AWS.
- Haz clic en Crear función.
- Selecciona Author from Scratch.
- Establece el nombre de la función como
ExportIAMLogsToS3
. - Selecciona un entorno de ejecución de Python 3.x.
Asigna un rol de IAM a la función que tenga permisos para realizar las siguientes acciones:
{ "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 recuperar registros de IAM 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 )
- Reemplaza
your-s3-bucket-name
por el nombre real de tu bucket.
Configura el activador de Lambda para los registros de CloudWatch
- En la consola de Lambda, ve a Designer.
- Elige Agregar activador > CloudWatch Logs.
- Selecciona el grupo de registros de CloudWatch Logs asociado con tus registros de IAM, por ejemplo,
/aws/cloudtrail/
. - Haz clic en Agregar.
Configura un feed en Google SecOps para transferir registros de IAM de AWS
- Ve a SIEM Settings > Feeds.
- Haz clic en Agregar nueva.
- En el campo Nombre del feed, ingresa un nombre para el feed, por ejemplo, Registros de IAM de AWS.
- Selecciona Amazon S3 como el Tipo de fuente.
- Selecciona IAM de AWS como el Tipo de registro.
- Haz clic en Siguiente.
Especifica valores para los siguientes parámetros de entrada:
- Región: Es la región en la que se encuentra el bucket de Amazon S3.
- URI de S3: Es el URI del bucket.
s3://your-log-bucket-name/
- Reemplaza
your-log-bucket-name
por el nombre real del bucket.
- Reemplaza
- El URI es un: Selecciona Directorio o Directorio que incluye subdirectorios.
Opciones de borrado de la fuente: Selecciona la opción de borrado según tu preferencia.
ID de clave de acceso: Es la clave de acceso del usuario con acceso al bucket de S3.
Clave de acceso secreta: Es la 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.
Haz clic en Siguiente.
Revisa la nueva configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.
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 para los tipos de entidades USER y RESOURCE. Para el 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 para el 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 | La clave se asigna directamente desde el campo Group.Path y está codificada como path . |
IsTruncated | entity.entity.group.attribute.labels.value | Se asigna directamente desde el campo IsTruncated y se convierte en una cadena. La clave está codificada como is_truncated . |
Marcador | entity.entity.group.attribute.labels.value | La clave se asigna directamente desde el campo Marker y está codificada 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 para el tipo de entidad USER. La clave está codificada como path . |
Ruta | entity.entity.resource.attribute.labels.value | Se asigna directamente desde el campo Path para el tipo de entidad RESOURCE. La clave está codificada como path . |
PermissionsBoundary.PermissionsBoundaryArn | entity.entity.resource.attribute.labels.value | La clave, que se asigna directamente desde el campo PermissionsBoundary.PermissionsBoundaryArn , está codificada como permissions_boundary_arn . |
PermissionsBoundary.PermissionsBoundaryType | entity.entity.resource.attribute.labels.value | La clave, que se asigna directamente desde el campo PermissionsBoundary.PermissionsBoundaryType , está codificada 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, que se asigna directamente desde el campo RoleLastUsed.LastUsedDate , está codificada 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 para el campo labels dentro del atributo del usuario. |
Tags.Value | entity.entity.user.attribute.labels.value | Se usa como el valor del campo labels dentro del atributo del usuario. |
UserID | entity.entity.user.product_object_id | Se asigna directamente desde el campo UserID . |
UserName | 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 dentro de la relación del usuario. |
Users.CreateDate | relations.entity.user.attribute.creation_time | Se asigna directamente desde el campo Users.CreateDate dentro de la relación del 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 dentro de la relación del usuario y se convierte al formato de marca de tiempo de Chronicle. |
Users.Path | relations.entity.user.attribute.labels.value | La clave se asigna directamente desde el campo Users.Path dentro de la relación del usuario y está codificada como path . |
Users.PermissionsBoundary.PermissionsBoundaryArn | relations.entity.resource.attribute.labels.value | La clave se asigna directamente desde el campo Users.PermissionsBoundary.PermissionsBoundaryArn dentro de la relación del usuario y está codificada como permissions_boundary_arn . |
Users.PermissionsBoundary.PermissionsBoundaryType | relations.entity.resource.attribute.labels.value | La clave se asigna directamente desde el campo Users.PermissionsBoundary.PermissionsBoundaryType dentro de la relación del usuario y está codificada como permissions_boundary_type . |
Users.UserID | relations.entity.user.product_object_id | Se asigna directamente desde el campo Users.UserID dentro de la relación del usuario. |
Users.UserName | relations.entity.user.userid | Se asigna directamente desde el campo Users.UserName dentro de la relación del usuario. |
N/A | entity.metadata.collected_timestamp | Se propaga con la marca de tiempo del evento del registro sin procesar. |
N/A | entity.metadata.vendor_name | Se codificó como AWS . |
N/A | entity.metadata.product_name | Se codificó como AWS IAM . |
N/A | entity.metadata.entity_type | Se determina según 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 establece en User para los tipos de entidades USER y GROUP. |
N/A | entity.entity.resource.resource_type | Se establece en ACCESS_POLICY para el tipo de entidad RESOURCE. |
N/A | entity.entity.resource.attribute.cloud.environment | Se codificó como AMAZON_WEB_SERVICES . |
N/A | relations.entity_type | Se codifica como USER para las relaciones del usuario dentro de un grupo. |
N/A | relations.relationship | Se codifica como MEMBER para las relaciones del usuario dentro de un grupo. |
N/A | relations.direction | Se codifica como UNIDIRECTIONAL para las relaciones del usuario dentro de un grupo. |
N/A | relations.entity.resource.resource_subtype | Se codifica como User para las relaciones del usuario dentro de un grupo. |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.