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

  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: 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 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 tarde.
  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 CloudTrail y selecciónalo en la lista de servicios.
  3. Haz clic en Crear sendero.
  4. Proporciona un Nombre de ruta, por ejemplo, IAMActivityTrail.
    • Aplicar seguimiento a todas las regiones: Selecciona 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.
  5. Haz clic en Crear para crear el recorrido.

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 bucket > 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 Autor desde cero.
  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 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 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 > Registros de CloudWatch.
  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 AWS IAM

  1. Ve a Configuración de SIEM > 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 AWS IAM 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 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.

  8. Haz clic en Siguiente.

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