Visão Geral das Proteções
| # | Camada | Proteção | Status |
|---|---|---|---|
| 1 | Autenticação | JWT com HMAC-SHA256 (claims iss, aud, exp, role) | Ativo |
| 2 | Autorização | RBAC com 3 roles: admin, user, readonly | Ativo |
| 3 | Auth Legacy | Bearer token com comparação em tempo constante (crypto/subtle) | Ativo |
| 4 | Auth Rate Limit | 5 tentativas/min por IP — bloqueio progressivo | Ativo |
| 5 | OAuth | PKCE + Device Flow para provedores externos | Ativo |
| 6 | Criptografia | AES-256-GCM para credenciais em repouso | Ativo |
| 7 | TLS | TLS 1.3 obrigatório para gRPC em produção | Ativo |
| 8 | Sessões | Criptografia de sessão em repouso com HKDF key derivation | Ativo |
| 9 | Sessões TTL | Expiração automática de sessões inativas | Ativo |
| 10 | Keychain | Integração com OS keychain (macOS Keychain, Linux secret-tool) | Ativo |
| 11 | Env Vars | Redação automática de variáveis sensíveis (strict/permissive) | Ativo |
| 12 | Histórico | Redação de secrets no histórico de conversas | Ativo |
| 13 | SSRF | Bloqueio de IPs privados, link-local e cloud metadata | Ativo |
| 14 | Rate Limiting | Token bucket por cliente no servidor gRPC | Ativo |
| 15 | Plugins | Assinatura Ed25519 com verificação obrigatória | Ativo |
| 16 | Plugins | Sistema de quarentena para plugins não verificados | Ativo |
| 17 | Comandos | Allowlist com 150+ comandos em 8 categorias | Ativo |
| 18 | Comandos | Modo strict vs permissive para allowlist | Ativo |
| 19 | Leitura | Bloqueio de caminhos sensíveis (.env, .ssh, etc.) | Ativo |
| 20 | Prompt Injection | Delimitadores <DATA> para isolar dados de instruções | Ativo |
| 21 | Log Scrubbing | 18 padrões de sanitização antes de enviar ao LLM | Ativo |
| 22 | Audit Log | Logging estruturado em JSON Lines para auditoria | Ativo |
| 23 | CORS | Deny-all por padrão no operator Kubernetes | Ativo |
| 24 | Resource Types | Allowlist de 17 tipos seguros, 18 tipos perigosos bloqueados | Ativo |
| 25 | Operator Auth | Fail-closed — requisições sem auth são recusadas | Ativo |
| 26 | RBAC K8s | Least-privilege, namespace-scoped por padrão | Ativo |
| 27 | gRPC Limits | Limites de tamanho de mensagem e conexões concorrentes | Ativo |
| 28 | Bind Address | Bind em localhost por padrão (não expõe na rede) | Ativo |
| 29 | JWT Clock Skew | Tolerância configurável para diferença de relógio | Ativo |
| 30 | NetworkPolicy | Política de rede para o operator Kubernetes | Ativo |
| 31 | Cosign | Assinatura de imagens de container com Cosign | Ativo |
| 32 | govulncheck | Verificação de vulnerabilidades em dependências Go no CI | Ativo |
| 33 | gosec | Análise estática de segurança no CI | Ativo |
| 34 | Dependabot | Atualização automática de dependências | Ativo |
| 35 | Admission Webhook | Validação de recursos antes da criação no K8s | Ativo |
Autenticação e Autorização
O ChatCLI suporta dois modelos de autenticação: JWT (recomendado para produção) e Bearer Token legado (para desenvolvimento e compatibilidade).Autenticação JWT
O JWT (JSON Web Token) fornece autenticação stateless com claims estruturados. O ChatCLI validaiss (issuer), aud (audience), exp (expiração) e o claim customizado role para autorização.
- Configuração JWT
- Gerar Token JWT
- Token Legado
RBAC — Controle de Acesso Baseado em Roles
O claimrole no JWT determina as permissões do usuário. O sistema segue o princípio do menor privilégio.
| Permissão | admin | user | readonly |
|---|---|---|---|
| Enviar mensagens | |||
| Executar comandos (agente) | |||
| Listar sessões | |||
| Ler sessões | |||
| Deletar sessões | |||
| Gerenciar plugins | |||
| Configurar servidor | |||
| Alterar roles de usuários | |||
| Visualizar audit logs | |||
| Health check |
Rate Limiting de Autenticação
Tentativas de autenticação falhadas são limitadas a 5 por minuto por IP. Após exceder o limite, o IP recebe429 Too Many Requests com backoff progressivo.
OAuth PKCE + Device Flow
Para autenticação com provedores externos (Anthropic, GitHub, Google), o ChatCLI implementa:- PKCE (Proof Key for Code Exchange): Previne interceptação do authorization code
- Device Flow: Para ambientes sem browser (SSH, containers, CI/CD)
Criptografia e Proteção de Dados
AES-256-GCM para Credenciais
Todas as credenciais OAuth e tokens são armazenados com criptografia AES-256-GCM (Galois/Counter Mode), que fornece tanto confidencialidade quanto autenticidade dos dados.Criptografia de Sessão em Repouso
Os dados de sessão são criptografados antes de gravar em disco usando uma chave derivada via HKDF (HMAC-based Key Derivation Function) a partir da chave mestre.TLS 1.3 para gRPC
Em produção, o servidor gRPC exige TLS 1.3 com cipher suites fortes.kubectl logs mesmo que o logger estruturado não consiga fazer flush antes do crash.Redação de Variáveis de Ambiente
O ChatCLI detecta e redacta automaticamente variáveis de ambiente sensíveis antes de exibir ou enviar ao LLM.- Modo Strict
- Modo Permissive
Redação do Histórico de Conversas
O histórico de conversas passa por redação automática antes de ser persistido. Padrões detectados incluem:- API keys (formato
sk-...,pk_...,ghp_...) - Tokens JWT (formato
eyJ...) - Connection strings com credenciais
- IPs privados em contextos sensíveis
- Números de cartão de crédito (Luhn validation)
Integração com OS Keychain
Quando disponível, o ChatCLI armazena a chave mestre no keychain do sistema operacional em vez do arquivo.auth-key.
| Sistema | Backend | Comando |
|---|---|---|
| macOS | Keychain Services | security add-generic-password |
| Linux | Secret Service API (GNOME Keyring, KDE Wallet) | secret-tool store |
| Windows | Windows Credential Manager | cmdkey /add |
Segurança do Modo Agente
O modo agente permite que a IA execute comandos no seu sistema. O ChatCLI implementa múltiplas camadas de proteção para garantir que apenas operações seguras sejam executadas.Allowlist de Comandos
O sistema mantém uma allowlist com 150+ comandos organizados em 8 categorias. Apenas comandos nesta lista são permitidos sem confirmação do usuário.Navegação e Sistema de Arquivos (25+ comandos)
Navegação e Sistema de Arquivos (25+ comandos)
Leitura e Busca de Conteúdo (20+ comandos)
Leitura e Busca de Conteúdo (20+ comandos)
Git e Controle de Versão (25+ comandos)
Git e Controle de Versão (25+ comandos)
Desenvolvimento e Build (20+ comandos)
Desenvolvimento e Build (20+ comandos)
Informações do Sistema (15+ comandos)
Informações do Sistema (15+ comandos)
Rede (diagnóstico somente) (15+ comandos)
Rede (diagnóstico somente) (15+ comandos)
Containers e Kubernetes (20+ comandos)
Containers e Kubernetes (20+ comandos)
Editores e Ferramentas (15+ comandos)
Editores e Ferramentas (15+ comandos)
Modo Strict vs Permissive
- Strict (Padrão)
- Permissive
- Apenas comandos da allowlist executam sem confirmação
- Qualquer comando fora da lista requer aprovação explícita do usuário
- Recomendado para produção e ambientes compartilhados
Bloqueio de Caminhos Sensíveis
O agente não pode ler arquivos em caminhos considerados sensíveis, independentemente da allowlist:| Caminho | Motivo |
|---|---|
~/.ssh/* | Chaves SSH privadas |
~/.gnupg/* | Chaves GPG |
~/.aws/credentials | Credenciais AWS |
~/.azure/credentials | Credenciais Azure |
~/.gcp/*.json | Service accounts GCP |
~/.kube/config | Kubeconfig com tokens |
~/.env, .env, .env.* | Variáveis de ambiente |
~/.chatcli/.auth-key | Chave mestre de criptografia |
~/.chatcli/auth-profiles.json | Credenciais criptografadas |
/etc/shadow | Hashes de senhas do sistema |
/etc/sudoers | Configuração de sudo |
**/id_rsa, **/id_ed25519 | Chaves privadas SSH |
**/*.pem, **/*.key | Certificados e chaves privadas |
Shell Config Sourcing
Por padrão, o agente não carrega arquivos de configuração do shell (.bashrc, .zshrc). Isso previne execução de código arbitrário que possa existir nesses arquivos.
Input guard — proteção contra typeahead em prompts de segurança
Quando uma security box aparece (modo coder/agent), três camadas defendem contra digitação acidental ser consumida como resposta y/n:- Flush kernel TTY —
TCIFLUSH(Linux) /TIOCFLUSH(BSD/Darwin) /FlushConsoleInputBuffer(Windows) descarta bytes na fila do kernel antes de renderizar a box. - Drain channel — esvazia o canal centralizado de stdin não-bloqueante (buffer de 10 linhas que o reader goroutine usa).
- Intent debounce — descarta qualquer input que chegue nos primeiros 250ms após a box ser desenhada (a janela de reação humana mínima).
stty sane no /dev/tty controlador para recuperar de um teardown anterior do go-prompt que possa ter deixado o terminal em raw mode (echo off). Sem esse reset, você digita e não vê os caracteres na tela — embora o kernel esteja capturando.
Sanitização de Saída de Comandos
A saída de todos os comandos executados passa por um sanitizador que detecta tentativas de prompt injection:Segurança de Plugins
O sistema de plugins do ChatCLI usa assinatura criptográfica Ed25519 para garantir integridade e autenticidade.Verificação Ed25519
Cada plugin deve ser assinado com uma chave Ed25519. Na instalação, o ChatCLI verifica:- A assinatura é válida contra a chave pública do autor
- O hash SHA-256 do binário confere com o manifesto
- O manifesto não foi alterado (assinatura cobre o manifesto inteiro)
Sistema de Quarentena
Plugins não verificados são colocados em quarentena — um diretório isolado onde não podem ser executados:Permissões de Arquivo
| Arquivo | Permissão | Descrição |
|---|---|---|
| Diretório do plugin | 0700 | Acesso apenas do dono |
| Binário do plugin | 0600 | Leitura apenas do dono (executado via loader) |
| Manifesto | 0600 | Leitura apenas do dono |
| Assinatura | 0600 | Leitura apenas do dono |
Permitir Plugins Não Assinados
Como Assinar um Plugin
Distribuir o plugin
- O binário do plugin
manifest.jsonmanifest.json.sigplugin-signing.pub(chave pública)
Segurança do Servidor gRPC
Prevenção de SSRF
O servidor gRPC inclui proteção contra Server-Side Request Forgery (SSRF). Todas as URLs processadas passam por validação antes de serem acessadas. CIDRs bloqueados:Rate Limiting por Cliente
O servidor implementa rate limiting com token bucket por cliente, identificado pelo IP de origem.| Parâmetro | Padrão | Variável |
|---|---|---|
| Tokens por segundo | 10 | CHATCLI_RATE_LIMIT_RPS |
| Burst máximo | 20 | CHATCLI_RATE_LIMIT_BURST |
| Cleanup interval | 5min | CHATCLI_RATE_LIMIT_CLEANUP |
Limites de Mensagem gRPC
| Parâmetro | Padrão | Variável |
|---|---|---|
| Tamanho máximo de mensagem recebida | 4 MB | CHATCLI_GRPC_MAX_RECV_SIZE |
| Tamanho máximo de mensagem enviada | 4 MB | CHATCLI_GRPC_MAX_SEND_SIZE |
| MaxConcurrentStreams | 100 | CHATCLI_GRPC_MAX_STREAMS |
Interceptor de Validação de Campos
Todas as requisições gRPC passam por um interceptor que valida:- Tamanho máximo de strings (previne DoS por payload)
- Caracteres permitidos em identificadores
- Formato de UUIDs de sessão
- Ranges de valores numéricos
Bind Address
gRPC Reflection
O gRPC reflection está desabilitado por padrão. Quando habilitado, expõe o schema completo do serviço, facilitando reconhecimento por atacantes.Audit Logging Estruturado
Todas as operações do servidor são registradas em formato JSON Lines para integração com sistemas de SIEM.Segurança do Operator Kubernetes
O operator Kubernetes do ChatCLI implementa proteções específicas para o ambiente cloud-native.Autenticação Fail-Closed
A API REST do operator usa autenticação fail-closed: se o middleware de autenticação falhar por qualquer motivo (erro interno, timeout, configuração inválida), a requisição é recusada. Nenhuma requisição passa sem validação explícita.- Secret
chatcli-operator-secrets(prioridade) — campoapi-keyscom lista YAML de entradas{key, role, description} - ConfigMap
chatcli-operator-config(fallback) — mesmo campoapi-keys - Rejeita a requisição (ou aceita em dev-mode se
CHATCLI_OPERATOR_DEV_MODE=true)
Allowlist de Tipos de Recursos
O operator só pode remediar um conjunto restrito de recursos Kubernetes. Isso previne que a IA modifique recursos críticos do cluster.- 17 Tipos Seguros (Permitidos)
- 18 Tipos Perigosos (Bloqueados)
Log Scrubbing (18 Padrões)
Antes de enviar logs ao LLM para análise, o operator remove informações sensíveis usando 18 padrões de sanitização:| # | Padrão | Exemplo |
|---|---|---|
| 1 | API Keys | Bearer sk-abc123... → Bearer **** |
| 2 | JWT Tokens | eyJhbGciOi... → [JWT_REDACTED] |
| 3 | Connection Strings | postgres://user:pass@host → postgres://****:****@host |
| 4 | Certificados Base64 | LS0tLS1CRUdJTi... → [CERT_REDACTED] |
| 5 | Chaves Privadas | -----BEGIN RSA PRIVATE KEY----- → [KEY_REDACTED] |
| 6 | AWS Access Keys | AKIA... → [AWS_KEY_REDACTED] |
| 7 | AWS Secret Keys | wJalrXUtnFEMI... → [AWS_SECRET_REDACTED] |
| 8 | GCP Service Account | "private_key": "..." → [GCP_KEY_REDACTED] |
| 9 | Passwords em URLs | ://user:password@ → ://****:****@ |
| 10 | Tokens OAuth | access_token=... → access_token=**** |
| 11 | GitHub Tokens | ghp_..., gho_... → [GH_TOKEN_REDACTED] |
| 12 | Slack Tokens | xoxb-..., xoxp-... → [SLACK_TOKEN_REDACTED] |
| 13 | Stripe Keys | sk_live_..., pk_live_... → [STRIPE_REDACTED] |
| 14 | Números de Cartão | 4111 1111 1111 1111 → [CARD_REDACTED] |
| 15 | SSN (US) | 123-45-6789 → [SSN_REDACTED] |
| 16 | IPs em contextos auth | auth from 10.0.0.1 → auth from [IP_REDACTED] |
| 17 | Email em logs | user@domain.com → [EMAIL_REDACTED] |
| 18 | Kubernetes Secrets | data: {key: base64...} → data: {key: [REDACTED]} |
CORS Deny-All
O operator responde com headers CORS que negam todas as origens por padrão:CHATCLI_OPERATOR_CORS_ORIGINS.RBAC Least-Privilege
O Helm chart cria Role e RoleBinding (namespace-scoped) por padrão:NetworkPolicy
O chart inclui uma NetworkPolicy restritiva:Admission Webhook
O operator inclui um ValidatingWebhookConfiguration que intercepta criação e atualização de recursos ChatCLI customizados, validando:- Schema dos CRDs
- Limites de recursos
- Referências a secrets existentes
- Nomes de namespace válidos
Structured Audit Logging
Todas as ações de remediação são logadas em formato estruturado:Segurança de CI/CD
O pipeline de CI/CD do ChatCLI inclui verificações automáticas de segurança em cada pull request e release.govulncheck
gosec
crypto/md5, hardcoded credentials, e mais.Dependabot
Cosign
API Key Masking em Workflows
Todos os secrets usados nos workflows do GitHub Actions são mascarados automaticamente nos logs. Além disso, o ChatCLI implementa masking adicional para prevenir vazamento acidental de chaves em outputs de testes.Referência de Variáveis de Segurança
Tabela completa de todas as variáveis de ambiente relacionadas à segurança do ChatCLI:Autenticação e Autorização
| Variável | Descrição | Padrão |
|---|---|---|
CHATCLI_JWT_SECRET | Chave secreta para validação JWT (HMAC-SHA256) | "" (JWT desabilitado) |
CHATCLI_JWT_ISSUER | Valor esperado do claim iss | "" |
CHATCLI_JWT_AUDIENCE | Valor esperado do claim aud | "" |
CHATCLI_JWT_CLOCK_SKEW | Tolerância de clock skew para validação exp | 30s |
CHATCLI_SERVER_TOKEN | Token Bearer para autenticação legada | "" (sem auth) |
CHATCLI_AUTH_RATE_LIMIT | Tentativas de auth por minuto por IP | 5 |
CHATCLI_AUTH_LOCKOUT_DURATION | Duração do bloqueio após exceder rate limit | 5m |
Criptografia e TLS
| Variável | Descrição | Padrão |
|---|---|---|
CHATCLI_SERVER_TLS_CERT | Caminho do certificado TLS do servidor | "" |
CHATCLI_SERVER_TLS_KEY | Caminho da chave TLS do servidor | "" |
CHATCLI_TLS_MIN_VERSION | Versão mínima de TLS aceita | 1.3 |
CHATCLI_ENCRYPTION_KEY | Chave de criptografia customizada (override .auth-key) | "" |
CHATCLI_DISABLE_KEYCHAIN | Desabilita integração com OS keychain | false |
CHATCLI_SESSION_ENCRYPTION | Habilita/desabilita criptografia de sessão | true |
CHATCLI_SESSION_TTL | Tempo de vida máximo de sessão inativa | 24h |
Redação e Proteção de Dados
| Variável | Descrição | Padrão |
|---|---|---|
CHATCLI_ENV_REDACTION | Modo de redação de env vars (strict/permissive/off) | strict |
CHATCLI_HISTORY_REDACTION | Habilita redação do histórico de conversas | true |
CHATCLI_LOG_SCRUB_PATTERNS | Padrões regex adicionais para log scrubbing (; separados) | "" |
CHATCLI_AUDIT_LOG | Caminho do arquivo de audit log | "" (stdout) |
CHATCLI_AUDIT_LOG_MAX_SIZE | Tamanho máximo do arquivo de audit log | 100M |
CHATCLI_AUDIT_LOG_MAX_AGE | Idade máxima dos logs de auditoria | 90d |
Modo Agente
| Variável | Descrição | Padrão |
|---|---|---|
CHATCLI_AGENT_ALLOWLIST_MODE | Modo da allowlist (strict/permissive) | strict |
CHATCLI_AGENT_DENYLIST | Padrões regex adicionais para bloquear (; separados) | "" |
CHATCLI_AGENT_ALLOW_SUDO | Permite execução de sudo no modo agente | false |
CHATCLI_AGENT_CMD_TIMEOUT | Timeout de execução por comando | 10m |
CHATCLI_AGENT_SOURCE_SHELL_CONFIG | Permite source de .bashrc/.zshrc | false |
CHATCLI_AGENT_MAX_OUTPUT_SIZE | Tamanho máximo da saída de comandos | 1M |
CHATCLI_AGENT_BLOCKED_PATHS | Caminhos adicionais para bloquear leitura (; separados) | "" |
Plugins
| Variável | Descrição | Padrão |
|---|---|---|
CHATCLI_ALLOW_UNSIGNED_PLUGINS | Permite plugins sem assinatura Ed25519 | false |
CHATCLI_PLUGIN_TRUSTED_KEYS | Chaves públicas Ed25519 confiáveis (, separadas) | "" |
CHATCLI_PLUGIN_QUARANTINE_DIR | Diretório de quarentena customizado | ~/.chatcli/plugins/quarantine |
Servidor gRPC
| Variável | Descrição | Padrão |
|---|---|---|
CHATCLI_GRPC_REFLECTION | Habilita gRPC reflection | false |
CHATCLI_GRPC_MAX_RECV_SIZE | Tamanho máximo de mensagem recebida | 4MB |
CHATCLI_GRPC_MAX_SEND_SIZE | Tamanho máximo de mensagem enviada | 4MB |
CHATCLI_GRPC_MAX_STREAMS | Máximo de streams concorrentes por conexão | 100 |
CHATCLI_GRPC_BIND | Endereço de bind do servidor. Auto-detecta 0.0.0.0 em Kubernetes. | 127.0.0.1:50051 / 0.0.0.0:50051 (K8s) |
CHATCLI_RATE_LIMIT_RPS | Requests por segundo por cliente | 10 |
CHATCLI_RATE_LIMIT_BURST | Burst máximo por cliente | 20 |
CHATCLI_RATE_LIMIT_CLEANUP | Intervalo de limpeza de buckets expirados | 5m |
SSRF e Rede
| Variável | Descrição | Padrão |
|---|---|---|
CHATCLI_SSRF_BLOCK_PRIVATE | Bloqueia acesso a redes privadas | true |
CHATCLI_SSRF_BLOCK_METADATA | Bloqueia acesso a endpoints de metadata cloud | true |
CHATCLI_SSRF_ALLOWED_HOSTS | Hosts permitidos mesmo em redes privadas (, separados) | "" |
CHATCLI_SSRF_DNS_CHECK | Valida DNS resolution contra IPs privados | true |
Operator Kubernetes
| Variável | Descrição | Padrão |
|---|---|---|
CHATCLI_OPERATOR_CORS_ORIGINS | Origens CORS permitidas (, separadas) | "" (deny-all) |
CHATCLI_OPERATOR_AUTH_MODE | Modo de autenticação (fail-closed/fail-open) | fail-closed |
CHATCLI_OPERATOR_ALLOWED_RESOURCES | Override da allowlist de tipos de recursos | (17 tipos seguros) |
CHATCLI_OPERATOR_LOG_SCRUB | Habilita log scrubbing antes de enviar ao LLM | true |
CI/CD e Verificação
| Variável | Descrição | Padrão |
|---|---|---|
CHATCLI_DISABLE_VERSION_CHECK | Desabilita verificação automática de versão | false |
CHATCLI_COSIGN_KEY | Chave pública Cosign para verificação de imagens | "" |
Boas Práticas para Produção
Mantenha gRPC reflection e CORS desabilitados
CHATCLI_GRPC_REFLECTION=true nem CHATCLI_OPERATOR_CORS_ORIGINS em produção, a menos que estritamente necessário.