Matheus Augusto · Engenharia de automação de segurança
Cada uma nasceu de um problema que apareceu no trabalho. Abra o caderno e vá virando: em toda página tem a ideia, o desafio de engenharia que ela me deu e a saída real do terminal.
Caderno de projetos
OSINT, custódia de segredos, custo de Kubernetes, ambientes de preview e sincronização offline.
Abrir o cadernoSumário
github.com/masterazul
01 spectra — 18 fontes públicas numa CLI só.
02 keyrot — cofre de segredos com auditoria encadeada.
03 kostwatch — quanto o cluster desperdiça, em dinheiro.
04 deploybox — preview no ar com um comando.
05 habitsync — backend que funciona sem rede.
Actions do CI pinadas por digest, cargo audit semanal e verificação de overflow no release.
i01 · OSINT
masterazul/Spectra · Rust · 724 KB
Consultar CNPJ, CEP, DNS e certificado de um domínio significava abrir meia dúzia de sites. Aqui são 18 fontes públicas numa CLI só, todas devolvendo o mesmo formato de JSON. E tem o verify: antes de sair coletando, ele diz quais fontes estão de pé.
O desafio
Rejeitar IP literal não bastava. 169.254.43518 não parece um endereço, mas o parser de URL normaliza para 169.254.169.254 — os metadados da AWS. A sonda de cabeçalho conectava no host interno logo na primeira requisição. Passei a exigir que o último rótulo comece com letra, a única condição em que o parser não tenta virar IPv4.
02 · Criptografia
masterazul/keyrot · Rust · 443 KB
A senha não cifra os segredos. Ela deriva, com Argon2id, a chave que embrulha outra chave — e é essa que cifra. Trocar a senha não obriga a re-cifrar nada. Todo put cria uma versão nova, e cada operação vira uma linha num log encadeado por SHA-256.
O desafio
Dez processos gravando no mesmo cofre perdiam de três a cinco escritas. Cada um lia o arquivo inteiro, alterava em memória e reescrevia por cima. A cadeia de auditoria quebrava junto e o verify passava a acusar adulteração que nunca houve. Resolvi com lock por operação; os dez passaram a sobreviver, e a cadeia ficou íntegra.
$ keyrot rotate db/senha --generate stored version 2 $ keyrot get db/senha --version 1 s3cr3t $ keyrot verify audit chain ok (5 entries)
03 · FinOps
masterazul/kostwatch · Rust · 715 KB
O time pede 2 vCPUs e usa 0,1. Multiplica por réplica e por mês: vira dinheiro parado. O kostwatch confronta o que foi pedido com o que roda de verdade — de um snapshot ou do Prometheus — e devolve a conta, do maior desperdício para o menor.
O desafio
Separar "sem métrica" de "uso zero". Um pod recém-criado, ainda sem duas coletas para o rate[5m], aparecia como ocioso com 100% de economia — e a recomendação era encolher um serviço vivo. Ausência de amostra agora descarta o workload em vez de virar zero.
$ kostwatch analyze --snapshot snapshot.json monthly cost: 448.95 USD savings: 196.56 (44%) payments api 197.10 164.40 1.00->0.15 legacy cron-run 32.85 32.15 0.50->0.01 idle search indexer 219.00 0.00 2.00->2.00
04 · DevOps
masterazul/deploybox · Rust · 422 KB
deploybox up . e o repositório vira um ambiente de preview no ar. Build do Dockerfile, porta livre escolhida sozinha, e um reverse proxy feito na unha com std::net para servir cada ambiente em nome.localhost.
O desafio
O proxy encaminhava só o corpo que chegava junto do cabeçalho. Qualquer requisição em Transfer-Encoding: chunked chegava truncada e a conexão pendurava. Sem Content-Length para contar bytes, a saída foi clonar o socket e copiar numa thread separada até o cliente fechar a escrita.
$ deploybox proxy proxy on http://127.0.0.1:8080 routing 2 preview(s) $ curl -H "Host: api.localhost" localhost:8080 preview vivo respondendo
05 · Offline-first
masterazul/habitsync · Rust · 509 KB
Feito para app que precisa funcionar no avião. O cliente grava tudo offline; quando a rede volta, manda num POST só e recebe apenas o que mudou desde o último cursor. Não tem banco: o estado é um arquivo JSON gravado de forma atômica.
O desafio
Um push rejeitado por last-write-wins sumia sem aviso: resposta 200, delta vazio, cursor inalterado. Um celular com o relógio atrasado perdia as próprias edições para sempre. Agora o servidor devolve a versão vencedora de todo id empurrado — e o cliente converge em vez de divergir calado.
$ curl -s localhost:8787/analytics
[{"name":"Ler 20 paginas",
"current_streak":3,"longest_streak":3,
"total":3,"rate_30d":0.1}]
Fim
Duque de Caxias, RJ · 100% remoto · disponibilidade imediata
Se algo aqui interessar, o código está aberto e eu respondo rápido. Os cinco projetos têm teste, CI e a mesma disciplina de segurança que eu levo para a operação.
Os desafios que você acabou de ler não são teóricos: todos vieram de bugs reais, encontrados com reprodução e corrigidos com teste antes e depois.