Skip to content

[P1][feature] feat(connector): HubSpot CRM connector — PII em contacts/companies/deals #1166

Description

@FabioLeitao

[P1][feature] feat(connector): HubSpot CRM connector — PII em contacts/companies/deals object properties

Contexto

CRMs são um dos maiores reservatórios de PII fora do banco: nome, email, telefone, e frequentemente CPF/documento em custom fields. O Data Boar escaneia DBs e filesystem; um conector CRM cobre um vector de alto valor que DBAs não monitoram.

Totalmente opt-in. Zero Trust. Least privilege (private app token read-only). Enterprise/Pro tier.

Encaixe na arquitetura (ref: docs/ADDING_CONNECTORS.md)

Extensão limpa do contrato de conector existente — não reinvenção:

  • Novo módulo connectors/hubspot_connector.py, classe HubSpotConnector
  • __init__(self, target_config, scanner, db_manager, sample_limit=5)
  • connect() — cliente REST a partir de target_config (token injetado via env, nunca no config commitado)
  • run() — para cada object type habilitado (contacts / companies / deals):
    • lê as object properties (schema do objeto)
    • trata cada propriedade como uma "coluna"
    • amostra os valores (respeitando sample_limit)
    • scanner.scan_column(prop_name, sample_text)
    • db_manager.save_finding(source_type="filesystem", path=<object_type>, file_name=<prop_name>, ...)
  • close() — encerra o cliente
  • registro: register("hubspot", HubSpotConnector, ["name","type"]) + ramo em connector_for_target() para type: hubspot

API HubSpot (referência)

  • REST /crm/v3/objects/{contacts|companies|deals} com parâmetro properties= para trazer os campos
  • Schema de propriedades via /crm/v3/properties/{objectType} (para descobrir custom fields dinamicamente)
  • Paginação via cursor after
  • Rate limit da API respeitado (backoff)

Config (exemplo)

targets:
  - name: crm-hubspot
    type: hubspot
    objects: [contacts, companies, deals]
    # token via env: HUBSPOT_PRIVATE_APP_TOKEN (nunca no arquivo)

Least privilege

  • Private app token com escopo read-only nos objetos escaneados (crm.objects.contacts.read, etc.)
  • Zero write. Zero delete.

Patterns a aplicar

Todos os patterns existentes via YAML: CPF, CNPJ, email, telefone, endereço, cartão, dados sensíveis — zero mudança de código de detecção. Custom fields de CRM (onde CPF costuma esconder) entram automaticamente porque cada property vira coluna.

Fixtures

Sintéticos (gerador de dados sintéticos BR): simular contacts com CPF-dígito-válido em custom field, para testar detecção sem dado real.

Definição de pronto

  • HubSpotConnector implementado, registrado, resolvível via type: hubspot
  • Lê contacts/companies/deals properties + custom fields
  • Findings alimentam o mesmo output Excel/heatmap existente
  • Fixtures sintéticos + teste
  • Token via env, nunca no config; escopo read-only documentado
  • docs/ADDING_CONNECTORS referenciado; entrada no config de exemplo

— claude.ai · Auditor R.O. externo (steering/altitude) · Sonnet 5 · A.I.I.D.C.O.B.P.P. v1.4

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions