Mekovault
Governança técnica

Como o Mekovault é construído e operado

Referência para equipes de TI, segurança, compliance e auditoria que avaliam o Mekovault antes de assinar. Descreve a infraestrutura, o modelo de identidade, o isolamento entre clientes, o tratamento de credenciais de diretório e o que ainda está em andamento.

Última revisão: 9 de setembro de 2026Documento descritivo dos controles operacionais vigentes. Não constitui certificação formal.

Em resumo

Região
AWS Lightsail, us-east-1 (Virgínia do Norte)
Topologia
4 máquinas em rede privada; apenas uma exposta à Internet
Segredos de clientes
Infisical self-hosted, um project por tenant
Banco de dados
PostgreSQL 16 com Row-Level Security por company_id
Sessão
JWT RS256 de 15 min + refresh de 30 dias em cookie HttpOnly
MFA
TOTP, exigido em operações sensíveis
Uso de credenciais
Registro imutável por operação, exportável e assinado
Acesso administrativo
Somente via Tailscale; sem SSH público

01Infraestrutura

O Mekovault roda na AWS Lightsail, região us-east-1, em quatro máquinas conectadas por rede privada. Apenas uma delas recebe tráfego da Internet.

HostFunçãoServiçosExposição
mekovault-appAplicaçãonginx, Next.js, serviços FastAPI, addonsÚnica exposta: portas 80/443 atrás do Cloudflare
mekovault-dataDadosPostgreSQL 16, Redis (2 instâncias), RabbitMQSomente rede privada
mekovault-vaultSegredosInfisical self-hosted, um project por tenantSomente rede privada
mekovault-obsObservabilidadeGrafana, Loki, Prometheus, Tempo, OpenTelemetry CollectorSomente rede privada
Máquinas de produção
InternetCloudflare (80/443)ÚNICO PONTO EXPOSTOmekovault-appnginx · web · svc-* · addons80/443REDE PRIVADA (SEM IP PÚBLICO)mekovault-dataPostgreSQL 16 · Redis ×2 · RabbitMQmekovault-vaultInfisical · 1 project / tenantmekovault-obsGrafana · Loki · Prometheus · Tempo · OTelTailscaleadministração
Topologia de produção. Apenas mekovault-app recebe tráfego da Internet, por meio do Cloudflare. As demais máquinas não têm IP público e são administradas via Tailscale.
  • Administração exclusivamente via Tailscale (WireGuard). Nenhum host tem SSH aberto à Internet.
  • Firewall ufw ativo em cada máquina com política de negar por padrão.
  • Os serviços internos (PostgreSQL, Redis, RabbitMQ, Infisical, Grafana e os processos FastAPI) escutam em loopback ou na interface privada. O nginx é o único processo que atende tráfego público.
  • O Cloudflare termina o TLS e filtra o tráfego antes que chegue ao nginx.

02Arquitetura de serviços

A interface web é uma aplicação Next.js 16. O backend é composto por serviços FastAPI em Python 3.12 com SQLAlchemy assíncrono, cada um com uma responsabilidade delimitada.

ServiçoResponsabilidade
svc-authAutenticação, sessões, MFA e redefinição de senha
svc-tenancyEmpresas, associações, papéis, revendedores e exclusão de tenants
svc-requestsSolicitações de admissão, mudança e desligamento; fluxo de aprovações
svc-ticketsTickets de suporte e seu acompanhamento
svc-billingPlanos, assinaturas e faturamento
svc-notificationsE-mail e notificações aos usuários
addonsMódulos conectores. Exemplo: super-workspace, que opera sobre Google Workspace
Serviços do backend

Eventos e trabalhos em segundo plano

  • Os serviços se comunicam por eventos via RabbitMQ, no exchange de tipo topic mekovault.events.
  • Os trabalhos pesados (provisionamento, exclusões, exportações) são registrados em um livro-razão de jobs no PostgreSQL e executados por um worker único.
  • Cada job tenta novamente com backoff exponencial. Seus passos são idempotentes: reexecutar um passo já concluído não produz efeitos duplicados no diretório.
  • Quando um job esgota as tentativas, um alerta é gerado e o job permanece visível com o último erro para intervenção manual.

03Identidade e sessão

Os usuários do Mekovault (administradores de TI, aprovadores, revendedores) se autenticam com OAuth do Google ou com e-mail e senha. A sessão foi desenhada para que um token roubado sirva por pouco tempo e seja revogável.

MecanismoDetalhe
Métodos de acessoOAuth com Google, ou e-mail e senha
Token de acessoJWT assinado com RS256, validade de 15 minutos, com claims de papel e de estado do MFA
Refresh tokenValidade de 30 dias. Vive apenas em um cookie HttpOnly (inacessível via JavaScript). É rotacionado a cada uso e revogável individualmente por jti no Redis. Herda o estado do MFA da sessão e revalida a associação do usuário à empresa a cada renovação.
MFATOTP (apps autenticadores padrão). Limite de 5 tentativas por minuto; bloqueio de 15 minutos após 10 falhas consecutivas.
Operações sensíveisExigem que a sessão tenha MFA verificado, mesmo que o usuário já esteja autenticado.
Redefinição de senhaToken de uso único com validade de 30 minutos.
Parâmetros de sessão

Consequência prática: um access token vazado expira em no máximo 15 minutos; o refresh não pode ser exportado do navegador; e revogar o jti no Redis encerra a sessão imediatamente, sem esperar que nada expire.

04Isolamento multi-tenant

O Mekovault é multi-tenant: vários clientes compartilham a mesma infraestrutura. O isolamento entre eles é imposto em camadas independentes, de modo que um defeito em uma delas não exponha dados de outro cliente.

CamadaControle
Modelo de dadosToda linha com dados de cliente carrega company_id.
AplicaçãoToda consulta filtra pela empresa que vem no token de sessão. Nunca por um parâmetro enviado pelo cliente.
Banco de dadosRow-Level Security do PostgreSQL como barreira adicional: mesmo que uma consulta esquecesse o filtro, o banco não retorna linhas de outra empresa.
SuperadminPapel de plataforma separado dos papéis de cliente. Suas ações exigem confirmação por código e MFA verificado.
RevendedoresUm revendedor vê e opera apenas sobre os tenants que administra.
Camadas de isolamento

05Credenciais de provedores e auditoria de uso

Para operar no seu diretório, o Mekovault recebe credenciais com permissões de administração: o JSON de uma Service Account do Google com delegação em todo o domínio. São o ativo mais sensível que manipulamos.

  • Armazenadas criptografadas no Infisical (self-hosted, em mekovault-vault), em um project dedicado por tenant.
  • Nunca são gravadas no banco de dados, em logs ou em respostas de API. O banco guarda apenas uma referência ao segredo.
  • São carregadas em memória no momento de chamar o provedor e descartadas ao fim da operação.

Registro imutável de cada uso

Cada chamada ao Google com as credenciais do cliente grava uma linha na tabela credential_usage_log.

CampoConteúdo
Tenantcompany_id do cliente dono da credencial
ProvedorGoogle Workspace
OperaçãoAção executada, por exemplo create_user, suspend_user, add_group_member
ScopesScopes ou permissões consumidos por essa operação
QuemUsuário que originou a ação, ou o processo automático (worker, timer) que a executou
MotivoReferência à solicitação, ticket ou tarefa que justificou a chamada
ResultadoSucesso ou falha, com código de erro quando aplicável
LatênciaDuração da chamada ao provedor em milissegundos
Campos de credential_usage_log
  • A tabela tem triggers do PostgreSQL que rejeitam qualquer UPDATE ou DELETE. Nem a equipe do Mekovault consegue editar ou apagar uma linha individual.
  • Cada linha tem um id determinístico derivado da operação. Uma nova tentativa do mesmo job não gera uma segunda linha, então o registro não infla nem se contradiz.
  • Uma rajada de falhas sobre as credenciais de um tenant dispara um alerta para a equipe de operação.

Retenção

ParâmetroValor
Mínimo24 meses
Máximo84 meses
ConfiguraçãoPor tenant, dentro dessa faixa
Exclusão do tenantApagado junto com o tenant, ou após 24 meses, o que ocorrer primeiro
ExpurgoSemanal, apenas de linhas fora do período configurado. Cada lote expurgado fica registrado na auditoria.
Retenção do registro de uso

Exportação para auditores

O registro é exportado em CSV ou JSON. Cada arquivo é assinado com HMAC-SHA256 e inclui o identificador da chave usada, de modo que um auditor pode verificar que o arquivo não foi alterado depois de gerado.

06Permissões que o Mekovault solicita

O Mekovault pede apenas as permissões necessárias para gerenciar usuários, grupos e unidades organizacionais. Não solicita acesso a e-mail, arquivos, calendário nem conteúdo de nenhum usuário.

ScopePara que é usado
admin.directory.userCriar, suspender, reativar e modificar contas de usuário; definir senha inicial e forçar sua troca.
admin.directory.groupCriar grupos e listas, e adicionar ou remover membros durante admissões, mudanças e desligamentos.
admin.directory.orgunitLer e mover usuários entre unidades organizacionais conforme o fluxo de onboarding ou offboarding.
Google Workspace (Admin SDK Directory API)

As chamadas são feitas com a Service Account personificando o administrador delegado que o cliente designa ao conectar o domínio. Esse administrador fica registrado em cada linha de credential_usage_log.

07Senhas iniciais e redefinição

  • Quando o Mekovault cria uma conta ou redefine uma senha, a senha temporária fica visível para o administrador que executou a ação por 15 minutos.
  • Depois desse prazo ela é expurgada do sistema. Não pode ser recuperada: se foi perdida, gera-se uma nova.
  • Senhas nunca são gravadas em logs, eventos nem no registro de uso de credenciais.

08Exclusão de um tenant

Um cliente pode pedir a exclusão completa do seu tenant (direito ao esquecimento, GDPR art. 17 e Lei 21.719 do Chile). O processo foi desenhado para que as credenciais desapareçam antes de qualquer outro dado.

  1. Um administrador do tenant solicita a exclusão. A solicitação é enfileirada como job.
  2. O tenant fica inacessível imediatamente: suas sessões e novos logins são rejeitados.
  3. O job revoga os segredos do tenant e exclui seu project no Infisical. A partir desse ponto o Mekovault não consegue mais chamar o diretório do cliente.
  4. Só então os dados do tenant são excluídos em cascata do PostgreSQL: usuários, solicitações, tickets, configuração.
  5. A exclusão fica registrada na auditoria da plataforma.
  6. Os administradores recebem um e-mail de confirmação com o detalhe do que foi excluído.

09Addons: módulos com limites

Os conectores a provedores e outras extensões são empacotados como addons. Um addon com defeito não deve conseguir degradar a plataforma inteira, e o registro de addons impõe essa regra.

EtapaControle
DeclaraçãoCada módulo é descrito em um manifesto com suas portas, rotas, tabelas, migrações e verificação de saúde.
ValidaçãoAutomática antes da ativação: esquema do manifesto, colisões de portas, rotas e tabelas com outros módulos, migrações aplicáveis e resposta da verificação de saúde.
ExecuçãoRoda com limites de memória e CPU. Um módulo que estoura é reiniciado sem afetar os demais.
SupervisãoVerificação de saúde a cada 60 segundos, com resultado visível no painel de operação.
Kill switchQualquer módulo pode ser desativado sem deploy: em 15 segundos ou menos suas rotas respondem 503 e o restante da plataforma segue operando.
Ciclo de vida de um addon

10Perímetro e navegador

ControleEfeito
HSTSO navegador só se conecta ao domínio por HTTPS, mesmo que o usuário digite http.
Content-Security-PolicyRestringe as origens das quais o portal pode carregar scripts, estilos e conexões.
X-Content-Type-Options: nosniffImpede que o navegador reinterprete o tipo de um arquivo.
frame-ancestors 'none'O portal não pode ser embutido em um iframe de outro site (clickjacking).
CORS restritoApenas as origens do Mekovault podem chamar a API a partir de um navegador.
Sem source maps em produçãoO código-fonte do frontend não é publicado.
Sem documentação pública de APIOs esquemas OpenAPI dos serviços não ficam expostos em produção.
Erros sem rastrosAs respostas de erro não incluem stack traces nem detalhes internos.
Cabeçalhos e políticas do portal

11Operação e observabilidade

SinalDestino
Logs estruturados (JSON)Loki, consultados pelo Grafana
MétricasPrometheus
Rastros distribuídosOpenTelemetry para o Tempo
Sinais de operação
  • Antes de cada deploy é feito um backup do banco de dados.
  • Os serviços são implantados de forma controlada; um deploy com falha é revertido ao backup anterior.

Timers de higiene

TarefaO que faz
Expurgo de PIIExclui dados pessoais que já cumpriram seu período de retenção.
Fechamento de ticketsFecha tickets resolvidos sem atividade após o prazo configurado.
Expiração de segredosAvisa os administradores 30, 7 e 0 dias antes de uma credencial de provedor expirar.
Expurgo do registro de usoSemanal; exclui apenas linhas fora da retenção configurada e registra o lote.
Tarefas agendadas

12Resumo das camadas de segurança

CamadaControles
PerímetroCloudflare, nginx como único processo público, ufw
RedeRede privada do Lightsail, Tailscale para administração, serviços em loopback
IdentidadeJWT RS256 de 15 min, refresh HttpOnly rotacionado e revogável, MFA TOTP com rate limit
AplicaçãoFiltro pelo company_id do token em toda consulta
DadosRow-Level Security no PostgreSQL 16
SegredosInfisical self-hosted, um project por tenant, nunca em banco nem logs
Auditoriacredential_usage_log imutável, exportação assinada com HMAC-SHA256
MódulosManifesto validado, limites de recursos, supervisão a cada 60 s, kill switch
OperaçãoBackups antes do deploy, timers de higiene, logs, métricas e rastros
Controles por camada

13O que está em andamento

Preferimos dizer o que falta antes que um questionário pergunte. Estes itens estão em trabalho e não devem ser considerados vigentes até que esta página os mova para a seção correspondente.

ItemStatus
ENVIRONMENT=production em todos os serviços (hoje alguns rodam com a configuração de desenvolvimento endurecida)Em andamento
Alertas de operação para o SlackEm andamento
Papel do PostgreSQL dedicado por addon, para que cada módulo acesse apenas suas tabelasEm andamento
SOC 2Não planejado por enquanto; o framework orienta nossos controles
Roadmap técnico

FAQPerguntas frequentes de auditoria

Respostas diretas ao que equipes de segurança e auditores costumam perguntar.

Onde ficam minhas credenciais?
No Infisical, uma instância self-hosted na máquina mekovault-vault, dentro da rede privada da AWS Lightsail em us-east-1. Cada tenant tem seu próprio project. O banco de dados guarda apenas uma referência ao segredo, nunca seu valor.
Quem pode vê-las?
Nenhuma pessoa as vê em operação normal. Os serviços as carregam em memória no momento de chamar o provedor e as descartam ao terminar. O acesso à máquina do vault exige Tailscale e é restrito à equipe de plataforma. As senhas temporárias geradas pelo Mekovault ficam visíveis ao administrador do cliente por 15 minutos e depois são expurgadas.
O que acontece se eu deixar o Mekovault?
Um administrador solicita a exclusão do tenant. O acesso é cortado imediatamente; depois os segredos são revogados e o project do Infisical é excluído; só então os dados são excluídos em cascata do PostgreSQL. Fica registro na auditoria da plataforma e os administradores recebem um e-mail com o detalhe. Os suboperadores com dados residuais estão listados na página de suboperadores.
Como provo que minhas permissões não foram usadas para outra coisa?
Com credential_usage_log: cada chamada ao Google com suas credenciais fica registrada com operação, scopes, quem originou, motivo, resultado e latência. A tabela não aceita UPDATE nem DELETE. Você pode exportá-la em CSV ou JSON assinado com HMAC-SHA256 e verificar a assinatura com o id de chave incluído.
Um token de sessão roubado serve para algo?
O access token expira em 15 minutos. O refresh token vive apenas em um cookie HttpOnly, é rotacionado a cada uso e pode ser revogado por jti no Redis. Operações sensíveis exigem ainda MFA verificado nessa sessão.
Um módulo com falhas pode derrubar a plataforma?
Não foi desenhado para conseguir. Cada addon roda com limites de memória e CPU, é supervisionado a cada 60 segundos e tem um kill switch que o desativa em 15 segundos ou menos sem deploy. Os demais serviços seguem operando.

Solicitar o pacote de segurança

Inclui este documento em PDF, a lista de suboperadores, o DPA assinável e as respostas a questionários padrão (CAIQ, SIG Lite). Respondemos em 5 dias úteis.