Recopila registros de la asistencia remota de BeyondTrust
Este analizador controla los mensajes de syslog de la asistencia remota de BeyondTrust y los transforma en formato UDM. Procesa registros con formato CEF y no CEF, extrae campos, realiza transformaciones de datos y los asigna a los campos de UDM adecuados, incluidos los detalles de los resultados principales, de destino y de seguridad.
Antes de comenzar
- Asegúrate de tener una instancia de Google Security Operations.
- Asegúrate de usar Windows 2016 o una versión posterior, o un host de Linux con systemd.
- Si se ejecuta 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
- 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.
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
- Para la instalación de Windows, ejecuta la siguiente secuencia de comandos:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
- Para la instalación de Linux, ejecuta la siguiente secuencia de comandos:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
- Puedes encontrar opciones de instalación adicionales en esta guía de instalación.
Configura el agente de BindPlane para transferir Syslog y enviarlo a Google SecOps
- Accede a la máquina en la que está instalado BindPlane.
Edita el archivo
config.yaml
de la siguiente manera:receivers: tcplog: # Replace the below port <54525> and IP <0.0.0.0> with your specific values listen_address: "0.0.0.0:54525" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the creds location below according the placement of the credentials file you downloaded creds: '{ json file for creds }' # Replace <customer_id> below with your actual ID that you copied customer_id: <customer_id> endpoint: malachiteingestion-pa.googleapis.com # You can apply ingestion labels below as preferred ingestion_labels: log_type: SYSLOG namespace: BeyondTrust_Remote_Support raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - tcplog exporters: - chronicle/chronicle_w_labels
Reinicia el agente de BindPlane para aplicar los cambios:
sudo systemctl restart bindplane
Configura la exportación de Syslog desde la asistencia remota de BeyondTrust
- Accede a la asistencia remota de BeyondTrust.
- Ve a Seguridad > Administración de dispositivos.
- Ve a la sección Syslog y establece los siguientes valores:
- Servidor syslog remoto: Ingresa el nombre de host o la dirección IP del servidor host de syslog (Bindplane). En este campo, puedes agregar hasta tres servidores syslog.
- Formato de mensaje: Selecciona RFC 5424.
- Puerto: Ingresa el puerto del servidor host de syslog (Bindplane).
- Haz clic en Enviar.
Asignación de UDM
Campo de registro | Asignación de UDM | Lógica |
---|---|---|
account:expiration | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "account:expiration" en el registro sin procesar. |
account:email:locale | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "account:email:locale" en el registro sin procesar. |
command_shell_is_whitelist | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "ssions:command_shell_is_whitelist" en el registro sin procesar. |
fecha y hora | read_only_udm.metadata.event_timestamp.seconds | El valor se analiza del campo "datetime" en el registro sin procesar y se convierte en una marca de tiempo de Unix. |
dtPostTime | read_only_udm.metadata.event_timestamp.seconds | El valor se analiza del campo "dtPostTime" en el registro sin procesar y se convierte en una marca de tiempo Unix. |
evento | read_only_udm.metadata.product_event_type | El valor se toma del campo "event" en el registro sin procesar. |
host | read_only_udm.principal.hostname | El valor se toma del campo "host" en el registro sin procesar. |
id | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "id" en el registro sin procesar. |
license_pool:id | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "license_pool:id" en el registro sin procesar. |
login_schedule:timezone | read_only_udm.target.location.country_or_region | El valor se toma del campo "login_schedule:timezone" en el registro sin procesar. |
old_account:email:address | read_only_udm.target.user.email_addresses | El valor se toma del campo "old_account:email:address" en el registro sin procesar. |
old_account:failed_logins | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_account:failed_logins" en el registro sin procesar. |
old_display_number | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_display_number" en el registro sin procesar. |
old_login_schedule:timezone | read_only_udm.target.location.country_or_region | El valor se toma del campo "old_login_schedule:timezone" en el registro sin procesar. |
old_permissions:api:reporting | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:api:reporting" en el registro sin procesar. |
old_permissions:jump_item_role:default:id | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:jump_item_role:default:id" en el registro sin procesar. |
old_permissions:jump_item_role:default:name | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:jump_item_role:default:name" en el registro sin procesar. |
old_permissions:jump_item_role:teams:id | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:jump_item_role:teams:id" en el registro sin procesar. |
old_permissions:jump_item_role:teams:name | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:jump_item_role:teams:name" en el registro sin procesar. |
old_permissions:presentations:control:status | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:presentations:control:status" en el registro sin procesar. |
old_permissions:public_sites:templates:status | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:public_sites:templates:status" en el registro sin procesar. |
old_permissions:reporting:presentation_reports | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:reporting:presentation_reports" en el registro sin procesar. |
old_permissions:reporting:support_reports | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:reporting:support_reports" en el registro sin procesar. |
old_permissions:reporting:vault_reports | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:reporting:vault_reports" en el registro sin procesar. |
old_permissions:support | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support" en el registro sin procesar. |
old_permissions:support:accept_team_sessions:status | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:accept_team_sessions:status" en el registro sin procesar. |
old_permissions:support:bomgar_button:change_public_sites:status | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:bomgar_button:change_public_sites:status" en el registro sin procesar. |
old_permissions:support:bomgar_button:personal:deploy:status | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:bomgar_button:personal:deploy:status" en el registro sin procesar. |
old_permissions:support:bomgar_button:team:manage | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:bomgar_button:team:manage" en el registro sin procesar. |
old_permissions:support:bomgar_button:team:manage:status | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:bomgar_button:team:manage:status" en el registro sin procesar. |
old_permissions:support:ios_content | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:ios_content" en el registro sin procesar. |
old_permissions:support:jump:local | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:jump:local" en el registro sin procesar. |
old_permissions:support:jump:local:status | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:jump:local:status" en el registro sin procesar. |
old_permissions:support:jump:remote | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:jump:remote" en el registro sin procesar. |
old_permissions:support:jump:remote:status | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:jump:remote:status" en el registro sin procesar. |
old_permissions:support:rdp:local | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:rdp:local" en el registro sin procesar. |
old_permissions:support:rdp:local:status | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:rdp:local:status" en el registro sin procesar. |
old_permissions:support:rdp:remote | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:rdp:remote" en el registro sin procesar. |
old_permissions:support:rdp:remote:status | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:rdp:remote:status" en el registro sin procesar. |
old_permissions:support:session_assignment:idle_timeout | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:session_assignment:idle_timeout" en el registro sin procesar. |
old_permissions:support:session_assignment:idle_timeout:status | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:session_assignment:idle_timeout:status" en el registro sin procesar. |
old_permissions:support:session_assignment:session_limit | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:session_assignment:session_limit" en el registro sin procesar. |
old_permissions:support:session_assignment:session_limit:status=forbid_override | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:session_assignment:session_limit:status=forbid_override" en el registro sin procesar. |
old_permissions:support:session_keys | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:session_keys" en el registro sin procesar. |
old_permissions:support:status | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:status" en el registro sin procesar. |
old_permissions:support:team_share | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:team_share" en el registro sin procesar. |
old_permissions:support:team_transfer | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:team_transfer" en el registro sin procesar. |
old_permissions:support:vnc:local | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:vnc:local" en el registro sin procesar. |
old_permissions:support:vnc:local:status | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:vnc:local:status" en el registro sin procesar. |
old_permissions:support:vnc:remote | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:vnc:remote" en el registro sin procesar. |
old_permissions:support:vnc:remote:status | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_permissions:support:vnc:remote:status" en el registro sin procesar. |
old_private_display_name | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_private_display_name" en el registro sin procesar. |
old_provider:id | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_provider:id" en el registro sin procesar. |
old_provider:name | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "old_provider:name" en el registro sin procesar. |
permissions:jump_item_role:default:id | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "permissions:jump_item_role:default:id" en el registro sin procesar. |
permissions:jump_item_role:default:name | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "permissions:jump_item_role:default:name" en el registro sin procesar. |
permissions:jump_item_role:teams:id | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "permissions:jump_item_role:teams:id" en el registro sin procesar. |
permissions:jump_item_role:teams:name | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "permissions:jump_item_role:teams:name" en el registro sin procesar. |
provider:id | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "provider:id" en el registro sin procesar. |
provider:name | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "provider:name" en el registro sin procesar. |
Reason | read_only_udm.security_result.description | El valor se toma del campo "reason" en el registro sin procesar y se agrega al campo de descripción con el prefijo " - Reason:". |
sEventID | read_only_udm.metadata.product_event_type | El valor se toma del campo "sEventID" en el registro sin procesar. |
sIpAddress | read_only_udm.principal.ip | El valor se toma del campo "sIpAddress" en el registro sin procesar. |
sLoginName | read_only_udm.principal.user.userid | El valor se analiza del campo "sLoginName" en el registro sin procesar. Si el campo contiene un dominio, este se extrae y se asigna a read_only_udm.principal.namespace. |
sMessage | read_only_udm.security_result.description | El valor se toma del campo "sMessage" en el registro sin procesar. El analizador extrae el texto entre comillas y lo asigna al campo de descripción. |
sOriginatingAccount | read_only_udm.principal.user.userid | El valor se analiza del campo "sOriginatingAccount" en el registro sin procesar. Si el campo contiene un dominio, este se extrae y se asigna a read_only_udm.principal.namespace. |
sOriginatingApplicationComponent | read_only_udm.principal.application | El valor se toma del campo "sOriginatingApplicationComponent" en el registro sin procesar y se agrega al campo de la aplicación entre paréntesis después del valor de sOriginatingApplicationName. |
sOriginatingApplicationName | read_only_udm.principal.application | El valor se toma del campo "sOriginatingApplicationName" en el registro sin procesar. |
sOriginatingSystem | read_only_udm.principal.hostname | El valor se toma del campo "sOriginatingSystem" en el registro sin procesar. |
session_policy:id | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "session_policy:id" en el registro sin procesar. |
session_policy:name | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "session_policy:name" en el registro sin procesar. |
session_policy:purpose | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "session_policy:purpose" en el registro sin procesar. |
sitio | read_only_udm.target.hostname | El valor se toma del campo "sitio" en el registro sin procesar. |
estado | read_only_udm.security_result.summary | El valor se toma del campo "estado" en el registro sin procesar y se agrega al campo de resumen. |
support:jump:local | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:jump:local" en el registro sin procesar. |
support:permissions:allow_pinned_clients | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:allow_pinned_clients" en el registro sin procesar. |
support:permissions:allow_users | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:allow_users" en el registro sin procesar. |
support:permissions:canned_scripts | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:canned_scripts" en el registro sin procesar. |
support:permissions:chat | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:chat" en el registro sin procesar. |
support:permissions:chat:push_url | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:chat:push_url" en el registro sin procesar. |
support:permissions:chat:send_file | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:chat:send_file" en el registro sin procesar. |
support:permissions:command_shell | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:command_shell" en el registro sin procesar. |
support:permissions:deploy_callback_button | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:deploy_callback_button" en el registro sin procesar. |
support:permissions:elevation | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:elevation" en el registro sin procesar. |
support:permissions:file_transfers:cust | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:file_transfers:cust" en el registro sin procesar. |
support:permissions:file_transfers:download | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:file_transfers:download" en el registro sin procesar. |
support:permissions:file_transfers:rep | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:file_transfers:rep" en el registro sin procesar. |
support:permissions:file_transfers:upload | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:file_transfers:upload" en el registro sin procesar. |
support:permissions:registry_access | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:registry_access" en el registro sin procesar. |
support:permissions:request_pin_unpin | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:request_pin_unpin" en el registro sin procesar. |
support:permissions:screen_sharing | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:screen_sharing" en el registro sin procesar. |
support:permissions:screen_sharing:allow_elevated_tools | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:screen_sharing:allow_elevated_tools" en el registro sin procesar. |
support:permissions:screen_sharing:annotations | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:screen_sharing:annotations" en el registro sin procesar. |
support:permissions:screen_sharing:application_restriction | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:screen_sharing:application_restriction" en el registro sin procesar. |
support:permissions:screen_sharing:application_sharing | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:screen_sharing:application_sharing" en el registro sin procesar. |
support:permissions:screen_sharing:clipboard_direction | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:screen_sharing:clipboard_direction" en el registro sin procesar. |
support:permissions:screen_sharing:cobrowse | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:screen_sharing:cobrowse" en el registro sin procesar. |
support:permissions:screen_sharing:privacy_mode | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:screen_sharing:privacy_mode" en el registro sin procesar. |
support:permissions:screen_sharing:show_screen | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:screen_sharing:show_screen" en el registro sin procesar. |
support:permissions:system_info | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:system_info" en el registro sin procesar. |
support:permissions:system_info:actions | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:permissions:system_info:actions" en el registro sin procesar. |
support:prompting:command_shell | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:prompting:command_shell" en el registro sin procesar. |
support:prompting:default | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:prompting:default" en el registro sin procesar. |
support:prompting:deploy_callback_button | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:prompting:deploy_callback_button" en el registro sin procesar. |
support:prompting:elevate | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:prompting:elevate" en el registro sin procesar. |
support:prompting:file_transfer | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:prompting:file_transfer" en el registro sin procesar. |
support:prompting:registry | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:prompting:registry" en el registro sin procesar. |
support:prompting:screen_sharing:cobrowse | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:prompting:screen_sharing:cobrowse" en el registro sin procesar. |
support:prompting:screen_sharing:full_access | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "support:prompting:screen_sharing:full_access" en el registro sin procesar. |
objetivo | read_only_udm.target.application | El valor se toma del campo "target" en el registro sin procesar. El analizador reemplaza "rep_client" por "Representative Console" y "web/login" por "Web/Login". |
two_factor_auth:app | read_only_udm.principal.user.attribute.labels.value | El valor se toma del campo "two_factor_auth:app" en el registro sin procesar. |
cuando | read_only_udm.metadata.product_log_id | El valor se toma del campo "when" en el registro sin procesar. |
cuando | read_only_udm.metadata.event_timestamp.seconds | El valor se analiza del campo "when" en el registro sin procesar y se convierte en una marca de tiempo Unix. |
quién | read_only_udm.principal.user.userid | El valor se analiza del campo "who" en el registro sin procesar. El analizador extrae el texto dentro de los paréntesis. |
quién | read_only_udm.principal.user.user_display_name | El valor se analiza del campo "who" en el registro sin procesar. El analizador extrae el texto antes de los paréntesis. |
who_ip | read_only_udm.principal.ip | El valor se toma del campo "who_ip" en el registro sin procesar. |
read_only_udm.metadata.vendor_name | El analizador establece el valor en "BeyondTrust". | |
read_only_udm.metadata.product_name | El analizador establece el valor en "BeyondTrust Remote Support". | |
read_only_udm.metadata.log_type | El analizador establece el valor en "BOMGAR". | |
read_only_udm.extensions.auth.type | El valor se establece en "MACHINE" si el objetivo es "rep_client", en "SSO" si el objetivo es "web/login" y en "AUTHTYPE_UNSPECIFIED" en caso contrario. | |
read_only_udm.extensions.auth.mechanism | El valor se establece en "USERNAME_PASSWORD" si el método es "using password", en "REMOTE" si el método es "using elevate" y se deja vacío en caso contrario por el analizador. | |
read_only_udm.security_result.action | El valor se establece en "ALLOW" si el estado no es "failure", el motivo no es "failed" o "user not found", y el sMessage no contiene "failed login to web app". De lo contrario, el analizador establece el valor en "BLOCK". | |
read_only_udm.security_result.summary | El valor se establece en "Acceso del usuario " o "Salida del usuario " según el nombre del evento, seguido del estado si el analizador no lo deja vacío. | |
read_only_udm.security_result.description | El valor se establece en "Usuario ", seguido del ID de usuario, la dirección IP, el estado, el nombre del evento, el conector ("a" para el acceso y "de" para el cierre de sesión), el objetivo y el método. Si el motivo no está vacío y no es “error”, el analizador lo agrega a la descripción con el prefijo “ - Reason:”. |
Cambios
2024-01-12
- Se mejoró el manejo de los eventos de estado "challenge".
- Se mejoró la asignación de direcciones de correo electrónico para mayor precisión.
2022-11-24
- Se corrigió un error en el análisis de la información del usuario, como el nombre visible, el ID y el método.
- Se mejoró la precisión de la clasificación del tipo de autenticación para los eventos de acceso de los usuarios.
2022-10-13
- Se integró un analizador específico del cliente en el analizador predeterminado para una mayor aplicabilidad.
2022-09-26
- Se integró un analizador específico del cliente en el analizador predeterminado para una mayor aplicabilidad.
2022-08-19
- Se consolidaron los analizadores personalizados en el analizador predeterminado para mejorar el rendimiento y la capacidad de mantenimiento.