Recoger registros de acceso remoto seguro de BeyondTrust
En este documento se explica cómo recoger registros de BeyondTrust Secure Remote Access mediante Bindplane. El analizador controla dos formatos syslog. El primer formato usa pares clave-valor en un mensaje estructurado, mientras que el segundo usa campos delimitados por barras verticales. El analizador extrae los campos relevantes de ambos formatos y los asigna al UDM. También clasifica los tipos de eventos en función de las palabras clave extraídas y gestiona la lógica específica de los eventos de inicio y cierre de sesión, así como de los tipos de autenticación.
Antes de empezar
- Asegúrate de que tienes una instancia de Google Security Operations.
- Asegúrate de usar Windows 2016 o una versión posterior, o un host Linux con
systemd
. - Si se ejecuta a través de un proxy, asegúrate de que los puertos del cortafuegos estén abiertos.
- Asegúrate de tener acceso privilegiado a BeyondTrust Secure Remote Access.
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
Instalación de ventanas
- 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
Instalación de Linux
- Abre un terminal con privilegios de superusuario o sudo.
Ejecuta el siguiente comando:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
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
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: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <customer_id> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization ingestion_labels: log_type: BEYONDTRUST_REMOTE_ACCESS raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
Sustituye el puerto y la dirección IP según sea necesario en tu infraestructura.
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.
Reinicia el agente de Bindplane para aplicar los cambios
Para reiniciar el agente de Bindplane en Linux, ejecuta el siguiente comando:
sudo systemctl restart bindplane-agent
Para reiniciar el agente de Bindplane en Windows, puedes usar la consola Servicios o introducir el siguiente comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Configurar la asistencia remota de BeyondTrust
- Inicia sesión en la interfaz web de BeyondTrust.
- Selecciona Appliance > Seguridad > Administración de appliance.
- En la sección Syslog, haga lo siguiente:
- Formato de mensaje: selecciona Formato BSD antiguo.
- Servidor syslog remoto: introduce la dirección IP y el puerto de Bindplane.
- Haz clic en Enviar.
Tabla de asignación de UDM
Campo de registro | Asignación de UDM | Lógica |
---|---|---|
datetime |
metadata.event_timestamp |
La marca de tiempo se analiza a partir del campo datetime con el formato RFC3 339 si el campo when no está presente. |
deviceHost |
target.hostname |
El valor de deviceHost se asigna directamente a target.hostname . |
dstHost |
target.ip |
El valor de dstHost se asigna directamente a target.ip después de validarse como una dirección IP válida. |
dstPriv |
additional.fields.[key=dstPriv].value.string_value |
El valor de dstPriv se coloca en el campo additional con la clave dstPriv . |
dstUid |
target.user.userid |
El valor de dstUid se asigna directamente a target.user.userid . |
dstUser |
target.user.user_display_name |
El valor de dstUser se asigna directamente a target.user.user_display_name . |
eventName |
metadata.event_type |
Si eventName es login (sin distinguir entre mayúsculas y minúsculas), metadata.event_type se asigna a USER_LOGIN . Si eventName es logout (sin distinguir entre mayúsculas y minúsculas), metadata.event_type se asigna a USER_LOGOUT . De lo contrario, si eventName no está vacío, se le asigna el valor USER_UNCATEGORIZED a metadata.event_type . Si eventName está vacío y el mensaje coincide con el segundo patrón de grok, metadata.event_type se asigna a GENERIC_EVENT . Si eventName está vacío y el mensaje coincide con el primer patrón grok, metadata.event_type se asigna a GENERIC_EVENT . Si srcUid , userid o who no están vacíos, metadata.event_type se asigna a USER_CHANGE_PERMISSIONS . Si deviceHost o site no están vacíos, metadata.event_type se asigna a USER_UNCATEGORIZED . De lo contrario, metadata.event_type se asigna a GENERIC_EVENT . |
event_name |
additional.fields.[key=event_name].value.string_value |
El valor de event_name se coloca en el campo additional con la clave event_name . |
event_name |
metadata.product_event_type |
El valor de event_name se usa junto con el campo id para rellenar metadata.product_event_type con el formato [ id] - event_name``. |
externalKeyLabel |
additional.fields.[key=externalKeyLabel].value.string_value |
El valor de externalKeyLabel se coloca en el campo additional con la clave externalKeyLabel . |
id |
metadata.product_event_type |
El valor de id se usa junto con el campo event_name para rellenar metadata.product_event_type con el formato [ id] - event_name``. |
jumpGroupId |
additional.fields.[key=jumpGroupId].value.string_value |
El valor de jumpGroupId se coloca en el campo additional con la clave jumpGroupId . |
jumpGroupName |
additional.fields.[key=jumpGroupName].value.string_value |
El valor de jumpGroupName se coloca en el campo additional con la clave jumpGroupName . |
jumpGroupType |
additional.fields.[key=jumpGroupType].value.string_value |
El valor de jumpGroupType se coloca en el campo additional con la clave jumpGroupType . |
jumpointId |
additional.fields.[key=jumpointId].value.string_value |
El valor de jumpointId se coloca en el campo additional con la clave jumpointId . |
jumpointName |
additional.fields.[key=jumpointName].value.string_value |
El valor de jumpointName se coloca en el campo additional con la clave jumpointName . |
kv_data |
Varios campos de UDM | El campo kv_data se analiza en pares clave-valor, que se asignan a varios campos de UDM en función de sus claves (por ejemplo, eventName , when , who , who_ip , site , target , status , reason ). |
kvdata |
Varios campos de UDM | El campo kvdata se analiza en pares clave-valor, que se asignan a varios campos de UDM en función de sus claves (por ejemplo, msg , srcUser , srcUid , srcHost , dstUser , dstUid , dstHost , sessionId , jumpointId , jumpointName , jumpGroupId , jumpGroupName , jumpGroupType , externalKeyLabel , dstPriv ). |
message |
Varios campos de UDM | El campo message se analiza mediante patrones grok para extraer varios campos, que luego se asignan a campos de UDM. |
msg |
metadata.description |
El valor de msg se asigna directamente a metadata.description . |
product_event_type |
metadata.product_event_type |
El valor de product_event_type se asigna directamente a metadata.product_event_type . |
product_log_id |
metadata.product_log_id |
El valor de product_log_id se asigna directamente a metadata.product_log_id . |
process_id |
principal.process.pid |
El valor de process_id se asigna directamente a principal.process.pid . |
reason |
security_result.description |
El valor de reason se asigna directamente a security_result.description . |
segment_number |
additional.fields.[key=segment_number].value.string_value |
El valor de segment_number se coloca en el campo additional con la clave segment_number . |
sessionId |
network.session_id |
El valor de sessionId se asigna directamente a network.session_id . |
site |
target.hostname |
El valor de site se asigna directamente a target.hostname . |
site_id |
additional.fields.[key=site_id].value.string_value |
El valor de site_id se coloca en el campo additional con la clave site_id . |
srcHost |
principal.ip |
El valor de srcHost se asigna directamente a principal.ip después de validarse como una dirección IP válida. |
srcUid |
principal.user.userid |
El valor de srcUid se asigna directamente a principal.user.userid . |
srcUser |
principal.user.user_display_name |
El valor de srcUser se asigna directamente a principal.user.user_display_name . |
status |
security_result.action |
Si status es failure (sin distinguir entre mayúsculas y minúsculas), security_result.action se asigna a BLOCK . De lo contrario, security_result.action se asigna a ALLOW . |
status |
security_result.action_details |
El valor de status se asigna directamente a security_result.action_details . |
target |
target.application |
El valor de target se asigna directamente a target.application . rep_client se sustituye por Representative Console y web/login se sustituye por Web/Login . |
target |
extensions.auth.type |
Si target es rep_client , extensions.auth.type se define como MACHINE . Si target es web/login , extensions.auth.type se define como SSO . De lo contrario, extensions.auth.type se asigna a AUTHTYPE_UNSPECIFIED . |
timestamp |
metadata.event_timestamp |
El timestamp del registro sin procesar se usa como alternativa si no están presentes ni datetime ni when . |
total_segments |
additional.fields.[key=total_segments].value.string_value |
El valor de total_segments se coloca en el campo additional con la clave total_segments . |
device_product |
additional.fields.[key=device_product].value.string_value |
El valor de device_product se coloca en el campo additional con la clave device_product . |
device_vendor |
additional.fields.[key=device_vendor].value.string_value |
El valor de device_vendor se coloca en el campo additional con la clave device_vendor . |
device_version |
metadata.product_version |
El valor de device_version se asigna directamente a metadata.product_version . |
when |
metadata.event_timestamp |
La marca de tiempo se analiza a partir del campo when con el formato UNIX, si está presente. |
who |
principal.user.userid |
Si el campo who coincide con el patrón de regex, el userid extraído se asigna a principal.user.userid . De lo contrario, todo el campo who se asigna a principal.user.userid . |
who |
principal.user.user_display_name |
Si el campo who coincide con el patrón de regex, el user_display_name extraído se asigna a principal.user.user_display_name . |
who_ip |
principal.ip |
El valor de who_ip se asigna directamente a principal.ip . |
(Lógica del analizador) | metadata.log_type |
El tipo de registro es BEYONDTRUST_REMOTE_ACCESS . |
(Lógica del analizador) | metadata.product_name |
El nombre del producto es BeyondTrust Secure Remote Access . |
(Lógica del analizador) | metadata.vendor_name |
El nombre del proveedor es BeyondTrust . |
(Lógica del analizador) | security_result.summary |
El valor se obtiene mediante el formato User %{eventName} . |
(Lógica del analizador) | extensions.auth.mechanism |
Si method contiene using password , el mecanismo se define como USERNAME_PASSWORD . Si method contiene using elevate , el mecanismo se define como REMOTE . |
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.