raijin-server 0.1.0__tar.gz → 0.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. raijin_server-0.2.1/PKG-INFO +407 -0
  2. raijin_server-0.2.1/README.md +374 -0
  3. {raijin_server-0.1.0 → raijin_server-0.2.1}/setup.cfg +18 -1
  4. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/__init__.py +1 -1
  5. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/cli.py +76 -5
  6. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/healthchecks.py +76 -0
  7. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/__init__.py +11 -2
  8. raijin_server-0.2.1/src/raijin_server/modules/apokolips_demo.py +378 -0
  9. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/bootstrap.py +65 -0
  10. raijin_server-0.2.1/src/raijin_server/modules/calico.py +107 -0
  11. raijin_server-0.2.1/src/raijin_server/modules/cert_manager.py +127 -0
  12. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/full_install.py +54 -19
  13. raijin_server-0.2.1/src/raijin_server/modules/network.py +151 -0
  14. raijin_server-0.2.1/src/raijin_server/modules/observability_dashboards.py +233 -0
  15. raijin_server-0.2.1/src/raijin_server/modules/observability_ingress.py +218 -0
  16. raijin_server-0.2.1/src/raijin_server/modules/sanitize.py +142 -0
  17. raijin_server-0.2.1/src/raijin_server/modules/secrets.py +109 -0
  18. raijin_server-0.2.1/src/raijin_server/modules/ssh_hardening.py +128 -0
  19. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/traefik.py +1 -1
  20. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/vpn.py +68 -3
  21. raijin_server-0.2.1/src/raijin_server/scripts/__init__.py +1 -0
  22. raijin_server-0.2.1/src/raijin_server/scripts/checklist.sh +60 -0
  23. raijin_server-0.2.1/src/raijin_server/scripts/install.sh +134 -0
  24. raijin_server-0.2.1/src/raijin_server/scripts/log_size_metric.sh +31 -0
  25. raijin_server-0.2.1/src/raijin_server/scripts/pre-deploy-check.sh +183 -0
  26. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/utils.py +45 -12
  27. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/validators.py +43 -4
  28. raijin_server-0.2.1/src/raijin_server.egg-info/PKG-INFO +407 -0
  29. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server.egg-info/SOURCES.txt +15 -1
  30. raijin_server-0.2.1/tests/test_full_install_sequence.py +11 -0
  31. raijin_server-0.2.1/tests/test_registry.py +24 -0
  32. raijin_server-0.1.0/PKG-INFO +0 -219
  33. raijin_server-0.1.0/README.md +0 -186
  34. raijin_server-0.1.0/src/raijin_server/modules/calico.py +0 -36
  35. raijin_server-0.1.0/src/raijin_server/modules/network.py +0 -57
  36. raijin_server-0.1.0/src/raijin_server.egg-info/PKG-INFO +0 -219
  37. {raijin_server-0.1.0 → raijin_server-0.2.1}/LICENSE +0 -0
  38. {raijin_server-0.1.0 → raijin_server-0.2.1}/pyproject.toml +0 -0
  39. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/config.py +0 -0
  40. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/essentials.py +0 -0
  41. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/firewall.py +0 -0
  42. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/grafana.py +0 -0
  43. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/hardening.py +0 -0
  44. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/harness.py +0 -0
  45. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/istio.py +0 -0
  46. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/kafka.py +0 -0
  47. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/kong.py +0 -0
  48. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/kubernetes.py +0 -0
  49. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/loki.py +0 -0
  50. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/minio.py +0 -0
  51. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/prometheus.py +0 -0
  52. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server/modules/velero.py +0 -0
  53. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server.egg-info/dependency_links.txt +0 -0
  54. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server.egg-info/entry_points.txt +0 -0
  55. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server.egg-info/requires.txt +0 -0
  56. {raijin_server-0.1.0 → raijin_server-0.2.1}/src/raijin_server.egg-info/top_level.txt +0 -0
@@ -0,0 +1,407 @@
1
+ Metadata-Version: 2.4
2
+ Name: raijin-server
3
+ Version: 0.2.1
4
+ Summary: CLI para automacao de setup e hardening de servidores Ubuntu Server.
5
+ Home-page: https://example.com/raijin-server
6
+ Author: Equipe Raijin
7
+ License: MIT
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3 :: Only
10
+ Classifier: Programming Language :: Python :: 3.9
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Intended Audience :: System Administrators
13
+ Classifier: Environment :: Console
14
+ Requires-Python: >=3.9
15
+ Description-Content-Type: text/markdown
16
+ License-File: LICENSE
17
+ Requires-Dist: typer>=0.12
18
+ Requires-Dist: rich>=13.7
19
+ Provides-Extra: yaml
20
+ Requires-Dist: pyyaml>=6.0; extra == "yaml"
21
+ Provides-Extra: dev
22
+ Requires-Dist: pytest>=7.0; extra == "dev"
23
+ Requires-Dist: pytest-cov>=4.0; extra == "dev"
24
+ Requires-Dist: black>=23.0; extra == "dev"
25
+ Requires-Dist: ruff>=0.1; extra == "dev"
26
+ Provides-Extra: all
27
+ Requires-Dist: pyyaml>=6.0; extra == "all"
28
+ Requires-Dist: pytest>=7.0; extra == "all"
29
+ Requires-Dist: pytest-cov>=4.0; extra == "all"
30
+ Requires-Dist: black>=23.0; extra == "all"
31
+ Requires-Dist: ruff>=0.1; extra == "all"
32
+ Dynamic: license-file
33
+
34
+ # raijin-server
35
+
36
+ CLI em Python (Typer) para automatizar setup e hardening de servidores Ubuntu Server em ambientes produtivos. Orquestra rede, firewall, Kubernetes, observabilidade e backups para acelerar a subida de clusters e workloads.
37
+
38
+ **✨ Versão Auditada e Resiliente para Produção**
39
+
40
+ ## Destaques
41
+
42
+ - ✅ **Validações de Pré-requisitos**: OS, espaço em disco, memória, conectividade
43
+ - ✅ **Health Checks Automáticos**: Valida serviços após instalação
44
+ - ✅ **Retry Inteligente**: Resistente a falhas temporárias de rede
45
+ - ✅ **Logging Estruturado**: Logs persistentes para auditoria
46
+ - ✅ **Gestão de Dependências**: Garante ordem correta de execução
47
+ - ✅ **Configuração via Arquivo**: Automação completa com YAML/JSON
48
+ - ✅ **Idempotência**: Re-execução segura sem quebrar o sistema
49
+ - ✅ **Modo Dry-run**: Simula execução sem aplicar mudanças
50
+
51
+ ## Requisitos
52
+
53
+ - Python >= 3.9
54
+ - Ubuntu Server 20.04+ (testado em 24.04)
55
+ - Permissões root/sudo
56
+ - Conectividade com internet
57
+ - Mínimo 4GB RAM, 20GB disco livre
58
+ - Ferramentas: `curl`, `apt-get`, `systemctl`
59
+
60
+ Ferramentas adicionais (instaladas pelos módulos quando necessário):
61
+ - `helm` (>=3.8 para OCI)
62
+ - `kubectl`, `kubeadm`
63
+ - `velero`, `istioctl`
64
+
65
+ ## Instalacao
66
+
67
+ Sem venv (global):
68
+
69
+ ```bash
70
+ python -m pip install .
71
+ ```
72
+
73
+ Com venv (recomendado para desenvolvimento):
74
+
75
+ ```bash
76
+ python -m venv .venv
77
+ source .venv/bin/activate
78
+ python -m pip install -e .
79
+ ```
80
+
81
+ ## Uso rapido
82
+
83
+ ### Validar Sistema
84
+ ```bash
85
+ # Verifica se o sistema atende pré-requisitos
86
+ sudo raijin-server validate
87
+ ```
88
+
89
+ ### Menu Interativo
90
+ ```bash
91
+ # Menu visual com stautils.py`: Funções utilitárias com retry, timeout e logging.
92
+ - `src/raijin_server/validators.py`: Validações de pré-requisitos e dependências.
93
+ - `src/raijin_server/healthchecks.py`: Health checks pós-instalação.
94
+ - `src/raijin_server/config.py`: Gerenciamento de configuração via arquivo.
95
+ - `src/raijin_server/modules/`: Automações por tópico (hardening, network, essentials, firewall, kubernetes, calico, istio, traefik, kong, minio, prometheus, grafana, loki, harness, velero, kafka).
96
+ - `src/raijin_server/scripts/`: Shells empacotados usados pelos módulos e scripts auxiliares.
97
+ - `ARCHITECTURE.md`: Visão do desenho técnico.
98
+ - `AUDIT.md`: Relatório completo de auditoria e melhorias.
99
+ - `SECURITY.md`: Como reportar vulnerabilidades
100
+ ### Execução Direta de Módulos
101
+ ```bash
102
+ # Executar módulo específico
103
+ sudo raijin-server kubernetes
104
+
105
+ # Dry-run (simula sem aplicar)
106
+ sudo raijin-server --dry-run kubernetes
107
+
108
+ # Pular validações (não recomendado)
109
+ sudo raijin-server --skip-validation kubernetes
110
+ ```
111
+
112
+ ### Automação via Arquivo de Configuração
113
+ ## Documentação Adicional
114
+
115
+ - **[AUDIT.md](AUDIT.md)**: Relatório completo de auditoria e melhorias implementadas
116
+ - **[ARCHITECTURE.md](ARCHITECTURE.md)**: Arquitetura técnica do ambiente
117
+ - **[SECURITY.md](SECURITY.md)**: Políticas de segurança e reporte de vulnerabilidades
118
+
119
+ ## Fluxo de Execução Recomendado
120
+
121
+ ```bash
122
+ # 1. Validar sistema
123
+ sudo raijin-server validate
124
+
125
+ # 2. Base do sistema
126
+ sudo raijin-server essentials
127
+ sudo raijin-server hardening
128
+ sudo raijin-server network # OPCIONAL: pule se IP já configurado via provedor ISP
129
+ sudo raijin-server firewall
130
+
131
+ # 3. Kubernetes
132
+ sudo raijin-server kubernetes
133
+ sudo raijin-server calico
134
+ sudo raijin-server secrets
135
+ sudo raijin-server cert-manager
136
+
137
+ # 4. Ingress (escolha um)
138
+ sudo raijin-server traefik
139
+ # OU
140
+ sudo raijin-server kong
141
+
142
+ # 5. Observabilidade
143
+ sudo raijin-server prometheus
144
+ sudo raijin-server grafana
145
+ sudo raijin-server observability-ingress
146
+ sudo raijin-server observability-dashboards
147
+ sudo raijin-server loki
148
+
149
+ # 6. Storage e Mensageria (opcional)
150
+ sudo raijin-server minio
151
+ sudo raijin-server kafka
152
+
153
+ # 7. Backup
154
+ sudo raijin-server velero
155
+
156
+ # 8. Service Mesh (opcional)
157
+ sudo raijin-server istio
158
+ ```
159
+
160
+ ### IP Estático (pular se já configurado)
161
+
162
+ O módulo `network` é **opcional** quando:
163
+ - O IP fixo foi configurado pelo provedor ISP (ex: Ibi Internet Empresarial)
164
+ - O IP estático foi definido durante a instalação do Ubuntu Server
165
+ - A rede já está funcionando corretamente
166
+
167
+ Para pular automaticamente em automações:
168
+ ```bash
169
+ export RAIJIN_SKIP_NETWORK=1
170
+ sudo raijin-server full-install
171
+ ```
172
+
173
+ O módulo detecta automaticamente se já existe um Netplan com IP estático e pergunta
174
+ se deseja pular. Se executar manualmente, basta responder "não" quando perguntado.
175
+
176
+ ### Notas de kernel / Secure Boot
177
+ - WireGuard depende de módulo de kernel. Com Secure Boot ativo, o módulo DKMS pode precisar ser assinado; se `modprobe wireguard` falhar, assine ou desabilite Secure Boot temporariamente.
178
+ - Certifique-se de ter headers do kernel instalados (`/lib/modules/$(uname -r)/build`) antes de instalar WireGuard.
179
+ - Para Kubernetes/Calico é necessário `br_netfilter` e sysctl `bridge-nf-call-iptables=1`. O módulo `bootstrap` já aplica, mas verifique se seu kernel suporta.
180
+
181
+ ### Comandos Úteis
182
+ ```bash
183
+ # Versão
184
+ raijin-server version
185
+
186
+ # Monitorar logs
187
+ tail -f /var/log/raijin-server/raijin-server.log
188
+
189
+ # Rotacao de logs (default: 20MB, 5 backups)
190
+ # Ajuste via env:
191
+ # export RAIJIN_LOG_MAX_BYTES=$((50*1024*1024))
192
+ # export RAIJIN_LOG_BACKUP_COUNT=5
193
+
194
+ # Métrica de tamanho de logs (Prometheus/Grafana) usando node_exporter textfile collector
195
+ # 1) Habilite textfile collector (ex.: /var/lib/node_exporter/textfile_collector)
196
+ # 2) Agende o script:
197
+ # sudo /bin/bash -c 'RAIJIN_METRIC_FILE=/var/lib/node_exporter/textfile_collector/raijin_log_size.prom \
198
+ # RAIJIN_LOG_DIR=/var/log/raijin-server \
199
+ # /usr/bin/bash -l $(python - <<'PY'
200
+ #from raijin_server.utils import resolve_script_path
201
+ #print(resolve_script_path("log_size_metric.sh"))
202
+ #PY
203
+ #)'
204
+ # 3) Crie um painel no Grafana com a métrica `raijin_log_size_total_bytes` (Prometheus)
205
+ ```
206
+
207
+ ## Estrutura
208
+
209
+ - `src/raijin_server/cli.py`: CLI principal com Typer, banner e `--dry-run`.
210
+ - `src/raijin_server/modules/`: automacoes por topico (hardening, network, essentials, firewall, kubernetes, calico, istio, traefik, kong, minio, prometheus, grafana, loki, harness, velero, kafka).
211
+ - `src/raijin_server/scripts/`: shells embarcados acessíveis via `raijin_server.utils.resolve_script_path()`.
212
+ - `ARCHITECTURE.md`: visao do desenho atual.
213
+ - `SECURITY.md`: como reportar e pensar seguranca.
214
+
215
+ ## Modulos disponiveis
216
+
217
+ - `sanitize`: remove clusters/residuos kube*, binarios antigos e listas apt.
218
+ - `bootstrap`: instala helm, kubectl, istioctl, velero, containerd e dependencias.
219
+ - `ssh-hardening`: cria usuario dedicado, aplica politicas seguras de SSH e integra ao Fail2ban.
220
+ - `hardening`: fail2ban, unattended-upgrades, sysctl.
221
+ - `essentials`: pacotes base (curl, git, jq, etc.) e NTP.
222
+ - `network`: Netplan com IP fixo e DNS. **OPCIONAL** se IP já configurado pelo provedor ISP.
223
+ - `firewall`: UFW com regras para SSH/HTTP/HTTPS/K8s.
224
+ - `vpn`: provisiona WireGuard (servidor + cliente inicial) e libera firewall.
225
+ - `kubernetes`: kubeadm init, containerd SystemdCgroup, kubeconfig.
226
+ - `calico`: CNI Calico com CIDR custom, default-deny e opcao de liberar egress rotulado.
227
+ - `cert_manager`: instala cert-manager e ClusterIssuer ACME (HTTP-01/DNS-01).
228
+ - `secrets`: instala sealed-secrets e external-secrets via Helm.
229
+ - `istio`: istioctl install (perfil raijin) e injeção automática.
230
+ - `traefik`: IngressController com TLS/ACME.
231
+ - `kong`: Ingress/Gateway com Helm.
232
+ - `minio`: armazenamento S3 compatível via Helm.
233
+ - `prometheus`, `grafana`, `loki`: observabilidade, dashboards e persistencia.
234
+ - `observability-ingress`: autentica e publica Grafana/Prometheus/Alertmanager com TLS dedicado.
235
+ - `observability-dashboards`: aplica dashboards opinativos e alertas default (Grafana/Prometheus/Alertmanager).
236
+ - `apokolips-demo`: landing page temática para validar ingress/TLS e testar DNS externo.
237
+ - `harness`: delegate Helm com parametros interativos.
238
+ - `velero`: backup/restore com schedule.
239
+ - `kafka`: deploy Bitnami via OCI.
240
+ - `full-install`: orquestra toda a sequência automaticamente (sanitize ➜ observability-dashboards).
241
+
242
+ ## Roadmap basico
243
+
244
+ - ✅ Validacoes de pre-requisitos e health-check por modulo.
245
+ - ✅ Provisionar ingress seguro para Grafana/Prometheus/Alertmanager (modulo `observability-ingress`).
246
+ - ✅ Dashboards e alertas opinativos prontos para uso (modulo `observability-dashboards`).
247
+ - ✅ Suporte a sealed-secrets/external-secrets para credenciais.
248
+ - ⏳ Testes automatizados (pytest) e linters.
249
+
250
+ ## Proximos passos sugeridos
251
+
252
+ - Suporte a sealed-secrets/external-secrets para credenciais sensíveis.
253
+ - Adicionar validacoes e testes (pytest, linters, testcontainers).
254
+
255
+ ## Scripts embarcados
256
+
257
+ Todos os helpers shell agora vivem em `src/raijin_server/scripts/` e acompanham o pacote Python.
258
+ Para invocá-los dentro de um módulo (ou mesmo após instalar via `pip`), use o helper `resolve_script_path()`:
259
+
260
+ ```bash
261
+ SCRIPT_PATH=$(python - <<'PY'
262
+ from raijin_server.utils import resolve_script_path
263
+ print(resolve_script_path('pre-deploy-check.sh'))
264
+ PY
265
+ )
266
+
267
+ bash "$SCRIPT_PATH"
268
+ ```
269
+
270
+ O helper garante o caminho absoluto correto independentemente de onde o pacote foi instalado.
271
+
272
+ ## Teste de ingress (Apokolips)
273
+
274
+ O módulo [src/raijin_server/modules/apokolips_demo.py](src/raijin_server/modules/apokolips_demo.py) cria um namespace dedicado, ConfigMap com HTML, Deployment NGINX, Service e Ingress Traefik com uma landing page "Apokolips" para validar o tráfego externo.
275
+
276
+ ```bash
277
+ sudo raijin-server apokolips-demo
278
+ ```
279
+
280
+ Personalização rápida:
281
+
282
+ - Defina `APOKOLIPS_HOST=ingress.seudominio.com` para pular o prompt de host.
283
+ - Defina `APOKOLIPS_TLS_SECRET=nome-do-secret` caso já possua um Secret TLS pronto (caso contrário o módulo publica apenas HTTP).
284
+
285
+ Recursos criados:
286
+
287
+ - Namespace `apokolips-demo`
288
+ - ConfigMap com o HTML temático
289
+ - Deployment + Service `ClusterIP` baseado em `nginx:1.25`
290
+ - Ingress (`ingressClassName: traefik`) apontando para o host informado
291
+
292
+ Valide o acesso:
293
+
294
+ ```bash
295
+ kubectl -n apokolips-demo get ingress apokolips-demo -o wide
296
+ curl -H "Host: SEU_HOST" https://<IP_DO_LOAD_BALANCER>/ --insecure
297
+ ```
298
+
299
+ Para remover rapidamente:
300
+
301
+ ```bash
302
+ kubectl delete namespace apokolips-demo
303
+ ```
304
+
305
+ ## Liberar egress controlado para pods
306
+
307
+ O módulo `calico` agora gera um `default-deny` por namespace e oferece uma política opcional
308
+ `allow-egress-internet`. Ao responder "sim" para a pergunta de egress, basta rotular os workloads
309
+ que precisam falar com APIs externas:
310
+
311
+ ```bash
312
+ kubectl label deployment minha-api -n backend \
313
+ networking.raijin.dev/egress=internet
314
+ ```
315
+
316
+ Somente pods com esse label terão tráfego liberado para o CIDR definido (padrão `0.0.0.0/0`).
317
+ Isso permite manter o isolamento padrão enquanto libera acesso seletivo para integrações externas.
318
+
319
+ ## Automacao de segredos (sealed-secrets + external-secrets)
320
+
321
+ Execute o modulo `secrets` para instalar os controladores:
322
+
323
+ ```bash
324
+ sudo raijin-server secrets
325
+ ```
326
+
327
+ Passos realizados:
328
+ - Instala `sealed-secrets` (namespace padrao: `kube-system`)
329
+ - Instala `external-secrets` (namespace padrao: `external-secrets`, com CRDs)
330
+ - Opcional: exporta o certificado publico do sealed-secrets para gerar manifests lacrados via `kubeseal`
331
+
332
+ Dicas rapidas:
333
+ - Exportar certificado depois: `kubectl -n kube-system get secret -l sealedsecrets.bitnami.com/sealed-secrets-key -o jsonpath='{.items[0].data.tls\.crt}' | base64 -d > sealed-secrets-cert.pem`
334
+ - Gerar sealed secret local: `kubeseal --controller-namespace kube-system --controller-name sealed-secrets < secret.yaml > sealed.yaml`
335
+ - ESO: crie um `SecretStore`/`ClusterSecretStore` apontando para seu backend (AWS/GCP/Vault) e um `ExternalSecret` referenciando as chaves.
336
+
337
+ ### Validar o modulo `secrets`
338
+
339
+ ```bash
340
+ # Status dos releases
341
+ helm status sealed-secrets -n kube-system
342
+ helm status external-secrets -n external-secrets
343
+
344
+ # Pods prontos
345
+ kubectl get pods -n kube-system -l name=sealed-secrets
346
+ kubectl get pods -n external-secrets -l app.kubernetes.io/name=external-secrets
347
+
348
+ # Health check integrado
349
+ raijin-server --health-check secrets
350
+ ```
351
+
352
+ ### Exemplos (prontos para aplicar)
353
+
354
+ - SecretStore AWS Secrets Manager: [examples/secrets/secretstore-aws-sm.yaml](examples/secrets/secretstore-aws-sm.yaml)
355
+ - ExternalSecret AWS Secrets Manager: [examples/secrets/externalsecret-aws-sm.yaml](examples/secrets/externalsecret-aws-sm.yaml)
356
+ - SecretStore Vault AppRole: [examples/secrets/secretstore-vault-approle.yaml](examples/secrets/secretstore-vault-approle.yaml)
357
+ - ExternalSecret Vault: [examples/secrets/externalsecret-vault.yaml](examples/secrets/externalsecret-vault.yaml)
358
+
359
+ Notas rápidas:
360
+ - Para AWS/IRSA: crie um ServiceAccount (`apps/eso-aws`) anotado com o role IAM e garanta a policy para leitura dos secrets.
361
+ - Para Vault: crie o Secret `vault-approle-secret` com `secretId` e ajuste `ROLE_ID_AQUI`. Ajuste `server`/`path` conforme seu mount de KV.
362
+ - Aplique na ordem: SecretStore ➜ ExternalSecret ➜ valide `kubectl get secret` no namespace do app.
363
+
364
+ ## Testes e lint
365
+
366
+ Ambiente de dev:
367
+ ```bash
368
+ python -m pip install -e .[dev]
369
+ pytest
370
+ ruff check src tests
371
+ ```
372
+
373
+ ## Acesso remoto seguro (VPN + SSH)
374
+
375
+ Execute `raijin-server ssh-hardening` para aplicar as politicas abaixo automaticamente e `raijin-server vpn` para subir o servidor WireGuard com um cliente inicial. Use `--dry-run` se quiser apenas revisar os comandos.
376
+
377
+ 1. **SSH reforçado**
378
+ - Gere chaves `ed25519` em cada estação: `ssh-keygen -t ed25519 -C "adminops@empresa"`.
379
+ - No servidor, crie um usuário administrativo (ex.: `adminops`) e aplique hardening no `/etc/ssh/sshd_config`:
380
+ ```
381
+ Port 22 # altere caso deseje
382
+ PermitRootLogin no
383
+ PasswordAuthentication no
384
+ AllowUsers adminops
385
+ ```
386
+ - Copie as chaves públicas para `/home/adminops/.ssh/authorized_keys`, ajuste permissões e reinicie o sshd (`systemctl restart ssh`).
387
+ - Para tunelar dashboards internos sem expor portas, use `ssh -L 3000:localhost:3000 adminops@IP_PUBLICO` (ou `-R` para acesso reverso).
388
+
389
+ 2. **VPN privada (WireGuard sugerido)**
390
+ - Instale `wireguard-tools` e `qrencode`, gere chaves do servidor (`wg genkey | tee server.key | wg pubkey > server.pub`).
391
+ - Configure `/etc/wireguard/wg0.conf`:
392
+ ```
393
+ [Interface]
394
+ Address = 10.20.0.1/24
395
+ ListenPort = 51820
396
+ PrivateKey = <server.key>
397
+ PostUp = ufw route allow in on wg0 out on eth0
398
+ PostDown = ufw route delete allow in on wg0 out on eth0
399
+ ```
400
+ - Adicione um `[Peer]` por estação com `AllowedIPs = 10.20.0.X/32`, distribua os arquivos `clientX.conf` ou QR codes e inicie com `systemctl enable --now wg-quick@wg0`.
401
+ - No modem/VPC, libere apenas `51820/UDP` e limite SSH/UIs para o range `10.20.0.0/24` (UFW `allow from 10.20.0.0/24 to any port 22`).
402
+
403
+ 3. **Fluxo recomendado**
404
+ - Exporte apenas o que precisa ser público (Traefik, Harness) e mantenha Grafana/Prometheus/Kubernetes API restritos ao túnel VPN.
405
+ - Documente as portas encaminhadas e mantenha as chaves/tokens em `secrets/` ou sealed-secrets para fácil rotação.
406
+
407
+ Combine esse fluxo com `raijin-server observability-ingress` para publicar Grafana/Prometheus/Alertmanager somente via TLS dedicado e autenticação básica por Traefik e finalize com `raijin-server observability-dashboards` para carregar dashboards e alertas opinativos.