raijin-server 0.1.0__tar.gz → 0.2.0__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.
- raijin_server-0.2.0/PKG-INFO +407 -0
- raijin_server-0.2.0/README.md +374 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/setup.cfg +18 -1
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/__init__.py +1 -1
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/cli.py +58 -4
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/healthchecks.py +76 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/__init__.py +11 -2
- raijin_server-0.2.0/src/raijin_server/modules/apokolips_demo.py +378 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/bootstrap.py +65 -0
- raijin_server-0.2.0/src/raijin_server/modules/calico.py +107 -0
- raijin_server-0.2.0/src/raijin_server/modules/cert_manager.py +127 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/full_install.py +54 -19
- raijin_server-0.2.0/src/raijin_server/modules/network.py +151 -0
- raijin_server-0.2.0/src/raijin_server/modules/observability_dashboards.py +233 -0
- raijin_server-0.2.0/src/raijin_server/modules/observability_ingress.py +218 -0
- raijin_server-0.2.0/src/raijin_server/modules/sanitize.py +142 -0
- raijin_server-0.2.0/src/raijin_server/modules/secrets.py +109 -0
- raijin_server-0.2.0/src/raijin_server/modules/ssh_hardening.py +128 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/traefik.py +1 -1
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/vpn.py +68 -3
- raijin_server-0.2.0/src/raijin_server/scripts/__init__.py +1 -0
- raijin_server-0.2.0/src/raijin_server/scripts/checklist.sh +60 -0
- raijin_server-0.2.0/src/raijin_server/scripts/install.sh +134 -0
- raijin_server-0.2.0/src/raijin_server/scripts/log_size_metric.sh +31 -0
- raijin_server-0.2.0/src/raijin_server/scripts/pre-deploy-check.sh +183 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/utils.py +45 -12
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/validators.py +5 -0
- raijin_server-0.2.0/src/raijin_server.egg-info/PKG-INFO +407 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server.egg-info/SOURCES.txt +15 -1
- raijin_server-0.2.0/tests/test_full_install_sequence.py +11 -0
- raijin_server-0.2.0/tests/test_registry.py +24 -0
- raijin_server-0.1.0/PKG-INFO +0 -219
- raijin_server-0.1.0/README.md +0 -186
- raijin_server-0.1.0/src/raijin_server/modules/calico.py +0 -36
- raijin_server-0.1.0/src/raijin_server/modules/network.py +0 -57
- raijin_server-0.1.0/src/raijin_server.egg-info/PKG-INFO +0 -219
- {raijin_server-0.1.0 → raijin_server-0.2.0}/LICENSE +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/pyproject.toml +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/config.py +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/essentials.py +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/firewall.py +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/grafana.py +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/hardening.py +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/harness.py +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/istio.py +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/kafka.py +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/kong.py +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/kubernetes.py +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/loki.py +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/minio.py +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/prometheus.py +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server/modules/velero.py +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server.egg-info/dependency_links.txt +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server.egg-info/entry_points.txt +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/src/raijin_server.egg-info/requires.txt +0 -0
- {raijin_server-0.1.0 → raijin_server-0.2.0}/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.0
|
|
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.
|