Coletar registros do scanner virtual da Qualys

Compatível com:

Esse analisador transforma registros brutos do Qualys Virtual Scanner formatados em JSON em um formato estruturado de acordo com a UDM do Google Security Operations. Ele extrai campos relevantes, como informações de ativos, detalhes da verificação e vulnerabilidades detectadas, mapeando-os para os campos correspondentes do UDM para representação e análise consistentes.

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-vscanner-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. Acesse IAM e administrador > Contas de serviço.
  2. Crie uma nova conta de serviço.
  3. Dê um nome descritivo a ele (por exemplo, qualys-user).
  4. Conceda à conta de serviço o papel Administrador de objetos do Storage no bucket do Cloud Storage criado na etapa anterior.
  5. Conceda à conta de serviço o papel Invocador do Cloud Functions.
  6. Crie uma chave SSH para a conta de serviço.
  7. 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 a função (por exemplo, fetch-qualys-vscanner).
    • Região: selecione uma região próxima ao seu bucket.
    • 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_virtual_scanners.json"
    
    # Qualys API Credentials
    QUALYS_USERNAME = "qualys-username"
    QUALYS_PASSWORD = "<qualys-password>"
    QUALYS_BASE_URL = "https://<qualys_base_url>"  # for example, https://qualysapi.qualys.com
    
    def fetch_virtual_scanners():
        """Fetch Virtual Scanner details from Qualys."""
        auth = base64.b64encode(f"{QUALYS_USERNAME}:{QUALYS_PASSWORD}".encode()).decode()
        headers = {
            "Authorization": f"Basic {auth}",
            "Content-Type": "application/xml"
        }
        url = f"{QUALYS_BASE_URL}/api/2.0/fo/scanner/"
        payload = {
            "action": "list",
            "scanner_type": "virtual"
        }
        response = requests.post(url, headers=headers, data=payload)
        response.raise_for_status()
        return response.text  # Qualys API returns XML data
    
    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(data, content_type="application/xml")
    
    def main(request):
        """Cloud Function entry point."""
        try:
            scanners = fetch_virtual_scanners()
            upload_to_gcs(scanners)
            return "Qualys Virtual Scanners data 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 job (por exemplo, trigger-fetch-qualys-vscanner).
    • Frequência: use a sintaxe cron para especificar a programação (por exemplo, 0 0 * * * para diariamente à meia-noite).
    • 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 do scanner virtual da Qualys.
  5. Selecione Google Cloud Storage como o Tipo de origem.
  6. Selecione Qualys Virtual Scanner 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ção de exclusão da fonte: 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ção de exclusão da fonte: 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
ASSET_ID entity.entity.asset.asset_id Mapeamento direto do campo ASSET_ID.
CLOUD_PROVIDER_TAGS.CLOUD_TAG.NAME entity.relations.entity.resource.attribute.labels.key Mapeamento direto do campo CLOUD_PROVIDER_TAGS.CLOUD_TAG.NAME.
CLOUD_PROVIDER_TAGS.CLOUD_TAG.VALUE entity.relations.entity.resource.attribute.labels.value Mapeamento direto do campo CLOUD_PROVIDER_TAGS.CLOUD_TAG.VALUE.
CLOUD_RESOURCE_ID entity.relations.entity.resource.id Mapeamento direto do campo CLOUD_RESOURCE_ID.
DETECTION_LIST.DETECTION.FIRST_FOUND_DATETIME entity.metadata.threat.first_discovered_time Mapeamento direto do campo DETECTION_LIST.DETECTION.FIRST_FOUND_DATETIME, convertido em carimbo de data/hora.
DETECTION_LIST.DETECTION.FIRST_REOPENED_DATETIME entity.metadata.threat.detection_fields.value Mapeamento direto do campo DETECTION_LIST.DETECTION.FIRST_REOPENED_DATETIME. A chave é codificada como "FIRST_REOPENED_DATETIME".
DETECTION_LIST.DETECTION.IS_DISABLED entity.metadata.threat.detection_fields.value Mapeamento direto do campo DETECTION_LIST.DETECTION.IS_DISABLED. A chave é codificada como "IS_DISABLED".
DETECTION_LIST.DETECTION.LAST_FIXED_DATETIME entity.metadata.threat.detection_fields.value Mapeamento direto do campo DETECTION_LIST.DETECTION.LAST_FIXED_DATETIME. A chave é codificada como "LAST_FIXED_DATETIME".
DETECTION_LIST.DETECTION.LAST_FOUND_DATETIME entity.metadata.threat.detection_fields.value Mapeamento direto do campo DETECTION_LIST.DETECTION.LAST_FOUND_DATETIME. A chave é codificada como "LAST_FOUND_DATETIME".
DETECTION_LIST.DETECTION.LAST_PROCESSED_DATETIME entity.metadata.threat.detection_fields.value Mapeamento direto do campo DETECTION_LIST.DETECTION.LAST_PROCESSED_DATETIME. A chave é codificada como "LAST_PROCESSED_DATETIME".
DETECTION_LIST.DETECTION.LAST_REOPENED_DATETIME entity.metadata.threat.detection_fields.value Mapeamento direto do campo DETECTION_LIST.DETECTION.LAST_REOPENED_DATETIME. A chave é codificada como "LAST_REOPENED_DATETIME".
DETECTION_LIST.DETECTION.LAST_TEST_DATETIME entity.metadata.threat.detection_fields.value Mapeamento direto do campo DETECTION_LIST.DETECTION.LAST_TEST_DATETIME. A chave é codificada como "LAST_TEST_DATETIME".
DETECTION_LIST.DETECTION.LAST_UPDATE_DATETIME entity.metadata.threat.detection_fields.value Mapeamento direto do campo DETECTION_LIST.DETECTION.LAST_UPDATE_DATETIME. A chave é codificada como "LAST_UPDATE_DATETIME".
DETECTION_LIST.DETECTION.PORT entity.metadata.threat.detection_fields.value Mapeamento direto do campo DETECTION_LIST.DETECTION.PORT. A chave é codificada como "PORT".
DETECTION_LIST.DETECTION.PROTOCOL entity.metadata.threat.detection_fields.value Mapeamento direto do campo DETECTION_LIST.DETECTION.PROTOCOL. A chave é codificada como "PROTOCOL".
DETECTION_LIST.DETECTION.QID entity.metadata.threat.detection_fields.value Mapeamento direto do campo DETECTION_LIST.DETECTION.QID. A chave é fixada no código como "QID".
DETECTION_LIST.DETECTION.RESULTS entity.metadata.threat.summary Mapeamento direto do campo DETECTION_LIST.DETECTION.RESULTS.
DETECTION_LIST.DETECTION.SEVERITY entity.metadata.threat.severity_details Mapeamento direto do campo DETECTION_LIST.DETECTION.SEVERITY.
DETECTION_LIST.DETECTION.SSL entity.metadata.threat.detection_fields.value Mapeamento direto do campo DETECTION_LIST.DETECTION.SSL. A chave é fixada no código como "SSL".
DETECTION_LIST.DETECTION.STATUS entity.metadata.threat.detection_fields.value Mapeamento direto do campo DETECTION_LIST.DETECTION.STATUS. A chave é fixada no código como "STATUS".
DETECTION_LIST.DETECTION.TIMES_FOUND entity.metadata.threat.detection_fields.value Mapeamento direto do campo DETECTION_LIST.DETECTION.TIMES_FOUND. A chave é codificada como "TIMES_FOUND".
DETECTION_LIST.DETECTION.TIMES_REOPENED entity.metadata.threat.detection_fields.value Mapeamento direto do campo DETECTION_LIST.DETECTION.TIMES_REOPENED. A chave é codificada como "TIMES_REOPENED".
DETECTION_LIST.DETECTION.TYPE entity.metadata.threat.severity Mapeado do campo DETECTION_LIST.DETECTION.TYPE. Se o valor for "info" (sem diferenciar maiúsculas de minúsculas), ele será mapeado para "INFORMATIONAL". Caso contrário, ele será adicionado como um campo de detecção com a chave "TYPE".
DETECTION_LIST.DETECTION.UNIQUE_VULN_ID entity.metadata.threat.detection_fields.value Mapeamento direto do campo DETECTION_LIST.DETECTION.UNIQUE_VULN_ID. A chave é codificada como "UNIQUE_VULN_ID".
DNS entity.entity.asset.hostname Mapeado do campo DNS se DNS_DATA.HOSTNAME estiver vazio.
DNS_DATA.HOSTNAME entity.entity.asset.hostname Mapeamento direto do campo DNS_DATA.HOSTNAME.
EC2_INSTANCE_ID entity.relations.entity.resource.product_object_id Mapeamento direto do campo EC2_INSTANCE_ID.
ID entity.entity.asset.product_object_id Mapeamento direto do campo ID.
ID entity.metadata.product_entity_id Mapeamento direto do campo ID.
IP entity.entity.ip Mapeamento direto do campo IP.
LAST_SCAN_DATETIME entity.metadata.interval.start_time Mapeamento direto do campo LAST_SCAN_DATETIME, convertido em carimbo de data/hora.
METADATA.AZURE.ATTRIBUTE.NAME entity.relations.entity.resource.attribute.labels.key Mapeamento direto do campo METADATA.AZURE.ATTRIBUTE.NAME.
METADATA.AZURE.ATTRIBUTE.VALUE entity.relations.entity.resource.attribute.labels.value Mapeamento direto do campo METADATA.AZURE.ATTRIBUTE.VALUE.
SO entity.entity.asset.platform_software.platform Mapeado do campo OS. Se o valor contiver "windows" (sem diferenciar maiúsculas e minúsculas), ele será mapeado para "WINDOWS". Se ele contiver "Linux" (sem diferenciar maiúsculas de minúsculas), será mapeado como "LINUX".
TAGS.TAG.NAME entity.relations.entity.resource.attribute.labels.key Mapeamento direto do campo TAGS.TAG.NAME.
TAGS.TAG.TAG_ID entity.relations.entity.resource.attribute.labels.value Mapeado do campo TAGS.TAG.TAG_ID. O valor tem o prefixo "TAG_ID: ".
entity.metadata.collected_timestamp O carimbo de data/hora da entrada de registro.
entity.metadata.entity_type Determinado com base na presença do campo IP. Se IP estiver presente, ele será definido como "IP_ADDRESS". Caso contrário, ela será definida como "ASSET".
entity.metadata.interval.end_time Codificado com um valor de carimbo de data/hora muito grande (253402300799 segundos).
entity.metadata.product_name Codificado como "QUALYS_VIRTUAL_SCANNER".
entity.metadata.vendor_name Codificado como "QUALYS_VIRTUAL_SCANNER".
entity.relations.entity.resource.resource_type Se CLOUD_SERVICE for "VM", ele será definido como "VIRTUAL_MACHINE".
entity.relations.entity_type Codificado como "RESOURCE".
entity.relations.relationship Codificado como "MEMBER".

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