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 CHANGED
@@ -1,5 +1,5 @@
1
1
  """Pacote principal do CLI Raijin Server."""
2
2
 
3
- __version__ = "0.3.7"
3
+ __version__ = "0.3.8"
4
4
 
5
5
  __all__ = ["__version__"]
@@ -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, list[str]]:
142
- """Inicializa o Vault e retorna root token e unseal keys."""
143
- typer.echo("\n Inicializando Vault...")
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
- ["kubectl", "-n", vault_ns, "exec", "vault-0", "--", "vault", "operator", "init", "-format=json"],
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
- unseal_keys = init_data["unseal_keys_b64"]
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, unseal_keys
176
+ return root_token, unseal_key
168
177
 
169
178
 
170
- def _unseal_vault(ctx: ExecutionContext, vault_ns: str, unseal_keys: list[str]) -> None:
171
- """Destrava o Vault usando as unseal keys."""
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
- # Precisa de 3 keys das 5 geradas (threshold padrão)
175
- for i in range(3):
176
- run_cmd(
177
- ["kubectl", "-n", vault_ns, "exec", "vault-0", "--", "vault", "operator", "unseal", unseal_keys[i]],
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/v1beta1
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.cluster.local:8200"
309
+ server: "http://vault.{vault_ns}.svc:8200"
273
310
  path: "secret"
274
311
  version: "v2"
275
312
  auth:
276
- kubernetes:
277
- mountPath: "kubernetes"
278
- role: "eso-role"
279
- serviceAccountRef:
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/v1beta1
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=f"{node_ip}:30900")
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, unseal_keys = _initialize_vault(ctx, vault_ns, node_ip)
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, unseal_keys)
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
- # Configura integração Vault + ESO
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/v1beta1")
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(f"- Root token e unseal keys salvos em: /etc/vault/keys.json")
587
- typer.echo("- Faça backup dessas keys em local seguro!")
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: raijin-server
3
- Version: 0.3.7
3
+ Version: 0.3.8
4
4
  Summary: CLI para automacao de setup e hardening de servidores Ubuntu Server.
5
5
  Home-page: https://example.com/raijin-server
6
6
  Author: Equipe Raijin
@@ -1,4 +1,4 @@
1
- raijin_server/__init__.py,sha256=kD4ksBx35-1QYm5EkRuSYWXJAwwJx_-sM9cp92bOhh4,94
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=HOFk57LFyzW4XJ3c8uEEPRd5Dj_OYDI1NBVLzJMp0vY,18562
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.7.dist-info/licenses/LICENSE,sha256=kJsMCjOiRZE0AQNtxWqBa32z9kMAaF4EUxyHj3hKaJo,1105
43
- raijin_server-0.3.7.dist-info/METADATA,sha256=KGvWKBpPSa4-6oSXFHJ0rykLQ-_VFftLobt0mFm-Co0,8829
44
- raijin_server-0.3.7.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
45
- raijin_server-0.3.7.dist-info/entry_points.txt,sha256=3ZvxDX4pvcjkIRsXAJ69wIfVmKa78LKo-C3QhqN2KVM,56
46
- raijin_server-0.3.7.dist-info/top_level.txt,sha256=Yz1xneCRtsZOzbPIcTAcrSxd-1p80pohMXYAZ74dpok,14
47
- raijin_server-0.3.7.dist-info/RECORD,,
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,,