Recopilar registros de PowerShell
En este documento se explica cómo recoger registros de PowerShell en Google Security Operations mediante Bindplane. El analizador transforma los registros sin procesar de Microsoft PowerShell en un modelo de datos unificado (UDM). Primero, extrae los campos del mensaje de registro sin procesar, los normaliza en campos de UDM y, a continuación, enriquece los datos con contexto adicional en función de los IDs de evento específicos. Por último, crea un evento de UDM estructurado para el análisis de seguridad.
Antes de empezar
- Asegúrate de que tienes una instancia de Google SecOps.
- Asegúrate de que tengas Windows 2016 o una versión posterior.
- Si se ejecuta a través de un proxy, asegúrate de que los puertos del cortafuegos estén abiertos.
Obtener el archivo de autenticación de ingestión de Google SecOps
- Inicia sesión en la consola de Google SecOps.
- Ve a Configuración de SIEM > Agentes de recogida.
- Descarga el archivo de autenticación de ingestión. Guarda el archivo de forma segura en el sistema en el que se instalará Bindplane.
Obtener el ID de cliente de Google SecOps
- Inicia sesión en la consola de Google SecOps.
- Ve a Configuración de SIEM > Perfil.
- Copia y guarda el ID de cliente de la sección Detalles de la organización.
Instalar el agente de BindPlane en Windows
- Abre el símbolo del sistema o PowerShell como administrador.
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
- Para ver otras opciones de instalación, consulta esta guía de instalación.
Configurar el agente de BindPlane para ingerir Syslog y enviarlo a Google SecOps
- Antes de configurar el archivo YAML, detén el
observIQ Distro for Open Telemetry Collector
servicio en el panel Servicios. Accede al archivo de configuración:
- Busca el archivo
config.yaml
. Normalmente, se encuentra en el directorio/etc/bindplane-agent/
en Linux o en el directorio de instalación en Windows. - Abre el archivo con un editor de texto (por ejemplo,
nano
,vi
o Bloc de notas).
- Busca el archivo
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]
Sustituye
<customer_id>
por el ID de cliente real.Actualiza
/path/to/ingestion-authentication-file.json
a la ruta en la que se guardó el archivo de autenticación en la sección Obtener el archivo de autenticación de ingestión de Google SecOps.Después de guardar el archivo
config.yaml
, inicia el servicioobservIQ 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 Servicios o introducir 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 del registro sin procesar. |
ActivityID | security_result.detection_fields[0].value | Se asigna directamente desde el campo ActivityID del registro sin procesar. Se eliminan las llaves. |
Canal | No está asignado al objeto IDM. | |
collection_time.nanos | No está asignado al objeto IDM. | |
collection_time.seconds | No está asignado al objeto IDM. | |
Comando | No está asignado al objeto IDM. | |
CommandLine | No está asignado al objeto IDM. | |
Ordenador | principal.hostname | Se asigna directamente desde el campo Computer del registro sin procesar, si está presente. |
ContextInfo | No está asignado al objeto IDM. | |
ContextInfo_Command Name | security_result.detection_fields[0].value | Se asigna directamente desde el campo ContextInfo_Command Name del registro sin procesar, si está presente. |
Tipo ContextInfo_Command | security_result.detection_fields[1].value | Se asigna directamente desde el campo ContextInfo_Command Type del registro sin procesar, si está presente. |
ContextInfo_Host Application | target.process.command_line | Se asigna directamente desde el campo ContextInfo_Host Application del 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 del 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 del 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 del 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 del registro sin procesar, si está presente. Se ha convertido en una cadena. |
ContextInfo_Severity | No está asignado al objeto IDM. | |
create_time.nanos | No está asignado al objeto IDM. | |
create_time.seconds | No está asignado al objeto IDM. | |
customer_id | No está asignado al objeto IDM. | |
datos | No está asignado al objeto IDM. | |
Datos | security_result.detection_fields[0].value | Se asigna directamente desde el campo Data del registro sin procesar, si está presente. |
Data_1 | security_result.detection_fields[1].value | Se asigna directamente desde el campo Data_1 del registro sin procesar, si está presente. |
Data_2 | security_result.detection_fields[2].value | Se asigna directamente desde el campo Data_2 del registro sin procesar, si está presente. |
Dominio | principal.administrative_domain | Se asigna directamente desde el campo Domain del registro sin procesar. |
entries | No está asignado al objeto IDM. | |
ERROR_EVT_UNRESOLVED | No está asignado al objeto IDM. | |
EventCategory | No está asignado al objeto IDM. | |
EventData | No está asignado al objeto IDM. | |
EventID | metadata.product_event_type, security_result.rule_name | Se asigna directamente desde el campo EventID del registro sin procesar. El valor incluye el prefijo EventID: para el campo security_result.rule_name . |
EventLevel | No está asignado al objeto IDM. | |
EventLevelName | security_result.severity | Asignado en función del valor de EventLevelName :- Information se asigna a INFORMATIONAL .- Verbose se asigna a LOW . |
EventLog | No está asignado al objeto IDM. | |
EventReceivedTime | No está asignado al objeto IDM. | |
EventType | No está asignado 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 del registro sin procesar si está presente y no está vacío o es 0. Se ha convertido en una cadena. |
ExecutionThreadID | security_result.detection_fields[2].value | Se asigna directamente desde el campo ExecutionThreadID del registro sin procesar si está presente y no está vacío o es 0. Se ha convertido en una cadena. |
Archivo | target.process.file.full_path | Se asigna directamente desde el campo File del registro sin procesar, si está presente. |
Aplicación host | No está asignado al objeto IDM. | |
HostApplication | No está asignado al objeto IDM. | |
Nombre de host | principal.hostname | Se asigna directamente desde el campo Hostname del registro sin procesar. |
id | No está asignado al objeto IDM. | |
Palabras clave | No está asignado al objeto IDM. | |
log_type | metadata.log_type | Se asigna directamente desde el campo log_type del registro sin procesar. |
Equipo | 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 de UDM en función del 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 del registro sin procesar, si está presente. |
Message.EventTime | metadata.event_timestamp | Se usa para extraer la marca de tiempo, si está presente. Se ha convertido en una cadena. |
Message.Message | security_result.description | Se asigna directamente desde el campo Message.Message del registro sin procesar si EventID está en [403 , 4103 , 4104 ] y message_message_not_found . Los retornos de carro y las tabulaciones se sustituyen por comas. |
Mensaje | security_result.description | Se asigna directamente desde el campo Message del registro sin procesar, si está presente. |
MessageNumber | No está asignado al objeto IDM. | |
MessageSourceAddress | principal.ip | Se asigna directamente desde el campo MessageSourceAddress del registro sin procesar, si está presente. |
MessageTotal | No está asignado al objeto IDM. | |
MG | No está asignado al objeto IDM. | |
Código de operación | metadata.description | Se asigna directamente desde el campo Opcode del registro sin procesar. |
OpcodeValue | No está asignado al objeto IDM. | |
Salida | security_result.detection_fields[0].value | Se asigna directamente desde el campo Output del 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 del registro sin procesar, si está presente. |
powershell.Host ID | target.asset.asset_id | Se asigna directamente desde el campo powershell.Host ID del 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 del registro sin procesar, si está presente. |
powershell.HostApplication | target.process.command_line | Se asigna directamente desde el campo powershell.HostApplication del registro sin procesar, si está presente. |
powershell.HostId | target.asset.asset_id | Se asigna directamente desde el campo powershell.HostId del 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 del registro sin procesar, si está presente. |
powershell.Script Name | target.process.file.full_path | Se asigna directamente desde el campo powershell.Script Name del registro sin procesar, si está presente. |
powershell.ScriptName | target.process.file.full_path | Se asigna directamente desde el campo powershell.ScriptName del registro sin procesar, si está presente. |
powershell.Sequence Number | security_result.detection_fields[2].value | Se asigna directamente desde el campo powershell.Sequence Number del registro sin procesar, si está presente. |
powershell.SequenceNumber | security_result.detection_fields[0].value | Se asigna directamente desde el campo powershell.SequenceNumber del registro sin procesar, si está presente. |
powershell.UserId | principal.user.userid | Se asigna directamente desde el campo powershell.UserId del registro sin procesar, si está presente. |
ID de proceso | principal.process.pid | Se asigna directamente desde el campo Process ID del registro sin procesar si ExecutionProcessID y ProcessID no están presentes, están vacíos o son 0. Se ha convertido en una cadena. |
ProcessID | principal.process.pid | Se asigna directamente desde el campo ProcessID del registro sin procesar si ExecutionProcessID no está presente, está vacío o es 0. Se ha convertido en una cadena. |
ProviderGuid | metadata.product_deployment_id | Se asigna directamente desde el campo ProviderGuid del registro sin procesar. Se eliminan las llaves. |
PSEdition | No está asignado al objeto IDM. | |
PSRemotingProtocolVersion | No está asignado al objeto IDM. | |
PSVersion | No está asignado al objeto IDM. | |
RecordNumber | metadata.product_log_id | Se asigna directamente desde el campo RecordNumber del registro sin procesar. Se ha convertido en una cadena. |
RenderedDescription | security_result.description | Se asigna directamente desde el campo RenderedDescription del registro sin procesar, si está presente. |
Usuario RunAs | No está asignado al objeto IDM. | |
ScriptBlockId | No está asignado al objeto IDM. | |
ScriptBlockText | security_result.detection_fields[0].value | Se asigna directamente desde el campo ScriptBlockText del registro sin procesar, si está presente. |
ID de ScriptBlock | No está asignado al objeto IDM. | |
Gravedad | security_result.severity, security_result.severity_details | Se asigna en función del 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 formato también se asigna a security_result.severity_details . |
source.collector_id | No está asignado al objeto IDM. | |
source.customer_id | No está asignado al objeto IDM. | |
Fuente | additional.fields[1].value.string_value | Se asigna directamente desde el campo Source del registro sin procesar, si está presente. |
SourceModuleName | principal.resource.name | Se asigna directamente desde el campo SourceModuleName del registro sin procesar. |
SourceModuleType | principal.resource.resource_subtype | Se asigna directamente desde el campo SourceModuleType del registro sin procesar. |
SourceName | metadata.product_name | Se asigna directamente desde el campo SourceName del registro sin procesar. |
start_time.nanos | No está asignado al objeto IDM. | |
start_time.seconds | No está asignado al objeto IDM. | |
TenantId | additional.fields[2].value.string_value | Se asigna directamente desde el campo TenantId del registro sin procesar, si está presente. |
ThreadID | No está asignado al objeto IDM. | |
timestamp.nanos | No está asignado al objeto IDM. | |
timestamp.seconds | No está asignado al objeto IDM. | |
tipo | No está asignado al objeto IDM. | |
UserID | principal.user.windows_sid | Se asigna directamente desde el campo UserID del registro sin procesar. |
Nombre de usuario | principal.user.userid | Se asigna directamente desde el campo Username del registro sin procesar si AccountName no está presente. |
metadata.vendor_name | Su valor debe ser Microsoft . |
|
metadata.event_type | Se define como 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. Asigna el valor PROCESS_TERMINATION si EventID es 403 y _HostApplication está presente en Message , o si EventID es 403 y NewEngineState es Stopped . Se asigna el valor 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 , 40962 o 40961 , o si EventID está vacío y MessageSourceAddress está presente.EventID EventID Se asigna el valor USER_UNCATEGORIZED si EventID está vacío y Username está presente. Se asigna el valor GENERIC_EVENT si EventID está vacío y no se incluyen MessageSourceAddress ni Username . |
|
metadata.product_name | Se establece en Powershell si no se incluye SourceName . |
|
security_result.action | Su valor debe ser ALLOW . |
|
security_result.detection_fields[0].key | Su valor debe ser Activity ID . |
|
security_result.detection_fields[1].key | Su valor debe ser Sequence Number . |
|
security_result.detection_fields[2].key | Su valor debe ser ExecutionThreadID . |
|
additional.fields[0].key | Su valor debe ser Management Group Name . |
|
additional.fields[1].key | Su valor debe ser Source . |
|
additional.fields[2].key | Su valor debe ser TenantId . |
|
principal.asset.platform_software.platform | Se asigna el valor WINDOWS si platform_software contiene win , MAC si contiene mac , LINUX si contiene lin y UNKNOWN_PLATFORM en el resto de los casos. |
|
target.process.file.full_path | Se define como _Path si EventID es 4104 y _Path está presente en Message . Se define como file_path si EventID es 4104 y file_path está presente en Message . Se define como _HostApplication si EventID es 403 y _HostApplication está presente en Message . |
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.