Recopila registros de PowerShell

Compatible con:

En este documento, se explica cómo recopilar registros de PowerShell en Google Security Operations con Bindplane. El analizador transforma los registros sin procesar de Microsoft PowerShell en un modelo de datos unificado (UDM). Primero, extrae campos del mensaje de registro sin procesar, los normaliza en campos del UDM y, luego, enriquece los datos con contexto adicional según IDs de eventos específicos, lo que, en última instancia, crea un evento estructurado del UDM para el análisis de seguridad.

Antes de comenzar

  • Asegúrate de tener una instancia de Google SecOps.
  • Asegúrate de tener Windows 2016 o una versión posterior.
  • Si ejecutas la herramienta detrás de un proxy, asegúrate de que los puertos del firewall estén abiertos.

Obtén el archivo de autenticación de transferencia de Google SecOps

  1. Accede a la consola de Google SecOps.
  2. Ve a SIEM Settings > Collection Agents.
  3. Descarga el archivo de autenticación de transferencia. Guarda el archivo de forma segura en el sistema en el que se instalará BindPlane.

Obtén el ID de cliente de Google SecOps

  1. Accede a la consola de Google SecOps.
  2. Ve a SIEM Settings > Profile.
  3. Copia y guarda el ID de cliente de la sección Detalles de la organización.

Instala el agente de Bindplane en Windows

  1. Abre el símbolo del sistema o PowerShell como administrador.
  2. Ejecuta el siguiente comando:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

Recursos de instalación adicionales

Configura el agente de BindPlane para transferir Syslog y enviarlo a Google SecOps

  1. Antes de configurar el archivo YAML, detén el Service observIQ Distro for Open Telemetry Collector en el panel Services.
  2. Accede al archivo de configuración:

    1. Ubica el archivo config.yaml. Por lo general, se encuentra en el directorio /etc/bindplane-agent/ en Linux o en el directorio de instalación en Windows.
    2. Abre el archivo con un editor de texto (por ejemplo, nano, vi o Bloc de notas).
  3. Edita el archivo config.yaml de la siguiente manera:

    receivers:
      windowseventlog/powershell:
        channel: Microsoft-Windows-PowerShell/Operational
        max_reads: 100
        poll_interval: 5s
        raw: true
        start_at: end
    
    processors:
      batch:
    
    exporters:
      chronicle/powershell:
        endpoint: malachiteingestion-pa.googleapis.com
        # Adjust the path to the credentials file you downloaded in Step 1
        creds: '/path/to/ingestion-authentication-file.json'
        log_type: 'POWERSHELL'
        override_log_type: false
        raw_log_field: body
        customer_id: '<customer_id>'
    
    service:
      pipelines:
        logs/winpowershell:
          receivers:
            - windowseventlog/powershell
          processors: [batch]
          exporters: [chronicle/powershell] 
    
  4. Reemplaza <customer_id> por el ID de cliente real.

  5. Actualiza /path/to/ingestion-authentication-file.json a la ruta de acceso en la que se guardó el archivo de autenticación en la sección Cómo obtener el archivo de autenticación de la transferencia de datos de Google SecOps.

  6. Después de guardar el archivo config.yaml, inicia el Servicio observIQ Distro for Open Telemetry Collector.

Reinicia el agente de Bindplane para aplicar los cambios

  • Para reiniciar el agente de Bindplane en Windows, puedes usar la consola de Servicios o ingresar el siguiente comando:

    net stop BindPlaneAgent && net start BindPlaneAgent
    

Tabla de asignación de UDM

Campo de registro Asignación de UDM Lógica
AccountName principal.user.userid Se asigna directamente desde el campo AccountName en el registro sin procesar.
ActivityID security_result.detection_fields[0].value Se asigna directamente desde el campo ActivityID en el registro sin procesar. Se quitan las llaves.
Canal No se asignó al objeto IDM.
collection_time.nanos No se asignó al objeto IDM.
collection_time.seconds No se asignó al objeto IDM.
Comando No se asignó al objeto IDM.
CommandLine No se asignó al objeto IDM.
Computadora principal.hostname Se asigna directamente desde el campo Computer en el registro sin procesar, si está presente.
ContextInfo No se asignó al objeto IDM.
ContextInfo_Command Name security_result.detection_fields[0].value Se asigna directamente desde el campo ContextInfo_Command Name en el registro sin procesar, si está presente.
ContextInfo_Command Type security_result.detection_fields[1].value Se asigna directamente desde el campo ContextInfo_Command Type en el registro sin procesar, si está presente.
ContextInfo_Host Application target.process.command_line Se asigna directamente desde el campo ContextInfo_Host Application en el registro sin procesar si powershell.Host Application no está presente.
ContextInfo_Host ID target.asset.asset_id Se asigna directamente desde el campo ContextInfo_Host ID en el registro sin procesar si powershell.Host ID no está presente. El valor tiene el prefijo Host ID:.
ContextInfo_Host Name target.hostname Se asigna directamente desde el campo ContextInfo_Host Name en el registro sin procesar si powershell.Host Name no está presente.
ContextInfo_Script Name target.process.file.full_path Se asigna directamente desde el campo ContextInfo_Script Name en el registro sin procesar si script_name no está presente.
ContextInfo_Sequence Number security_result.detection_fields[2].value Se asigna directamente desde el campo ContextInfo_Sequence Number en el registro sin procesar, si está presente. Se convirtió en una cadena.
ContextInfo_Severity No se asignó al objeto IDM.
create_time.nanos No se asignó al objeto IDM.
create_time.seconds No se asignó al objeto IDM.
customer_id No se asignó al objeto IDM.
datos No se asignó al objeto IDM.
Datos security_result.detection_fields[0].value Se asigna directamente desde el campo Data en el registro sin procesar, si está presente.
Data_1 security_result.detection_fields[1].value Se asigna directamente desde el campo Data_1 en el registro sin procesar, si está presente.
Data_2 security_result.detection_fields[2].value Se asigna directamente desde el campo Data_2 en el registro sin procesar, si está presente.
Dominio principal.administrative_domain Se asigna directamente desde el campo Domain en el registro sin procesar.
entradas No se asignó al objeto IDM.
ERROR_EVT_UNRESOLVED No se asignó al objeto IDM.
EventCategory No se asignó al objeto IDM.
EventData No se asignó al objeto IDM.
EventID metadata.product_event_type, security_result.rule_name Se asigna directamente desde el campo EventID en el registro sin procesar. El valor tiene el prefijo EventID: para el campo security_result.rule_name.
EventLevel No se asignó al objeto IDM.
EventLevelName security_result.severity Se asigna según el valor de EventLevelName:
- Information se asigna a INFORMATIONAL.
: Verbose se asigna a LOW.
EventLog No se asignó al objeto IDM.
EventReceivedTime No se asignó al objeto IDM.
EventType No se asignó al objeto IDM.
EventTime metadata.event_timestamp Se usa para extraer la marca de tiempo si está presente.
ExecutionProcessID principal.process.pid Se asigna directamente desde el campo ExecutionProcessID en el registro sin procesar si está presente y no está vacío ni es 0. Se convirtió en una cadena.
ExecutionThreadID security_result.detection_fields[2].value Se asigna directamente desde el campo ExecutionThreadID en el registro sin procesar si está presente y no está vacío ni es 0. Se convirtió en una cadena.
Archivo target.process.file.full_path Se asigna directamente desde el campo File en el registro sin procesar, si está presente.
Aplicación de host No se asignó al objeto IDM.
HostApplication No se asignó al objeto IDM.
Nombre de host principal.hostname Se asigna directamente desde el campo Hostname en el registro sin procesar.
id No se asignó al objeto IDM.
Palabras clave No se asignó al objeto IDM.
log_type metadata.log_type Se asigna directamente desde el campo log_type en el registro sin procesar.
Máquina principal.asset.asset_id, principal.asset.platform_software.platform_version El campo Machine se analiza para extraer el ID de la máquina y la información de la plataforma. El ID de la máquina tiene el prefijo Machine ID:. La plataforma se asigna a la enumeración del UDM según el valor:
- win se asigna a WINDOWS.
: mac se asigna a MAC.
: lin se asigna a LINUX.
: Otros valores se asignan a UNKNOWN_PLATFORM.
ManagementGroupName additional.fields[0].value.string_value Se asigna directamente desde el campo ManagementGroupName en el registro sin procesar, si está presente.
Message.EventTime metadata.event_timestamp Se usa para extraer la marca de tiempo si está presente. Se convirtió en una cadena.
Message.Message security_result.description Se asigna directamente desde el campo Message.Message en el registro sin procesar si EventID está en [403, 4103, 4104] y message_message_not_found. Los retornos de carro y las tabulaciones se reemplazan por comas.
Mensaje security_result.description Se asigna directamente desde el campo Message en el registro sin procesar, si está presente.
MessageNumber No se asignó al objeto IDM.
MessageSourceAddress principal.ip Se asigna directamente desde el campo MessageSourceAddress en el registro sin procesar, si está presente.
MessageTotal No se asignó al objeto IDM.
MG No se asignó al objeto IDM.
Opcode metadata.description Se asigna directamente desde el campo Opcode en el registro sin procesar.
OpcodeValue No se asignó al objeto IDM.
Salida security_result.detection_fields[0].value Se asigna directamente desde el campo Output en el registro sin procesar, si está presente.
powershell.Command Name security_result.detection_fields[0].value Se asigna directamente desde el campo powershell.Command Name si está presente.
powershell.Command Type security_result.detection_fields[1].value Se asigna directamente desde el campo powershell.Command Type si está presente.
powershell.Host Application target.process.command_line Se asigna directamente desde el campo powershell.Host Application en el registro sin procesar, si está presente.
powershell.Host ID target.asset.asset_id Se asigna directamente desde el campo powershell.Host ID en el registro sin procesar, si está presente. El valor tiene el prefijo Host ID:.
powershell.Host Name target.hostname Se asigna directamente desde el campo powershell.Host Name en el registro sin procesar, si está presente.
powershell.HostApplication target.process.command_line Se asigna directamente desde el campo powershell.HostApplication en el registro sin procesar, si está presente.
powershell.HostId target.asset.asset_id Se asigna directamente desde el campo powershell.HostId en el registro sin procesar, si está presente. El valor tiene el prefijo Host ID:.
powershell.HostName target.hostname Se asigna directamente desde el campo powershell.HostName en el registro sin procesar, si está presente.
powershell.Script Name target.process.file.full_path Se asigna directamente desde el campo powershell.Script Name en el registro sin procesar, si está presente.
powershell.ScriptName target.process.file.full_path Se asigna directamente desde el campo powershell.ScriptName en el registro sin procesar, si está presente.
powershell.Sequence Number security_result.detection_fields[2].value Se asigna directamente desde el campo powershell.Sequence Number en el registro sin procesar, si está presente.
powershell.SequenceNumber security_result.detection_fields[0].value Se asigna directamente desde el campo powershell.SequenceNumber en el registro sin procesar, si está presente.
powershell.UserId principal.user.userid Se asigna directamente desde el campo powershell.UserId en el registro sin procesar, si está presente.
ID de proceso principal.process.pid Se asigna directamente desde el campo Process ID en el registro sin procesar si ExecutionProcessID y ProcessID no están presentes, están vacíos o son 0. Se convirtió en una cadena.
ProcessID principal.process.pid Se asigna directamente desde el campo ProcessID en el registro sin procesar si ExecutionProcessID no está presente, está vacío o es 0. Se convirtió en una cadena.
ProviderGuid metadata.product_deployment_id Se asigna directamente desde el campo ProviderGuid en el registro sin procesar. Se quitan las llaves.
PSEdition No se asignó al objeto IDM.
PSRemotingProtocolVersion No se asignó al objeto IDM.
PSVersion No se asignó al objeto IDM.
RecordNumber metadata.product_log_id Se asigna directamente desde el campo RecordNumber en el registro sin procesar. Se convirtió en una cadena.
RenderedDescription security_result.description Se asigna directamente desde el campo RenderedDescription en el registro sin procesar, si está presente.
Usuario de RunAs No se asignó al objeto IDM.
ScriptBlockId No se asignó al objeto IDM.
ScriptBlockText security_result.detection_fields[0].value Se asigna directamente desde el campo ScriptBlockText en el registro sin procesar, si está presente.
ID de ScriptBlock No se asignó al objeto IDM.
Gravedad security_result.severity, security_result.severity_details Se asigna según el valor de Severity:
- verbose o info se asigna a LOW.
 - warn o err se asigna a MEDIUM.
: crit se asigna a HIGH.
El valor sin procesar también se asigna a security_result.severity_details.
source.collector_id No se asignó al objeto IDM.
source.customer_id No se asignó al objeto IDM.
Fuente additional.fields[1].value.string_value Se asigna directamente desde el campo Source en el registro sin procesar, si está presente.
SourceModuleName principal.resource.name Se asigna directamente desde el campo SourceModuleName en el registro sin procesar.
SourceModuleType principal.resource.resource_subtype Se asigna directamente desde el campo SourceModuleType en el registro sin procesar.
SourceName metadata.product_name Se asigna directamente desde el campo SourceName en el registro sin procesar.
start_time.nanos No se asignó al objeto IDM.
start_time.seconds No se asignó al objeto IDM.
TenantId additional.fields[2].value.string_value Se asigna directamente desde el campo TenantId en el registro sin procesar, si está presente.
ThreadID No se asignó al objeto IDM.
timestamp.nanos No se asignó al objeto IDM.
timestamp.seconds No se asignó al objeto IDM.
tipo No se asignó al objeto IDM.
UserID principal.user.windows_sid Se asigna directamente desde el campo UserID en el registro sin procesar.
Nombre de usuario principal.user.userid Se asigna directamente desde el campo Username en el registro sin procesar si AccountName no está presente.
metadata.vendor_name Se define en Microsoft.
metadata.event_type Se establece en PROCESS_LAUNCH si EventID es 4104 y _Path está presente en Message, o si EventID es 4103, o si EventID está en [800, 600, 400] y powershell.ScriptName y powershell.HostApplication están presentes. Se establece en PROCESS_TERMINATION si EventID es 403 y _HostApplication está presente en Message, o si EventID es 403 y NewEngineState es Stopped. Se establece en STATUS_UPDATE si EventID es 4104 y _Path no está presente en Message, o si EventID es 4103 y no_value, script_name está vacío, script_name_not_found y host_application_not_found son todos verdaderos, o si EventID es 53504, o si EventID es 40962, o si EventID es 40961, o si EventID está vacío y MessageSourceAddress está presente. Se establece en USER_UNCATEGORIZED si EventID está vacío y Username está presente. Se establece en GENERIC_EVENT si EventID está vacío y MessageSourceAddress y Username no están presentes.
metadata.product_name Se establece en Powershell si SourceName no está presente.
security_result.action Se define en ALLOW.
security_result.detection_fields[0].key Se define en Activity ID.
security_result.detection_fields[1].key Se define en Sequence Number.
security_result.detection_fields[2].key Se define en ExecutionThreadID.
additional.fields[0].key Se define en Management Group Name.
additional.fields[1].key Se define en Source.
additional.fields[2].key Se define en TenantId.
principal.asset.platform_software.platform Se establece en WINDOWS si platform_software contiene win, MAC si contiene mac, LINUX si contiene lin y UNKNOWN_PLATFORM en los demás casos.
target.process.file.full_path Se establece en _Path si EventID es 4104 y _Path está presente en Message. Se establece en file_path si EventID es 4104 y file_path está presente en Message. Se establece en _HostApplication si EventID es 403 y _HostApplication está presente en Message.

¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.