Files
obsidian/infra/vault.md
kappa b24d10d156 vault-mcp-server 실 아키텍처 정정 (중복 아님, jp1 단일 인스턴스)
- infra/vault.md MCP 서버 섹션 전체 재작성: K3s Deployment 아니라 Pod 없는 리버스 프록시 파사드, 세 접근 경로 모두 jp1 Incus vault 컨테이너(10.253.101.58)로 수렴
- 과거 오류 정정 callout 추가: vault-active.vault.svc.cluster.local 경로 실존 안 함, hcv/mcp URL은 Vault UI로 307 (올바른 MCP 경로는 vault-mcp.inouter.com/mcp)
- history/2026-04-15-vault-mcp-duplicate-investigation.md 인시던트 기록

근거: Heimdall 조사 (Outline 5b6ddffa) + kappa 로컬 확인 (jp1 systemd active + 활성 트래픽)
2026-04-15 13:29:18 +09:00

6.7 KiB

title, updated, tags
title updated tags
Vault 시크릿 관리 2026-04-15
infra
vault
security

K3s 배포

HashiCorp Vault v1.21.2, K3s에 HA Raft 3노드로 배포 (Helm chart hashicorp/vault 0.32.0). namespace: vault. 스토리지: Longhorn 10Gi PVC. Unseal key 5개 (threshold 3), 키 파일: ~/vault-keys.json

접근

  • UI/API: https://hcv.inouter.com
  • 트래픽 흐름: BunnyCDN (pull zone: inouter, ID 5316471) → SafeLine WAF → apisix (라우트 hcv-inouter-com) → K3s Traefik (192.168.9.134/140/214:443) → vault-active:8200
  • K3s Ingress: vault-ui (class traefik, TLS wildcard-inouter-com-tls)
  • APISIX upstream: hcv-inouter-com (roundrobin, 3노드 443)

Root Token

Vault root token은 만료 없음 (TTL: 0s)

접근 정책

접근 정책: infra-read(읽기 전용), infra-admin(읽기/쓰기)

시크릿 구조 (KV v1)

⚠️ KV v1 — 버전 관리 없음. 덮어쓰기 주의. ⚠️ 시크릿 읽을 때 모든 키를 확인할 것 — 한 경로에 여러 키가 있음 (예: cloudflare에 api_token과 global_api_key 둘 다 있음)

전수 목록 (2026-04-15 실측)

| 카테고리 | 경로 | 내용 | |----------| ai/ | brave, context7, deepseek, google/drive-mcp, openai, openrouter, pinecone, testsprite, vertex | | apps/ | anomaly-detect, cfb-manager, cf-multisite, discord, figma, gitea, gitea/registry, k3s, myapp, n8n, nocodb, ops-agents-ssh, outline, portainer, postgres, sftpgo, telegram-ai-support, trader, twilio, waf-saas | | auth/ | api-keys/openai, api-keys/stripe, github/oauth-gitea, google/ca/external-account-key, google/ca/service-account, google/oauth-gitea | | cloud/ | alibaba, aws, backblaze, backblaze/restic, bunnycdn, cloudflare, cloudflare-netbis, cloudflare/r2, cloudflare/turnstile-crowdsec-captcha, cloudflare/turnstile-inouter-bunny, latitude, lightsail, linode, r2-gitea, r2-multisite, r2-sftpgo, supabase, vultr, zenlayer | | company/ | bank, info, ironclad, korbit, koreaexim, popbill | | database/ | bunnydb/cs-blocklist, postgres, redis | | domain/ | globalping, maxmind, namecheap, namecheap/api, namecheap/api-server, namecheap/deposit-api, namecheap/registrant | | infra/ | apisix, argocd, cert-manager, cf-tunnel-manager, crowdsec-bunny-bouncer, google/eab, ilo, k8s/infra-tool, mariadb, safeline, ssh, ssh/id_ed25519, tailscale, vault-sync | | messaging/ | discord/bot, discord-brokkr, discord/claudechannel, discord-claude-code, discord/nocodb-webhook, discord/webhook-heimdall, discord/webhook-relay, mailgun/api-key, mailgun/smtp, telegram | | openclaw/ | discord/main-bot, gateway/local, gitea/main, integrations/discord, oauth/gmail, runtime/test, test, tools/brave | | product/ | irondesk/ton-wallet, irondesk/tron |

자주 사용하는 시크릿 (빠른 참조)

용도 경로 주요 키 주의사항
Cloudflare API cloud/cloudflare api_token (제한), global_api_key (전체 권한), email, account_id Rulesets/Firewall/Rate Limits는 global_api_key만 접근 가능
BunnyCDN API cloud/bunnycdn api_key
Gitea API apps/gitea api_token, url, admin_password
Outline API apps/outline api-key (kappa), brokkr-api-key (에이전트)
Portainer API apps/portainer api_token, url
Turnstile (crowdsec) cloud/cloudflare/turnstile-crowdsec-captcha sitekey, secret_key
Mailgun messaging/mailgun/api-key
Discord 봇 messaging/discord/bot
ops 에이전트 SSH apps/ops-agents-ssh private_key, public_key

SSH CA (Signed Certificates)

Vault SSH Secrets Engine (ssh-client-signer/) 활성화. CA 키: ed25519. 역할: admin (allowed_users: root,kaffa,admin, TTL 8h, max 24h).

CA 등록 완료 서버:

미등록: safeline-osaka (응답 없음)

자동화: ~/.ssh/vault-sign.sh가 인증서 만료 시 자동 재발급 (vault CLI 기반). 인증서에 root,kaffa,admin principals 포함. ~/.ssh/config에 Match exec로 연동. ssh apisix-osaka 등 일반 SSH처럼 사용 가능.

MCP 서버

실 배포 (2026-04-15 정정)

vault-mcp-server v0.2.0 은 jp1 Incus vault 컨테이너 (10.253.101.58) 단일 인스턴스. systemd 유닛 vault-mcp-server.service로 streamable-http 모드 가동 (--transport-host=0.0.0.0 --transport-port=8080 --mcp-endpoint=/mcp). 같은 컨테이너에 HashiCorp Vault 본체(포트 8200)도 동일 프로세스 공간에 존재 → vault 백엔드는 http://127.0.0.1:8200.

[!warning] 과거 문서 오류 정정 (2026-04-15) 이전 기록에 "K3s vault namespace Deployment 배포", "vault-active.vault.svc.cluster.local:8200" 이라 적혀 있었으나 실제와 다름. K3s 안에는 vault 파드/Deployment 없음. 상세: history/2026-04-15-vault-mcp-duplicate-investigation.md

접근 경로 (3가지, 모두 같은 jp1 프로세스로 수렴)

hcv.inouter.com              → Traefik@K3s:443 → 10.253.101.58:8200  (Vault UI/API)
vault-mcp.inouter.com        → Traefik@K3s:443 → 10.253.101.58:8080  (MCP)
http://10.253.101.58:8080/mcp                                          (Tailscale 직결, kappa Claude 현행)

K3s tools 네임스페이스의 vault-mcpPod 없는 리버스 프록시 파사드: Service(selector 비움) + 수동 EndpointSlice가 10.253.101.58 로 고정 + IngressRoute 2개(hcv, vault-mcp). ArgoCD 앱 argocd/vault-mcp, Helm chart kaffa/helm-charts charts/app + values/vault-mcp.yaml (deployment 없는 ingress-only 렌더링).

주의

  • hcv.inouter.com/mcp 는 MCP 엔드포인트 아님 — Vault가 /mcp 경로를 UI(/ui/)로 307 리다이렉트. 외부 MCP hostname 필요하면 vault-mcp.inouter.com/mcp 사용.
  • 외부 공개 경로는 BunnyCDN/Cloudflare 비경유 (Traefik wildcard cert 직접 TLS 종단). 내부 LAN/Tailscale 전용.
  • kappa Claude MCP는 현재 http://10.253.101.58:8080/mcp (Tailscale 암호화 의존). 장기적으로 https://vault-mcp.inouter.com/mcp 로 이전 검토 가능 (Traefik TLS + wildcard cert 혜택).

재배포 자료

  • Helm chart: gitea.inouter.com/kaffa/helm-charts.git charts/app
  • values: kaffa/helm-charts values/vault-mcp.yaml
  • jp1 컨테이너 내부 바이너리: /usr/local/bin/vault-mcp-server
  • systemd: /etc/systemd/system/vault-mcp-server.service

관련 서비스

cert-manager, gitea, irondesk 등에서 Vault 시크릿을 참조