Recopila registros de AWS IAM

Compatible con:

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

  1. Crea un bucket de Amazon S3 siguiendo esta guía del usuario: Cómo crear un bucket.
  2. Guarda el Nombre y la Región del bucket para usarlos más adelante.
  3. Crea un usuario siguiendo esta guía del usuario: Cómo crear un usuario de IAM.
  4. Selecciona el usuario creado.
  5. Selecciona la pestaña Credenciales de seguridad.
  6. Haz clic en Crear clave de acceso en la sección Claves de acceso.
  7. Selecciona Servicio de terceros como el Caso de uso.
  8. Haz clic en Siguiente.
  9. Opcional: Agrega una etiqueta de descripción.
  10. Haz clic en Crear clave de acceso.
  11. Haz clic en Descargar archivo CSV para guardar la clave de acceso y la clave de acceso secreta para usarlas más adelante.
  12. Haz clic en Listo.
  13. Selecciona la pestaña Permisos.
  14. Haz clic en Agregar permisos en la sección Políticas de permisos.
  15. Selecciona Agregar permisos.
  16. Selecciona Adjuntar políticas directamente.
  17. Busca y selecciona la política AmazonS3FullAccess.
  18. Haz clic en Siguiente.
  19. Haz clic en Agregar permisos.

Configura CloudTrail para capturar registros de IAM

  1. Accede a la consola de administración de AWS.
  2. En la barra de búsqueda, escribe y selecciona CloudTrail en la lista de servicios.
  3. Haz clic en Crear ruta.
  4. Proporciona un Nombre de ruta, por ejemplo, IAMActivityTrail.
    • Aplicar el rastro a todas las regiones: Selecciona 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.
  5. Haz clic en Crear para crear el registro de seguimiento.

Configura CloudTrail para exportar registros a S3

  1. Ve a Servicios > S3.
  2. Selecciona el bucket de S3 en el que se almacenan los registros de CloudTrail, por ejemplo, iam-logs-bucket.
  3. Asegúrate de que CloudTrail tenga los permisos adecuados para escribir registros en el bucket.
  4. 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/*"
        }
      ]
    }
    
  5. Habilita el control de versiones en el bucket de S3 para asegurarte de que los registros se almacenen con varias versiones.

  6. Ve a Propiedades > Control de versiones de buckets > Habilitar.

Opcional: Configura Lambda para la exportación en tiempo real

  1. Ve a la consola de Lambda de AWS.
  2. Haz clic en Crear función.
  3. Selecciona Author from Scratch.
  4. Establece el nombre de la función como ExportIAMLogsToS3.
  5. Selecciona un entorno de ejecución de Python 3.x.
  6. 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/*"
        }
      ]
    }
    
  7. 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

  1. En la consola de Lambda, ve a Designer.
  2. Elige Agregar activador > CloudWatch Logs.
  3. Selecciona el grupo de registros de CloudWatch Logs asociado con tus registros de IAM, por ejemplo, /aws/cloudtrail/.
  4. Haz clic en Agregar.

Configura feeds

Existen dos puntos de entrada diferentes para configurar feeds en la plataforma de Google SecOps:

  • Configuración del SIEM > Feeds > Agregar nuevo
  • Centro de contenido > Paquetes de contenido > Comenzar

Cómo configurar el feed de IAM de AWS

  1. Haz clic en el paquete Amazon Cloud Platform.
  2. Busca el tipo de registro IAM de AWS.
  3. Especifica los valores en los siguientes campos.

    • Tipo de fuente: API de terceros
    • Nombre de usuario: Nombre de usuario para la autenticación
    • Secreto: Secreto para autenticarse

    Opciones avanzadas

    • Nombre del feed: Es un valor completado previamente que identifica el feed.
    • Espacio de nombres del activo: Es el espacio de nombres asociado con el feed.
    • Etiquetas de transferencia: Son las etiquetas que se aplican a todos los eventos de este feed.
  4. Haz clic en Crear feed.

Para obtener más información sobre cómo configurar varios feeds para diferentes tipos de registros dentro de esta familia de productos, consulta Configura 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 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.