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 en 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 la UDM correspondientes para 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 AWS IAM y 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 usarlos más adelante.
- Crea un usuario siguiendo esta guía: 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 usarlas más tarde.
- 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 CloudTrail y selecciónalo en la lista de servicios.
- Haz clic en Crear sendero.
- Proporciona un Nombre de ruta, por ejemplo,
IAMActivityTrail
.- Aplicar seguimiento a todas las regiones: Selecciona Sí para registrar las actividades 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 Leer y Escribir para capturar eventos de lectura y escritura en recursos de IAM.
- Eventos de datos: Habilita los eventos de datos de S3 y Lambda.
- Haz clic en Crear para crear el recorrido.
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 bucket > 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 Autor desde cero.
- 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 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 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 > Registros de CloudWatch.
- 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 AWS IAM
- Ve a Configuración de SIEM > 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 AWS IAM 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 eliminación de fuentes: Selecciona la opción de eliminación según tus preferencias.
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 configuración de tu nuevo 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 asignan directamente desde el campo Arn para los tipos de entidades USUARIO y RECURSO. 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 asignan directamente desde el campo CreateDate y se convierten 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 asignan directamente desde el campo Group.CreateDate y se convierten 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 | Se asigna directamente desde el campo Group.Path , y la clave está codificada en 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 en is_truncated . |
Marcador | entity.entity.group.attribute.labels.value | Se asigna directamente desde el campo Marker , y la clave está codificada en marker . |
PasswordLastUsed | entity.entity.user.last_login_time | Se asignan directamente desde el campo PasswordLastUsed y se convierten 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 en path . |
Ruta | entity.entity.resource.attribute.labels.value | Se asigna directamente desde el campo Path para el tipo de entidad RESOURCE, y la clave se codifica en path . |
PermissionsBoundary.PermissionsBoundaryArn | entity.entity.resource.attribute.labels.value | Se asigna directamente desde el campo PermissionsBoundary.PermissionsBoundaryArn , y la clave está codificada en permissions_boundary_arn . |
PermissionsBoundary.PermissionsBoundaryType | entity.entity.resource.attribute.labels.value | La clave se asigna directamente desde el campo PermissionsBoundary.PermissionsBoundaryType y se codifica en 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 | Se asigna directamente desde el campo RoleLastUsed.LastUsedDate , y la clave está codificada en 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 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 asignan directamente desde el campo Users.Arn dentro de la relación del usuario. |
Users.CreateDate | relations.entity.user.attribute.creation_time | Se asignan directamente desde el campo Users.CreateDate dentro de la relación del usuario y se convierten al formato de marca de tiempo de Chronicle. |
Users.PasswordLastUsed | relations.entity.user.last_login_time | Se asignan directamente desde el campo Users.PasswordLastUsed dentro de la relación del usuario y se convierten 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 se codifica en 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 se codifica en 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 se codifica en permissions_boundary_type . |
Users.UserID | relations.entity.user.product_object_id | Se asignan directamente desde el campo Users.UserID dentro de la relación del usuario. |
Users.UserName | relations.entity.user.userid | Se asignan directamente desde el campo Users.UserName dentro de la relación del usuario. |
N/A | entity.metadata.collected_timestamp | Se completa con la marca de tiempo del evento del registro sin procesar. |
N/A | entity.metadata.vendor_name | Se codifica en AWS . |
N/A | entity.metadata.product_name | Se codifica en AWS IAM . |
N/A | entity.metadata.entity_type | Se determina en función de la presencia de campos específicos: USUARIO si existe UserID , RECURSO si existe RoleName y GRUPO si existe Group.GroupName . |
N/A | entity.entity.resource.resource_subtype | Establece en User para los tipos de entidades USUARIO y GRUPO. |
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 codifica en AMAZON_WEB_SERVICES . |
N/A | relations.entity_type | Está codificado de forma fija en USER para las relaciones de los usuarios dentro de un grupo. |
N/A | relations.relationship | Está codificado de forma fija en MEMBER para las relaciones de los usuarios dentro de un grupo. |
N/A | relations.direction | Está codificado de forma fija en UNIDIRECTIONAL para las relaciones de los usuarios dentro de un grupo. |
N/A | relations.entity.resource.resource_subtype | Está codificado de forma fija en User para las relaciones de los usuarios dentro de un grupo. |
Cambios
2023-12-14
- Es un analizador creado recientemente.
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.