raijin-server 0.3.7__py3-none-any.whl → 0.3.8__py3-none-any.whl
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.
Potentially problematic release.
This version of raijin-server might be problematic. Click here for more details.
- raijin_server/__init__.py +1 -1
- raijin_server/modules/secrets.py +73 -34
- {raijin_server-0.3.7.dist-info → raijin_server-0.3.8.dist-info}/METADATA +1 -1
- {raijin_server-0.3.7.dist-info → raijin_server-0.3.8.dist-info}/RECORD +8 -8
- {raijin_server-0.3.7.dist-info → raijin_server-0.3.8.dist-info}/WHEEL +0 -0
- {raijin_server-0.3.7.dist-info → raijin_server-0.3.8.dist-info}/entry_points.txt +0 -0
- {raijin_server-0.3.7.dist-info → raijin_server-0.3.8.dist-info}/licenses/LICENSE +0 -0
- {raijin_server-0.3.7.dist-info → raijin_server-0.3.8.dist-info}/top_level.txt +0 -0
raijin_server/__init__.py
CHANGED
raijin_server/modules/secrets.py
CHANGED
|
@@ -138,12 +138,17 @@ def _get_minio_credentials(ctx: ExecutionContext) -> tuple[str, str]:
|
|
|
138
138
|
)
|
|
139
139
|
|
|
140
140
|
|
|
141
|
-
def _initialize_vault(ctx: ExecutionContext, vault_ns: str, node_ip: str) -> tuple[str,
|
|
142
|
-
"""Inicializa o Vault e retorna root token e unseal
|
|
143
|
-
typer.echo("\
|
|
141
|
+
def _initialize_vault(ctx: ExecutionContext, vault_ns: str, node_ip: str) -> tuple[str, str]:
|
|
142
|
+
"""Inicializa o Vault com 1 key/1 threshold e retorna root token e unseal key."""
|
|
143
|
+
typer.echo("\nInicializando Vault...")
|
|
144
144
|
|
|
145
|
+
# Usa 1 key com threshold 1 para simplificar (produção pode usar 5/3)
|
|
145
146
|
result = run_cmd(
|
|
146
|
-
[
|
|
147
|
+
[
|
|
148
|
+
"kubectl", "-n", vault_ns, "exec", "vault-0", "--",
|
|
149
|
+
"vault", "operator", "init",
|
|
150
|
+
"-key-shares=1", "-key-threshold=1", "-format=json"
|
|
151
|
+
],
|
|
147
152
|
ctx,
|
|
148
153
|
check=False,
|
|
149
154
|
)
|
|
@@ -155,28 +160,60 @@ def _initialize_vault(ctx: ExecutionContext, vault_ns: str, node_ip: str) -> tup
|
|
|
155
160
|
import json
|
|
156
161
|
init_data = json.loads(result.stdout)
|
|
157
162
|
root_token = init_data["root_token"]
|
|
158
|
-
|
|
163
|
+
unseal_key = init_data["unseal_keys_b64"][0]
|
|
159
164
|
|
|
160
165
|
# Salva keys localmente
|
|
161
166
|
vault_keys_path = Path("/etc/vault/keys.json")
|
|
162
167
|
vault_keys_path.parent.mkdir(parents=True, exist_ok=True)
|
|
163
168
|
vault_keys_path.write_text(json.dumps(init_data, indent=2))
|
|
164
169
|
typer.secho(f"\n✓ Vault keys salvas em {vault_keys_path}", fg=typer.colors.GREEN)
|
|
170
|
+
|
|
171
|
+
# Salva credenciais em secret K8s para uso do ESO
|
|
172
|
+
_save_vault_credentials_to_k8s(ctx, vault_ns, root_token, unseal_key)
|
|
173
|
+
|
|
165
174
|
typer.secho("⚠️ IMPORTANTE: Guarde essas keys em local seguro!", fg=typer.colors.YELLOW, bold=True)
|
|
166
175
|
|
|
167
|
-
return root_token,
|
|
176
|
+
return root_token, unseal_key
|
|
168
177
|
|
|
169
178
|
|
|
170
|
-
def
|
|
171
|
-
"""
|
|
179
|
+
def _save_vault_credentials_to_k8s(ctx: ExecutionContext, vault_ns: str, root_token: str, unseal_key: str) -> None:
|
|
180
|
+
"""Salva credenciais do Vault em secret K8s."""
|
|
181
|
+
typer.echo("Salvando credenciais do Vault em secret K8s...")
|
|
182
|
+
|
|
183
|
+
# Codifica em base64
|
|
184
|
+
token_b64 = base64.b64encode(root_token.encode()).decode()
|
|
185
|
+
key_b64 = base64.b64encode(unseal_key.encode()).decode()
|
|
186
|
+
|
|
187
|
+
secret_yaml = f"""apiVersion: v1
|
|
188
|
+
kind: Secret
|
|
189
|
+
metadata:
|
|
190
|
+
name: vault-init-credentials
|
|
191
|
+
namespace: {vault_ns}
|
|
192
|
+
type: Opaque
|
|
193
|
+
data:
|
|
194
|
+
root-token: {token_b64}
|
|
195
|
+
unseal-key: {key_b64}
|
|
196
|
+
"""
|
|
197
|
+
|
|
198
|
+
secret_path = Path("/tmp/raijin-vault-credentials.yaml")
|
|
199
|
+
write_file(secret_path, secret_yaml, ctx)
|
|
200
|
+
|
|
201
|
+
run_cmd(
|
|
202
|
+
["kubectl", "apply", "-f", str(secret_path)],
|
|
203
|
+
ctx,
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
typer.secho("✓ Credenciais salvas em secret vault-init-credentials.", fg=typer.colors.GREEN)
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def _unseal_vault(ctx: ExecutionContext, vault_ns: str, unseal_key: str) -> None:
|
|
210
|
+
"""Destrava o Vault usando a unseal key."""
|
|
172
211
|
typer.echo("\nDesbloqueando Vault...")
|
|
173
212
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
ctx,
|
|
179
|
-
)
|
|
213
|
+
run_cmd(
|
|
214
|
+
["kubectl", "-n", vault_ns, "exec", "vault-0", "--", "vault", "operator", "unseal", unseal_key],
|
|
215
|
+
ctx,
|
|
216
|
+
)
|
|
180
217
|
|
|
181
218
|
typer.secho("✓ Vault desbloqueado.", fg=typer.colors.GREEN)
|
|
182
219
|
|
|
@@ -262,23 +299,21 @@ def _create_secretstore_example(ctx: ExecutionContext, vault_ns: str, eso_ns: st
|
|
|
262
299
|
"""Cria exemplo de ClusterSecretStore e ExternalSecret."""
|
|
263
300
|
typer.echo("\nCriando exemplo de ClusterSecretStore...")
|
|
264
301
|
|
|
265
|
-
secretstore_yaml = f"""apiVersion: external-secrets.io/
|
|
302
|
+
secretstore_yaml = f"""apiVersion: external-secrets.io/v1
|
|
266
303
|
kind: ClusterSecretStore
|
|
267
304
|
metadata:
|
|
268
305
|
name: vault-backend
|
|
269
306
|
spec:
|
|
270
307
|
provider:
|
|
271
308
|
vault:
|
|
272
|
-
server: "http://vault.{vault_ns}.svc
|
|
309
|
+
server: "http://vault.{vault_ns}.svc:8200"
|
|
273
310
|
path: "secret"
|
|
274
311
|
version: "v2"
|
|
275
312
|
auth:
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
name: "external-secrets"
|
|
281
|
-
namespace: "{eso_ns}"
|
|
313
|
+
tokenSecretRef:
|
|
314
|
+
namespace: "{vault_ns}"
|
|
315
|
+
name: "vault-init-credentials"
|
|
316
|
+
key: "root-token"
|
|
282
317
|
"""
|
|
283
318
|
|
|
284
319
|
secretstore_path = Path("/tmp/raijin-vault-secretstore.yaml")
|
|
@@ -310,7 +345,7 @@ def _create_example_secret(ctx: ExecutionContext, vault_ns: str, root_token: str
|
|
|
310
345
|
typer.secho("✓ Secret 'secret/example' criado no Vault.", fg=typer.colors.GREEN)
|
|
311
346
|
|
|
312
347
|
# Cria ExternalSecret de exemplo
|
|
313
|
-
external_secret_yaml = """apiVersion: external-secrets.io/
|
|
348
|
+
external_secret_yaml = """apiVersion: external-secrets.io/v1
|
|
314
349
|
kind: ExternalSecret
|
|
315
350
|
metadata:
|
|
316
351
|
name: example-secret
|
|
@@ -379,7 +414,7 @@ def run(ctx: ExecutionContext) -> None:
|
|
|
379
414
|
)
|
|
380
415
|
node_ip = result.stdout.strip() if result.returncode == 0 else "192.168.1.81"
|
|
381
416
|
|
|
382
|
-
minio_host = typer.prompt("MinIO host", default=
|
|
417
|
+
minio_host = typer.prompt("MinIO host (interno)", default="minio.minio.svc:9000")
|
|
383
418
|
access_key, secret_key = _get_minio_credentials(ctx)
|
|
384
419
|
|
|
385
420
|
# ========== HashiCorp Vault ==========
|
|
@@ -469,15 +504,14 @@ injector:
|
|
|
469
504
|
if not ctx.dry_run:
|
|
470
505
|
_wait_for_pods_ready(ctx, vault_ns, "app.kubernetes.io/name=vault", timeout=180)
|
|
471
506
|
|
|
472
|
-
# Inicializa Vault
|
|
473
|
-
root_token,
|
|
507
|
+
# Inicializa Vault (retorna root_token e unseal_key)
|
|
508
|
+
root_token, unseal_key = _initialize_vault(ctx, vault_ns, node_ip)
|
|
474
509
|
|
|
475
510
|
# Destrava Vault
|
|
476
|
-
_unseal_vault(ctx, vault_ns,
|
|
511
|
+
_unseal_vault(ctx, vault_ns, unseal_key)
|
|
477
512
|
|
|
478
513
|
# Configura Vault
|
|
479
514
|
_enable_kv_secrets(ctx, vault_ns, root_token)
|
|
480
|
-
_configure_kubernetes_auth(ctx, vault_ns, root_token)
|
|
481
515
|
|
|
482
516
|
# ========== External Secrets Operator ==========
|
|
483
517
|
typer.secho("\n== External Secrets Operator ==", fg=typer.colors.CYAN, bold=True)
|
|
@@ -545,8 +579,7 @@ resources:
|
|
|
545
579
|
if not ctx.dry_run:
|
|
546
580
|
_wait_for_pods_ready(ctx, eso_ns, "app.kubernetes.io/name=external-secrets", timeout=120)
|
|
547
581
|
|
|
548
|
-
#
|
|
549
|
-
_create_eso_policy_and_role(ctx, vault_ns, root_token, eso_ns)
|
|
582
|
+
# Cria ClusterSecretStore (usa tokenSecretRef, não precisa de Kubernetes auth)
|
|
550
583
|
_create_secretstore_example(ctx, vault_ns, eso_ns, node_ip)
|
|
551
584
|
_create_example_secret(ctx, vault_ns, root_token)
|
|
552
585
|
|
|
@@ -562,7 +595,7 @@ resources:
|
|
|
562
595
|
|
|
563
596
|
typer.echo("\n2. Criar ExternalSecret:")
|
|
564
597
|
typer.echo(" kubectl apply -f - <<EOF")
|
|
565
|
-
typer.echo(" apiVersion: external-secrets.io/
|
|
598
|
+
typer.echo(" apiVersion: external-secrets.io/v1")
|
|
566
599
|
typer.echo(" kind: ExternalSecret")
|
|
567
600
|
typer.echo(" metadata:")
|
|
568
601
|
typer.echo(" name: myapp-secret")
|
|
@@ -582,8 +615,14 @@ resources:
|
|
|
582
615
|
typer.echo("\n3. Secret será sincronizado automaticamente!")
|
|
583
616
|
typer.echo(" kubectl get secret myapp-secret -o yaml")
|
|
584
617
|
|
|
618
|
+
typer.secho("\n=== Recuperar Credenciais ===", fg=typer.colors.CYAN)
|
|
619
|
+
typer.echo("Via arquivo local:")
|
|
620
|
+
typer.echo(" cat /etc/vault/keys.json")
|
|
621
|
+
typer.echo("\nVia Kubernetes Secret:")
|
|
622
|
+
typer.echo(f" kubectl -n {vault_ns} get secret vault-init-credentials -o jsonpath='{{.data.root-token}}' | base64 -d")
|
|
623
|
+
typer.echo(f" kubectl -n {vault_ns} get secret vault-init-credentials -o jsonpath='{{.data.unseal-key}}' | base64 -d")
|
|
624
|
+
|
|
585
625
|
typer.secho("\n⚠️ IMPORTANTE:", fg=typer.colors.YELLOW, bold=True)
|
|
586
|
-
typer.echo(
|
|
587
|
-
typer.echo("-
|
|
588
|
-
typer.echo("- Após reboot do Vault, use: kubectl -n vault exec vault-0 -- vault operator unseal")
|
|
626
|
+
typer.echo("- Faça backup das credenciais em local seguro!")
|
|
627
|
+
typer.echo(f"- Após reboot do Vault, use: kubectl -n {vault_ns} exec vault-0 -- vault operator unseal <unseal-key>")
|
|
589
628
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
raijin_server/__init__.py,sha256=
|
|
1
|
+
raijin_server/__init__.py,sha256=IWpKGUd_KknUfa2XJ_Xu7M_xVWCdNyixW7AMO96xWkY,94
|
|
2
2
|
raijin_server/cli.py,sha256=WvZaPJ5AVjhzzs_jLLe2QGvVEH_VphRwnUkTMEgycbI,37320
|
|
3
3
|
raijin_server/config.py,sha256=QNiEVvrbW56XgvNn5-h3bkJm46Xc8mjNqPbvixXD8N0,4829
|
|
4
4
|
raijin_server/healthchecks.py,sha256=UHSRyeKTsCGeL_4dxDSGZ1t8164Q7wYTi1c3ZiU0cro,13536
|
|
@@ -28,7 +28,7 @@ raijin_server/modules/minio.py,sha256=ZoxugJvvuGLzViDfEzrVCRZUevoiFwcEy0PNyn0My4
|
|
|
28
28
|
raijin_server/modules/network.py,sha256=QRlYdcryCCPAWG3QQ_W7ld9gJgETI7H8gwntOU7UqFE,4818
|
|
29
29
|
raijin_server/modules/prometheus.py,sha256=lyhaqLIfMl0GtQ2b2Hre7_A47HrHBB5gspmnWtwXZ4Y,21880
|
|
30
30
|
raijin_server/modules/sanitize.py,sha256=_RnWn1DUuNrzx3NnKEbMvf5iicgjiN_ubwT59e0rYWY,6040
|
|
31
|
-
raijin_server/modules/secrets.py,sha256=
|
|
31
|
+
raijin_server/modules/secrets.py,sha256=3QzvFd4qH1hyOtbu3Cxyu4JUaYgWssxI-oZ4gS3HIP4,19924
|
|
32
32
|
raijin_server/modules/ssh_hardening.py,sha256=Zd0dlylUBr01SkrI1CS05-0DB9xIto5rWH1bUVs80ow,5422
|
|
33
33
|
raijin_server/modules/traefik.py,sha256=omziywss4o-8t64Kj-upLqbXdFYm2JwqOoOukDUmqxY,5008
|
|
34
34
|
raijin_server/modules/velero.py,sha256=nH7WI145OOK-DZo_ZjNegEnwkppi8h98DeQaB5A_kVg,7161
|
|
@@ -39,9 +39,9 @@ raijin_server/scripts/checklist.sh,sha256=j6E0Kmk1EfjLvKK1VpCqzXJAXI_7Bm67LK4ndy
|
|
|
39
39
|
raijin_server/scripts/install.sh,sha256=Y1ickbQ4siQ0NIPs6UgrqUr8WWy7U0LHmaTQbEgavoI,3949
|
|
40
40
|
raijin_server/scripts/log_size_metric.sh,sha256=Iv4SsX8AuCYRou-klYn32mX41xB6j0xJGLBO6riw4rU,1208
|
|
41
41
|
raijin_server/scripts/pre-deploy-check.sh,sha256=XqMo7IMIpwUHF17YEmU0-cVmTDMoCGMBFnmS39FidI4,4912
|
|
42
|
-
raijin_server-0.3.
|
|
43
|
-
raijin_server-0.3.
|
|
44
|
-
raijin_server-0.3.
|
|
45
|
-
raijin_server-0.3.
|
|
46
|
-
raijin_server-0.3.
|
|
47
|
-
raijin_server-0.3.
|
|
42
|
+
raijin_server-0.3.8.dist-info/licenses/LICENSE,sha256=kJsMCjOiRZE0AQNtxWqBa32z9kMAaF4EUxyHj3hKaJo,1105
|
|
43
|
+
raijin_server-0.3.8.dist-info/METADATA,sha256=5QdtvUtfp7Qq_OaevRKA2WoU7i6NViAOG58h3wI5vmw,8829
|
|
44
|
+
raijin_server-0.3.8.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
45
|
+
raijin_server-0.3.8.dist-info/entry_points.txt,sha256=3ZvxDX4pvcjkIRsXAJ69wIfVmKa78LKo-C3QhqN2KVM,56
|
|
46
|
+
raijin_server-0.3.8.dist-info/top_level.txt,sha256=Yz1xneCRtsZOzbPIcTAcrSxd-1p80pohMXYAZ74dpok,14
|
|
47
|
+
raijin_server-0.3.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|