← Voltar

Matheus Augusto · Engenharia de automação de segurança

Cinco ferramentas em Rust.

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

Cinco ferramentas, cinco problemas.

OSINT, custódia de segredos, custo de Kubernetes, ambientes de preview e sincronização offline.

Abrir o caderno

Sumário

O que tem aqui

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.

44Testes
0Unsafe
0Warnings
MITLicença

Actions do CI pinadas por digest, cargo audit semanal e verificação de overflow no release.

i

01 · OSINT

spectra

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.

carregando o módulo
18Fontes
11Comandos
11Testes
Ver o código → 01

02 · Criptografia

keyrot

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)
AES-256GCM
Argon2idKDF
6Testes
Ver o código → 02

03 · FinOps

kostwatch

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
PromEntrada
44%Exemplo
10Testes
Ver o código → 03

04 · DevOps

deploybox

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
std::netProxy
0Dep de rede
9Testes
Ver o código → 04

05 · Offline-first

habitsync

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}]
LWWConflito
413Limite 1 MiB
8Testes
Ver o código → 05

Fim

Obrigado pela leitura.

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.

5Projetos
44Testes
34Bugs corrigidos
Falar comigo → fim