Recolha registos de auditoria da HashiCorp

Compatível com:

Este analisador processa registos de auditoria da HashiCorp em formatos JSON, Syslog ou combinados. Extrai campos, realiza a análise Grok e KV para mensagens do tipo padrão e "runner", processa payloads JSON e mapeia os dados extraídos para o UDM. O analisador também inclui o processamento de erros e a eliminação de registos com formato incorreto.

Antes de começar

  • Certifique-se de que tem uma instância do Google Security Operations.
  • Certifique-se de que tem o Windows 2016 ou posterior, ou um anfitrião Linux com systemd.
  • Se estiver a executar o serviço através de um proxy, certifique-se de que as portas da firewall estão abertas.
  • Certifique-se de que tem acesso privilegiado ao HCP.

Obtenha o ficheiro de autenticação de carregamento do Google SecOps

  1. Inicie sessão na consola Google SecOps.
  2. Aceda a Definições do SIEM > Agentes de recolha.
  3. Transfira o ficheiro de autenticação de carregamento.

Obtenha o ID de cliente do Google SecOps

  1. Inicie sessão na consola Google SecOps.
  2. Aceda a Definições do SIEM > Perfil.
  3. Copie e guarde o ID do cliente da secção Detalhes da organização.

Instale o agente do Bindplane

  1. Para a instalação do Windows, execute o seguinte script:
    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
  2. Para a instalação do Linux, execute o seguinte script:
    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
  3. Pode encontrar opções de instalação adicionais neste guia de instalação.

Configure o agente Bindplane para carregar o Syslog e enviá-lo para o Google SecOps

  1. Aceda à máquina onde o agente Bindplane está instalado.
  2. Edite o ficheiro config.yaml da seguinte forma:

    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
    
  3. Reinicie o agente do Bindplane para aplicar as alterações:

    sudo systemctl restart bindplane
    

Ative o Syslog para o HCP Vault

  1. Inicie sessão no portal de HCPs.
  2. Aceda a Clusters do Vault.
  3. Selecione o cluster do cofre na lista de clusters implementados.
  4. Na Vista geral do cluster, localize e copie o Endereço do cofre (por exemplo, https://vault-cluster-name.hashicorpcloud.com:8200).
  5. Aceda à secção Detalhes de acesso e copie o token raiz.

Instale a CLI do 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 (com o 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.
    
  • Valide a instalação da CLI do Vault executando o seguinte comando:

    vault --version
    

Configure o HCP Vault através da CLI para enviar registos de auditoria para o Bindplane

  1. Abra o terminal ou a linha de comandos.
  2. Defina o endereço do servidor da pasta protegida através da variável de ambiente:

    export VAULT_ADDR="https://vault-cluster-name.hashicorpcloud.com:8200"
    
  3. Inicie sessão no Vault com o token raiz:

    vault login <root-token>
    

Configure o caminho do Syslog para uma tomada Syslog externa

  1. Execute o seguinte comando para ativar o syslog e enviá-lo para o agente Bindplane:

    vault audit enable socket address="udp://<bindplane-ip>:<bindplane-port>" socket_type="udp" tag="vault"
    
  2. Confirme a nova configuração:

    vault audit list
    
  3. O resultado deve apresentar a nova configuração da tomada.

  4. Opcional: automatize a configuração através do Terraform:

    • Crie um ficheiro de configuração do 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"
      }
    }
    
    • Aplique a configuração:
    terraform init
    terraform apply
    

Resolução de problemas de registos não recebidos

  • Verifique se o servidor syslog está acessível:

    ping <syslog-server-ip>
    

Tabela de mapeamento da UDM

Campo de registo Mapeamento de UDM Lógica
auth.accessor security_result.about.resource.attribute.labels.value O valor de auth.accessor do registo não processado é mapeado para uma etiqueta com a chave "auth_accessor" em security_result.about.resource.attribute.labels no UDM.
auth.client_token security_result.about.resource.attribute.labels.value O valor de auth.client_token do registo não processado é mapeado para uma etiqueta com a chave "auth_client_token" em security_result.about.resource.attribute.labels no UDM.
auth.display_name target.user.user_display_name O valor de auth.display_name do registo não processado é mapeado para target.user.user_display_name no UDM.
auth.entity_id target.resource.product_object_id O valor de auth.entity_id do registo não processado é mapeado para target.resource.product_object_id no UDM.
auth.metadata.account_id target.user.userid O valor de auth.metadata.account_id do registo não processado é mapeado para target.user.userid no UDM.
auth.metadata.auth_type security_result.about.resource.attribute.labels.value O valor de auth.metadata.auth_type do registo não processado é mapeado para uma etiqueta com a chave "auth_type" em security_result.about.resource.attribute.labels no UDM.
auth.metadata.role_id security_result.about.resource.attribute.labels.value O valor de auth.metadata.role_id do registo não processado é mapeado para uma etiqueta com a chave "role_id" em security_result.about.resource.attribute.labels no UDM.
auth.metadata.role_name target.resource.attribute.roles.name O valor de auth.metadata.role_name do registo não processado é mapeado para target.resource.attribute.roles.name no UDM.
auth.token_ttl security_result.about.resource.attribute.labels.value O valor de auth.token_ttl do registo não processado é mapeado para uma etiqueta com a chave "auth_token_ttl" em security_result.about.resource.attribute.labels no UDM.
auth.token_type security_result.about.resource.attribute.labels.value O valor de auth.token_type do registo não processado é mapeado para uma etiqueta com a chave "auth_token_type" em security_result.about.resource.attribute.labels no UDM.
cluster observer.resource.name O valor de cluster do registo não processado é mapeado para observer.resource.name no UDM.
error security_result.description O valor de error do registo não processado é mapeado para security_result.description no UDM.
headers.accept security_result.about.resource.attribute.labels.value O valor de headers.accept do registo não processado é mapeado para uma etiqueta com a chave "httpHeaders accept" em security_result.about.resource.attribute.labels no UDM.
headers.httpHeaders.cache-control additional.fields.value.string_value O valor de headers.httpHeaders.cache-control do registo não processado é mapeado para um campo com a chave "httpHeaders cache control" em additional.fields no UDM.
headers.snyk-acting-org-public-id principal.resource.attribute.labels.value O valor de headers.snyk-acting-org-public-id do registo não processado é mapeado para uma etiqueta com a chave "snyk-acting-org-public-id" em principal.resource.attribute.labels no UDM.
headers.snyk-flow-name principal.resource.attribute.labels.value O valor de headers.snyk-flow-name do registo não processado é mapeado para uma etiqueta com a chave "snyk-flow-name" em principal.resource.attribute.labels no UDM.
headers.snyk-request-id principal.resource.attribute.labels.value O valor de headers.snyk-request-id do registo não processado é mapeado para uma etiqueta com a chave "snyk-request-id" em principal.resource.attribute.labels no UDM.
headers.user-agent network.http.parsed_user_agent O valor de headers.user-agent do registo não processado é analisado como um agente do utilizador e mapeado para network.http.parsed_user_agent no GDU.
headers.x-forwarded-host principal.hostname O valor de headers.x-forwarded-host do registo não processado é mapeado para principal.hostname no UDM.
headers.x-forwarded-port principal.port O valor de headers.x-forwarded-port do registo não processado é mapeado para principal.port no UDM.
headers.x-real-ip principal.ip O valor de headers.x-real-ip do registo não processado é mapeado para principal.ip no UDM.
hostname observer.hostname O valor de hostname do registo não processado é mapeado para observer.hostname no UDM.
httpHeaders.cf-cache-status target.resource.attribute.labels.value O valor de httpHeaders.cf-cache-status do registo não processado é mapeado para uma etiqueta com a chave "cf-cache-status" em target.resource.attribute.labels no UDM.
httpHeaders.cf-ray target.resource.attribute.labels.value O valor de httpHeaders.cf-ray do registo não processado é mapeado para uma etiqueta com a chave "cf-ray" em target.resource.attribute.labels no UDM.
httpHeaders.content-length security_result.about.resource.attribute.labels.value O valor de httpHeaders.content-length do registo não processado é mapeado para uma etiqueta com a chave "httpHeaders Content-Length" em security_result.about.resource.attribute.labels no UDM.
httpHeaders.content-type security_result.about.resource.attribute.labels.value O valor de httpHeaders.content-type do registo não processado é mapeado para uma etiqueta com a chave "httpHeaders Content-Type" em security_result.about.resource.attribute.labels no UDM.
httpHeaders.gitlab-lb target.resource.attribute.labels.value O valor de httpHeaders.gitlab-lb do registo não processado é mapeado para uma etiqueta com a chave "gitlab-lb" em target.resource.attribute.labels no UDM.
httpHeaders.gitlab-sv target.resource.attribute.labels.value O valor de httpHeaders.gitlab-sv do registo não processado é mapeado para uma etiqueta com a chave "gitlab-sv" em target.resource.attribute.labels no UDM.
httpHeaders.ratelimit-limit target.resource.attribute.labels.value O valor de httpHeaders.ratelimit-limit do registo não processado é mapeado para uma etiqueta com a chave "ratelimit-limit" em target.resource.attribute.labels no UDM.
httpHeaders.ratelimit-observed target.resource.attribute.labels.value O valor de httpHeaders.ratelimit-observed do registo não processado é mapeado para uma etiqueta com a chave "ratelimit-observed" em target.resource.attribute.labels no UDM.
httpHeaders.ratelimit-remaining target.resource.attribute.labels.value O valor de httpHeaders.ratelimit-remaining do registo não processado é mapeado para uma etiqueta com a chave "ratelimit-remaining" em target.resource.attribute.labels no UDM.
httpHeaders.ratelimit-reset target.resource.attribute.labels.value O valor de httpHeaders.ratelimit-reset do registo não processado é mapeado para uma etiqueta com a chave "ratelimit-reset" em target.resource.attribute.labels no UDM.
httpHeaders.ratelimit-resettime target.resource.attribute.labels.value O valor de httpHeaders.ratelimit-resettime do registo não processado é mapeado para uma etiqueta com a chave "ratelimit-resettime" em target.resource.attribute.labels no UDM.
httpHeaders.referrer-policy target.resource.attribute.labels.value O valor de httpHeaders.referrer-policy do registo não processado é mapeado para uma etiqueta com a chave "referrer-policy" em target.resource.attribute.labels no UDM.
httpHeaders.server target.resource.attribute.labels.value O valor de httpHeaders.server do registo não processado é mapeado para uma etiqueta com a chave "server" em target.resource.attribute.labels no UDM.
httpHeaders.x-content-type-options target.resource.attribute.labels.value O valor de httpHeaders.x-content-type-options do registo não processado é mapeado para uma etiqueta com a chave "x-content-type-options" em target.resource.attribute.labels no UDM.
httpHeaders.x-frame-options target.resource.attribute.labels.value O valor de httpHeaders.x-frame-options do registo não processado é mapeado para uma etiqueta com a chave "x-frame-options" em target.resource.attribute.labels no UDM.
httpHeaders.x-request-id target.resource.attribute.labels.value O valor de httpHeaders.x-request-id do registo não processado é mapeado para uma etiqueta com a chave "x-request-id" em target.resource.attribute.labels no UDM.
httpStatus network.http.response_code O valor de httpStatus do registo não processado é mapeado para network.http.response_code no UDM.
httpUrl target.url O valor de httpUrl do registo não processado é mapeado para target.url no UDM.
insertId metadata.product_log_id O valor de insertId do registo não processado é mapeado para metadata.product_log_id no UDM.
job additional.fields.value.string_value O valor de job do registo não processado é mapeado para um campo com a chave "job id" em additional.fields no UDM.
job_status additional.fields.value.string_value O valor de job_status do registo não processado é mapeado para um campo com a chave "job_status" em additional.fields no UDM.
labels.compute.googleapis.com/resource_name target.resource.name O valor de labels.compute.googleapis.com/resource_name do registo não processado é mapeado para target.resource.name no UDM.
labels.k8s-pod/app_kubernetes_io/instance target.resource.attribute.labels.value O valor de labels.k8s-pod/app_kubernetes_io/instance do registo não processado é mapeado para uma etiqueta com a chave "Kubernetes IO Instance" em target.resource.attribute.labels no UDM.
labels.k8s-pod/app_kubernetes_io/name target.resource.attribute.labels.value O valor de labels.k8s-pod/app_kubernetes_io/name do registo não processado é mapeado para uma etiqueta com a chave "Kubernetes IO Instance Name" em target.resource.attribute.labels no UDM.
labels.k8s-pod/component target.resource.attribute.labels.value O valor de labels.k8s-pod/component do registo não processado é mapeado para uma etiqueta com a chave "component" em target.resource.attribute.labels no UDM.
labels.k8s-pod/controller-revision-hash target.resource.attribute.labels.value O valor de labels.k8s-pod/controller-revision-hash do registo não processado é mapeado para uma etiqueta com a chave "Controller Revision Hash" em target.resource.attribute.labels no UDM.
labels.k8s-pod/helm_sh/chart target.resource.attribute.labels.value O valor de labels.k8s-pod/helm_sh/chart do registo não processado é mapeado para uma etiqueta com a chave "Kubernetes IO Instance Manager SH" em target.resource.attribute.labels no UDM.
labels.k8s-pod/vault-active target.resource.attribute.labels.value O valor de labels.k8s-pod/vault-active do registo não processado é mapeado para uma etiqueta com a chave "Vault active" em target.resource.attribute.labels no UDM.
labels.k8s-pod/vault-initialized target.resource.attribute.labels.value O valor de labels.k8s-pod/vault-initialized do registo não processado é mapeado para uma etiqueta com a chave "Vault initialized" em target.resource.attribute.labels no UDM.
labels.k8s-pod/vault-perf-standby target.resource.attribute.labels.value O valor de labels.k8s-pod/vault-perf-standby do registo não processado é mapeado para uma etiqueta com a chave "vault perf standby" em target.resource.attribute.labels no UDM.
labels.k8s-pod/vault-sealed target.resource.attribute.labels.value O valor de labels.k8s-pod/vault-sealed do registo não processado é mapeado para uma etiqueta com a chave "Vault sealed" em target.resource.attribute.labels no UDM.
labels.k8s-pod/vault-version target.resource.attribute.labels.value O valor de labels.k8s-pod/vault-version do registo não processado é mapeado para uma etiqueta com a chave "Versão do Vault" em target.resource.attribute.labels no UDM.
maskedToken security_result.about.resource.attribute.labels.value O valor de maskedToken do registo não processado é mapeado para uma etiqueta com a chave "maskedToken" em security_result.about.resource.attribute.labels no UDM.
method network.http.method, operation O valor de method do registo não processado é mapeado para operation. Se operation não estiver vazio, network.application_protocol é definido como "HTTP". Com base no valor de operation, é derivado o valor de network.http.method.
msg metadata.description O valor de msg do registo não processado é mapeado para metadata.description no UDM.
pid target.process.pid O valor de pid do registo não processado é mapeado para target.process.pid no UDM.
request.client_token target.resource.attribute.labels.value O valor de request.client_token do registo não processado é mapeado para uma etiqueta com a chave "request_client_token" em target.resource.attribute.labels no UDM.
request.client_token_accessor target.resource.attribute.labels.value O valor de request.client_token_accessor do registo não processado é mapeado para uma etiqueta com a chave "request_client_token_accessor" em target.resource.attribute.labels no UDM.
request.data.role_id target.resource.attribute.labels.value O valor de request.data.role_id do registo não processado é mapeado para uma etiqueta com a chave "request_data_role_id" em target.resource.attribute.labels no UDM.
request.data.secret_id target.resource.attribute.labels.value O valor de request.data.secret_id do registo não processado é mapeado para uma etiqueta com a chave "request_data_secret_id" em target.resource.attribute.labels no UDM.
request.id network.session_id O valor de request.id do registo não processado é mapeado para network.session_id no UDM.
request.mount_accessor target.resource.attribute.labels.value O valor de request.mount_accessor do registo não processado é mapeado para uma etiqueta com a chave "request_mount_accessor" em target.resource.attribute.labels no UDM.
request.mount_type target.resource.attribute.labels.value O valor de request.mount_type do registo não processado é mapeado para uma etiqueta com a chave "request_mount_type" em target.resource.attribute.labels no UDM.
request.namespace.id target.namespace O valor de request.namespace.id do registo não processado é mapeado para target.namespace no UDM.
request.operation target.resource.attribute.labels.value, network.http.method, operation O valor de request.operation do registo não processado é mapeado para operation. Se operation não estiver vazio, network.application_protocol é definido como "HTTP". Com base no valor de operation, é derivado o valor de network.http.method. O valor de request.operation também é mapeado para uma etiqueta com a chave "capabilities" em target.resource.attribute.labels no UDM.
request.path target.url O valor de request.path do registo não processado é mapeado para target.url no UDM.
request.remote_address principal.ip O valor de request.remote_address do registo não processado é mapeado para principal.ip no UDM.
request.remote_port principal.port O valor de request.remote_port do registo não processado é mapeado para principal.port no UDM.
request.wrap_ttl target.resource.attribute.labels.value O valor de request.wrap_ttl do registo não processado é mapeado para uma etiqueta com a chave "request_wrap_ttl" em target.resource.attribute.labels no UDM.
resource.labels.container_name additional.fields.value.string_value O valor de resource.labels.container_name do registo não processado é mapeado para um campo com a chave "nome do contentor" em additional.fields no UDM.
resource.labels.location target.location.name O valor de resource.labels.location do registo não processado é mapeado para target.location.name no UDM.
resource.labels.namespace_name target.namespace O valor de resource.labels.namespace_name do registo não processado é mapeado para target.namespace no UDM.
resource.labels.pod_name additional.fields.value.string_value O valor de resource.labels.pod_name do registo não processado é mapeado para um campo com a chave "pod_name" em additional.fields no UDM.
resource.labels.project_id target.cloud.project.name O valor de resource.labels.project_id do registo não processado é mapeado para target.cloud.project.name no UDM.
response.data.num_uses target.resource.attribute.labels.value O valor de response.data.num_uses do registo não processado é mapeado para uma etiqueta com a chave "response_data_num_uses" em target.resource.attribute.labels no UDM.
response.data.orphan target.resource.attribute.labels.value O valor de response.data.orphan do registo não processado é mapeado para uma etiqueta com a chave "response_data_orphan" em target.resource.attribute.labels no UDM.
response.data.renewable target.resource.attribute.labels.value O valor de response.data.renewable do registo não processado é mapeado para uma etiqueta com a chave "response_data_renewable" em target.resource.attribute.labels no UDM.
response.data.ttl target.resource.attribute.labels.value O valor de response.data.ttl do registo não processado é mapeado para uma etiqueta com a chave "response_data_ttl" em target.resource.attribute.labels no UDM.
response.wrap_info.accessor target.resource.attribute.labels.value O valor de response.wrap_info.accessor do registo não processado é mapeado para uma etiqueta com a chave "response_wrap_info_accessor" em target.resource.attribute.labels no UDM.
response.wrap_info.token target.resource.attribute.labels.value O valor de response.wrap_info.token do registo não processado é mapeado para uma etiqueta com a chave "response_wrap_info_token" em target.resource.attribute.labels no UDM.
response.wrap_info.ttl target.resource.attribute.labels.value O valor de response.wrap_info.ttl do registo não processado é mapeado para uma etiqueta com a chave "response_wrap_info_ttl" em target.resource.attribute.labels no UDM.
response.wrap_info.wrapped_accessor target.resource.attribute.labels.value O valor de response.wrap_info.wrapped_accessor do registo não processado é mapeado para uma etiqueta com a chave "response_wrap_info_wrapped_accessor" em target.resource.attribute.labels no UDM.
runner principal.user.userid O valor de runner do registo não processado é mapeado para principal.user.userid no UDM.
status network.http.response_code O valor de status do registo não processado é mapeado para network.http.response_code no UDM.
streamingID target.resource.attribute.labels.value O valor de streamingID do registo não processado é mapeado para uma etiqueta com a chave "streamingID" em target.resource.attribute.labels no UDM.
time metadata.event_timestamp.seconds, metadata.event_timestamp.nanos O valor de time do registo não processado é analisado e usado para preencher o campo metadata.event_timestamp no UDM.
type metadata.product_event_type O valor de type do registo não processado é mapeado para metadata.product_event_type no UDM.
url principal.url O valor de url do registo não processado é mapeado para principal.url no UDM. O valor "MACHINE" é atribuído a extensions.auth.type no UDM. O valor "USER_LOGIN" é atribuído a metadata.event_type no UDM. O valor "HASHICORP" é atribuído a metadata.log_type no UDM. O valor "HASHICORP" é atribuído a metadata.product_name no UDM. O valor "HASHICORP" é atribuído a metadata.vendor_name no UDM. O valor "SERVICE_ACCOUNT" é atribuído a target.resource.attribute.roles.type no UDM.

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.