
Proxy bastião SSH de confiança zero com gerenciamento de chaves baseado em Vault, aplicação de políticas RBAC, gravação completa de sessões e TUI administrativa para acesso auditável à infraestrutura de produção.
Um bastion host SSH auto-hospedado e endurecido com gerenciamento de chaves baseado em Vault, aplicação de políticas RBAC, gravação completa de sessões e uma TUI administrativa interativa — projetado para equipes que precisam de acesso auditável e de confiança zero à infraestrutura de produção.
Equipes de engenharia modernas precisam de uma forma de dar aos desenvolvedores o acesso mínimo necessário para fazerem seus trabalhos — nem mais, nem menos. A distribuição tradicional de chaves SSH é propensa a erros: chaves são compartilhadas, esquecidas em laptops e revogadas tarde demais.
O ZTTP resolve isso atuando como a única porta para sua infraestrutura:
Laptop do Desenvolvedor
│
│ zttp
│ (Por baixo dos panos: SSH na porta 2224)
▼
┌─────────────────────────────────────────────────────────┐
│ Proxy ZTTP │
│ │
│ ① Portão de Autenticação — TUI de login bcrypt/Argon2id│
│ ② Mecanismo RBAC — verificação de política por ambiente │
│ ③ Busca no Vault — recuperação efêmera de chave SSH │
│ ④ Ponte — túnel TCP transparente │
│ ⑤ Gravador de Auditoria — gravador de quadros ttyrec │
└──────────┬──────────────────────────────────────────────┘
│ ssh (IP privado, chave efêmera)
▼
Servidor de Destino
Serviços de infraestrutura (Docker Compose):
.ttyrec com quadros com carimbo de data/horaServidor (host do proxy):
2224make (opcional, mas recomendado)Desenvolvedor (cliente):
ssh)git clone https://gitlab.com/Nihal799/zttp.git
cd zttp
cp .env.example .env
Edite .env e defina no mínimo:
PROXY_NODE_IP=<ip-publico-do-seu-servidor>
POSTGRES_PASSWORD=<uma-senha-forte>
VAULT_TOKEN=<um-token-vault-forte>
⚠️ Nunca faça commit do seu arquivo
.env. Ele está listado no.gitignore.
make docker-up
# ou diretamente:
docker compose -f deploy/docker-compose.yml up -d --build
make docker-ps
curl http://localhost:8080/healthz
make release PROXY_ADDR=<ip-do-seu-servidor>:2224
Isso compila de forma cruzada os clientes para todas as plataformas e atualiza automaticamente dist/install.sh e dist/install.ps1 com a URL correta do servidor. O contêiner Nginx serve esses arquivos em http://<ip-do-seu-servidor>:8555/.
curl -fsSL http://<ip-do-proxy>:8555/install.sh | bash
irm http://<ip-do-proxy>:8555/install.ps1 | iex
Após a instalação, conecte-se ao gateway ZTTP:
zttp
# ou diretamente:
ssh -p 2224 <seu-usuario>@<ip-do-proxy>
Você verá uma tela de login no terminal. Após a autenticação, verá uma lista de servidores aos quais está autorizado a acessar.
Toda a configuração é feita por variáveis de ambiente (ou arquivo .env). Consulte .env.example para a referência completa.
O ZTTP usa um modelo baseado em funções. Cada usuário recebe uma função; cada função tem uma política que define quais ambientes de servidores ela pode acessar.
Funções e atribuições de servidores são gerenciadas pelo Console Administrativo (veja abaixo). O mecanismo RBAC realiza todas as verificações em uma única consulta PostgreSQL — ele nunca expõe por que o acesso foi negado ao cliente (proteção contra enumeração).
Conecte-se ao servidor zttp-admin pelo menu do gateway, ou faça login com uma conta que tenha a função security-admin.
O Console Administrativo oferece:
Todas as ações administrativas são registradas em
admin-actions.logdentro do volume de auditoria.
Todas as sessões são armazenadas no volume Docker zttp-audit-logs (/var/log/zttp/audit/ dentro do contêiner).
security-adminCtrl+C para voltar# Listar gravações
sudo ls /var/lib/docker/volumes/zttp-audit-logs/_data/
# Reproduzir uma gravação com ttyplay
sudo ttyplay /var/lib/docker/volumes/zttp-audit-logs/_data/<id-da-sessao>.ttyrec
# Ler o log de ações administrativas
sudo cat /var/lib/docker/volumes/zttp-audit-logs/_data/admin-actions.log
Requisitos: Go 1.25+, Docker (para compilação cruzada)
# Compilar proxy + CLI para a plataforma atual
make build
# Compilar CLI de forma cruzada para todas as plataformas (Linux, macOS, Windows)
make release PROXY_ADDR=<ip-do-proxy>:2224
# Executar testes
make test
# Executar proxy localmente (requer Postgres + Vault já em execução)
make run-proxy
(Clique para reproduzir a demonstração)
(Clique para reproduzir a demonstração)
(Clique para reproduzir a demonstração)
(Clique para reproduzir a demonstração)
(Clique para reproduzir a demonstração)
zttp/
├── cmd/
│ ├── proxy/ # Ponto de entrada do servidor proxy
│ └── zttp/ # Ponto de entrada do cliente CLI
├── db/
│ └── migrations/ # Migrações de esquema do PostgreSQL
├── deploy/
│ ├── docker-compose.yml
│ ├── Dockerfile.proxy
│ └── vault-seed.sh # Semeia chaves SSH de teste no Vault
├── dist/
│ ├── install.sh # Script de instalação Linux/macOS
│ └── install.ps1 # Script de instalação Windows
├── internal/
│ ├── audit/ # Registro de ações administrativas
│ ├── auth/ # Autenticação de usuários (bcrypt, bloqueio)
│ ├── cli/ # TUI do cliente CLI e lógica de conexão
│ ├── config/ # Configuração baseada em ambiente
│ ├── killswitch/ # Serviço gRPC de interruptor de emergência
│ ├── proxy/ # Proxy SSH, TUI do gateway, TUI administrativa, ponte
│ ├── rbac/ # Mecanismo de controle de acesso baseado em funções
│ ├── ratelimit/ # Limitação de taxa por IP
│ ├── session/ # Rastreamento de sessões e armazenamento no banco
│ └── vault/ # Cliente de chaves SSH do HashiCorp Vault
├── proto/ # Definições de protocolo gRPC
├── tools/
│ └── hashpw/ # Ferramenta CLI: gerar hash de senha bcrypt
├── .env.example # Modelo de configuração
├── go.mod
└── Makefile
git checkout -b feat/sua-funcionalidademake testPor favor, não faça commit de:
.env ou qualquer arquivo contendo segredoszttp na raiz está no .gitignore)Este projeto é proprietário. Todos os direitos reservados.
Construído com Go, PostgreSQL, HashiCorp Vault e Docker.
| Problema | Solução ZTTP |
|---|
| Chaves SSH compartilhadas em laptops | As chaves vivem apenas no HashiCorp Vault — nunca em disco |
| Sem visibilidade de quem fez o quê | Cada tecla pressionada é gravada no formato .ttyrec |
| Acesso irrestrito à produção | Mecanismo de política baseado em funções aplica regras por ambiente |
| Sem forma de interromper uma sessão ativa | Endpoint gRPC de interrupção encerra qualquer sessão ativa |
| Acesso opaco para auditores | TUI administrativa com reprodução de sessões, logs de texto e logs de ações administrativas |
| Serviço | Finalidade |
|---|
zttp-proxy | O bastion SSH (binário Go) |
zttp-postgres | Banco de dados do plano de controle (usuários, servidores, políticas RBAC) |
zttp-vault | HashiCorp Vault — armazena chaves privadas SSH |
zttp-nginx | Serve instaladores CLI em /release/ |
zttp-init-audit | Contêiner de execução única que corrige permissões de volume |
| Variável | Padrão | Descrição |
|---|
PROXY_LISTEN_ADDR | 0.0.0.0:2222 | Endereço de bind do proxy SSH |
HTTP_LISTEN_ADDR | 0.0.0.0:8080 | Endereço HTTP de verificação de saúde |
GRPC_LISTEN_ADDR | 0.0.0.0:9090 | Endereço gRPC do interruptor de emergência |
PROXY_NODE_IP | 127.0.0.1 | IP externo embutido nos binários CLI |
DATABASE_URL | postgres://zttp:... | String de conexão do PostgreSQL |
VAULT_ADDR | http://localhost:8201 | URL do servidor Vault |
VAULT_TOKEN | dev-root-token-zttp | Token raiz do Vault (apenas dev — use AppRole em produção) |
MAX_FAILED_ATTEMPTS | 5 | Limite de bloqueio |
LOCKOUT_DURATION | 15m | Duração do bloqueio de conta |
RATE_LIMIT_PER_MIN | 10 | Máximo de tentativas de login por minuto por IP |
AUDIT_LOG_DIR | /var/log/zttp/audit | Caminho do diretório de gravação de sessões |
SOC_WEBHOOK_URL | (vazio) | Webhook opcional para alertas do SOC |
| Função | Acesso |
|---|
security-admin | Acesso total a todos os ambientes + Console Administrativo |
sre-tier1 | Todos os ambientes, incluindo produção |
sre-tier2 | Apenas homologação e desenvolvimento |
dev | Apenas ambiente de desenvolvimento |
readonly | Ambiente de desenvolvimento, conjunto de comandos restrito |
| Opção de Menu | Descrição |
|---|
| Adicionar Usuário | Criar um novo usuário com atribuição de função |
| Adicionar Servidor | Registrar um servidor de destino (hostname, IP, ambiente, usuário SSH) |
| Gerenciar Acesso a Servidores | Conceder ou revogar acesso de usuários a servidores específicos |
| Ver Usuários | Listar todos os usuários e suas funções |
| Ver Servidores | Listar todos os servidores registrados |
| Ver Logs de Auditoria | Navegar por sessões, reproduzir gravações, ler logs de texto |
| [ Voltar ] | Retornar ao gateway de servidores |
| Comando | Descrição |
|---|
make build | Compilar proxy e CLI para a plataforma atual |
make release | Compilar binários CLI de forma cruzada para todas as plataformas |
make release-docker | Compilar de forma cruzada dentro de um contêiner Docker (evita problemas com snap/WSL) |
make docker-up | Iniciar todos os serviços Docker Compose |
make docker-down | Parar todos os serviços e excluir volumes |
make docker-logs | Acompanhar logs do proxy |
make docker-ps | Mostrar status dos contêineres |
make test | Executar todos os testes Go |
make migrate | Aplicar migrações de banco de dados |
make seed | Semear dados de desenvolvimento |
make hashpw PW=minhasenha | Gerar um hash bcrypt para semeadura manual do banco |
make clean | Remover binários compilados e cache de compilação |
| Camada | Mecanismo |
|---|
| Transporte | Todas as conexões de clientes são SSH (criptografadas em trânsito) |
| Autenticação | bcrypt (custo 12) / Argon2id — texto simples é estruturalmente proibido no esquema |
| Proteção contra força bruta | Bloqueio de conta (5 tentativas / 15 min) + limitador de taxa por IP |
| Autorização | Consulta RBAC de JOIN único — negações são sempre genéricas ("Permissão negada") |
| Gerenciamento de segredos | Chaves privadas SSH armazenadas exclusivamente no HashiCorp Vault, buscadas efemeramente |
| Trilha de auditoria | Gravação completa de teclas no formato .ttyrec, log administrativo imutável somente de acréscimo |
| Isolamento de processos | Proxy executa como não-root (UID 65532) dentro de um contêiner distroless |
| Interruptor de emergência | Qualquer sessão ativa pode ser encerrada via gRPC sem reiniciar o proxy |