refactor: distribute Acaua as a Docker image instead of a desktop app
Release / Plan (reuse the published image?) (push) Successful in 3s
CI / Docker image (build and smoke test) (push) Skipped
CI / Format and clippy (push) Successful in 4m32s
CI / Dependency audit (push) Successful in 11s
CI / Tests (Linux) (push) Successful in 9m15s
Release / ci (push) Successful in 9m18s
Release / Build image (arm64) (push) Failing after 7m7s
Release / Build image (amd64) (push) Failing after 13m53s
Release / Publish tags (push) Skipped
Release / Gitea release (push) Skipped
Release / Plan (reuse the published image?) (push) Successful in 3s
CI / Docker image (build and smoke test) (push) Skipped
CI / Format and clippy (push) Successful in 4m32s
CI / Dependency audit (push) Successful in 11s
CI / Tests (Linux) (push) Successful in 9m15s
Release / ci (push) Successful in 9m18s
Release / Build image (arm64) (push) Failing after 7m7s
Release / Build image (amd64) (push) Failing after 13m53s
Release / Publish tags (push) Skipped
Release / Gitea release (push) Skipped
Acaua is a collective SOC daemon consuming only Zeek log files, not a single-user tool needing local hardware like its siblings. Drop the Tauri desktop shell, installers and self-update entirely; the server and its web dashboard ship as a container, updated by pulling a new image tag. Link against the official prebuilt libduckdb instead of compiling it from source via the bundled feature, cutting image build time from 15+ minutes to about 3. Fix a real bug found along the way: as PID 1 in a container, the daemon ignored SIGTERM and was always killed after the stop timeout; it now shuts down gracefully. Also corrects the Pillar 1 beaconing score: the period estimate had a harmonic alias (a perfectly periodic 4h series resolved to 600s), and the old score formula flagged pure random traffic as suspicious (p95 = 0.839 on Poisson noise). The new formula was validated against 300 samples per scenario. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VAyr8d7HuAdUGB6aA5xmDD
This commit is contained in:
1 parent
1b974bb90d
commit
8a80504c45
72 files changed
+2524
-6384
No files matched your search
+58
-44
@@ -2,65 +2,79 @@
|
||||
|
||||
[English](../docker.md) · **Português**
|
||||
|
||||
A imagem é para laboratório e pesquisa. Ela roda o mesmo binário `acaua` de uma
|
||||
instalação nativa, com a UI embutida. O esqueleto não liga a feature DuckDB na
|
||||
imagem; o armazenamento continua reservado para uma release futura.
|
||||
O Acauã é distribuído como uma imagem de container oficial:
|
||||
`git.lucasrguerra.dev.br/ciberfauna/acaua`.
|
||||
|
||||
## Build
|
||||
Tags de imagem disponíveis:
|
||||
- `latest`: Release estável mais recente.
|
||||
- `X.Y.Z` / `X.Y`: Versões semânticas fixadas.
|
||||
- `edge`: Gerada automaticamente a partir do branch `main`.
|
||||
|
||||
O container executa como usuário de sistema não privilegiado (`acaua`, UID 10001),
|
||||
com filesystem raiz somente leitura (`read_only: true`), todas as capabilities revogadas
|
||||
(`cap_drop: [ALL]`), e endurecimento de segurança (`no-new-privileges:true`).
|
||||
|
||||
## Implantação com Compose
|
||||
|
||||
A implantação recomendada para produção e laboratório utiliza Docker Compose:
|
||||
|
||||
```bash
|
||||
docker build -t acaua .
|
||||
docker run --rm -p 127.0.0.1:8787:8787 -v "$PWD/data/acaua:/data/acaua" acaua
|
||||
cp .env.example .env # configure ZEEK_INTERFACE (apenas redes autorizadas)
|
||||
docker compose pull && docker compose up -d
|
||||
```
|
||||
|
||||
O estágio de build usa `rust:1-slim-bookworm`; o de runtime usa
|
||||
`debian:bookworm-slim` e instala só `ca-certificates`, `curl` e `tar` (o updater
|
||||
precisa de `curl` e `tar`).
|
||||
|
||||
## Compose
|
||||
Para compilar e rodar localmente a partir do código:
|
||||
|
||||
```bash
|
||||
cp .env.example .env # opcional: defina ZEEK_INTERFACE
|
||||
docker compose up --build
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
O Compose sobe dois serviços:
|
||||
A stack coordena dois serviços:
|
||||
|
||||
| Serviço | Função | Notas |
|
||||
|---|---|---|
|
||||
| `zeek` | Captura e grava logs Zeek em `./data/zeek` | Rede do host e `NET_RAW`/`NET_ADMIN` |
|
||||
| `acaua` | Lê logs e serve UI/API | Porta do host presa a `127.0.0.1:8787` |
|
||||
| Serviço | Imagem | Finalidade | Perfil de segurança |
|
||||
|---|---|---|---|
|
||||
| `zeek` | `zeek/zeek:9.0.1` | Captura de pacotes de rede e rotação horária de logs | Rede host, capabilities `NET_RAW` e `NET_ADMIN` |
|
||||
| `acaua` | `git.lucasrguerra.dev.br/ciberfauna/acaua` | Processamento analítico, API e dashboard web | Não privilegiado (UID 10001), rootfs read-only, sem capabilities |
|
||||
|
||||
O `acaua` monta `./data/zeek` somente leitura em `/data/zeek` e `./data/acaua`
|
||||
leitura-escrita em `/data/acaua`. O daemon dentro do contêiner escuta
|
||||
`0.0.0.0:8787`, mas a porta publicada é só loopback no host.
|
||||
## Volumes e organização de dados
|
||||
|
||||
## Layout de dados
|
||||
A stack utiliza volumes nomeados para isolamento limpo de permissões e propriedade:
|
||||
|
||||
```text
|
||||
data/
|
||||
zeek/ # logs Zeek, escritos pelo serviço zeek
|
||||
acaua/ # store, exportações e arquivos de runtime
|
||||
- `zeek-logs`: Volume compartilhado montado em `/logs` no serviço Zeek e montado
|
||||
como **somente leitura** em `/data/zeek:ro` no serviço Acauã.
|
||||
- `acaua-data`: Volume dedicado de leitura e escrita montado em `/data/acaua` para o
|
||||
armazenamento DuckDB, partições Parquet e arquivos de execução.
|
||||
|
||||
Para inspecionar ou extrair dados no host:
|
||||
|
||||
```bash
|
||||
docker compose cp acaua:/data/acaua ./local-acaua-backup
|
||||
```
|
||||
|
||||
Não monte a raiz do host nem um diretório com arquivos sensíveis sem relação. O
|
||||
parser deve confinar caminhos à raiz do dataset; o esqueleto ainda não lê
|
||||
registros.
|
||||
Ou executar um container efêmero de inspeção:
|
||||
|
||||
```bash
|
||||
docker run --rm -v acaua_acaua-data:/data:ro debian:trixie-slim ls -la /data
|
||||
```
|
||||
|
||||
## Atualização
|
||||
|
||||
Por rodar como um daemon de SOC de uso coletivo, atualizações são realizadas
|
||||
puxando a imagem verificada mais recente:
|
||||
|
||||
```bash
|
||||
docker compose pull && docker compose up -d
|
||||
```
|
||||
|
||||
O daemon em execução finaliza de forma limpa em resposta ao `SIGTERM` em tempo
|
||||
sub-segundo, garantindo que gravações Parquet e transações DuckDB sejam concluídas
|
||||
sem corrupção.
|
||||
|
||||
## Notas de segurança
|
||||
|
||||
- O serviço `zeek` precisa de privilégio de captura. Rode só em interface e rede
|
||||
que você tem autorização para monitorar.
|
||||
- Não mude o mapeamento de porta do host para `0.0.0.0:8787` sem proxy reverso
|
||||
com autenticação.
|
||||
- A imagem não tem telemetria e não faz conexão de saída exceto um
|
||||
`acaua update` explícito.
|
||||
- O contêiner não é sandbox para dataset hostil. Trate captura malformada como
|
||||
entrada hostil e mantenha o contêiner sem privilégios.
|
||||
|
||||
## Limitações
|
||||
|
||||
- Sem build DuckDB na imagem; o armazenamento analítico não está ativo.
|
||||
- A UI é um shell e o `analyze` devolve relatório stub.
|
||||
- A imagem não inclui Zeek; o Compose usa a imagem upstream do Zeek.
|
||||
- Ainda não há imagem publicada em registry. Compile localmente.
|
||||
- O serviço `zeek` requer privilégios de captura de pacotes (`NET_RAW`, `NET_ADMIN`).
|
||||
Execute-o apenas em interfaces e redes que você tem autorização explícita para monitorar.
|
||||
- A publicação padrão do dashboard é restrita a loopback (`ACAUA_PUBLISH=127.0.0.1:8787`).
|
||||
Não exponha o serviço em interfaces externas sem um proxy reverso com autenticação.
|
||||
- A imagem não possui telemetria. Tráfego de saída restringe-se a checagens de
|
||||
versão iniciadas pelo operador contra a API de Releases do Gitea.
|
||||
Reference in new issue
Block a user