Coletar registros do monitoramento contínuo do Qualys

Compatível com:

Esse código do analisador do Logstash primeiro extrai campos como IP de origem, usuário, método e protocolo de aplicativo de mensagens de registro brutas usando padrões grok. Em seguida, ele mapeia campos específicos dos dados de registro brutos para os campos correspondentes no Modelo de Dados Unificado (UDM, na sigla em inglês), realiza conversões de tipo de dados e enriquece os dados com rótulos e metadados adicionais antes de estruturar a saída no formato UDM desejado.

Antes de começar

Verifique se você atende aos seguintes pré-requisitos:

  • Instância do Google Security Operations.
  • Acesso privilegiado ao Google Cloud.
  • Acesso privilegiado ao Qualys.

Ative as APIs obrigatórias:

  1. Faça login no console do Google Cloud .
  2. Acesse APIs e serviços > Biblioteca.
  3. Procure e ative as seguintes APIs:
    • API Cloud Functions
    • API Cloud Scheduler
    • Cloud Pub/Sub (necessário para o Cloud Scheduler invocar funções)

Criar um Google Cloud bucket do Storage

  1. Faça login no console do Google Cloud .
  2. Acesse a página Buckets do Cloud Storage.

    Acessar buckets

  3. Clique em Criar.

  4. Configure o bucket:

    • Nome: insira um nome exclusivo que atenda aos requisitos de nome de bucket (por exemplo, qualys-asset-bucket).
    • Escolha onde armazenar seus dados: selecione um local.
    • Escolha uma classe de armazenamento para seus dados: selecione uma classe de armazenamento padrão para o bucket ou escolha Classe automática para gerenciamento automático da classe de armazenamento.
    • Escolha como controlar o acesso a objetos: selecione não para aplicar a prevenção de acesso público e escolha um modelo de controle de acesso para os objetos do bucket.
    • Classe de armazenamento: escolha com base nas suas necessidades (por exemplo, Padrão).
  5. Clique em Criar.

Criar uma conta de serviço do Google Cloud

  1. Faça login no console do Google Cloud .
  2. Acesse IAM e administrador > Contas de serviço.
  3. Crie uma nova conta de serviço.
  4. Dê um nome descritivo a ele (por exemplo, qualys-user).
  5. Conceda à conta de serviço o papel Administrador de objetos do Storage no bucket do GCS criado na etapa anterior.
  6. Conceda à conta de serviço o papel Invocador do Cloud Functions.
  7. Crie uma chave SSH para a conta de serviço.
  8. Faça o download de um arquivo de chave JSON para a conta de serviço. Mantenha esse arquivo em segurança.

Opcional: crie um usuário de API dedicado no Qualys

  1. Faça login no console da Qualys.
  2. Acesse Usuários.
  3. Clique em Novo > Usuário.
  4. Insira as Informações gerais necessárias para o usuário.
  5. Selecione a guia Função do usuário.
  6. Verifique se a caixa de seleção Acesso à API está marcada.
  7. Clique em Salvar.

Identificar seu URL específico da API do Qualys

Opção 1

Identifique seus URLs conforme mencionado na identificação da plataforma.

Opção 2

  1. Faça login no console da Qualys.
  2. Acesse Ajuda > Sobre.
  3. Role a tela para ver essas informações em "Central de operações de segurança (SOC)".
  4. Copie o URL da API do Qualys.

Configurar a função do Cloud

  1. Acesse Cloud Functions no console Google Cloud .
  2. Clique em Criar função.
  3. Configure a função:

    • Nome: insira um nome para sua função (por exemplo, fetch-qualys-cm-alerts).
    • Região: selecione uma região próxima ao seu bucket.
    • Ambiente de execução: Python 3.10 (ou o ambiente de execução de sua preferência).
    • Gatilho: escolha o gatilho HTTP, se necessário, ou o Cloud Pub/Sub para execução programada.
    • Autenticação: proteja com autenticação.
    • Escreva o código com um editor in-line:
    ```python
    from google.cloud import storage
    import requests
    import base64
    import json
    
    # Google Cloud Storage Configuration
    BUCKET_NAME = "<bucket-name>"
    FILE_NAME = "qualys_cm_alerts.json"
    
    # Qualys API Credentials
    QUALYS_USERNAME = "<qualys-username>"
    QUALYS_PASSWORD = "<qualys-password>"
    QUALYS_BASE_URL = "https://<qualys_base_url>"
    
    def fetch_cm_alerts():
        """Fetch alerts from Qualys Continuous Monitoring."""
        auth = base64.b64encode(f"{QUALYS_USERNAME}:{QUALYS_PASSWORD}".encode()).decode()
        headers = {
            "Authorization": f"Basic {auth}",
            "Content-Type": "application/xml"
        }
        payload = """
        <ServiceRequest>
            <filters>
                <Criteria field="alert.date" operator="GREATER">2024-01-01</Criteria>
            </filters>
        </ServiceRequest>
        """
        response = requests.post(f"{QUALYS_BASE_URL}/qps/rest/2.0/search/cm/alert", headers=headers, data=payload)
        response.raise_for_status()
        return response.json()
    
    def upload_to_gcs(data):
        """Upload data to Google Cloud Storage."""
        client = storage.Client()
        bucket = client.get_bucket(BUCKET_NAME)
        blob = bucket.blob(FILE_NAME)
        blob.upload_from_string(json.dumps(data, indent=2), content_type="application/json")
    
    def main(request):
        """Cloud Function entry point."""
        try:
            alerts = fetch_cm_alerts()
            upload_to_gcs(alerts)
            return "Qualys CM alerts uploaded to Cloud Storage successfully!"
        except Exception as e:
            return f"An error occurred: {e}", 500
    ```
    
  4. Clique em Implantar depois de concluir a configuração.

Configurar o Cloud Scheduler

  1. Acesse o Cloud Scheduler no console Google Cloud .
  2. Clique em Criar job.
  3. Configure o job:

    • Nome: insira um nome para o trabalho (por exemplo, trigger-fetch-qualys-cm-alerts).
    • Frequência: use a sintaxe cron para especificar a programação (por exemplo, 0 * * * * para executar a cada hora).
    • Fuso horário: defina seu fuso horário preferido.
    • Tipo de gatilho: escolha HTTP.
    • URL do gatilho: insira o URL da função do Cloud, que pode ser encontrado nos detalhes da função após a implantação.
    • Método: escolha POST.
  4. Crie o job.

Configurar feeds

Há dois pontos de entrada diferentes para configurar feeds na plataforma do Google SecOps:

  • Configurações do SIEM > Feeds
  • Central de conteúdo > Pacotes de conteúdo

Configure feeds em "Configurações do SIEM" > "Feeds".

Para configurar um feed, siga estas etapas:

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo feed.
  3. Na próxima página, clique em Configurar um único feed.
  4. No campo Nome do feed, insira um nome para o feed, por exemplo, Registros de monitoramento contínuo da Qualys.
  5. Selecione Google Cloud Storage como o Tipo de origem.
  6. Selecione Monitoramento contínuo da Qualys como o Tipo de registro.
  7. Clique em Próxima.
  8. Especifique valores para os seguintes parâmetros de entrada:

    • URI do bucket de armazenamento: o URI de origem do bucket de armazenamento Google Cloud .
    • URI é um: selecione Arquivo único.
    • Opções de exclusão de fontes: selecione a opção de exclusão de acordo com sua preferência.
  9. Clique em Próxima.

  10. Revise a nova configuração do feed na tela Finalizar e clique em Enviar.

Configurar feeds na Central de conteúdo

Especifique valores para os seguintes campos:

  • URI do bucket de armazenamento: o URI de origem do bucket de armazenamento Google Cloud .
  • URI é um: selecione Arquivo único.
  • Opções de exclusão de fontes: selecione a opção de exclusão de acordo com sua preferência.

Opções avançadas

  • Nome do feed:um valor pré-preenchido que identifica o feed.
  • Tipo de origem:método usado para coletar registros no Google SecOps.
  • Namespace do recurso:namespace associado ao feed.
  • Rótulos de ingestão:rótulos aplicados a todos os eventos deste feed.

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
Alert.alertInfo.appVersion metadata.product_version Mapeado diretamente de Alert.alertInfo.appVersion
Alert.alertInfo.operatingSystem principal.platform_version Mapeado diretamente de Alert.alertInfo.operatingSystem
Alert.alertInfo.port additional.fields.value.string_value Mapeado diretamente de Alert.alertInfo.port e adicionado como um par de chave-valor em additional.fields com a chave "Alert port"
Alert.alertInfo.protocol network.ip_protocol Mapeado diretamente de Alert.alertInfo.protocol
Alert.alertInfo.sslIssuer network.tls.client.certificate.issuer Mapeado diretamente de Alert.alertInfo.sslIssuer
Alert.alertInfo.sslName additional.fields.value.string_value Mapeado diretamente de Alert.alertInfo.sslName e adicionado como um par de chave-valor em additional.fields com a chave "Nome SSL"
Alert.alertInfo.sslOrg additional.fields.value.string_value Mapeado diretamente de Alert.alertInfo.sslOrg e adicionado como um par de chave-valor em additional.fields com a chave "SSL Org"
Alert.alertInfo.ticketId additional.fields.value.string_value Mapeado diretamente de Alert.alertInfo.ticketId e adicionado como um par de chave-valor em additional.fields com a chave "Ticket Id"
Alert.alertInfo.vpeConfidence additional.fields.value.string_value Mapeado diretamente de Alert.alertInfo.vpeConfidence e adicionado como um par de chave-valor em additional.fields com a chave "VPE Confidence"
Alert.alertInfo.vpeStatus additional.fields.value.string_value Mapeado diretamente de Alert.alertInfo.vpeStatus e adicionado como um par de chave-valor em additional.fields com a chave "VPE Confidence"
Alert.eventType additional.fields.value.string_value Mapeado diretamente de Alert.eventType e adicionado como um par de chave-valor em additional.fields com a chave "Tipo de evento".
Alert.hostname principal.hostname Mapeado diretamente de Alert.hostname
Alert.id security_result.threat_id Mapeado diretamente de Alert.id
Alert.ipAddress principal.ip Mapeado diretamente de Alert.ipAddress
Alert.profile.id additional.fields.value.string_value Mapeado diretamente de Alert.profile.id e adicionado como um par de chave-valor em additional.fields com a chave "ID do perfil"
Alert.profile.title additional.fields.value.string_value Mapeado diretamente de Alert.profile.title e adicionado como um par de chave-valor em additional.fields com a chave "Título do perfil"
Alert.qid vulnerability.name Mapeado como "QID: " de Alert.qid
Alert.source additional.fields.value.string_value Mapeado diretamente de Alert.source e adicionado como um par de chave-valor em additional.fields com a chave "Alert Source"
Alert.triggerUuid metadata.product_log_id Mapeado diretamente de Alert.triggerUuid
Alert.vulnCategory additional.fields.value.string_value Mapeado diretamente de Alert.vulnCategory e adicionado como um par de chave-valor em additional.fields com a chave "Categoria de vulnerabilidade"
Alert.vulnSeverity vulnerability.severity Mapeado com base no valor de Alert.vulnSeverity: 1 a 3: BAIXO, 4 a 6: MÉDIO, 7 a 8: ALTO
Alert.vulnTitle vulnerability.description Mapeado diretamente de Alert.vulnTitle
Alert.vulnType additional.fields.value.string_value Mapeado diretamente de Alert.vulnType e adicionado como um par de chave-valor em additional.fields com a chave "Vulnerability Type"
Host principal.ip Analisado da linha de registro "Host: "
edr.client.ip_addresses Copiados do principal.ip
edr.client.hostname Copiados do principal.hostname
edr.raw_event_name Definido como "STATUS_UPDATE" se Alert.ipAddress, Alert.hostname ou src_ip estiverem presentes. Caso contrário, definido como "GENERIC_EVENT".
metadata.event_timestamp Extraído dos campos Alert.eventDate ou timestamp. Alert.eventDate tem prioridade se existir. Caso contrário, timestamp será usado. O carimbo de data/hora é convertido para UTC.
metadata.event_type Mesma lógica de edr.raw_event_name
metadata.log_type Definido como "QUALYS_CONTINUOUS_MONITORING"
metadata.product_name Definido como "QUALYS_CONTINUOUS_MONITORING"
metadata.vendor_name Definido como "QUALYS_CONTINUOUS_MONITORING"
network.application_protocol Analisado da linha de registro " /user HTTP"
network.http.method Analisado da linha de registro " /user HTTP"
timestamp event.timestamp Extraído dos campos Alert.eventDate ou timestamp. Alert.eventDate tem prioridade se existir. Caso contrário, timestamp será usado. O carimbo de data/hora é convertido para UTC.

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