20. Área de automação
O que a plataforma faz sozinha, num lugar só — conectores, regras e destinos de webhook.
A Automação é o grupo do menu com tudo o que roda sem ninguém clicar: o que entra (conectores que trazem eventos e logs), o que decide (regras que transformam resposta e log em achado, e avisos por regra) e o que sai (destinos que recebem um aviso por HTTP quando algo acontece). Antes isso estava espalhado entre Auditoria e Administração, e quem queria saber "o que a plataforma faz sozinha" precisava conhecer três menus.
Tela | O que faz | Para ver |
|---|---|---|
Painel da automação | coletores no ar, inspeções, execuções e custo da semana, achados abertos, o que está falhando e a cadeia de selos | automacao:ler |
Achados | a caixa única: achados de inspeção e de log, para confirmar, descartar ou promover | automacao:ler |
Eventos e conectores | SIEM, XDR, EDR, nuvem, identidade e ITSM; regras de log e achados de log ficam na integração aberta (Eventos e conectores) | integracao:ler |
Automação de respostas | a resposta de auditoria que vira NC ou risco (Automação de respostas) | auditoria:ler |
Avisos por regra | quem recebe o quê, e quando (Avisos e e-mail) | admin:usuarios |
Fontes de conteúdo | de onde o coletor lê documentos, código e mensagens | integracao:ler |
Inspeções | uma fonte lida pelas lentes e julgada contra as normas | automacao:ler |
Lentes | o que procurar, escrito pelo cliente | automacao:ler |
Destinos | para onde sai o aviso: webhook, Teams, CITSmart ou e-mail | automacao:ler |
Sandbox | ensaiar regra e modelo sem gravar de verdade (Modelos de linguagem, parecer prévio e sandbox) | llm:administrar |
As telas mudaram de grupo, e não de endereço: avisos antigos, links e a ajuda continuam abrindo a mesma tela. Embaixo do grupo há atalhos para Modelo de linguagem, Contas de serviço e Regras de atendimento, que ficam onde estão porque servem à plataforma inteira (ou aos casos).
As permissões da área são automacao:ler (ver destinos e entregas), automacao:escrever (cadastrar, testar e reenviar) e automacao:triar (decidir o que um achado da automação vira). De fábrica, o administrador e o gestor têm as três, e o analista tem ler e triar. Perfis próprios que já viam ou mantinham as integrações receberam o equivalente na atualização.
O coletor: quem faz o trabalho pesado
Ler milhares de documentos, abrir compactados, fazer OCR e chamar o modelo de linguagem é peso, e esse peso não roda dentro da plataforma: roda no grc-coletor, um processo à parte, em quantas instâncias forem precisas — numa máquina ao lado ou dentro da rede do cliente. O coletor fala com a plataforma só pela API, com uma conta de serviço do perfil Coletor de inspeção (Administração ▸ Contas de serviço): pede trabalho, recebe a inspeção com a credencial da fonte, entrega os achados e encerra.
Há dois jeitos de ligar o coletor:
• Coletor da instalação (GRC_COLETOR_CHAVE_INSTALACAO, a mesma no app e no coletor, ao menos 32 caracteres). Ele atende todos os tenants ativos — inclusive os criados depois que subiu, conferidos a cada cinco minutos —, sem uma chave por cliente e sem reinício. Em cada tenant ele trabalha com uma conta de serviço própria, Coletor da instalação, que a plataforma cria na primeira vez e que o administrador do tenant vê em Contas de serviço: o RLS, a trilha e o teto de ingestão seguem por tenant. Revogar essa conta tira o coletor da instalação daquele tenant. A chave da instalação só abre a API do coletor: no resto da plataforma ela não vale nada.
• Coletor do cliente (GRC_COLETOR_CHAVES): a chave de uma conta de serviço do próprio tenant, para quem roda o coletor dentro da rede do cliente, perto das fontes que só ele alcança.
• Cada inspeção vai a um coletor por vez, por 15 minutos renováveis. Coletor que cai deixa a vez vencer e outro continua de onde os documentos ficaram.
• Antes de cada lote ao modelo, o coletor pergunta se pode: com gente usando a IA pela tela, fora da janela de lote ou com o modelo recusando chamadas, ele espera. A tela continua rápida.
• A entrega tem teto por tenant (600 documentos por minuto). Vinte coletores juntos não deixam a plataforma lenta. O teto é contado no banco e vale para a instalação inteira: com várias instâncias da aplicação atrás do balanceador, o tenant continua com 600 no total, e não 600 em cada uma. Quem passa do teto recebe 429 com o tempo de espera, e o coletor tenta de novo depois.
• O topo de Inspeções diz quantos coletores estão no ar e se têm OCR.
• A API do coletor é só para conta de serviço. Nem o administrador, que tem todas as permissões, a chama com o login dele: a resposta leva a credencial decifrada da fonte.
• Fora da própria máquina e da rede do compose, o coletor só fala com a plataforma por https (GRC_COLETOR_API). Quem instala numa rede já cifrada por outro meio libera o http com GRC_COLETOR_PERMITIR_HTTP=true.
• Sem memória, o coletor sai e o contêiner sobe de novo: ficar de pé com o trabalhador parado deixaria os tenants sem inspeção.
Fontes de conteúdo
Em Automação ▸ Fontes de conteúdo (mudar pede integracao:escrever), Nova fonte e escolha o tipo: Pasta, MinIO ou S3, Envio manual, Links, SharePoint, OneDrive, SharePoint local, Google Drive, CITSmart Athena (GED), GitHub, GitLab, E-mail (IMAP), E-mail (Microsoft 365) ou Teams (canais). O formulário pede os campos do tipo; senha, token e chave vão cifrados e não voltam à tela (em branco na edição mantém o que está guardado).
• Testar é um pedido: a plataforma não alcança a fonte, quem alcança é o coletor. Ele atende no pulso seguinte e devolve uma amostra do que enxergou (até cinco documentos), ou o erro.
• Pasta: cada tenant tem a própria pasta no coletor, /dados/<código do tenant> (GRC_COLETOR_PASTAS muda a raiz), e o caminho da fonte é relativo a ela: politicas, ou . para a pasta inteira. Caminho absoluto, .. e link simbólico para fora são recusados — o mesmo coletor atende vários tenants, e nenhum lê a pasta do outro.
• Links lê só a web pública: endereço da rede interna é recusado, no cadastro e a cada link seguido.
• Todo endereço de fonte (S3, Athena, SharePoint local, GitHub, GitLab, IMAP) é conferido: rede do cliente sim; a própria máquina, os metadados da nuvem e a rede da plataforma, não. Redirecionamento para outro servidor é seguido sem a credencial da fonte.
• Envio manual: em Arquivos, envie o contrato ou a política avulsa (até 50 MB); entra na próxima execução das inspeções da fonte.
• E-mail e Teams leem mensagens de pessoas. A fonte só roda depois que quem administra a plataforma (admin:usuarios) registrar, em Base legal, a hipótese da LGPD, a política que sustenta o monitoramento e quem a aprovou no jurídico e no encarregado de dados. Revogar a base legal pausa as inspeções da fonte.
Lentes
Uma lente é o que procurar, escrito como se diria a um auditor. Em Automação ▸ Lentes, Nova lente: um gatilho por título ##, com o que conta e o que não conta como achado (o formulário traz um modelo). Mudar as instruções cria a versão seguinte — o achado diz por qual versão foi reconhecido, e os documentos já vistos voltam ao modelo na execução seguinte.
Lentes de fábrica. Todo tenant nasce com cinco lentes do produto, marcadas de fábrica: segredos e credenciais expostos, dados pessoais fora do lugar (LGPD), procedimento que contraria a política, incidente sem tratamento e obrigação de fornecedor descumprida. Elas são só leitura: Ligar e Desligar valem para o seu tenant, e Duplicar cria uma cópia sua, que você ajusta à vontade — a de fábrica continua recebendo as melhorias do produto. Os exemplos que você põe numa lente de fábrica são do seu tenant. O modelo de tenant, no console, diz quais nascem ligadas.
Em Versões e exemplos, os exemplos são os casos já revisados por gente: "não é achado" (falso positivo) e "é achado". Os ativos entram no prompt da lente, para o mesmo erro não voltar. O falso positivo marcado na triagem vira exemplo sozinho.
O documento chega ao modelo como dado, depois das instruções, e um detector procura nele texto escrito para dar ordens ao modelo ("ignore as instruções anteriores…"): documento assim vira achado Injeção de prompt suspeita, mesmo que o modelo não dispare nada.
Inspeções
Em Automação ▸ Inspeções, Nova inspeção junta uma fonte, as lentes e, se quiser, as normas contra as quais julgar (frameworks e temas do catálogo). Escolha a frequência, um teto de tokens por execução (estourado, a execução para e retoma depois de onde parou), só estas extensões e se o coletor deve fazer OCR. Salvar deixa em rascunho; Ativar põe na fila.
• Executar agora antecipa a vez; Reanalisar tudo esquece o que já foi visto.
• Documento com o mesmo conteúdo e a mesma chave de análise (versão das lentes, exemplos, normas e modelo) não vai ao modelo de novo.
• Compactados (zip, 7z, tar, gz, bz2, xz) são abertos até três níveis, com teto de 5 000 arquivos e 512 MB descompactados — a bomba de compressão para no teto e o documento fica como falha.
Clique no nome da inspeção para ver:
• Achados: o que as lentes reconheceram, com o trecho, a confiança e a versão da lente;
• Normas: cada requisito e quantos documentos o atendem, atendem em parte, não atendem ou não tratam do assunto (sem evidência), com o trecho que sustenta cada veredito. Requisito sem trecho próximo no documento é "sem evidência" sem gastar chamada ao modelo; "não atende" com confiança vira também achado, ligado ao requisito;
• Documentos: o que foi visto, ignorado, sem texto ou com falha, e o motivo;
• Execuções: cada passada do coletor, com documentos, achados e tokens.
Painel da automação
Automação ▸ Painel da automação mostra, numa olhada, o que roda sozinho: quantos coletores responderam nos últimos três minutos, inspeções ativas (e as atrasadas há mais de uma hora), execuções, documentos, achados e tokens dos últimos sete dias, o custo por inspeção, os achados abertos por severidade e destinos com entrega desistida. Em Pede atenção aparecem a fonte que falhou no teste e a inspeção ativa que não executa há uma semana. A tela se atualiza a cada minuto.
Achados: a caixa única
Em Automação ▸ Achados estão, num lugar só, os achados das inspeções e os das regras de log — filtre por origem, situação, severidade ou texto. Clique no achado para ver a explicação, o trecho, o documento, o requisito, a lente e o selo. Decidir pede automacao:triar:
• Confirmar — é achado, e alguém vai cuidar dele;
• Falso positivo — pede o motivo, e o motivo vira exemplo na lente que reconheceu o achado: o mesmo caso não volta na próxima execução;
• Descartar — não interessa, sem ensinar nada à lente;
• Reabrir — volta atrás numa decisão;
• Virar NC (pede também nc:tratar), Virar risco (risco:escrever) ou Abrir caso (caso:abrir). A NC nasce com origem Inspeção, o requisito violado, o trecho como evidência, o documento como link e a referência ao achado — promover de novo é recusado. O risco entra com o impacto da severidade; o caso, como incidente pelo canal API, com impacto e urgência da severidade.
Comentários ficam no achado, com resposta. PDF gera o relatório do achado, com a evidência, o selo, os comentários e quem gerou. Achado de log segue as decisões da tela de eventos (virar NC, risco ou descartar).
O selo: prova de que o achado não foi mexido
Cada achado de inspeção, ao ser gravado, entra na cadeia do dia do tenant: o selo dele é o hash do conteúdo (título, explicação, evidências, documento, lente, requisito) mais o selo do anterior. O banco recusa mudar o conteúdo de um achado selado — a triagem (estado, motivo, quem decidiu, o que virou) continua livre. Se alguém mudasse o conteúdo por baixo, a cadeia quebraria daquele ponto em diante. Pelo mesmo motivo, achado selado não se apaga: a inspeção que já tem achados é pausada, e não removida, e a lente que reconheceu algum é desativada — a tela diz isso ao tentar.
No Painel, Cadeia de selos lista os dias; Conferir refaz os hashes, elo a elo, até o fim da cadeia, e separa os dois problemas: lacuna (falta um elo — achado apagado) e adulteração (o conteúdo do achado mudou depois de selado). Mesmo depois de uma lacuna, o conteúdo de cada elo seguinte continua conferido. De hora em hora a plataforma ancora a ponta de cada cadeia (Ancorar agora antecipa). A âncora leva o carimbo de tempo da FreeTSA (RFC 3161), a autoridade gratuita que o produto usa por padrão — só o hash sai da instalação — e o arquivo .tst pode ser baixado e conferido com qualquer ferramenta de carimbo de tempo (openssl ts -verify, com o certificado da FreeTSA). GRC_SELO_TSA_URL troca a autoridade; vazio desliga, para a instalação sem internet, e aí a cadeia vale pelo encadeamento.
Destinos: avisar outro sistema quando algo acontece
Um destino recebe um aviso a cada evento que ele assina. O tipo diz como:
Tipo | O que chega |
|---|---|
Webhook | um POST com o JSON do evento, assinado — para o SIEM, o sistema de chamados ou um script seu |
Microsoft Teams | um cartão no canal: Adaptive Card, para o fluxo "Quando uma solicitação de webhook é recebida" do Power Automate, ou MessageCard, para o conector de entrada antigo |
CITSmart | um chamado aberto no CITSmart (/webmvc/servicerequestincident/create), com o título e o texto do evento; informe os ids de solicitante, atividade e contrato e o cabeçalho Authorization, guardado cifrado |
a notificação às pessoas escolhidas — no sino e por e-mail, conforme a preferência de cada uma; não sai pedido para fora da plataforma |
Em Automação ▸ Destinos (cadastrar pede automacao:escrever):
1. Clique em Novo destino e escolha o tipo (não muda depois).
2. Preencha Nome e Endereço (http ou https, com o nome completo do servidor ou o IP; o e-mail não tem endereço, e sim as pessoas que recebem) e marque em Eventos o que ele recebe:
◦ nc.criada — uma não conformidade nasceu, de qualquer origem (regra, auditoria, automação, log, inspeção ou à mão);
◦ nc.estado_alterado — a NC mudou de estado (triagem, plano, conclusão, encerramento);
◦ risco.criado — um risco foi registrado;
◦ achado_de_log.criado — as regras de log reconheceram um desvio;
◦ achado_de_inspecao.criado — uma inspeção reconheceu um achado (lente, segredo, injeção ou requisito não atendido).
3. Clique em Criar destino. A tela mostra o segredo de assinatura uma vez só: copie e entregue a quem cuida do sistema que recebe. Perdeu? Trocar segredo gera outro (o antigo deixa de valer na hora).
4. Clique em Testar: a plataforma manda um evento teste agora e mostra o que o destino respondeu e em quanto tempo.
Na lista, cada destino mostra a última entrega com sucesso, a última falha e quantas entregas estão na fila. Pausar segura o envio (o que acontecer nesse meio-tempo não é enfileirado); Entregas abre o histórico, e Reenviar põe de volta na fila uma entrega que falhou — depois de consertar o outro lado.
O endereço não pode ser a própria máquina da plataforma, o enlace local onde mora o serviço de metadados da nuvem (169.254.x.x) nem um nome sem domínio (postgres, objetos), que é como os serviços da instalação se chamam entre si. Rede privada é aceita: o sistema de chamados do cliente costuma morar nela. A rede da própria plataforma, não: com a aplicação em contêiner, a sub-rede dela é recusada sozinha; fora de contêiner, informe as redes a recusar em GRC_AUTOMACAO_REDES_BLOQUEADAS (CIDR, separados por vírgula). O endereço é conferido no cadastro e de novo a cada envio.
O Testar de um destino CITSmart abre um chamado de verdade no CITSmart do cliente, e a tela pede confirmação antes.
O que chega do outro lado
POST /seu/endereco
Content-Type: application/json
X-GRC-Evento: nc.criada
X-GRC-Entrega: 4f0c… (o id desta entrega; igual nas tentativas)
X-GRC-Tentativa: 1
X-GRC-Timestamp: 1759314656 (segundos desde 1970)
X-GRC-Assinatura: sha256=9331ca93…
{"evento": "nc.criada", "entregaId": "4f0c…", "ocorridoEm": "2026-10-01T10:30:56Z",
"registro": {"tipo": "NAO_CONFORMIDADE", "id": "…", "numero": "NC-2026-0237", "titulo": "…",
"severidade": "ALTA", "estado": "IDENTIFICADO", "origem": "INSPECAO",
"requisitoId": "…", "evidenciaUrl": "https://…", "referenciaExterna": "…"}}
A assinatura é o HMAC-SHA256 do segredo sobre <X-GRC-Timestamp>.<corpo>. Confira as duas coisas antes de confiar no aviso: a assinatura e o instante (recuse o que tiver mais de cinco minutos). Em Python:
import hmac, hashlib, time
esperada = "sha256=" + hmac.new(segredo.encode(), f"{ts}.{corpo}".encode(), hashlib.sha256).hexdigest()
ok = hmac.compare_digest(esperada, cabecalho_assinatura) and abs(time.time() - int(ts)) < 300
Responda 2xx em até 10 segundos e processe depois. Sem resposta, com 5xx, 408 ou 429, a entrega volta para a fila e tenta de novo em 30 s, 1 min, 2 min… dobrando até 6 h entre tentativas, e desiste depois de 10 (cerca de oito horas e meia). Outro 4xx (endereço errado, autenticação recusada) desiste na hora, porque repetir não muda nada. Use X-GRC-Entrega para descartar repetidos: numa queda de rede, a mesma entrega pode chegar duas vezes.
A entrega nasce na mesma gravação do que aconteceu: se a NC for gravada, o aviso não se perde mesmo que o destino esteja fora do ar; se a gravação for desfeita, o aviso não sai. Entregas enviadas ficam 30 dias no histórico, e as que desistiram, 90.
Não conformidade por API, com o que ela viola
Quem cria NC pela API (uma conta de serviço com nc:tratar) pode dizer, além de título, descrição e severidade, o que o achado viola e de onde ele veio:
Campo | O que é |
|---|---|
origem | MANUAL (padrão) ou INSPECAO. As demais origens nascem só dentro da plataforma. |
requisitoId, controleId | o requisito e o controle do catálogo (de fábrica ou do tenant) |
evidenciaUrl | onde a evidência mora — o documento, o commit, a página; só http e https |
evidenciaTrecho | o trecho que sustenta o achado, já sem dados pessoais |
referenciaExterna | o id do achado no sistema que o mandou |
Com referenciaExterna, o pedido é idempotente: mandar o mesmo achado de novo devolve a NC que já existe (200), em vez de criar outra (201). É o que deixa um coletor reenviar um lote que caiu no meio sem duplicar nada. A NC mostra requisito, controle e evidência no detalhe, e o webhook nc.criada leva os mesmos campos.
Dados pessoais antes do modelo de linguagem
Cada modelo em Administração ▸ Modelo de linguagem tem Mascarar dados pessoais. Ligado, o texto vai ao modelo com CPF, CNPJ, e-mail, telefone e cartão trocados por marcadores ([CPF], [E-MAIL]…) — o modelo não vê o número, mas vê que havia um, e é o que uma regra como "dado pessoal em log" precisa julgar. Número sem pontuação só vira marcador quando o dígito verificador confere (o cartão, quando passa no Luhn): onze dígitos quaisquer podem ser um pedido ou um protocolo.
Vem ligado para modelo fora da rede da instalação e desligado para o que mora nela (localhost, rede privada ou o ollama do compose), que é o caminho recomendado para quem não pode mandar texto para fora.
Análise de aderência gravada
A análise de aderência do acervo (Acervo de documentos) continua sem guardar nada por padrão. Marque Gravar esta análise antes de Analisar para guardar só o resultado — requisito a requisito, com os trechos citados —, nunca o documento. As gravadas aparecem em Análises gravadas, abaixo da tela: clique para reabrir (e baixar o relatório de novo) ou apague. Cada pessoa vê as suas; quem configura o acervo vê todas.
O conector de logs GRCS Inspect saiu do catálogo de Eventos e conectores: não aceita integração nova, e a integração que já existe continua coletando até ser removida.
O destino CITSmart não reenvia sozinho uma entrega que pode ter aberto o chamado (resposta que não veio, erro do servidor): o CITSmart não recusa chamado repetido, e reenviar abriria o segundo. A entrega fica como desistida, com o aviso de conferir no CITSmart; Reenviar continua à mão. Conexão recusada, 429 e 503 voltam à fila normalmente.