Back

Autenticação e Autorização de Agentes IA: Como Proteger Tool Calls, Escopos OAuth e Permissões em Produção

Seu agente de IA acabou de mandar uma mensagem no Slack pra 14.000 clientes. Um agente de suporte em produção, feito pra consultar status de pedidos, sofreu prompt injection e acessou a API de mensagens em massa. Tinha as credenciais. Tinha as permissões. Ninguém aprovou. O agente agiu dentro da sua autorização técnica: ele só não deveria ter feito isso.

Essa é a nova fronteira de segurança de IA. Passamos anos blindando aplicações web contra SQL injection, XSS e CSRF. Agora tamos deployando sistemas autônomos que carregam API keys, tokens OAuth e credenciais de banco de dados, sistemas que tomam suas próprias decisões sobre quais ferramentas chamar e quais dados acessar. A superfície de ataque não são os pesos do modelo. É a camada de execução: as credenciais, permissões e acessos a ferramentas concedidos a agentes que podem ser manipulados via prompt injection, goal hijacking ou simples erro de configuração.

Esse guia cobre a arquitetura de segurança completa pra agentes de IA em produção: gestão de identidade, autorização delegada com OAuth 2.1, permissões granulares de ferramentas, enforcement de gateway MCP, padrões human-in-the-loop e as estratégias de defesa em profundidade que separam um deploy seguro de um incidente esperando pra acontecer.

Por que autenticação tradicional não funciona pra agentes de IA

Você não daria as credenciais root da AWS pra um estagiário dizendo "usa com bom senso". Mas é essencialmente isso que muitos times fazem com agentes de IA. Vamos ver por que o modelo tradicional de service account quebra:

Agentes são atores não-determinísticos

Um microserviço tradicional faz as mesmas chamadas de API toda vez. Dá pra auditar o comportamento lendo o código fonte. Um agente de IA é fundamentalmente diferente:

Serviço Tradicional:
  Input: "Buscar pedido #12345"
  → Sempre chama: GET /api/orders/12345
  → Previsível, auditável

Agente IA:
  Input: "Ajuda esse cliente com o pedido dele"
  → Pode chamar: GET /api/orders/12345
  → Pode chamar: POST /api/refunds
  → Pode chamar: PUT /api/customer/email
  → Pode chamar: DELETE /api/orders/12345
  → Não-determinístico, depende do contexto

O agente decide quais ferramentas invocar baseado no seu raciocínio em runtime. Políticas RBAC estáticas que funcionavam pra microserviços não dão conta: você precisa de autorização dinâmica e consciente do contexto.

O problema do raio de explosão

Quando um serviço tradicional é comprometido, o dano fica limitado à sua funcionalidade fixa. Quando um agente de IA é comprometido (ou manipulado), o raio de explosão é igual ao conjunto total de permissões dele:

FatorMicroserviçoAgente IA
AçõesFixas, predefinidasDinâmicas, decididas pelo modelo
Vetor de ataqueExploits de códigoPrompt injection, goal hijacking
Raio de explosãoFunção únicaTodas as permissões concedidas
Trilha de auditoriaLogs determinísticosExige trace de raciocínio
Padrão de acessoPrevisívelDepende do contexto

Um agente com permissões amplas vira uma superfície de ataque universal. Cada ferramenta que ele pode acessar é uma ferramenta que um atacante pode potencialmente invocar através do agente.

O descompasso do ciclo de vida de credenciais

A maioria das service accounts usa credenciais de longa duração: API keys que rotacionam trimestralmente, tokens de serviço sem expiração. Pra um serviço determinístico, isso é (até certo ponto) aceitável. Pra um agente que pode ser manipulado em tempo real:

// ❌ Como a maioria dos times deploya agentes hoje const agent = new Agent({ openaiKey: process.env.OPENAI_API_KEY, stripeKey: process.env.STRIPE_SECRET_KEY, // Acesso total dbConnection: process.env.DATABASE_URL, // Leitura + Escrita slackToken: process.env.SLACK_BOT_TOKEN, // Todos os canais awsCredentials: { accessKeyId: process.env.AWS_ACCESS_KEY, // IAM admin?? secretAccessKey: process.env.AWS_SECRET_KEY, }, }); // Esse agente tem as chaves do reino

Se o agente sofrer prompt injection, cada uma dessas credenciais tá em jogo.

O modelo de identidade pra agentes

O primeiro passo pra proteger agentes é tratá-los como Identidades Não-Humanas (NHIs): não como extensões de contas de usuário, não como service accounts compartilhadas, mas como entidades de identidade de primeira classe.

Identidade única por agente

Cada instância de agente deve ter sua própria identidade, sem compartilhar credenciais com outros agentes ou serviços:

interface AgentIdentity { agentId: string; // Identificador único agentType: string; // ex: 'customer-support', 'data-analyst' version: string; // Versão do agente pra auditoria deploymentEnv: string; // 'production' | 'staging' | 'development' owner: string; // Time responsável createdAt: Date; expiresAt: Date; // Expiração obrigatória maxConcurrentSessions: number; allowedTools: string[]; // Whitelist de ferramentas permitidas deniedTools: string[]; // Blacklist explícita } // Registrar identidade do agente no deploy const identity = await identityProvider.register({ agentType: 'customer-support', version: '2.4.1', owner: 'support-team', expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000), // 24h allowedTools: [ 'lookup_order', 'check_shipping_status', 'create_support_ticket', ], deniedTools: [ 'issue_refund', // Exige aprovação humana 'delete_account', // Nunca automatizado 'bulk_message', // Nunca automatizado ], });

Credenciais de curta duração e escopo limitado

Acabe com as API keys estáticas. Cada sessão de agente deve usar credenciais que sejam:

  1. Limitadas no tempo: Expiram em minutos ou horas, não meses
  2. Limitadas em escopo: Só dão acesso às ferramentas específicas necessárias
  3. Vinculadas à sessão: Atreladas a uma sessão específica, não ao tipo de agente
class AgentCredentialManager { async getSessionCredentials( agentIdentity: AgentIdentity, sessionContext: SessionContext ): Promise<ScopedCredentials> { // Solicitar token de curta duração ao identity provider const token = await this.idp.issueToken({ subject: agentIdentity.agentId, audience: 'tool-gateway', scopes: this.resolveScopes(agentIdentity, sessionContext), expiresIn: '15m', // Sessões de 15 minutos sessionId: sessionContext.id, constraints: { maxToolCalls: 50, // Limite rígido por sessão allowedIPs: ['10.0.0.0/8'], // Restrições de rede rateLimit: '100/minute', }, }); return { token, refreshToken: null, // Sem refresh — pegar nova sessão expiresAt: token.expiresAt, }; } private resolveScopes( identity: AgentIdentity, context: SessionContext ): string[] { // Resolução dinâmica de escopos baseada em contexto const baseScopes = identity.allowedTools.map( (t) => `tool:${t}:execute` ); // Elevar ou restringir com base no contexto do usuário if (context.userTier === 'enterprise') { baseScopes.push('tool:priority_support:execute'); } // Restrições baseadas em horário const hour = new Date().getHours(); if (hour < 6 || hour > 22) { // Fora do horário: modo somente leitura return baseScopes.filter((s) => !s.includes('write')); } return baseScopes; } }

OAuth 2.1 pra autorização delegada de agentes

Quando um agente de IA age em nome de um usuário, ele precisa de autorização delegada: o usuário concede explicitamente ao agente acesso limitado e temporário aos seus recursos. OAuth 2.1 foi projetado exatamente pra isso.

O fluxo OAuth pra agentes

┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
│ Usuário  │    │  Gateway │    │ Servidor │    │ Servidor │
│          │    │  Agente  │    │   Auth   │    │ Recurso  │
└────┬─────┘    └────┬─────┘    └────┬─────┘    └────┬─────┘
     │               │               │               │
     │ "Me ajuda com │               │               │
     │  meu pedido"  │               │               │
     │──────────────>│               │               │
     │               │               │               │
     │  Auth neces.  │               │               │
     │<──────────────│               │               │
     │               │               │               │
     │ Login + dar   │               │               │
     │ acesso        │               │               │
     │ limitado      │               │               │
     │──────────────────────────────>│               │
     │               │               │               │
     │               │  Token com    │               │
     │               │  escopos      │               │
     │               │<──────────────│               │
     │               │               │               │
     │               │  API call     │               │
     │               │  com token    │               │
     │               │──────────────────────────────>│
     │               │               │               │
     │               │  Resposta     │               │
     │               │<──────────────────────────────│
     │               │               │               │
     │  Agente usa   │               │               │
     │  o resultado  │               │               │
     │<──────────────│               │               │

Implementação: OAuth 2.1 + PKCE pra agentes

import { AuthorizationCode } from 'simple-oauth2'; class AgentOAuthManager { private client: AuthorizationCode; constructor() { this.client = new AuthorizationCode({ client: { id: process.env.AGENT_CLIENT_ID!, secret: '', // Cliente público — sem secret }, auth: { tokenHost: process.env.AUTH_SERVER_URL!, authorizePath: '/authorize', tokenPath: '/token', }, }); } async initiateUserConsent( userId: string, requiredScopes: string[] ): Promise<ConsentRequest> { // Gerar challenge PKCE const codeVerifier = crypto.randomBytes(32) .toString('base64url'); const codeChallenge = crypto .createHash('sha256') .update(codeVerifier) .digest('base64url'); const authorizationUrl = this.client.authorizeURL({ redirect_uri: process.env.AGENT_CALLBACK_URL, scope: requiredScopes.join(' '), state: crypto.randomUUID(), code_challenge: codeChallenge, code_challenge_method: 'S256', }); // Guardar verifier pra troca de token await this.storeSession(userId, { codeVerifier }); return { consentUrl: authorizationUrl, scopes: requiredScopes, expiresIn: 300, // 5 minutos pra completar }; } async exchangeCode( userId: string, authorizationCode: string ): Promise<AgentToken> { const session = await this.getSession(userId); const tokenResponse = await this.client.getToken({ code: authorizationCode, redirect_uri: process.env.AGENT_CALLBACK_URL, code_verifier: session.codeVerifier, }); return { accessToken: tokenResponse.token.access_token, expiresAt: new Date(tokenResponse.token.expires_at), scopes: tokenResponse.token.scope.split(' '), // Sem refresh token — agente precisa re-solicitar consentimento }; } }

Design de escopos granulares

Projete escopos estreitos o suficiente pra aplicar o princípio de menor privilégio:

// ❌ RUIM: Escopos amplos demais const scopes = ['orders:full', 'customers:full', 'payments:full']; // ✅ BOM: Escopos granulares e específicos por ação const scopes = [ 'orders:read', // Só consultar pedidos 'orders:status:read', // Só verificar status de envio 'tickets:create', // Só criar tickets de suporte // NÃO incluído: // 'orders:write' // Não pode modificar pedidos // 'refunds:create' // Não pode emitir reembolsos // 'customers:delete' // Não pode deletar contas ]; // Ainda melhor: escopos específicos por recurso const scopes = [ 'orders:read:user:usr_abc123', // Só pedidos desse usuário 'tickets:create:org:org_xyz789', // Só tickets dessa org ];

O Tool Gateway: interceptando cada ação do agente

A camada de segurança mais crítica é a que fica entre o agente e cada ferramenta que ele pode invocar. Pense nisso como um firewall pra ações de agentes.

Arquitetura

┌─────────────┐    ┌─────────────────────────────────────┐
│             │    │          Tool Gateway                │
│   Agente    │    │                                     │
│   Runtime   │───>│  ┌──────────┐  ┌───────────────┐   │
│             │    │  │  Motor   │  │  Rate Limiter │   │
│             │    │  │  AuthZ   │  │               │   │
└─────────────┘    │  └────┬─────┘  └───────┬───────┘   │
                   │       │                │            │
                   │  ┌────▼────────────────▼───────┐   │
                   │  │     Ponto de Enforcement      │   │
                   │  │     de Políticas (PEP)        │   │
                   │  └────┬─────────────────────────┘   │
                   │       │                             │
                   │  ┌────▼─────────────────────────┐   │
                   │  │     Logger de Auditoria        │   │
                   │  └────┬─────────────────────────┘   │
                   └───────┼─────────────────────────────┘
                           │
              ┌────────────┼────────────────┐
              │            │                │
        ┌─────▼────┐ ┌────▼─────┐  ┌──────▼──────┐
        │ Stripe   │ │ Database │  │ Slack API   │
        │ API      │ │          │  │             │
        └──────────┘ └──────────┘  └─────────────┘

Implementação

class ToolGateway { async executeToolCall( request: ToolCallRequest ): Promise<ToolCallResult> { // Passo 1: Verificar identidade e sessão do agente const session = await this.verifySession(request); if (!session.valid) { throw new UnauthorizedError('Sessão inválida ou expirada'); } // Passo 2: Checar rate limits const rateLimitOk = await this.rateLimiter.check( request.agentId, request.toolName ); if (!rateLimitOk) { throw new RateLimitError('Rate limit de tool call excedido'); } // Passo 3: Avaliar política de autorização const decision = await this.authzEngine.evaluate({ subject: request.agentId, action: request.toolName, resource: request.parameters, context: { sessionId: request.sessionId, time: new Date(), reasoning: request.reasoning, }, }); // Passo 4: Lidar com decisão da política if (!decision.allowed) { throw new ForbiddenError(decision.reason); } // Passo 5: Aprovação humana se necessária if (decision.requiresApproval) { const approved = await this.requestHumanApproval(request); if (!approved) { throw new ForbiddenError('Aprovação humana negada'); } } // Passo 6: Executar com sanitização de parâmetros const sanitizedParams = decision.modifiedParams || this.sanitizeParams(request.parameters); // Passo 7: Executar e auditar return await this.executeWithAudit( request.toolName, sanitizedParams, request ); } }

MCP como gateway padrão

O Model Context Protocol (MCP) virou o padrão de facto pra comunicação agente-ferramenta. Use servidores MCP como sua fronteira de segurança:

import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { z } from 'zod'; const server = new McpServer({ name: 'secure-tools', version: '1.0.0', }); // Registrar ferramentas com segurança integrada e validação Zod server.registerTool( 'lookup_order', { description: 'Consultar detalhes do pedido por ID', inputSchema: z.object({ orderId: z.string() .regex(/^ORD-[A-Z0-9]{8}$/) .describe('O ID do pedido pra consultar'), }), }, async ({ orderId }, { meta }) => { const hasScope = await verifyScope( meta.authToken, 'orders:read' ); if (!hasScope) { return { content: [ { type: 'text', text: 'Erro: Permissões insuficientes pra consulta de pedido', }, ], isError: true, }; } const order = await db.orders.findByIdAndUser( orderId, meta.userId ); if (!order) { return { content: [ { type: 'text', text: 'Pedido não encontrado ou acesso negado', }, ], isError: true, }; } return { content: [ { type: 'text', text: JSON.stringify(sanitizeOrder(order)), }, ], }; } );

Fluxos de aprovação Human-in-the-Loop (HITL)

Nem toda ação deveria ser bloqueada por aprovação humana: isso anula o propósito da automação. Mas operações de alto risco exigem.

Matriz de classificação de risco

enum RiskLevel { LOW = 'low', // Auto-aprovar MEDIUM = 'medium', // Logar e prosseguir, revisar async HIGH = 'high', // Aprovação humana síncrona necessária CRITICAL = 'critical', // Bloquear completamente } const TOOL_RISK_CLASSIFICATION: Record<string, RiskLevel> = { // Baixo risco — auto-aprovar 'lookup_order': RiskLevel.LOW, 'check_shipping': RiskLevel.LOW, 'search_faq': RiskLevel.LOW, // Risco médio — prosseguir mas flagear pra review 'create_ticket': RiskLevel.MEDIUM, 'update_customer_preferences': RiskLevel.MEDIUM, 'send_notification': RiskLevel.MEDIUM, // Alto risco — aprovação em tempo real necessária 'issue_refund': RiskLevel.HIGH, 'modify_subscription': RiskLevel.HIGH, 'access_pii': RiskLevel.HIGH, 'escalate_to_human': RiskLevel.HIGH, // Crítico — nunca permitir execução automatizada 'delete_account': RiskLevel.CRITICAL, 'bulk_data_export': RiskLevel.CRITICAL, 'modify_permissions': RiskLevel.CRITICAL, 'execute_code': RiskLevel.CRITICAL, };

Implementação de aprovação em tempo real

class ApprovalQueue { async requestApproval( request: ToolCallRequest ): Promise<boolean> { const risk = TOOL_RISK_CLASSIFICATION[request.toolName]; if (risk === RiskLevel.CRITICAL) { return false; // Sempre negar } if (risk === RiskLevel.LOW) { return true; // Sempre permitir } if (risk === RiskLevel.MEDIUM) { // Auto-aprovar mas flagear pra revisão async await this.flagForReview(request); return true; } // Risco ALTO: aprovação síncrona necessária const approval = await this.createApprovalRequest({ toolName: request.toolName, parameters: request.parameters, reasoning: request.reasoning, agentId: request.agentId, timeout: 300000, // 5 minutos }); // Notificar revisores via Slack/Teams/PagerDuty await this.notifyReviewers(approval); // Aguardar decisão const result = await this.waitForDecision( approval.id, approval.timeout ); // Timeout = negado (fail-closed) return result?.approved ?? false; } }

Defesa em profundidade: arquitetura de segurança em camadas

Nenhuma camada de segurança sozinha é suficiente. Deploys de agentes em produção precisam de defesa em profundidade:

Camada 1: Filtragem de input (antes do agente)

class AgentInputFilter { private readonly INJECTION_PATTERNS = [ /ignore\s+(all\s+)?previous\s+instructions/i, /you\s+are\s+now\s+a/i, /system\s*:\s*/i, /\bact\s+as\b/i, /forget\s+(everything|all|your)/i, /new\s+instructions?\s*:/i, /admin\s+(mode|access|override)/i, ]; async filterInput(input: string): Promise<FilterResult> { for (const pattern of this.INJECTION_PATTERNS) { if (pattern.test(input)) { return { safe: false, reason: `Potencial injeção detectada: ${pattern.source}`, sanitized: null, }; } } const classification = await this.classifyIntent(input); if (classification.maliciousScore > 0.7) { return { safe: false, reason: `Conteúdo classificado como potencialmente malicioso (score: ${classification.maliciousScore})`, sanitized: null, }; } return { safe: true, reason: null, sanitized: input }; } }

Camada 2: Validação de tool calls (o gateway)

Já coberta acima: o Tool Gateway com AuthZ, rate limiting e fluxos de aprovação.

Camada 3: Filtragem de output (depois do agente)

class AgentOutputFilter { async filterOutput( output: string, context: SessionContext ): Promise<FilterResult> { // Detecção e redação de PII const piiCheck = await this.detectPII(output); if (piiCheck.found) { output = this.redactPII(output, piiCheck.entities); } // Prevenção de vazamento de dados sensíveis const secrets = this.detectSecretsInOutput(output); if (secrets.length > 0) { output = '[CENSURADO: Output continha dados sensíveis]'; await this.alertSecurityTeam({ type: 'SECRET_LEAK_PREVENTED', context, }); } return { safe: true, reason: null, sanitized: output }; } }

Camada 4: Detecção de anomalias de comportamento

class AgentBehaviorMonitor { async monitorAction( action: AgentAction ): Promise<AnomalyResult> { const baseline = this.baselines.get(action.agentType); if (!baseline) return { anomalous: false }; const anomalies: string[] = []; // Anomalia na frequência de uso de ferramenta const toolFreq = await this.getToolFrequency( action.agentId, action.toolName, '1h' ); if (toolFreq > baseline.toolFrequency[action.toolName] * 3) { anomalies.push( `Tool "${action.toolName}" chamada ${toolFreq}x (baseline: ${baseline.toolFrequency[action.toolName]}x)` ); } // Padrão de acesso a ferramentas novas const previousTools = await this.getHistoricalTools( action.agentId, '30d' ); if (!previousTools.includes(action.toolName)) { anomalies.push( `Primeiro acesso à ferramenta: "${action.toolName}"` ); } if (anomalies.length > 0) { await this.triggerAlert({ agentId: action.agentId, anomalies, severity: anomalies.length > 2 ? 'critical' : 'warning', }); } return { anomalous: anomalies.length > 0, details: anomalies, }; } }

Logging de auditoria: a espinha dorsal forense

Toda ação do agente precisa ser logada de forma imutável com contexto suficiente pra reconstruir a cadeia de decisões completa:

interface AgentAuditEntry { // Identidade timestamp: Date; traceId: string; agentId: string; agentType: string; sessionId: string; // Contexto do ator triggerUserId: string | null; triggerSource: 'user' | 'schedule' | 'event' | 'agent'; // Ação event: 'TOOL_CALL' | 'TOOL_DENIED' | 'APPROVAL_REQUESTED' | 'APPROVAL_GRANTED' | 'APPROVAL_DENIED' | 'RATE_LIMITED' | 'ANOMALY_DETECTED' | 'SESSION_CREATED' | 'SESSION_EXPIRED'; // Detalhes toolName: string; parameters: Record<string, unknown>; // Sanitizados reasoning: string; policyDecision: PolicyDecision; result: 'success' | 'failure' | 'denied' | 'timeout'; // Custo tokensConsumed: number; estimatedCost: number; // Metadata modelUsed: string; latencyMs: number; } // CRÍTICO: Distinguir ações de agente vs. humano class AuditLogger { async log(entry: AgentAuditEntry): Promise<void> { // Store append-only e imutável await this.immutableStore.append({ ...entry, actorType: 'AI_AGENT', hash: this.computeHash(entry), }); // Streaming em tempo real pra monitoramento await this.eventStream.publish('agent.audit', entry); } }

Anti-padrões de produção

Anti-padrão 1: API Keys compartilhadas

// ❌ NUNCA: Múltiplos agentes compartilhando uma credencial const agentA = new Agent({ apiKey: SHARED_KEY }); const agentB = new Agent({ apiKey: SHARED_KEY }); // Não dá pra distinguir agente A de B nos logs // Revogar uma key mata todos os agentes // ✅ SEMPRE: Credenciais por agente, por sessão const agentA = new Agent({ credential: await issueCredential({ agentId: 'agent-a', sessionId: 'sess-123', scopes: ['orders:read'], expiresIn: '15m', }), });

Anti-padrão 2: Permissões "God Mode"

// ❌ NUNCA: Agente com acesso total ao banco de dados const agent = new Agent({ db: new PrismaClient(), // Acesso ao schema inteiro tools: ALL_TOOLS, // Todas as ferramentas disponíveis }); // ✅ SEMPRE: Acesso mínimo baseado em whitelist const agent = new Agent({ db: new ReadOnlyClient({ allowedTables: ['orders', 'products'], allowedOperations: ['SELECT'], rowLimit: 100, }), tools: SUPPORT_AGENT_TOOLS, // Subconjunto curado });

Anti-padrão 3: Confiar no raciocínio do agente

// ❌ NUNCA: Deixar o agente decidir escalar suas próprias permissões if (agent.reasoning.includes('Preciso de acesso admin')) { grantAdminAccess(agent); // O agente pediu educadamente! } // ✅ SEMPRE: Mudanças de permissão exigem aprovação fora de banda // Permissões são definidas no deploy, não em runtime // Agentes não podem solicitar nem conceder novas permissões a si mesmos

Anti-padrão 4: Sem kill switch de emergência

// ❌ NUNCA: Sem forma de parar um agente comprometido agent.run(); // E rezamos // ✅ SEMPRE: Circuit breaker + kill switch const controller = new AbortController(); const breaker = new CircuitBreaker({ maxFailures: 5, maxCost: 100, // $100 máximo timeout: 60000, signal: controller.signal, }); // Kill switch externo adminApi.on('kill-agent', (agentId) => { if (agentId === agent.id) { controller.abort('Shutdown de emergência por admin'); revokeAllCredentials(agent.id); notifySecurityTeam(agent.id, 'EMERGENCY_KILL'); } });

Checklist de segurança

Antes de deployar qualquer agente de IA em produção:

Identidade e Autenticação:

  • Agente tem identidade única (não credenciais compartilhadas)
  • Credenciais de curta duração (minutos/horas, não dias/meses)
  • OAuth 2.1 com PKCE pra autorização delegada do usuário
  • Sem API keys estáticas na configuração do agente
  • Rotação de credenciais automatizada

Autorização e Permissões:

  • Acesso a ferramentas baseado em whitelist (allow explícito, deny por padrão)
  • Escopos granulares e específicos por ação
  • Autorização dinâmica considera contexto (horário, risco, tier do usuário)
  • Agentes não podem auto-escalar permissões
  • Operações de alto risco exigem aprovação human-in-the-loop

Tool Gateway:

  • Todas as tool calls passam por um gateway centralizado
  • Parâmetros de input são validados e sanitizados
  • Rate limiting aplicado por agente e por ferramenta
  • MCP ou protocolo equivalente padroniza a comunicação de ferramentas
  • Outputs filtrados pra PII e dados sensíveis

Monitoramento e Resposta:

  • Toda ação do agente é logada de forma imutável
  • Ações do agente são distinguíveis de ações humanas nos logs
  • Detecção de anomalias de comportamento ativa
  • Kill switch de emergência existe pra cada agente
  • Playbook de resposta a incidentes inclui cenários de agente comprometido

Agentes de IA são o padrão de software mais poderoso e mais perigoso de 2026. Eles tomam decisões autônomas com credenciais reais contra sistemas reais. Se você trata a segurança do agente como segurança de API tradicional, tá construindo sobre premissas falsas. Agentes precisam de autorização dinâmica, credenciais com escopo limitado, acesso a ferramentas controlado por gateway, supervisão humana pra ações de alto impacto e monitoramento comportamental contínuo. Os padrões desse guia foram projetados pra realidade de que agentes são não-determinísticos, manipuláveis e capazes de causar dano real quando suas permissões excedem sua confiabilidade. Proteja a camada de execução, e seus agentes viram um multiplicador de força. Ignore, e você tá a uma prompt injection de distância do seu pior incidente.

AI agentsauthenticationauthorizationOAuthsecurityMCPtool callingproductionidentityzero trust

Explore ferramentas relacionadas

Experimente estas ferramentas gratuitas do Pockit