Pular para o conteúdo principal
O ChatCLI implementa uma arquitetura de segurança em profundidade (defense-in-depth) com mais de 30 controles de segurança distribuídos em todas as camadas da aplicação — da autenticação e criptografia até a prevenção de injeção, hardening de infraestrutura e auditoria estruturada.
Todas as proteções listadas nesta página estão ativas por padrão. A filosofia do ChatCLI é secure-by-default: você não precisa configurar nada para obter um nível elevado de segurança.

Visão Geral das Proteções

#CamadaProteçãoStatus
1AutenticaçãoJWT com HMAC-SHA256 (claims iss, aud, exp, role) Ativo
2AutorizaçãoRBAC com 3 roles: admin, user, readonly Ativo
3Auth LegacyBearer token com comparação em tempo constante (crypto/subtle) Ativo
4Auth Rate Limit5 tentativas/min por IP — bloqueio progressivo Ativo
5OAuthPKCE + Device Flow para provedores externos Ativo
6CriptografiaAES-256-GCM para credenciais em repouso Ativo
7TLSTLS 1.3 obrigatório para gRPC em produção Ativo
8SessõesCriptografia de sessão em repouso com HKDF key derivation Ativo
9Sessões TTLExpiração automática de sessões inativas Ativo
10KeychainIntegração com OS keychain (macOS Keychain, Linux secret-tool) Ativo
11Env VarsRedação automática de variáveis sensíveis (strict/permissive) Ativo
12HistóricoRedação de secrets no histórico de conversas Ativo
13SSRFBloqueio de IPs privados, link-local e cloud metadata Ativo
14Rate LimitingToken bucket por cliente no servidor gRPC Ativo
15PluginsAssinatura Ed25519 com verificação obrigatória Ativo
16PluginsSistema de quarentena para plugins não verificados Ativo
17ComandosAllowlist com 150+ comandos em 8 categorias Ativo
18ComandosModo strict vs permissive para allowlist Ativo
19LeituraBloqueio de caminhos sensíveis (.env, .ssh, etc.) Ativo
20Prompt InjectionDelimitadores <DATA> para isolar dados de instruções Ativo
21Log Scrubbing18 padrões de sanitização antes de enviar ao LLM Ativo
22Audit LogLogging estruturado em JSON Lines para auditoria Ativo
23CORSDeny-all por padrão no operator Kubernetes Ativo
24Resource TypesAllowlist de 17 tipos seguros, 18 tipos perigosos bloqueados Ativo
25Operator AuthFail-closed — requisições sem auth são recusadas Ativo
26RBAC K8sLeast-privilege, namespace-scoped por padrão Ativo
27gRPC LimitsLimites de tamanho de mensagem e conexões concorrentes Ativo
28Bind AddressBind em localhost por padrão (não expõe na rede) Ativo
29JWT Clock SkewTolerância configurável para diferença de relógio Ativo
30NetworkPolicyPolítica de rede para o operator Kubernetes Ativo
31CosignAssinatura de imagens de container com Cosign Ativo
32govulncheckVerificação de vulnerabilidades em dependências Go no CI Ativo
33gosecAnálise estática de segurança no CI Ativo
34DependabotAtualização automática de dependências Ativo
35Admission WebhookValidaçã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 valida iss (issuer), aud (audience), exp (expiração) e o claim customizado role para autorização.
# Variáveis obrigatórias para habilitar JWT
export CHATCLI_JWT_SECRET="sua-chave-secreta-com-pelo-menos-32-caracteres"
export CHATCLI_JWT_ISSUER="chatcli-auth"
export CHATCLI_JWT_AUDIENCE="chatcli-server"

# Opcional: tolerância de clock skew (padrão: 30s)
export CHATCLI_JWT_CLOCK_SKEW=60s

chatcli server

RBAC — Controle de Acesso Baseado em Roles

O claim role no JWT determina as permissões do usuário. O sistema segue o princípio do menor privilégio.
Permissãoadminuserreadonly
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
O role readonly não pode enviar mensagens nem executar comandos. Ideal para dashboards de monitoramento e integrações que apenas consomem dados.

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 recebe 429 Too Many Requests com backoff progressivo.
Tentativa 1-5:  Resposta normal (401 Unauthorized)
Tentativa 6:    429 Too Many Requests (espere 30s)
Tentativa 7+:   429 Too Many Requests (espere 60s, 120s, 240s...)

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)
Veja a documentação completa de OAuth em Autenticação OAuth.

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.
~/.chatcli/
  auth-profiles.json  (0600) — credenciais criptografadas AES-256-GCM
  .auth-key           (0600) — chave mestre de 256 bits
// Fluxo de criptografia simplificado:
// 1. Gera chave aleatória de 256 bits (crypto/rand)
// 2. Cria cipher AES-256
// 3. Gera nonce aleatório de 12 bytes
// 4. Encripta com GCM (nonce || ciphertext || tag)
// 5. Codifica em base64 para armazenamento

nonce := make([]byte, gcm.NonceSize()) // 12 bytes
io.ReadFull(crypto.Reader, nonce)
ciphertext := gcm.Seal(nonce, nonce, plaintext, nil)

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.
Chave mestre (.auth-key)


  HKDF (SHA-256, salt=session-id, info="chatcli-session")


  Chave de sessão (256 bits, única por sessão)


  AES-256-GCM (criptografia dos dados de sessão)

TLS 1.3 para gRPC

Em produção, o servidor gRPC exige TLS 1.3 com cipher suites fortes.
# Gerar certificado autoassinado para testes:
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 \
  -keyout key.pem -out cert.pem -days 365 -nodes \
  -subj "/CN=chatcli-server"

# Iniciar servidor com TLS:
chatcli server --tls-cert cert.pem --tls-key key.pem
Se o carregamento do certificado TLS falhar, o erro é escrito em stderr e no log estruturado, incluindo os caminhos do certificado e da chave. Em containers, isso garante que o erro seja visível via kubectl logs mesmo que o logger estruturado não consiga fazer flush antes do crash.
Quando TLS não está configurado, o servidor emite um log de warning a cada startup. O comportamento funcional não muda, mas a comunicação trafega em texto plano.

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.
export CHATCLI_ENV_REDACTION=strict
# Redacta QUALQUER variável que contenha:
# KEY, SECRET, TOKEN, PASSWORD, CREDENTIAL, AUTH,
# API_KEY, PRIVATE, CERTIFICATE, e mais
Exemplo de saída:
AWS_ACCESS_KEY_ID=****REDACTED****
DATABASE_URL=****REDACTED****
OPENAI_API_KEY=****REDACTED****

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.
SistemaBackendComando
macOSKeychain Servicessecurity add-generic-password
LinuxSecret Service API (GNOME Keyring, KDE Wallet)secret-tool store
WindowsWindows Credential Managercmdkey /add
A integração com keychain é automática quando o backend está disponível. Use CHATCLI_DISABLE_KEYCHAIN=true para forçar o armazenamento em arquivo.

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.
cat, bat, less, more, head, tail, grep, rg, ag, ack,
sed (somente leitura), awk (somente leitura), cut, sort,
uniq, diff, comm, join, paste, tr, expand, unexpand
git status, git log, git diff, git show, git branch,
git tag, git stash list, git remote -v, git describe,
git rev-parse, git ls-files, git ls-tree, git blame,
git shortlog, git reflog, git config --get,
git cherry, git merge-base, git name-rev, git whatchanged
Operações destrutivas como git push --force, git reset --hard e git clean -f nunca estão na allowlist.
go build, go test, go vet, go fmt, go mod tidy,
go run, go generate, go doc, go env, go version,
npm run, npm test, npm list, npx, yarn, pnpm,
make, cmake, cargo build, cargo test, cargo clippy,
python -m pytest, pip list, rustc --version
uname, hostname, uptime, whoami, id, groups,
env (com redação), printenv (com redação),
date, cal, free, top (modo batch), ps,
lsb_release, sw_vers, sysctl (somente leitura)
ping, traceroute, dig, nslookup, host, whois,
curl (somente GET), wget (somente download),
ss, netstat, ip addr, ifconfig, nmap (somente scan),
openssl s_client (verificação TLS)
Comandos de rede que podem modificar configurações (iptables, route add, ip link set) são bloqueados.
docker ps, docker images, docker logs, docker inspect,
docker stats, docker top, docker port,
kubectl get, kubectl describe, kubectl logs,
kubectl top, kubectl api-resources, kubectl explain,
kubectl config view, kubectl cluster-info,
helm list, helm status, helm get values,
crictl ps, podman ps
jq, yq, xq, xmllint, python -m json.tool,
base64 (decodificação), md5sum, sha256sum,
tar (somente listar: tf/tvf), zip (somente listar: -l),
echo, printf, tee (somente leitura), column, fmt

Modo Strict vs Permissive

export CHATCLI_AGENT_ALLOWLIST_MODE=strict
  • 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:
CaminhoMotivo
~/.ssh/*Chaves SSH privadas
~/.gnupg/*Chaves GPG
~/.aws/credentialsCredenciais AWS
~/.azure/credentialsCredenciais Azure
~/.gcp/*.jsonService accounts GCP
~/.kube/configKubeconfig com tokens
~/.env, .env, .env.*Variáveis de ambiente
~/.chatcli/.auth-keyChave mestre de criptografia
~/.chatcli/auth-profiles.jsonCredenciais criptografadas
/etc/shadowHashes de senhas do sistema
/etc/sudoersConfiguração de sudo
**/id_rsa, **/id_ed25519Chaves privadas SSH
**/*.pem, **/*.keyCertificados e chaves privadas
Tentativas de leitura desses caminhos são silenciosamente bloqueadas e registradas no audit log. A IA recebe uma mensagem genérica informando que o arquivo não está acessível.

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.
# Habilitar source de shell config (opt-in)
export CHATCLI_AGENT_SOURCE_SHELL_CONFIG=true

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:
  1. Flush kernel TTYTCIFLUSH (Linux) / TIOCFLUSH (BSD/Darwin) / FlushConsoleInputBuffer (Windows) descarta bytes na fila do kernel antes de renderizar a box.
  2. Drain channel — esvazia o canal centralizado de stdin não-bloqueante (buffer de 10 linhas que o reader goroutine usa).
  3. Intent debounce — descarta qualquer input que chegue nos primeiros 250ms após a box ser desenhada (a janela de reação humana mínima).
Sem essas camadas, digitar acidentalmente durante o stream do LLM faria a security box consumir os bytes prontos como aprovação. A primeira vez que isso aconteceu motivou o input guard. Adicionalmente, no início de cada turn do agente, o ChatCLI faz 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:
Padrões detectados e removidos:
  - "Ignore previous instructions..."
  - "You are now a..."
  - "System: new instructions..."
  - Sequências de escape ANSI maliciosas
  - Caracteres Unicode de controle (RTL override, etc.)

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:
  1. A assinatura é válida contra a chave pública do autor
  2. O hash SHA-256 do binário confere com o manifesto
  3. 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:
~/.chatcli/plugins/
  verified/          — plugins com assinatura válida (executáveis)
  quarantine/        — plugins sem assinatura ou com assinatura inválida

Permissões de Arquivo

ArquivoPermissãoDescrição
Diretório do plugin0700Acesso apenas do dono
Binário do plugin0600Leitura apenas do dono (executado via loader)
Manifesto0600Leitura apenas do dono
Assinatura0600Leitura apenas do dono

Permitir Plugins Não Assinados

Essa opção desabilita a verificação de assinatura. Use apenas em desenvolvimento local.
export CHATCLI_ALLOW_UNSIGNED_PLUGINS=true

Como Assinar um Plugin

1

Gerar par de chaves Ed25519

chatcli plugin keygen --output ~/.chatcli/plugin-keys/

# Gera:
#   plugin-signing.key  (chave privada — NUNCA compartilhe)
#   plugin-signing.pub  (chave pública — distribua com o plugin)
2

Criar o manifesto do plugin

{
  "name": "meu-plugin",
  "version": "1.0.0",
  "description": "Descrição do plugin",
  "author": "seu-nome",
  "binary": "meu-plugin",
  "checksum": ""
}
3

Calcular o checksum do binário

sha256sum meu-plugin | awk '{print $1}'
# Copie o hash para o campo "checksum" do manifesto
4

Assinar o manifesto

chatcli plugin sign \
  --manifest manifest.json \
  --key ~/.chatcli/plugin-keys/plugin-signing.key \
  --output manifest.json.sig
5

Distribuir o plugin

Inclua na distribuição:
  • O binário do plugin
  • manifest.json
  • manifest.json.sig
  • plugin-signing.pub (chave pública)
6

Instalar e verificar

chatcli plugin install ./meu-plugin/
# A verificação de assinatura é automática
# Se falhar, o plugin vai para quarentena

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:
10.0.0.0/8          — Rede privada Classe A
172.16.0.0/12       — Rede privada Classe B
192.168.0.0/16      — Rede privada Classe C
127.0.0.0/8         — Loopback
169.254.169.254/32  — AWS/GCP metadata endpoint
100.100.100.200/32  — Alibaba Cloud metadata
fd00::/8            — IPv6 Unique Local
::1/128             — IPv6 loopback
fe80::/10           — IPv6 link-local
A validação também resolve DNS para prevenir bypass via domínios que apontam para IPs privados (DNS rebinding).

Rate Limiting por Cliente

O servidor implementa rate limiting com token bucket por cliente, identificado pelo IP de origem.
ParâmetroPadrãoVariável
Tokens por segundo10CHATCLI_RATE_LIMIT_RPS
Burst máximo20CHATCLI_RATE_LIMIT_BURST
Cleanup interval5minCHATCLI_RATE_LIMIT_CLEANUP
# Configurar rate limiting customizado
export CHATCLI_RATE_LIMIT_RPS=5
export CHATCLI_RATE_LIMIT_BURST=10
chatcli server

Limites de Mensagem gRPC

ParâmetroPadrãoVariável
Tamanho máximo de mensagem recebida4 MBCHATCLI_GRPC_MAX_RECV_SIZE
Tamanho máximo de mensagem enviada4 MBCHATCLI_GRPC_MAX_SEND_SIZE
MaxConcurrentStreams100CHATCLI_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

# Padrão local: bind apenas em localhost (seguro)
chatcli server
# Escuta em 127.0.0.1:50051

# Em Kubernetes: auto-detecta via KUBERNETES_SERVICE_HOST e usa 0.0.0.0
# Nenhuma configuração necessária!

# Expor na rede manualmente (use apenas com TLS + auth)
chatcli server --bind 0.0.0.0:50051 --tls-cert cert.pem --tls-key key.pem
Em Kubernetes, o bind address é automaticamente configurado para 0.0.0.0 — nenhuma configuração manual é necessária. O servidor detecta o ambiente via a variável KUBERNETES_SERVICE_HOST.
Nunca exponha o servidor na rede (0.0.0.0) sem TLS e autenticação habilitados.

gRPC Reflection

O gRPC reflection está desabilitado por padrão. Quando habilitado, expõe o schema completo do serviço, facilitando reconhecimento por atacantes.
# Habilitar apenas para debugging local
export CHATCLI_GRPC_REFLECTION=true

Audit Logging Estruturado

Todas as operações do servidor são registradas em formato JSON Lines para integração com sistemas de SIEM.
{
  "timestamp": "2026-04-06T10:30:00Z",
  "level": "info",
  "event": "grpc.request",
  "method": "/chatcli.v1.ChatService/SendMessage",
  "client_ip": "192.168.1.100",
  "user": "admin@example.com",
  "role": "admin",
  "duration_ms": 245,
  "status": "OK",
  "request_size": 1024,
  "response_size": 4096
}
# Configurar output do audit log
export CHATCLI_AUDIT_LOG=/var/log/chatcli/audit.jsonl
export CHATCLI_AUDIT_LOG_MAX_SIZE=100M
export CHATCLI_AUDIT_LOG_MAX_AGE=90d

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.
Requisição → Auth Middleware → Erro?
                                 ├── Sim → 403 Forbidden (fail-closed)
                                 └── Não → Validar token → Processar
As API keys são carregadas com hot-reload a cada 30 segundos, na seguinte ordem de prioridade:
  1. Secret chatcli-operator-secrets (prioridade) — campo api-keys com lista YAML de entradas {key, role, description}
  2. ConfigMap chatcli-operator-config (fallback) — mesmo campo api-keys
  3. Rejeita a requisição (ou aceita em dev-mode se CHATCLI_OPERATOR_DEV_MODE=true)
Não confunda os dois Secrets de Auth do projeto — ambos costumam aparecer juntos no namespace do operator:
SecretPara quêQuem consomeCampo
chatcli-operator-secretsREST API auth do operator (dashboard, /api/v1/*)operator pod (este capítulo)api-keys (YAML)
chatcli-api-keysLLM provider keys (OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.) usadas pelo gateway chatclichatcli server pod via Instance.spec.apiKeys.nameuma chave por provedor (OPENAI_API_KEY, etc.)
O Secret chatcli-operator-secrets precisa estar no mesmo namespace que o pod do operator (o controller chama Secrets(resolveNamespace()).Get(...)resolveNamespace()POD_NAMESPACE env var, o arquivo de namespace do ServiceAccount, ou cai pro default chatcli-system). Se você fez helm install --namespace <X>, crie o Secret em <X>.
API keys armazenadas no Secret são recarregadas automaticamente a cada 30s — nenhum restart do operator é necessário.

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.
Deployment, StatefulSet, DaemonSet, ReplicaSet,
Pod, Service, ConfigMap, Ingress,
Job, CronJob, HorizontalPodAutoscaler,
PodDisruptionBudget, NetworkPolicy,
ServiceAccount, Role, RoleBinding, Endpoints
Tentativas de remediar tipos bloqueados são registradas no audit log e geram alertas.

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ãoExemplo
1API KeysBearer sk-abc123...Bearer ****
2JWT TokenseyJhbGciOi...[JWT_REDACTED]
3Connection Stringspostgres://user:pass@hostpostgres://****:****@host
4Certificados Base64LS0tLS1CRUdJTi...[CERT_REDACTED]
5Chaves Privadas-----BEGIN RSA PRIVATE KEY-----[KEY_REDACTED]
6AWS Access KeysAKIA...[AWS_KEY_REDACTED]
7AWS Secret KeyswJalrXUtnFEMI...[AWS_SECRET_REDACTED]
8GCP Service Account"private_key": "..."[GCP_KEY_REDACTED]
9Passwords em URLs://user:password@://****:****@
10Tokens OAuthaccess_token=...access_token=****
11GitHub Tokensghp_..., gho_...[GH_TOKEN_REDACTED]
12Slack Tokensxoxb-..., xoxp-...[SLACK_TOKEN_REDACTED]
13Stripe Keyssk_live_..., pk_live_...[STRIPE_REDACTED]
14Números de Cartão4111 1111 1111 1111[CARD_REDACTED]
15SSN (US)123-45-6789[SSN_REDACTED]
16IPs em contextos authauth from 10.0.0.1auth from [IP_REDACTED]
17Email em logsuser@domain.com[EMAIL_REDACTED]
18Kubernetes Secretsdata: {key: base64...}data: {key: [REDACTED]}

CORS Deny-All

O operator responde com headers CORS que negam todas as origens por padrão:
Access-Control-Allow-Origin: (não definido)
Access-Control-Allow-Methods: (não definido)
Access-Control-Allow-Headers: (não definido)
Para integrar com dashboards web, configure origens permitidas explicitamente via CHATCLI_OPERATOR_CORS_ORIGINS.

RBAC Least-Privilege

O Helm chart cria Role e RoleBinding (namespace-scoped) por padrão:
# values.yaml
rbac:
  create: true
  clusterWide: false  # Role (padrão) vs ClusterRole

NetworkPolicy

O chart inclui uma NetworkPolicy restritiva:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: chatcli-operator
spec:
  podSelector:
    matchLabels:
      app: chatcli-operator
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              chatcli-access: "true"
      ports:
        - port: 8443  # API REST (TLS)
        - port: 50051  # gRPC (TLS)
  egress:
    - to:
        - namespaceSelector: {}
      ports:
        - port: 443    # Kubernetes API
        - port: 6443   # Kubernetes API (alternativo)

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:
{
  "timestamp": "2026-04-06T10:30:00Z",
  "event": "remediation.applied",
  "resource_type": "Deployment",
  "resource_name": "nginx",
  "namespace": "production",
  "action": "scale_up",
  "replicas_before": 1,
  "replicas_after": 3,
  "reason": "Pod CrashLoopBackOff detectado",
  "approved_by": "auto-policy",
  "audit_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}

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

Verifica todas as dependências Go contra o banco de dados de vulnerabilidades do Go. Falha o build se encontrar CVEs conhecidos em dependências usadas.
govulncheck ./...

gosec

Análise estática de segurança que detecta padrões inseguros no código-fonte: SQL injection, uso de crypto/md5, hardcoded credentials, e mais.
gosec -fmt json ./...

Dependabot

Monitora dependências e cria PRs automáticos quando atualizações de segurança estão disponíveis. Configurado para Go modules e GitHub Actions.

Cosign

Todas as imagens de container publicadas são assinadas com Sigstore Cosign. Verifique a autenticidade antes de usar:
cosign verify ghcr.io/diillson/chatcli:latest \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  --certificate-identity-regexp "github.com/diillson/chatcli"

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ávelDescriçãoPadrão
CHATCLI_JWT_SECRETChave secreta para validação JWT (HMAC-SHA256)"" (JWT desabilitado)
CHATCLI_JWT_ISSUERValor esperado do claim iss""
CHATCLI_JWT_AUDIENCEValor esperado do claim aud""
CHATCLI_JWT_CLOCK_SKEWTolerância de clock skew para validação exp30s
CHATCLI_SERVER_TOKENToken Bearer para autenticação legada"" (sem auth)
CHATCLI_AUTH_RATE_LIMITTentativas de auth por minuto por IP5
CHATCLI_AUTH_LOCKOUT_DURATIONDuração do bloqueio após exceder rate limit5m

Criptografia e TLS

VariávelDescriçãoPadrão
CHATCLI_SERVER_TLS_CERTCaminho do certificado TLS do servidor""
CHATCLI_SERVER_TLS_KEYCaminho da chave TLS do servidor""
CHATCLI_TLS_MIN_VERSIONVersão mínima de TLS aceita1.3
CHATCLI_ENCRYPTION_KEYChave de criptografia customizada (override .auth-key)""
CHATCLI_DISABLE_KEYCHAINDesabilita integração com OS keychainfalse
CHATCLI_SESSION_ENCRYPTIONHabilita/desabilita criptografia de sessãotrue
CHATCLI_SESSION_TTLTempo de vida máximo de sessão inativa24h

Redação e Proteção de Dados

VariávelDescriçãoPadrão
CHATCLI_ENV_REDACTIONModo de redação de env vars (strict/permissive/off)strict
CHATCLI_HISTORY_REDACTIONHabilita redação do histórico de conversastrue
CHATCLI_LOG_SCRUB_PATTERNSPadrões regex adicionais para log scrubbing (; separados)""
CHATCLI_AUDIT_LOGCaminho do arquivo de audit log"" (stdout)
CHATCLI_AUDIT_LOG_MAX_SIZETamanho máximo do arquivo de audit log100M
CHATCLI_AUDIT_LOG_MAX_AGEIdade máxima dos logs de auditoria90d

Modo Agente

VariávelDescriçãoPadrão
CHATCLI_AGENT_ALLOWLIST_MODEModo da allowlist (strict/permissive)strict
CHATCLI_AGENT_DENYLISTPadrões regex adicionais para bloquear (; separados)""
CHATCLI_AGENT_ALLOW_SUDOPermite execução de sudo no modo agentefalse
CHATCLI_AGENT_CMD_TIMEOUTTimeout de execução por comando10m
CHATCLI_AGENT_SOURCE_SHELL_CONFIGPermite source de .bashrc/.zshrcfalse
CHATCLI_AGENT_MAX_OUTPUT_SIZETamanho máximo da saída de comandos1M
CHATCLI_AGENT_BLOCKED_PATHSCaminhos adicionais para bloquear leitura (; separados)""

Plugins

VariávelDescriçãoPadrão
CHATCLI_ALLOW_UNSIGNED_PLUGINSPermite plugins sem assinatura Ed25519false
CHATCLI_PLUGIN_TRUSTED_KEYSChaves públicas Ed25519 confiáveis (, separadas)""
CHATCLI_PLUGIN_QUARANTINE_DIRDiretório de quarentena customizado~/.chatcli/plugins/quarantine

Servidor gRPC

VariávelDescriçãoPadrão
CHATCLI_GRPC_REFLECTIONHabilita gRPC reflectionfalse
CHATCLI_GRPC_MAX_RECV_SIZETamanho máximo de mensagem recebida4MB
CHATCLI_GRPC_MAX_SEND_SIZETamanho máximo de mensagem enviada4MB
CHATCLI_GRPC_MAX_STREAMSMáximo de streams concorrentes por conexão100
CHATCLI_GRPC_BINDEndereç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_RPSRequests por segundo por cliente10
CHATCLI_RATE_LIMIT_BURSTBurst máximo por cliente20
CHATCLI_RATE_LIMIT_CLEANUPIntervalo de limpeza de buckets expirados5m

SSRF e Rede

VariávelDescriçãoPadrão
CHATCLI_SSRF_BLOCK_PRIVATEBloqueia acesso a redes privadastrue
CHATCLI_SSRF_BLOCK_METADATABloqueia acesso a endpoints de metadata cloudtrue
CHATCLI_SSRF_ALLOWED_HOSTSHosts permitidos mesmo em redes privadas (, separados)""
CHATCLI_SSRF_DNS_CHECKValida DNS resolution contra IPs privadostrue

Operator Kubernetes

VariávelDescriçãoPadrão
CHATCLI_OPERATOR_CORS_ORIGINSOrigens CORS permitidas (, separadas)"" (deny-all)
CHATCLI_OPERATOR_AUTH_MODEModo de autenticação (fail-closed/fail-open)fail-closed
CHATCLI_OPERATOR_ALLOWED_RESOURCESOverride da allowlist de tipos de recursos(17 tipos seguros)
CHATCLI_OPERATOR_LOG_SCRUBHabilita log scrubbing antes de enviar ao LLMtrue

CI/CD e Verificação

VariávelDescriçãoPadrão
CHATCLI_DISABLE_VERSION_CHECKDesabilita verificação automática de versãofalse
CHATCLI_COSIGN_KEYChave pública Cosign para verificação de imagens""

Boas Práticas para Produção

1

Configure autenticação JWT com roles

export CHATCLI_JWT_SECRET=$(openssl rand -hex 32)
export CHATCLI_JWT_ISSUER="sua-org-auth"
export CHATCLI_JWT_AUDIENCE="chatcli-production"
chatcli server
2

Habilite TLS 1.3 com certificados válidos

# Use certificados de uma CA confiável (Let's Encrypt, etc.)
chatcli server \
  --tls-cert /etc/chatcli/tls/cert.pem \
  --tls-key /etc/chatcli/tls/key.pem
3

Use modo strict para o agente

export CHATCLI_AGENT_ALLOWLIST_MODE=strict
export CHATCLI_AGENT_ALLOW_SUDO=false
export CHATCLI_AGENT_CMD_TIMEOUT=5m
4

Configure audit logging para SIEM

export CHATCLI_AUDIT_LOG=/var/log/chatcli/audit.jsonl
export CHATCLI_AUDIT_LOG_MAX_SIZE=100M
export CHATCLI_AUDIT_LOG_MAX_AGE=90d
5

Habilite redação em modo strict

export CHATCLI_ENV_REDACTION=strict
export CHATCLI_HISTORY_REDACTION=true
export CHATCLI_OPERATOR_LOG_SCRUB=true
6

Mantenha gRPC reflection e CORS desabilitados

Não defina CHATCLI_GRPC_REFLECTION=true nem CHATCLI_OPERATOR_CORS_ORIGINS em produção, a menos que estritamente necessário.
7

Exija assinatura de plugins

# Padrão — mas verifique que não foi sobrescrito:
export CHATCLI_ALLOW_UNSIGNED_PLUGINS=false
8

Use RBAC namespace-scoped no Kubernetes

helm install chatcli oci://ghcr.io/diillson/charts/chatcli \
  --set rbac.clusterWide=false \
  --set securityContext.readOnlyRootFilesystem=true \
  --set podSecurityContext.runAsNonRoot=true
9

Configure resource limits

resources:
  requests:
    memory: "128Mi"
    cpu: "100m"
  limits:
    memory: "512Mi"
    cpu: "500m"
10

Verifique imagens com Cosign

cosign verify ghcr.io/diillson/chatcli:latest \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  --certificate-identity-regexp "github.com/diillson/chatcli"
11

Mantenha dependências atualizadas

# Verifique vulnerabilidades localmente:
govulncheck ./...

# Atualize dependências:
go get -u ./...
go mod tidy
12

Monitore o audit log

# Verificar tentativas de auth falhadas:
jq 'select(.event == "auth.failed")' /var/log/chatcli/audit.jsonl

# Verificar remediações do operator:
jq 'select(.event == "remediation.applied")' /var/log/chatcli/audit.jsonl

# Alertar em tentativas de acesso a caminhos bloqueados:
jq 'select(.event == "blocked_path.access")' /var/log/chatcli/audit.jsonl

Próximos Passos

Autenticação OAuth

Configuração detalhada de PKCE, Device Flow e integração com provedores.

Governança do Modo Agente

Regras de policy, denylist customizada e controle granular de permissões.

Sistema de Plugins

Desenvolvimento, distribuição e gerenciamento de plugins.

Servidor gRPC

Deploy, configuração avançada e monitoramento do servidor.

Operator Kubernetes

Deploy do operator, CRDs e configuração de remediação automática.

Deploy com Docker e Helm

Guia completo de deploy containerizado com hardening.

Referência de Configuração

Todas as variáveis de ambiente e opções de configuração.

Sistema de Hooks

Automação de tarefas com hooks de ciclo de vida.