Coletar registros de contexto de recursos do Qualys

Compatível com:

Esse analisador extrai informações do contexto do recurso dos registros JSON do Qualys e os transforma no formato UDM. Ele analisa vários campos, como ID, IP, nome do host, detalhes do recurso da nuvem, SO e tags, mapeando-os para os campos correspondentes do UDM e criando relações entre os recursos e os recursos. O analisador também processa a lógica específica para provedores de nuvem e sistemas operacionais, garantindo uma representação precisa no UDM.

Antes de começar

  • Verifique se você tem uma instância do Google Security Operations.
  • Verifique se você tem acesso privilegiado a Google Cloud.
  • Verifique se você tem acesso privilegiado aos Qualys.

Ative as APIs obrigatórias:

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

Criar um bucket do Google Cloud 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 selecione 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 selecione 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 (por exemplo, qualys-user).
  4. Conceda à conta de serviço o papel de Administrador de objetos do Storage no bucket do Cloud Storage criado na etapa anterior.
  5. Conceda à conta de serviço o papel de 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.

Identifique o URL específico da API 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 conferir essas informações na Central de operações de segurança (SOC).
  4. Copie o URL da API Qualys.

Configurar a Função do Cloud

  1. Acesse o 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-assets).
    • 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: ofereça segurança com autenticação.
    • Escrever o código com um editor inline:
    ```python
    from google.cloud import storage
    import requests
    import base64
    import json
    
    # Cloud Storage configuration
    BUCKET_NAME = "<bucket-name>"
    FILE_NAME = "qualys_assets.json"
    
    # Qualys API credentials
    QUALYS_USERNAME = "<qualys-username>"
    QUALYS_PASSWORD = "<qualys-password>"
    QUALYS_BASE_URL = "https://<qualys_base_url>"
    
    def fetch_qualys_assets():
        auth = base64.b64encode(f"{QUALYS_USERNAME}:{QUALYS_PASSWORD}".encode()).decode()
        headers = {
            "Authorization": f"Basic {auth}",
            "Content-Type": "application/xml"
        }
        payload = """
        <ServiceRequest>
            <filters>
                <Criteria field="asset.name" operator="LIKE">%</Criteria>
            </filters>
        </ServiceRequest>
        """
        response = requests.post(f"{QUALYS_BASE_URL}/qps/rest/2.0/search/am/asset", headers=headers, data=payload)
        return response.json()
    
    def upload_to_gcs(data):
        client = storage.Client()
        bucket = client.get_bucket(BUCKET_NAME)
        blob = bucket.blob(FILE_NAME)
        blob.upload_from_string(json.dumps(data), content_type="application/json")
    
    def main(request):
        assets = fetch_qualys_assets()
        upload_to_gcs(assets)
        return "Data uploaded to Cloud Storage successfully!"
    
    ```
    
  4. Clique em Implantar depois de concluir a configuração.

Configurar o Cloud Scheduler

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

    • Nome: insira um nome para o job. Por exemplo, trigger-fetch-qualys-assets.
    • 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 acionador: escolha HTTP.
    • URL do gatilho: insira o URL da função do Cloud (encontrado nos detalhes da função após a implantação).
    • Método: escolha POST.
  4. Crie o job.

Configurar um feed no Google SecOps para ingerir registros de contexto de ativos do Qualys

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo.
  3. No campo Nome do feed, insira um nome para o feed (por exemplo, Qualys Asset Context Logs).
  4. Selecione Google Cloud Storage como o Tipo de origem.
  5. Selecione Qualys Asset Context como o tipo de registro.
  6. Clique em Próxima.
  7. Especifique valores para os seguintes parâmetros de entrada:

    • URI do GCS: o URI do Cloud Storage.
    • URI é um: selecione Arquivo único.
    • Opções de exclusão da origem: selecione a opção de exclusão de acordo com sua preferência.
    • Namespace de recursos: o namespace de recursos.
    • Rótulos de ingestão: o rótulo a ser aplicado aos eventos desse feed.
  8. Clique em Próxima.

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

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
ASSET_ID entity.entity.asset.asset_id Mapeado diretamente do campo ASSET_ID.
CLOUD_PROVIDER entity.relations.entity.resource.resource_subtype Mapeado diretamente do campo CLOUD_PROVIDER.
CLOUD_PROVIDER_TAGS.CLOUD_TAG[].NAME entity.relations.entity.resource.attribute.labels.key Mapeado diretamente do campo CLOUD_PROVIDER_TAGS.CLOUD_TAG[].NAME.
CLOUD_PROVIDER_TAGS.CLOUD_TAG[].VALUE entity.relations.entity.resource.attribute.labels.value Mapeado diretamente do campo CLOUD_PROVIDER_TAGS.CLOUD_TAG[].VALUE.
CLOUD_RESOURCE_ID entity.relations.entity.resource.id Mapeado diretamente do campo CLOUD_RESOURCE_ID.
CLOUD_SERVICE entity.relations.entity.resource.resource_type Se CLOUD_SERVICE for "VM", o valor será definido como "VIRTUAL_MACHINE".
DNS_DATA.HOSTNAME entity.entity.asset.hostname Mapeado diretamente do campo DNS_DATA.HOSTNAME.
EC2_INSTANCE_ID entity.relations.entity.resource.product_object_id Mapeado diretamente do campo EC2_INSTANCE_ID.
ID entity.entity.asset.product_object_id Mapeado diretamente do campo ID.
IP entity.entity.asset.ip Mapeado diretamente do campo IP.
METADATA.AZURE.ATTRIBUTE[].NAME entity.relations.entity.resource.attribute.labels.key Mapeado diretamente do campo METADATA.AZURE.ATTRIBUTE[].NAME.
METADATA.AZURE.ATTRIBUTE[].VALUE entity.relations.entity.resource.attribute.labels.value Mapeado diretamente do campo METADATA.AZURE.ATTRIBUTE[].VALUE.
OS entity.entity.asset.platform_software.platform Se OS contiver "windows" (sem distinção entre maiúsculas e minúsculas), o valor será definido como "WINDOWS".
TAGS.TAG[].NAME entity.relations.entity.resource.attribute.labels.key Mapeado diretamente do campo TAGS.TAG[].NAME.
TAGS.TAG[].TAG_ID entity.relations.entity.resource.attribute.labels.value String concatenada "TAG_ID: " com o valor de TAGS.TAG[].TAG_ID. Copiado do campo create_time do registro bruto. Fixado em "ASSET". Fixado em "QUALYS ASSET CONTEXT". Fixado em "QUALYS ASSET CONTEXT". Fixado em "RESOURCE". Fixado em "MEMBER". Copiado do campo create_time do registro bruto.

Alterações

2023-08-01

  • Mapeamos "DNS_DATA.HOSTNAME" para "entity.entity.asset.hostname".

2023-07-18

  • Parser recém-criado.