Saltar para o conteúdo

MCP

Auditar o Claude Code e servidores MCP em ambientes self-hosted

Por Olivares AI 7 min de leitura

Uma equipa de plataforma implementa o Claude Code para uma dúzia de engenheiros. Para o tornar útil, ligam-no a alguns servidores MCP: um que lê o monorepo, um que consulta uma réplica de relatórios, um que abre tickets. Numa semana, um agente está a ler código-fonte, a tocar numa base de dados e a chamar ferramentas internas — e ninguém consegue responder à pergunta que um auditor acabará por fazer: qual o agente que fez o quê, a que recurso, e consegue provar que não foi alterado posteriormente?

Esta não é uma lacuna hipotética. Investigação independente do setor (CSA/Token, n=418) concluiu que cerca de 82% das organizações têm agentes de IA em execução de que não têm conhecimento, ao passo que apenas cerca de 21% mantêm um inventário deles em tempo real. O Claude Code e o MCP são exatamente o tipo de capacidade que aterra depressa e ultrapassa a narrativa de auditoria. A boa notícia: um registo defensável é alcançável inteiramente dentro do seu próprio perímetro, sem que payloads ou segredos saiam dele.

Porque é que a configuração óbvia não passa numa auditoria

A primeira implementação habitual partilha uma só credencial. Cada instância do Claude Code autentica-se na camada MCP e nas bases de dados a jusante como a mesma conta de serviço — mcp-runner, ci-bot, algo genérico. Funciona, e destrói silenciosamente a atribuição.

Quando dez agentes atuam como um único principal, o registo de auditoria da base de dados mostra dez escritas a partir de mcp-runner e nada mais. Não consegue saber qual a sessão de que engenheiro emitiu o UPDATE, se veio de um prompt interativo do Claude Code ou de um job não assistido, nem qual a ferramenta MCP que estava no caminho. Investigação independente (Optro) situa a fração de organizações que conseguem rastrear a ação de um agente até uma pessoa em cerca de 28%. Uma conta de serviço partilhada é uma das razões estruturais para o colapso da atribuição: o registo de auditoria pode mostrar o que aconteceu, mas nunca qual o agente que o fez.

A segunda falha é a integridade. Mesmo as equipas que registam por ação escrevem habitualmente para um armazenamento mutável. Se os registos vivem no mesmo sistema a que um atacante (ou um agente com bugs) consegue chegar, “temos registos” não é o mesmo que “temos provas”. Um auditor distingue claramente as duas coisas.

A identidade por agente é a base

Tudo o que vem a jusante depende da atribuição, por isso corrija a identidade primeiro. Em vez de um único token partilhado, emita uma identidade distinta e de curta duração por agente — idealmente por sessão. A identidade viaja com o pedido para dentro do servidor MCP e para qualquer recurso que o agente alcance, pelo que o principal registado na base de dados é o agente e não um runner genérico.

É isto que torna o least-privilege significativo. Um agente de relatórios pode ser fixado em apenas leitura na réplica de relatórios; um agente de release recebe escrita apenas para os artefactos que possui. Agora, uma única escrita observada fora desse envelope é um sinal preciso e atribuível, em vez de ruído numa conta partilhada. Expressa como política, a intenção é direta:

agent "reporting-assistant" {
  # Claude Code session via the reporting MCP server
  resource "prod-postgres/reporting_replica" {
    access     = "read"      # SELECT only
    deny       = ["write", "ddl"]
  }
  resource "s3://billing-exports" {
    access = "read"
  }
  on_violation {
    action = "block_and_alert"   # refuse at access time, not just log
  }
}

O ponto não é a sintaxe — é que a política nomeia o agente, nomeia o recurso e separa a leitura da leitura/escrita. Essa separação é tudo o que importa.

Trate as anotações MCP como sinais não confiáveis

As ferramentas MCP podem descrever-se a si próprias com anotações como readOnlyHint e destructiveHint. São genuinamente úteis para triagem — uma ferramenta que se declara destrutiva merece uma política mais apertada. Mas a especificação MCP é explícita ao afirmar que estas são sugestões, e os clientes não devem confiar nelas para decisões de segurança. Têm origem no servidor, que é precisamente aquilo que está a auditar. Uma ferramenta pode declarar readOnlyHint: true e ainda assim executar uma escrita, seja por um bug, por uma má configuração ou por evasão deliberada.

Por isso, a postura correta é a corroboração, não a confiança. Tome a anotação como uma alegação e, depois, verifique-a face à verdade fundamental de uma camada que a ferramenta não controla:

  • Registos de auditoria da base de dados (por exemplo, o pgAudit do PostgreSQL) dizem-lhe se um SELECT ou um UPDATE foi efetivamente executado.
  • Spans de OpenTelemetry do servidor MCP e dos serviços a jusante mostram o grafo de chamadas e as operações realizadas.
  • Sinais eBPF ao nível do kernel são a salvaguarda anti-evasão: uma syscall de escrita para um ficheiro ou socket é observável no kernel, independentemente do que a ferramenta alegou no espaço de utilizador.

Quando a anotação diz apenas leitura e o kernel viu uma escrita, essa contradição é a descoberta de destaque — uma ferramenta readOnlyHint que escreveu em prod-postgres é precisamente o desvio de least-privilege que vale a pena acordar alguém para tratar. A diferença entre o que a política permitiu e o que os coletores observaram é onde reside o verdadeiro risco.

O registo que um auditor irá aceitar

Um registo só é prova se for à prova de adulteração. Escreva cada evento num registo apenas de acréscimo, encadeado por hash: cada registo inclui o hash do anterior, pelo que qualquer edição ou eliminação a jusante quebra a cadeia e é detetável. Cada linha atribui a ação ao agente específico, nomeia o recurso, regista leitura versus leitura/escrita e transporta um nível de confiança — attributed quando a identidade e o resultado estão ambos corroborados, approximate quando algo teve de ser inferido. A confiança é apresentada com honestidade; uma correspondência aproximada nunca é disfarçada de uma comprovada.

ts=2026-06-08T09:14:02Z agent=reporting-assistant@s3f1 tool=sql-read     resource=prod-postgres/reporting_replica  op=R   outcome=allow   conf=attributed   prev=8a1c…
ts=2026-06-08T09:14:05Z agent=reporting-assistant@s3f1 tool=export-writer resource=s3://billing-exports          op=R   outcome=allow   conf=attributed   prev=2f90…
ts=2026-06-08T09:17:48Z agent=data-export-job@b22e     tool=sql-write     resource=prod-postgres/customers          op=RW  outcome=DENY    conf=attributed   prev=c7d3…  policy=read_only_violation

Essa terceira linha é aquela que interessa a um auditor: uma tentativa de escrita numa tabela para a qual o agente não tinha qualquer concessão de escrita, negada no momento do acesso, atribuída a um agente nomeado e ancorada na cadeia. Como a política é imposta quando o acesso acontece — e não meramente registada depois — a negação é um controlo, não uma autópsia.

Mais duas propriedades fazem o registo aguentar-se. As vistas privilegiadas são elas próprias auditadas: olhar para o mapa de acessos fica registado, pelo que “quem viu o quê” tem resposta. E a exportação de provas é à prova de adulteração — entrega a um auditor uma fatia assinada da cadeia que ele pode verificar de forma independente, em vez de um CSV que tem de aceitar de boa-fé.

PropriedadeConta de serviço partilhadaIdentidade por agente + registo encadeado por hash
AtribuiçãoUm único principal para todos os agentesAção associada ao agente/sessão específico
Leitura vs escritaMisturadasDistinguidas e verificadas pela política
IntegridadeRegistos mutáveisApenas de acréscimo, a cadeia quebra-se na edição
Exportação pronta para auditoriaCSV aceite de boa-féFatia assinada e verificável de forma independente

Porque é que o self-hosted importa aqui

Tudo isto funciona sem que nada saia da sua rede. O coletor observa — registos, OpenTelemetry, eBPF como salvaguarda ao nível do kernel — em vez de se sentar no caminho de dados do agente, pelo que, se falhar, nunca quebra o agente nem o pedido de produção que está por trás dele. O registo armazena relações de acesso, não payloads: regista que reporting-assistant leu reporting_replica, não as linhas que devolveu. As entradas que possam transportar segredos ou dados pessoais são redigidas e analisadas em busca de segredos antes de qualquer coisa ser escrita. Para infraestruturas air-gapped, sujeitas ao RGPD ou com restrições de residência de dados, essa é a diferença entre uma narrativa de auditoria que pode defender e uma que não pode: nada sobre a sua utilização do Claude Code e do MCP comunica para o exterior, porque o sistema nunca vê os dados, para começar.

O Claude Code e o MCP valem a pena ser implementados. Só precisam de um registo de auditoria construído da mesma forma que o construiria para qualquer outra automação privilegiada — identidade primeiro, resultados corroborados, provas ancoradas. Se quiser ver como o mapa de acessos e o registo à prova de adulteração se encaixam, o modelo de segurança e a visão geral do produto aprofundam cada um deles.

Perguntas frequentes

Posso confiar no readOnlyHint de uma ferramenta MCP para provar que uma ação foi só de leitura?

Não. A especificação MCP afirma que as anotações de ferramentas, como readOnlyHint e destructiveHint, são sugestões e devem ser tratadas como não confiáveis, porque provêm do servidor e não de uma camada de imposição. Use-as para triagem e para assinalar contradições, mas prove o resultado real de leitura/escrita com telemetria ou sinais ao nível do kernel (spans de OpenTelemetry, registos de auditoria da base de dados, eBPF). Confie no resultado corroborado, não na anotação.

Como atribuo uma ação do Claude Code a um agente específico em vez de a uma conta de serviço partilhada?

Emita uma identidade distinta e de curta duração por agente ou por sessão, em vez de um único token partilhado. Quando o agente chega a uma base de dados ou a um servidor MCP, essa identidade viaja com o pedido, pelo que o registo de auditoria regista qual o agente que fez o quê. Uma conta de serviço partilhada colapsa todos os agentes num único principal e torna impossível, a posteriori, o least-privilege por agente e a atribuição à prova de adulteração.

Veja a que os seus agentes conseguem aceder

A Olivares AI é a plataforma aberta e self-hosted para o seu ecossistema de IA. Implemente-a na sua própria infraestrutura e obtenha o mapa de acessos que as suas equipas de segurança e plataforma têm vindo a pedir.