Recopila registros de auditoría de HashiCorp
Este analizador procesa los registros de auditoría de HashiCorp en formatos JSON, Syslog o combinados. Extrae campos, realiza el análisis de Grok y de KV para los mensajes estándar y de tipo "ejecutor", controla las cargas útiles de JSON y asigna los datos extraídos al UDM. El analizador también incluye el manejo de errores y el descarte de registros con formato incorrecto.
Antes de comenzar
- Asegúrate de tener una instancia de Google Security Operations.
- Asegúrate de tener un host de Windows 2016 o posterior, o bien un host de Linux con systemd.
- Si ejecutas la herramienta detrás de un proxy, asegúrate de que los puertos del firewall estén abiertos.
- Asegúrate de tener acceso con privilegios a HCP.
Obtén el archivo de autenticación de transferencia de Google SecOps
- Accede a la consola de Google SecOps.
- Ve a SIEM Settings > Collection Agents.
- 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 del 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 en 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 en 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 que ingiera Syslog y lo envíe a Google SecOps
- Accede a la máquina en la que está instalado el agente de BindPlane.
Edita el archivo
config.yaml
de la siguiente manera:receivers: udplog: # 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: auditd raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
Reinicia el agente de Bindplane para aplicar los cambios:
sudo systemctl restart bindplane
Habilita Syslog para HCP Vault
- Accede al HCP Portal.
- Ve a Vault Clusters.
- Selecciona tu clúster de Vault en la lista de clústeres implementados.
- En Cluster Overview, busca y copia la dirección de Vault (por ejemplo, https://vault-cluster-name.hashicorpcloud.com:8200).
- Ve a la sección Detalles de acceso y copia el token raíz.
Instala la CLI de Vault
Para Linux:
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list sudo apt update && sudo apt install vault
Para macOS (con Homebrew):
brew tap hashicorp/tap brew install hashicorp/tap/vault
Para Windows:
Download the executable file. Extract it and add the Vault binary to your system's PATH.
Para verificar la instalación de la CLI de Vault, ejecuta el siguiente comando:
vault --version
Configura HCP Vault con la CLI para enviar registros de auditoría a Bindplane
- Abre la terminal o el símbolo del sistema.
Configura la dirección del servidor de Vault con la variable de entorno:
export VAULT_ADDR="https://vault-cluster-name.hashicorpcloud.com:8200"
Accede a Vault con el token raíz:
vault login <root-token>
Configura la ruta de Syslog en un socket de Syslog externo
Ejecuta el siguiente comando para habilitar syslog y enviarlo al agente de Bindplane:
vault audit enable socket address="udp://<bindplane-ip>:<bindplane-port>" socket_type="udp" tag="vault"
Confirma la configuración nueva:
vault audit list
El resultado debe mostrar la nueva configuración del socket.
Opcional: Automatiza la configuración con Terraform:
- Crea un archivo de configuración de Terraform (audit.tf):
resource "vault_audit" "syslog" { type = "syslog" description = "Syslog audit logs" options = { tag = "vault" facility = "LOCAL0" } } resource "vault_audit" "socket" { type = "socket" description = "Remote syslog socket" options = { address = "udp://<syslog-server-ip>:514" socket_type = "udp" tag = "vault" } }
- Aplica la configuración:
terraform init terraform apply
No se reciben los registros de solución de problemas
Verifica que se pueda acceder al servidor syslog:
ping <syslog-server-ip>
Tabla de asignación de UDM
Campo de registro | Asignación de UDM | Lógica |
---|---|---|
auth.accessor |
security_result.about.resource.attribute.labels.value |
El valor de auth.accessor del registro sin procesar se asigna a una etiqueta con la clave "auth_accessor" en security_result.about.resource.attribute.labels en el UDM. |
auth.client_token |
security_result.about.resource.attribute.labels.value |
El valor de auth.client_token del registro sin procesar se asigna a una etiqueta con la clave "auth_client_token" en security_result.about.resource.attribute.labels en el UDM. |
auth.display_name |
target.user.user_display_name |
El valor de auth.display_name del registro sin procesar se asigna a target.user.user_display_name en el UDM. |
auth.entity_id |
target.resource.product_object_id |
El valor de auth.entity_id del registro sin procesar se asigna a target.resource.product_object_id en el UDM. |
auth.metadata.account_id |
target.user.userid |
El valor de auth.metadata.account_id del registro sin procesar se asigna a target.user.userid en el UDM. |
auth.metadata.auth_type |
security_result.about.resource.attribute.labels.value |
El valor de auth.metadata.auth_type del registro sin procesar se asigna a una etiqueta con la clave "auth_type" en security_result.about.resource.attribute.labels en el UDM. |
auth.metadata.role_id |
security_result.about.resource.attribute.labels.value |
El valor de auth.metadata.role_id del registro sin procesar se asigna a una etiqueta con la clave "role_id" en security_result.about.resource.attribute.labels en el UDM. |
auth.metadata.role_name |
target.resource.attribute.roles.name |
El valor de auth.metadata.role_name del registro sin procesar se asigna a target.resource.attribute.roles.name en el UDM. |
auth.token_ttl |
security_result.about.resource.attribute.labels.value |
El valor de auth.token_ttl del registro sin procesar se asigna a una etiqueta con la clave "auth_token_ttl" en security_result.about.resource.attribute.labels en el UDM. |
auth.token_type |
security_result.about.resource.attribute.labels.value |
El valor de auth.token_type del registro sin procesar se asigna a una etiqueta con la clave "auth_token_type" en security_result.about.resource.attribute.labels en el UDM. |
cluster |
observer.resource.name |
El valor de cluster del registro sin procesar se asigna a observer.resource.name en el UDM. |
error |
security_result.description |
El valor de error del registro sin procesar se asigna a security_result.description en el UDM. |
headers.accept |
security_result.about.resource.attribute.labels.value |
El valor de headers.accept del registro sin procesar se asigna a una etiqueta con la clave "httpHeaders accept" en security_result.about.resource.attribute.labels en el UDM. |
headers.httpHeaders.cache-control |
additional.fields.value.string_value |
El valor de headers.httpHeaders.cache-control del registro sin procesar se asigna a un campo con la clave "httpHeaders cache control" en additional.fields en el UDM. |
headers.snyk-acting-org-public-id |
principal.resource.attribute.labels.value |
El valor de headers.snyk-acting-org-public-id del registro sin procesar se asigna a una etiqueta con la clave "snyk-acting-org-public-id" en principal.resource.attribute.labels en el UDM. |
headers.snyk-flow-name |
principal.resource.attribute.labels.value |
El valor de headers.snyk-flow-name del registro sin procesar se asigna a una etiqueta con la clave "snyk-flow-name" en principal.resource.attribute.labels en el UDM. |
headers.snyk-request-id |
principal.resource.attribute.labels.value |
El valor de headers.snyk-request-id del registro sin procesar se asigna a una etiqueta con la clave "snyk-request-id" en principal.resource.attribute.labels en el UDM. |
headers.user-agent |
network.http.parsed_user_agent |
El valor de headers.user-agent del registro sin procesar se analiza como un agente de usuario y se asigna a network.http.parsed_user_agent en el UDM. |
headers.x-forwarded-host |
principal.hostname |
El valor de headers.x-forwarded-host del registro sin procesar se asigna a principal.hostname en el UDM. |
headers.x-forwarded-port |
principal.port |
El valor de headers.x-forwarded-port del registro sin procesar se asigna a principal.port en el UDM. |
headers.x-real-ip |
principal.ip |
El valor de headers.x-real-ip del registro sin procesar se asigna a principal.ip en el UDM. |
hostname |
observer.hostname |
El valor de hostname del registro sin procesar se asigna a observer.hostname en el UDM. |
httpHeaders.cf-cache-status |
target.resource.attribute.labels.value |
El valor de httpHeaders.cf-cache-status del registro sin procesar se asigna a una etiqueta con la clave "cf-cache-status" en target.resource.attribute.labels en el UDM. |
httpHeaders.cf-ray |
target.resource.attribute.labels.value |
El valor de httpHeaders.cf-ray del registro sin procesar se asigna a una etiqueta con la clave "cf-ray" en target.resource.attribute.labels en el UDM. |
httpHeaders.content-length |
security_result.about.resource.attribute.labels.value |
El valor de httpHeaders.content-length del registro sin procesar se asigna a una etiqueta con la clave "httpHeaders Content-Length" en security_result.about.resource.attribute.labels en el UDM. |
httpHeaders.content-type |
security_result.about.resource.attribute.labels.value |
El valor de httpHeaders.content-type del registro sin procesar se asigna a una etiqueta con la clave "httpHeaders Content-Type" en security_result.about.resource.attribute.labels en el UDM. |
httpHeaders.gitlab-lb |
target.resource.attribute.labels.value |
El valor de httpHeaders.gitlab-lb del registro sin procesar se asigna a una etiqueta con la clave "gitlab-lb" en target.resource.attribute.labels en el UDM. |
httpHeaders.gitlab-sv |
target.resource.attribute.labels.value |
El valor de httpHeaders.gitlab-sv del registro sin procesar se asigna a una etiqueta con la clave "gitlab-sv" en target.resource.attribute.labels en el UDM. |
httpHeaders.ratelimit-limit |
target.resource.attribute.labels.value |
El valor de httpHeaders.ratelimit-limit del registro sin procesar se asigna a una etiqueta con la clave "ratelimit-limit" en target.resource.attribute.labels en el UDM. |
httpHeaders.ratelimit-observed |
target.resource.attribute.labels.value |
El valor de httpHeaders.ratelimit-observed del registro sin procesar se asigna a una etiqueta con la clave "ratelimit-observed" en target.resource.attribute.labels en el UDM. |
httpHeaders.ratelimit-remaining |
target.resource.attribute.labels.value |
El valor de httpHeaders.ratelimit-remaining del registro sin procesar se asigna a una etiqueta con la clave "ratelimit-remaining" en target.resource.attribute.labels en el UDM. |
httpHeaders.ratelimit-reset |
target.resource.attribute.labels.value |
El valor de httpHeaders.ratelimit-reset del registro sin procesar se asigna a una etiqueta con la clave "ratelimit-reset" en target.resource.attribute.labels en el UDM. |
httpHeaders.ratelimit-resettime |
target.resource.attribute.labels.value |
El valor de httpHeaders.ratelimit-resettime del registro sin procesar se asigna a una etiqueta con la clave "ratelimit-resettime" en target.resource.attribute.labels en el UDM. |
httpHeaders.referrer-policy |
target.resource.attribute.labels.value |
El valor de httpHeaders.referrer-policy del registro sin procesar se asigna a una etiqueta con la clave "referrer-policy" en target.resource.attribute.labels en el UDM. |
httpHeaders.server |
target.resource.attribute.labels.value |
El valor de httpHeaders.server del registro sin procesar se asigna a una etiqueta con la clave "server" en target.resource.attribute.labels en el UDM. |
httpHeaders.x-content-type-options |
target.resource.attribute.labels.value |
El valor de httpHeaders.x-content-type-options del registro sin procesar se asigna a una etiqueta con la clave "x-content-type-options" en target.resource.attribute.labels en el UDM. |
httpHeaders.x-frame-options |
target.resource.attribute.labels.value |
El valor de httpHeaders.x-frame-options del registro sin procesar se asigna a una etiqueta con la clave "x-frame-options" en target.resource.attribute.labels en el UDM. |
httpHeaders.x-request-id |
target.resource.attribute.labels.value |
El valor de httpHeaders.x-request-id del registro sin procesar se asigna a una etiqueta con la clave "x-request-id" en target.resource.attribute.labels en el UDM. |
httpStatus |
network.http.response_code |
El valor de httpStatus del registro sin procesar se asigna a network.http.response_code en el UDM. |
httpUrl |
target.url |
El valor de httpUrl del registro sin procesar se asigna a target.url en el UDM. |
insertId |
metadata.product_log_id |
El valor de insertId del registro sin procesar se asigna a metadata.product_log_id en el UDM. |
job |
additional.fields.value.string_value |
El valor de job del registro sin procesar se asigna a un campo con la clave "job id" en additional.fields en el UDM. |
job_status |
additional.fields.value.string_value |
El valor de job_status del registro sin procesar se asigna a un campo con la clave "job_status" en additional.fields en el UDM. |
labels.compute.googleapis.com/resource_name |
target.resource.name |
El valor de labels.compute.googleapis.com/resource_name del registro sin procesar se asigna a target.resource.name en el UDM. |
labels.k8s-pod/app_kubernetes_io/instance |
target.resource.attribute.labels.value |
El valor de labels.k8s-pod/app_kubernetes_io/instance del registro sin procesar se asigna a una etiqueta con la clave "Instancia de E/S de Kubernetes" en target.resource.attribute.labels en el UDM. |
labels.k8s-pod/app_kubernetes_io/name |
target.resource.attribute.labels.value |
El valor de labels.k8s-pod/app_kubernetes_io/name del registro sin procesar se asigna a una etiqueta con la clave "Nombre de instancia de Kubernetes IO" en target.resource.attribute.labels en el UDM. |
labels.k8s-pod/component |
target.resource.attribute.labels.value |
El valor de labels.k8s-pod/component del registro sin procesar se asigna a una etiqueta con la clave "component" en target.resource.attribute.labels en el UDM. |
labels.k8s-pod/controller-revision-hash |
target.resource.attribute.labels.value |
El valor de labels.k8s-pod/controller-revision-hash del registro sin procesar se asigna a una etiqueta con la clave "Hash de revisión del controlador" en target.resource.attribute.labels en el UDM. |
labels.k8s-pod/helm_sh/chart |
target.resource.attribute.labels.value |
El valor de labels.k8s-pod/helm_sh/chart del registro sin procesar se asigna a una etiqueta con la clave "Kubernetes IO Instance Manager SH" en target.resource.attribute.labels en el UDM. |
labels.k8s-pod/vault-active |
target.resource.attribute.labels.value |
El valor de labels.k8s-pod/vault-active del registro sin procesar se asigna a una etiqueta con la clave "Vault active" en target.resource.attribute.labels en el UDM. |
labels.k8s-pod/vault-initialized |
target.resource.attribute.labels.value |
El valor de labels.k8s-pod/vault-initialized del registro sin procesar se asigna a una etiqueta con la clave "Vault initialized" en target.resource.attribute.labels en el UDM. |
labels.k8s-pod/vault-perf-standby |
target.resource.attribute.labels.value |
El valor de labels.k8s-pod/vault-perf-standby del registro sin procesar se asigna a una etiqueta con la clave "vault perf standby" en target.resource.attribute.labels en el UDM. |
labels.k8s-pod/vault-sealed |
target.resource.attribute.labels.value |
El valor de labels.k8s-pod/vault-sealed del registro sin procesar se asigna a una etiqueta con la clave "Vault sealed" en target.resource.attribute.labels en el UDM. |
labels.k8s-pod/vault-version |
target.resource.attribute.labels.value |
El valor de labels.k8s-pod/vault-version del registro sin procesar se asigna a una etiqueta con la clave "Versión de Vault" en target.resource.attribute.labels en el UDM. |
maskedToken |
security_result.about.resource.attribute.labels.value |
El valor de maskedToken del registro sin procesar se asigna a una etiqueta con la clave "maskedToken" en security_result.about.resource.attribute.labels en el UDM. |
method |
network.http.method , operation |
El valor de method del registro sin procesar se asigna a operation . Si operation no está vacío, network.application_protocol se establece en "HTTP". network.http.method se deriva en función del valor de operation . |
msg |
metadata.description |
El valor de msg del registro sin procesar se asigna a metadata.description en el UDM. |
pid |
target.process.pid |
El valor de pid del registro sin procesar se asigna a target.process.pid en el UDM. |
request.client_token |
target.resource.attribute.labels.value |
El valor de request.client_token del registro sin procesar se asigna a una etiqueta con la clave "request_client_token" en target.resource.attribute.labels en el UDM. |
request.client_token_accessor |
target.resource.attribute.labels.value |
El valor de request.client_token_accessor del registro sin procesar se asigna a una etiqueta con la clave "request_client_token_accessor" en target.resource.attribute.labels en el UDM. |
request.data.role_id |
target.resource.attribute.labels.value |
El valor de request.data.role_id del registro sin procesar se asigna a una etiqueta con la clave "request_data_role_id" en target.resource.attribute.labels en el UDM. |
request.data.secret_id |
target.resource.attribute.labels.value |
El valor de request.data.secret_id del registro sin procesar se asigna a una etiqueta con la clave "request_data_secret_id" en target.resource.attribute.labels en el UDM. |
request.id |
network.session_id |
El valor de request.id del registro sin procesar se asigna a network.session_id en el UDM. |
request.mount_accessor |
target.resource.attribute.labels.value |
El valor de request.mount_accessor del registro sin procesar se asigna a una etiqueta con la clave "request_mount_accessor" en target.resource.attribute.labels en el UDM. |
request.mount_type |
target.resource.attribute.labels.value |
El valor de request.mount_type del registro sin procesar se asigna a una etiqueta con la clave "request_mount_type" en target.resource.attribute.labels en el UDM. |
request.namespace.id |
target.namespace |
El valor de request.namespace.id del registro sin procesar se asigna a target.namespace en el UDM. |
request.operation |
target.resource.attribute.labels.value , network.http.method , operation |
El valor de request.operation del registro sin procesar se asigna a operation . Si operation no está vacío, network.application_protocol se establece en "HTTP". network.http.method se deriva en función del valor de operation . El valor de request.operation también se asigna a una etiqueta con la clave "capabilities" en target.resource.attribute.labels en el UDM. |
request.path |
target.url |
El valor de request.path del registro sin procesar se asigna a target.url en el UDM. |
request.remote_address |
principal.ip |
El valor de request.remote_address del registro sin procesar se asigna a principal.ip en el UDM. |
request.remote_port |
principal.port |
El valor de request.remote_port del registro sin procesar se asigna a principal.port en el UDM. |
request.wrap_ttl |
target.resource.attribute.labels.value |
El valor de request.wrap_ttl del registro sin procesar se asigna a una etiqueta con la clave "request_wrap_ttl" en target.resource.attribute.labels en el UDM. |
resource.labels.container_name |
additional.fields.value.string_value |
El valor de resource.labels.container_name del registro sin procesar se asigna a un campo con la clave "nombre del contenedor" en additional.fields en el UDM. |
resource.labels.location |
target.location.name |
El valor de resource.labels.location del registro sin procesar se asigna a target.location.name en el UDM. |
resource.labels.namespace_name |
target.namespace |
El valor de resource.labels.namespace_name del registro sin procesar se asigna a target.namespace en el UDM. |
resource.labels.pod_name |
additional.fields.value.string_value |
El valor de resource.labels.pod_name del registro sin procesar se asigna a un campo con la clave "pod_name" en additional.fields en el UDM. |
resource.labels.project_id |
target.cloud.project.name |
El valor de resource.labels.project_id del registro sin procesar se asigna a target.cloud.project.name en el UDM. |
response.data.num_uses |
target.resource.attribute.labels.value |
El valor de response.data.num_uses del registro sin procesar se asigna a una etiqueta con la clave "response_data_num_uses" en target.resource.attribute.labels en el UDM. |
response.data.orphan |
target.resource.attribute.labels.value |
El valor de response.data.orphan del registro sin procesar se asigna a una etiqueta con la clave "response_data_orphan" en target.resource.attribute.labels en el UDM. |
response.data.renewable |
target.resource.attribute.labels.value |
El valor de response.data.renewable del registro sin procesar se asigna a una etiqueta con la clave "response_data_renewable" en target.resource.attribute.labels en el UDM. |
response.data.ttl |
target.resource.attribute.labels.value |
El valor de response.data.ttl del registro sin procesar se asigna a una etiqueta con la clave "response_data_ttl" en target.resource.attribute.labels en el UDM. |
response.wrap_info.accessor |
target.resource.attribute.labels.value |
El valor de response.wrap_info.accessor del registro sin procesar se asigna a una etiqueta con la clave "response_wrap_info_accessor" en target.resource.attribute.labels en el UDM. |
response.wrap_info.token |
target.resource.attribute.labels.value |
El valor de response.wrap_info.token del registro sin procesar se asigna a una etiqueta con la clave "response_wrap_info_token" en target.resource.attribute.labels en el UDM. |
response.wrap_info.ttl |
target.resource.attribute.labels.value |
El valor de response.wrap_info.ttl del registro sin procesar se asigna a una etiqueta con la clave "response_wrap_info_ttl" en target.resource.attribute.labels en el UDM. |
response.wrap_info.wrapped_accessor |
target.resource.attribute.labels.value |
El valor de response.wrap_info.wrapped_accessor del registro sin procesar se asigna a una etiqueta con la clave "response_wrap_info_wrapped_accessor" en target.resource.attribute.labels en el UDM. |
runner |
principal.user.userid |
El valor de runner del registro sin procesar se asigna a principal.user.userid en el UDM. |
status |
network.http.response_code |
El valor de status del registro sin procesar se asigna a network.http.response_code en el UDM. |
streamingID |
target.resource.attribute.labels.value |
El valor de streamingID del registro sin procesar se asigna a una etiqueta con la clave "streamingID" en target.resource.attribute.labels en el UDM. |
time |
metadata.event_timestamp.seconds , metadata.event_timestamp.nanos |
El valor de time del registro sin procesar se analiza y se usa para completar el campo metadata.event_timestamp en el UDM. |
type |
metadata.product_event_type |
El valor de type del registro sin procesar se asigna a metadata.product_event_type en el UDM. |
url |
principal.url |
El valor de url del registro sin procesar se asigna a principal.url en el UDM. El valor "MACHINE" se asigna a extensions.auth.type en el UDM. El valor "USER_LOGIN" se asigna a metadata.event_type en el UDM. El valor "HASHICORP" se asigna a metadata.log_type en el UDM. El valor "HASHICORP" se asigna a metadata.product_name en el UDM. El valor "HASHICORP" se asigna a metadata.vendor_name en el UDM. El valor "SERVICE_ACCOUNT" se asigna a target.resource.attribute.roles.type en el UDM. |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.