Recopila registros de Microsoft PowerShell
En este documento, se explica cómo transferir registros de Microsoft PowerShell a Google Security Operations con el agente de Bindplane.
Microsoft PowerShell es un framework de administración de parámetros de configuración y automatización de tareas de Microsoft que consta de un shell de línea de comandos y un lenguaje de programación. Los registros de PowerShell capturan la ejecución de secuencias de comandos, la actividad de los módulos y las invocaciones de comandos, lo que proporciona visibilidad de las operaciones de PowerShell para la supervisión de seguridad y el análisis forense.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Instancia de Google SecOps
- Windows Server 2016 o versiones posteriores
- Conectividad de red entre el host de Windows y Google SecOps
- Si se ejecuta detrás de un proxy, asegúrate de que los puertos de firewall estén abiertos según los requisitos del agente de Bindplane.
- Acceso de administrador al host de Windows para configurar el registro de PowerShell y, luego, instalar el agente de Bindplane
Configura el registro de PowerShell
El registro de PowerShell debe estar habilitado en los hosts de Windows antes de que se puedan recopilar los registros. De forma predeterminada, el registro de PowerShell es mínimo. Habilita el registro de bloques de secuencias de comandos para capturar la actividad detallada de PowerShell.
Habilita el registro de bloqueos de secuencias de comandos con la política de grupo
- Abre el Editor de directivas de grupo local ejecutando
gpedit.msccomo administrador. - Ve a Computer Configuration > Administrative Templates > Windows Components > Windows PowerShell.
- Haz doble clic en Activar el registro de bloques de secuencias de comandos de PowerShell.
- Selecciona Habilitada.
- De manera opcional, marca la casilla de verificación Log script block invocation start / stop events para capturar los eventos de inicio y detención de cada bloque de secuencia de comandos. Ten en cuenta que esta opción genera un gran volumen de registros.
- Haz clic en Aceptar.
- Abre Símbolo del sistema como administrador y ejecuta
gpupdate /forcepara aplicar la política de inmediato.
Habilita el registro de bloques de secuencias de comandos con el registro
Como alternativa, puedes habilitar el registro de bloqueo de secuencias de comandos estableciendo el siguiente valor de registro:
- Abre el Editor del Registro ejecutando
regeditcomo administrador. - Navega hacia
HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging. - Si la clave no existe, créala.
- Crea un nuevo valor DWORD (32 bits) llamado
EnableScriptBlockLoggingy establece su valor en1. - Reinicia las sesiones de PowerShell para que se aplique el cambio.
El registro de bloques de secuencias de comandos de PowerShell escribe eventos en el canal de registro de eventos Microsoft-Windows-PowerShell/Operational con el ID de evento 4104.
Opcional: Habilita el registro de módulos
El registro de módulos registra los detalles de la ejecución de la canalización para los módulos especificados. Para habilitar el registro de módulos en todos los módulos, haz lo siguiente:
- En el Editor de directivas de grupo local, ve a Configuración del equipo > Plantillas administrativas > Componentes de Windows > Windows PowerShell.
- Haz doble clic en Activar el registro de módulos.
- Selecciona Habilitada.
- Haz clic en Mostrar junto a Nombres de módulos.
- Ingresa
*para registrar todos los módulos. - Haz clic en Aceptar en la ventana Module Names.
- Haz clic en Aceptar en la ventana Module Logging.
- Ejecuta
gpupdate /forcepara aplicar la política.
Los eventos de Module Logging se escriben en el registro de eventos de Windows PowerShell con el ID de evento 4103.
Opcional: Habilita la transcripción
La transcripción crea un registro basado en texto de todas las entradas y salidas de la sesión de PowerShell. Para habilitar la transcripción, haz lo siguiente:
- En el Editor de directivas de grupo local, ve a Configuración del equipo > Plantillas administrativas > Componentes de Windows > Windows PowerShell.
- Haz doble clic en Activar la transcripción de PowerShell.
- Selecciona Habilitada.
- De manera opcional, especifica un Directorio de salida de la transcripción. Si se deja en blanco, las transcripciones se guardan en la carpeta Documentos de cada usuario.
- Marca Incluir encabezados de invocación para incluir marcas de tiempo y metadatos.
- Haz clic en Aceptar.
- Ejecuta
gpupdate /forcepara aplicar la política.
Las transcripciones se escriben en archivos de texto con nombres que comienzan con PowerShell_transcript.
Obtén credenciales de Google SecOps para el agente de Bindplane
Para autenticar el agente de Bindplane en Google SecOps, elige uno de los siguientes métodos:
- Implementaciones nuevas: Usa la API de Chronicle (opción 1).
- Implementaciones heredadas: Sigue usando el archivo de autenticación de la API de Ingestion (opción 2) hasta que se descontinúe la API de Ingestion el 20 de julio de 2027.
Opción 1: Crea una cuenta de servicio para la API de Chronicle (recomendada)
- Accede a la consola deGoogle Cloud y selecciona el proyecto de Google Cloud que está vinculado a tu instancia de Google SecOps.
- Ve a IAM y administración > Cuentas de servicio.
- Haga clic en Crear cuenta de servicio.
- Proporciona los siguientes detalles de configuración:
- Nombre de la cuenta de servicio: Ingresa un nombre para la cuenta (por ejemplo,
bindplane-ingest). - Descripción de la cuenta de servicio: Ingresa una descripción (por ejemplo,
Bindplane agent log ingestion).
- Nombre de la cuenta de servicio: Ingresa un nombre para la cuenta (por ejemplo,
- Haz clic en Crear y continuar.
- En la sección Otorga a esta cuenta de servicio acceso al proyecto, haz clic en Seleccionar un rol y elige Editor de Chronicle.
- Haz clic en Continuar y, luego, en Listo.
- Haz clic en la cuenta de servicio que creaste y, luego, ve a la pestaña Claves.
- Haz clic en Agregar clave > Crear clave nueva.
- Selecciona JSON y haz clic en Crear. El archivo de claves se descargará en tu computadora.
- Guarda el archivo de claves como
ingestion-auth.jsonen el directorio del recopilador de Bindplane (/opt/observiq-otel-collector/ingestion-auth.jsonen Linux oC:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.jsonen Windows) o actualizacreds_file_pathenconfig.yamlpara que coincida con la ruta de acceso en la que lo guardas. - Ve a IAM y administración > Configuración y copia el Número de proyecto. Lo necesitarás para la configuración del exportador.
Opción 2: Descarga el archivo de autenticación de transferencia (heredado)
- Accede a la consola de Google SecOps.
- Ve a Configuración de SIEM > Agentes de recopilación.
- Descarga el archivo de autenticación de transferencia.
- Guarda el archivo de forma segura en el sistema en el que se instalará el agente de Bindplane.
Obtén el ID de cliente de Google SecOps
- Accede a 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.
Instala el agente de Bindplane
Instala el agente de Bindplane en tu host de Windows según las siguientes instrucciones.
Instalación en Windows
- Abre el símbolo del sistema o PowerShell como administrador.
Ejecuta el comando siguiente:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quietEspera a que se complete la instalación.
Ejecuta el siguiente comando para verificar la instalación:
sc query observiq-otel-collectorEl servicio debe mostrarse como RUNNING.
Recursos de instalación adicionales
Para obtener más opciones de instalación y solucionar problemas, consulta la guía de instalación del agente de Bindplane.
Configura el agente de BindPlane para recopilar registros de PowerShell
Ubica el archivo de configuración de Windows
Ubica el archivo de configuración de Windows de la siguiente manera:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
Edita el archivo de configuración
Reemplaza todo el contenido de
config.yamlpor la siguiente configuración:receivers: windowseventlog/powershell: channel: Microsoft-Windows-PowerShell/Operational max_reads: 100 poll_interval: 5s raw: true start_at: end processors: batch: exporters: chronicle/powershell: protocol: https # Region of your instance, for example us, europe, asia-southeast1 location: <LOCATION> # Project number of the Google Cloud project linked to the instance project: '<PROJECT_NUMBER>' compression: gzip creds_file_path: 'C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json' customer_id: '<CUSTOMER_ID>' endpoint: chronicle.googleapis.com log_type: 'POWERSHELL' raw_log_field: body override_log_type: false service: pipelines: logs/powershell: receivers: - windowseventlog/powershell processors: - batch exporters: - chronicle/powershell
Parámetros de configuración
Reemplaza los marcadores de posición que se indican más abajo:
Configuración del receptor:
channel: Es el canal del registro de eventos de Windows desde el que se recopilarán los datos. Para el registro de bloques de secuencias de comandos de PowerShell, usaMicrosoft-Windows-PowerShell/Operational. Para el registro de módulos, usaWindows PowerShell.raw: Se establece entruepara enviar el XML sin procesar del registro de eventos de Windows a Google SecOps.start_at: Se establece enendpara recopilar solo eventos nuevos después de que se inicia el agente. Establécelo enbeginningpara recopilar todos los eventos existentes.
Configuración del exportador:
<CUSTOMER_ID>: Reemplaza este valor por el ID de cliente del paso anterior.creds_file_path: Es la ruta de acceso completa al archivo de claves JSON de la cuenta de servicio (opción 1). Copia el archivo de credenciales en esta ubicación.location: Reemplaza<LOCATION>por la región de tu instancia de Google SecOps (por ejemplo,us,europeoasia-southeast1). El exportador anteponechronicle.googleapis.comcon este valor. Consulta Extremos regionales para obtener la lista completa.project: Reemplaza<PROJECT_NUMBER>por el número de proyecto de IAM y administración > Configuración.endpoint: Mantén el valor establecido enchronicle.googleapis.com.log_type: Se establece enPOWERSHELLpara usar el analizador de PowerShell.
Exportador de la API de transferencia heredada
Si usas el archivo de autenticación de transferencia de la opción 2, reemplaza el bloque
exporterspor lo siguiente. Establececreds_file_pathen la ruta de acceso al archivo de autenticación de la transferencia y, si tu instancia se encuentra fuera de EE.UU., reemplazamalachiteingestion-pa.googleapis.compor tu extremo regional (por ejemplo,europe-malachiteingestion-pa.googleapis.com).exporters: chronicle/powershell: compression: gzip creds_file_path: 'C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json' customer_id: '<CUSTOMER_ID>' endpoint: malachiteingestion-pa.googleapis.com log_type: 'POWERSHELL' raw_log_field: body override_log_type: false
Cómo guardar el archivo de configuración
Después de editarlo, haz clic en Archivo > Guardar para guardar el archivo.
Reinicia el agente de Bindplane para aplicar los cambios.
Windows
Usa el símbolo del sistema o PowerShell como administrador:
net stop observiq-otel-collector && net start observiq-otel-collectorO bien, usa la consola de Servicios:
- Presiona
Win+R, escribeservices.mscy presiona Intro. - Busca observIQ OpenTelemetry Collector.
- Haz clic con el botón derecho y selecciona Reiniciar.
Verifica que el servicio esté en ejecución:
sc query observiq-otel-collectorRevisa los registros en busca de errores:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- Presiona
Verifica la transferencia de registros
Después de configurar el agente de BindPlane y reiniciar el servicio, los registros de PowerShell deberían comenzar a fluir hacia Google SecOps.
- Accede a la consola de Google SecOps.
- Ve a Investigar > Búsqueda.
Ejecuta la siguiente búsqueda para verificar que se estén transfiriendo los registros de PowerShell:
metadata.log_type = "POWERSHELL"Verifica que los eventos aparezcan con marcas de tiempo recientes.
Los eventos de registro de bloques de secuencias de comandos de PowerShell (ID de evento 4104) aparecerán con detalles de los bloques de secuencias de comandos ejecutados, incluido el contenido de la secuencia de comandos, el ID del bloque de secuencias de comandos y el contexto de ejecución.
Tabla de asignación de UDM
| Campo de registro | Asignación de UDM | Lógica |
|---|---|---|
| HostId | principal.resource.product_object_id | Identificador único del objeto del producto asociado al recurso principal |
| System.Version | metadata.product_version | Versión del producto que generó el evento |
| System.EventId, EventID, winlog.event_id | metadata.product_event_type | Es el tipo de evento según lo define el producto. |
| Computer, System.Computer, computer, winlog.computer_name | principal.hostname | Nombre de host de la entidad principal |
| Computer, System.Computer, computer, winlog.computer_name | principal.asset.hostname | Nombre de host del recurso asociado con la principal |
| System.EventRecordID, RecordNumber, winlog.record_id | metadata.product_log_id | Identificador único de la entrada de registro dentro del sistema de registro del producto |
| System.Opcode, opcode, winlog.opcode | metadata.description | Descripción del evento o contexto adicional |
| ProviderGuid, winlog.provider_guid | metadata.product_deployment_id | Es el identificador único de la implementación del producto. |
| System.ProcessID, ProcessID, ExecutionProcessID, execution.process_id, winlog.process.pid | principal.process.pid | ID de proceso del proceso principal |
| SourceModuleName | principal.resource.name | Nombre del recurso asociado con el principal |
| SourceModuleType | principal.resource.resource_subtype | Subtipo del recurso asociado con la principal |
| security.user_id, UserID, winlog.user.identifier | principal.user.windows_sid | Identificador de seguridad (SID) de Windows para el usuario principal |
| metadata.event_type | Es el tipo de evento (p. ej., USER_LOGIN, NETWORK_CONNECTION). | |
| SourceName, winlog.provider_name | metadata.product_name | Nombre del producto que generó el evento |
| AccountName, Username, UserName, winlog.user.name | principal.user.userid | ID de usuario del usuario principal |
| Dominio, winlog.user.domain | principal.administrative_domain | Dominio administrativo del principal |
| Path, target_file, ScriptName, script_name, ContextInfo_Script Name, file_path | target.process.file.full_path | Ruta de acceso completa al archivo asociado con el proceso de destino |
| HostName, powershell.Host Name, ContextInfo_Host Name | target.hostname | Nombre de host de la entidad de destino |
| HostName, powershell.Host Name, ContextInfo_Host Name | target.asset.hostname | Nombre de host del activo asociado con el objetivo |
| ID del host, HostID, ContextInfo_Host ID | target.asset.asset_id | Es el identificador único del activo de destino. |
| Nombre_de_comando, ContextInfo_Command Name, CommandName | target.application | Nombre de la aplicación asociada con el destino |
| HostApplication, ContextInfo_Host Application | target.process.command_line | Es la línea de comandos que se usó para iniciar el proceso de destino. |
| ScriptBlockText | target.process.command_line | Es la línea de comandos que se usó para iniciar el proceso de destino. |
| MessageSourceAddress | principal.ip | Dirección IP de la entidad principal |
| MessageSourceAddress | principal.asset.ip | Es la dirección IP del recurso asociado con la principal. |
| Nombre_de_host | principal.application | Nombre de la aplicación asociada con la principal |
| Version_de_host | principal.platform_version | Es la versión de la plataforma asociada con la principal. |
| Id_de_host | principal.resource.id | Es el identificador único del recurso de principal. |
| Application_host | principal.process.file.full_path | Ruta de acceso completa al archivo asociado con el proceso principal |
| HostApplication | principal.process.command_line | Es la línea de comandos que se usa para iniciar el proceso principal. |
| Usuario, admin_domain | principal.user.userid | ID de usuario del usuario principal |
| Usuario, admin_domain | principal.administrative_domain | Dominio administrativo del principal |
| CommandLine | principal.process.command_line | Línea de comandos que se usó para iniciar el proceso principal |
| Máquina, machine_id | principal.asset.asset_id | Es el identificador único del activo principal. |
| Máquina, platform_software | principal.asset.platform_software.platform | Tipo de plataforma del recurso (p.ej., WINDOWS, LINUX) |
| Máquina, platform_software | principal.asset.platform_software.platform_version | Es la versión del software de la plataforma en el recurso. |
| MessageSourceAddress | intermediary.ip | Dirección IP de la entidad intermediaria |
| MessageSourceAddress, Hostname | intermediary.hostname | Nombre de host de la entidad intermediaria |
| MessageSourceAddress, Hostname | intermediary.asset.hostname | Nombre de host del activo asociado con el intermediario |
| MessageSourceAddress | intermediary.port | Número de puerto que usa el intermediario |
| HostApplication | target.process.command_line | Es la línea de comandos que se usó para iniciar el proceso de destino. |
| HostId | target.asset.asset_id | Es el identificador único del activo de destino. |
| SequenceNumber, ContextInfo_Sequence Number, Sequence Number | security_result.detection_fields | Pares clave-valor de información de detección adicional |
| ProviderName | principal.resource.attribute.labels | Son las etiquetas o los atributos asociados con el recurso principal. |
| NewEngineState | additional.fields | Son campos personalizados adicionales que no están cubiertos por el esquema de UDM estándar. |
| PreviousEngineState | additional.fields | Campos personalizados adicionales no incluidos en el esquema de UDM estándar |
| ScriptName | additional.fields | Son campos personalizados adicionales que no están cubiertos por el esquema de UDM estándar. |
| ManagementGroupName | additional.fields | Son campos personalizados adicionales que no están cubiertos por el esquema de UDM estándar. |
| Fuente | additional.fields | Son campos personalizados adicionales que no están cubiertos por el esquema de UDM estándar. |
| RenderedDescription | security_result.description | Descripción del resultado de seguridad o de la acción que se tomó |
| TenantId | additional.fields | Son campos personalizados adicionales que no están cubiertos por el esquema de UDM estándar. |
| UserName | principal.user.userid | ID de usuario del usuario principal |
| ActivityID | security_result.detection_fields | Pares clave-valor de información de detección adicional |
| ExecutionThreadID, execution.thread_id, winlog.process.thread.id | security_result.detection_fields | Pares clave-valor de información de detección adicional |
| Salida | security_result.detection_fields | Pares clave-valor de información de detección adicional |
| Datos | security_result.detection_fields | Pares clave-valor de información de detección adicional |
| Data_1 | additional.fields | Son campos personalizados adicionales que no están cubiertos por el esquema de UDM estándar. |
| data_1 | security_result.detection_fields | Pares clave-valor de información de detección adicional |
| Data_2 | security_result.detection_fields | Pares clave-valor de información de detección adicional |
| winlog.activity_id | security_result.detection_fields | Pares clave-valor de información de detección adicional |
| winlog.api | additional.fields | Campos personalizados adicionales no incluidos en el esquema de UDM estándar |
| winlog.channel | principal.resource.attribute.labels | Etiquetas o atributos asociados con el recurso principal |
| Desplazamiento | additional.fields | Son campos personalizados adicionales que no están cubiertos por el esquema de UDM estándar. |
| SeverityValue | security_result.detection_fields | Pares clave-valor de información de detección adicional |
| intermediario | intermediario | Detalles sobre las entidades intermediarias involucradas en el evento |
| security_result | security_result | Resultado general de seguridad, incluidas acciones, niveles de gravedad y detecciones |
| metadata.vendor_name | Es el nombre del proveedor que produjo el evento. | |
| SourceName | metadata.product_name | Es el nombre del producto que produjo el evento. |
syslog_host |
event.idm.read_only_udm.intermediary.hostname |
Asignado desde el registro de cambios |
Computer |
event.idm.read_only_udm.intermediary.hostname |
Se asignó desde el registro de cambios |
Version |
event.idm.read_only_udm.metadata.product_version |
Se asignó desde el registro de cambios |
Task |
event.idm.read_only_udm.security_result.detection_fields |
Se asignó desde el registro de cambios |
OpcodeValue |
event.idm.read_only_udm.security_result.detection_fields |
Se asignó desde el registro de cambios |
ThreadID |
event.idm.read_only_udm.security_result.detection_fields |
Se asignó desde el registro de cambios |
AccountType |
event.idm.read_only_udm.security_result.detection_fields |
Se asignó desde el registro de cambios |
Offset |
event1.idm.read_only_udm.additional.fields |
Se asignó desde el registro de cambios |
SeverityValue |
event1.idm.read_only_udm.additional.fields |
Se asignó desde el registro de cambios |
NewEngineState", "PreviousEngineState", "HostVersion", "RunspaceId", "SequenceNumber", "EngineVersion" and "PipelineId |
additional.fields |
Se asignó desde el registro de cambios |
Payload |
security_result.detection_fields |
Se asignó desde el registro de cambios |
Script Name |
target.file.full_path |
Se asignó desde el registro de cambios |
SystemTime |
metadata.event_timestamp |
Se asignó desde el registro de cambios |
channel", "keywords", "MessageNumber", "MessageTotal", and "ScriptBlockId |
security_result.detection_fields |
Se asignó desde el registro de cambios |
System.ProviderName |
principal.resource.attribute.labels |
Se asignó desde el registro de cambios |
HostVersion", "RunspaceId", "PipelineId", "EngineVersion", "DetailSequence", "DetailTotal", "SequenceNumber", and "ScriptName |
additional.fields |
Se asignó desde el registro de cambios |
System.EventRecordID", "System.Task", "System.Keywords", "System.Opcode", and "System.ThreadID |
security.detection_fields |
Se asignó desde el registro de cambios |
EventLevelName |
security_result.severity |
Se asignó desde el registro de cambios |
ManagementGroupName", "Source", "TenantId |
additional_fields |
Se asignó desde el registro de cambios |
Registro de cambios
Consulta el registro de cambios de este analizador
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.