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 un feed en Google SecOps para transferir registros de IAM de AWS

  1. Ve a SIEM Settings > Feeds.
  2. Haz clic en Agregar nueva.
  3. En el campo Nombre del feed, ingresa un nombre para el feed, por ejemplo, Registros de IAM de AWS.
  4. Selecciona Amazon S3 como el Tipo de fuente.
  5. Selecciona IAM de AWS como el Tipo de registro.
  6. Haz clic en Siguiente.
  7. 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.
    • 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.

  8. Haz clic en Siguiente.

  9. 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.