Recoger registros de gestión de identidades y accesos de AWS

Disponible en:

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

  1. Crea un segmento de Amazon S3 siguiendo esta guía de usuario: Crear un segmento.
  2. Guarda el nombre y la región del bucket para usarlos más adelante.
  3. Crea un usuario siguiendo esta guía: Crear un usuario de gestión de identidades y accesos.
  4. Selecciona el usuario creado.
  5. Selecciona la pestaña Credenciales de seguridad.
  6. En la sección Claves de acceso, haz clic en Crear clave de acceso.
  7. Selecciona Servicio de terceros como Caso práctico.
  8. Haz clic en Siguiente.
  9. Opcional: añade 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. En la sección Políticas de permisos, haz clic en Añadir permisos.
  15. Selecciona Añadir permisos.
  16. Seleccione Adjuntar políticas directamente.
  17. Busca y selecciona la política AmazonS3FullAccess.
  18. Haz clic en Siguiente.
  19. Haz clic en Añadir permisos.

Configurar CloudTrail para capturar registros de IAM

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

Configurar 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 segmento.
  4. 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/*"
        }
      ]
    }
    
  5. Habilita la gestión de versiones en el bucket de S3 para asegurarte de que los registros se almacenan con varias versiones.

  6. Vaya a Propiedades > Versionado de cubos > Habilitar.

Opcional: Configurar 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 Crear desde cero.
  4. Asigna el nombre ExportIAMLogsToS3 a la función.
  5. Selecciona un entorno de ejecución de Python 3.x.
  6. 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/*"
        }
      ]
    }
    
  7. 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

  1. En la consola de Lambda, ve a Diseñador.
  2. Selecciona Añadir activador > CloudWatch Logs.
  3. Selecciona el grupo de registros CloudWatch Logs asociado a tus registros de IAM; por ejemplo, /aws/cloudtrail/.
  4. 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

  1. Haz clic en el paquete Amazon Cloud Platform.
  2. Busca el tipo de registro AWS IAM.
  3. 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.
  4. 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.