์—…๋ฐ์ดํŠธ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
New releaseAug 20, 2026

aquaman v0.14.1

๐Ÿ”ฑ AI ์—์ด์ „ํŠธ๋ฅผ ์œ„ํ•œ ์œ ์ผํ•œ ๋…๋ฆฝ ์ž๊ฒฉ ์ฆ๋ช… ํ”„๋ก์‹œ: ์ž์ฒด ๋ณผํŠธ ๊ฒฉ๋ฆฌ(BYOV) ๋ฐ ์ตœ์†Œ ๊ถŒํ•œ ์š”์ฒญ ์ •์ฑ…. ํ‚ค๋Š” ์ด๋ฏธ ๋ณด๊ด€ ์ค‘์ธ ๊ณณ์— ๊ทธ๋Œ€๋กœ ๋‚จ์•„ ์žˆ์œผ๋ฉฐ, ์—์ด์ „ํŠธ ๋ฉ”๋ชจ๋ฆฌ์— ์ ˆ๋Œ€ ์ €์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 1Password, keychain, keepassxc ๋ฐ ๊ธฐํƒ€ ์—ฌ๋Ÿฌ ๋„๊ตฌ์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

๊ณต์œ 

๐Ÿ”ฑ Aquaman

CI codecov npm version npm downloads Security: process isolation TypeScript License: MIT

๐Ÿ”ฑ AI ์—์ด์ „ํŠธ๋ฅผ ์œ„ํ•œ ์œ ์ผํ•œ ๋…๋ฆฝํ˜• ์ž๊ฒฉ ์ฆ๋ช… ํ”„๋ก์‹œ: ์ž์‹ ์˜ ๋ณผํŠธ๋ฅผ ๊ฐ€์ ธ์™€ ๊ฒฉ๋ฆฌ(isolation) ๋ฐ ์ตœ์†Œ ๊ถŒํ•œ ์š”์ฒญ ์ •์ฑ…์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ‚ค๋Š” ์ด๋ฏธ ๋ณด๊ด€ ์ค‘์ธ ๊ณณ์— ๊ทธ๋Œ€๋กœ ๋‚จ์•„ ์žˆ์œผ๋ฉฐ, ์—์ด์ „ํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ์—๋Š” ์ ˆ๋Œ€ ์ €์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 1Password, keychain, keepassxc ๋“ฑ๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

Claude Code, OpenClaw ๋˜๋Š” Hermes๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋‚˜๋ฉด, ์ด์ œ ๊ท€์ค‘ํ•œ API ํ‚ค๊ฐ€ ํ‰๋ฌธ(plaintext)์œผ๋กœ ๋“ค์–ด ์žˆ๋Š” .env ํŒŒ์ผ์„ ๋งˆ์ฃผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ด€๋ จ ๊ธฐ์‚ฌ๋“ค์„ ์ฝ์–ด๋ณด์…จ์„ ํ…Œ๊ณ , ์—์ด์ „ํŠธ๊ฐ€ ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜(prompt injection)์„ ๋‹นํ–ˆ์„ ๋•Œ ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์ง€๋Š”์ง€ ์•„์‹ค ๊ฒ๋‹ˆ๋‹ค. ์ €ํฌ๋„ ์ž˜ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Aquaman์€ ์„ธ ๊ฐ€์ง€ ๋ฐฉ์–ด ๊ณ„์ธต์œผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค:

  1. ํ”„๋กœ์„ธ์Šค ๊ฒฉ๋ฆฌ: API ํ‚ค๋Š” ๋ณ„๋„์˜ ํ”„๋ก์‹œ ํ”„๋กœ์„ธ์Šค์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ๋Š” ์ ˆ๋Œ€ ํ‚ค๋ฅผ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ์—์„œ RCE(์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰)๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์ž๊ฒฉ ์ฆ๋ช…์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ์ฃผ์†Œ ๊ณต๊ฐ„์— ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์š”์ฒญ ์ •์ฑ…: ์„œ๋น„์Šค๋ณ„ ๊ทœ์น™์œผ๋กœ ์—์ด์ „ํŠธ๊ฐ€ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ API๋ฅผ ์ฐจ๋‹จํ•˜๊ณ , ์‚ญ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋ฉฐ, ์ดˆ์•ˆ์€ ํ—ˆ์šฉํ•˜์ง€๋งŒ ์ „์†ก์€ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ถ€๋œ ์š”์ฒญ์€ ์‹ค์ œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ ˆ๋Œ€ ์ „๋‹ฌ๋ฐ›์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ณ€์กฐ ๊ฐ์ง€ ๊ฐ€๋Šฅํ•œ ๊ฐ์‚ฌ: ๋ชจ๋“  ์ž๊ฒฉ ์ฆ๋ช… ์‚ฌ์šฉ์ด SHA-256 ํ•ด์‹œ ์ฒด์ธ์œผ๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๋ฌด์—‡์ด ์ ‘๊ทผ๋˜์—ˆ๋Š”์ง€ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ๊ณ , ์‚ฌํ›„ ๋ณ€์กฐ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฝ๋กœ ์„ ํƒ

Aquaman์€ ํ•˜๋‚˜์˜ ๋ณผํŠธ(vault) + ํ•˜๋‚˜์˜ ๋ฐ๋ชฌ(daemon)์„ ๊ณต์œ ํ•˜๋Š” ๋„ค ๊ฐ€์ง€ ํŒจํ‚ค์ง€๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์„ค์น˜ํ•˜์„ธ์š”:

ํŒจํ‚ค์ง€๊ธฐ๋Šฅ์„ค์น˜ ์‹œ๊ธฐ
aquaman-proxyํ•ต์‹ฌ: ๋ณผํŠธ, ๋ฐ๋ชฌ, ๊ฐ์‚ฌ, ์ •์ฑ…, CLI. ๋ชจ๋‘์—๊ฒŒ ํ•„์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ.ํ•ญ์ƒ.
aquaman-pluginOpenClaw ๊ฒŒ์ดํŠธ์›จ์ด ์–ด๋Œ‘ํ„ฐ. ๊ฒŒ์ดํŠธ์›จ์ด ์‹œ์ž‘ ์‹œ ํ”„๋ก์‹œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์ฑ„๋„ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ€๋กœ์ฑ•๋‹ˆ๋‹ค. 5๊ฐ€์ง€ ์ธ์ฆ ๋ชจ๋“œ์—์„œ 25๊ฐœ์˜ ๋‚ด์žฅ ์„œ๋น„์Šค๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.OpenClaw ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ์šด์˜ํ•˜๋Š” ๊ฒฝ์šฐ. ๋˜ํ•œ https://clawhub.ai/plugins/aquaman-plugin ์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
aquaman-coderAI ์ฝ”๋”ฉ ์—์ด์ „ํŠธ ์–ด๋Œ‘ํ„ฐ. ํ”„๋กœ์ ํŠธ ๋ฒ”์œ„์˜ aquaman://service/key ์ฐธ์กฐ๋ฅผ ๊ฐ Bash ๋„๊ตฌ ํ˜ธ์ถœ ์‹œ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.Claude Code(ํ˜„์žฌ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ - Codex / OpenCode / Cursor๋„ ๊ณ„ํš ์ค‘์ž…๋‹ˆ๋‹ค.
aquaman-hermesHermes ์—์ด์ „ํŠธ ํ˜ธ์ŠคํŠธ ํ”Œ๋Ÿฌ๊ทธ์ธ(Python, PyPI ์ œ๊ณต). Hermes๋ฅผ ์„ ํƒ์ , ํ† ํฐ ๊ฒŒ์ดํŠธ(token-gated) ๋ฃจํ”„๋ฐฑ ๋ฆฌ์Šค๋„ˆ๋กœ ์—ฐ๊ฒฐํ•˜๋ฉฐ, ๋„ค์ดํ‹ฐ๋ธŒ ANTHROPIC_BASE_URL/OPENAI_BASE_URL์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ ๋‚ด /aquaman-status ๋ช…๋ น์–ด, ๋„๊ตฌ ๋ฐ ์ƒํƒœ ํ™•์ธ(health probe)์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฉ๋ฆฌ๋Š” ํ”„๋ก์‹œ ์ธก์—์„œ ์ด๋ฃจ์–ด์ง€๋ฉฐ, ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์–ด๋–ค ์ž๊ฒฉ ์ฆ๋ช…๋„ ๋ณด์œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.Hermes ์—์ด์ „ํŠธ ํ˜ธ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ. pip install aquaman-hermes

๋‹จ์ผ aquaman CLI๋กœ ๋„ค ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ์ตœ์ƒ์œ„ ๋ช…๋ น์–ด๋กœ ๋ณผํŠธ ๋ฐ ๊ฐ์‚ฌ, aquaman openclaw ...๋กœ OpenClaw ํ†ตํ•ฉ, aquaman coder ...๋กœ ์ฝ”๋”ฉ ์—์ด์ „ํŠธ ํ†ตํ•ฉ(๋‚ด๋ถ€์ ์œผ๋กœ aquaman-coder์— ์œ„์ž„), ๊ทธ๋ฆฌ๊ณ  aquaman hermes ...๋กœ Hermes Python ํŒจํ‚ค์ง€๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

๋น ๋ฅธ ์‹œ์ž‘

aquaman help, aquaman doctor๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ์นœ๊ตฌ์ž…๋‹ˆ๋‹ค.

1. ๋ณผํŠธ๋งŒ (ํ”„๋ก์‹œ + ๋น„๋ฐ€๋งŒ)

npm install -g aquaman-proxy
aquaman setup                                # ๋ฐฑ์—”๋“œ ๋งˆ๋ฒ•์‚ฌ + ํ‚ค ์ €์žฅ
aquaman daemon &                             # ํ”„๋ก์‹œ ์‹œ์ž‘
aquaman credentials list                     # ํ™•์ธ

ํ”„๋ก์‹œ๋Š” ~/.aquaman/proxy.sock(UDS, chmod 0o600)์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๋„๊ตฌ๋“  http://aquaman.local/<service>/<path>๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ํ”„๋ก์‹œ๊ฐ€ ์„ ํƒํ•œ ๋ณผํŠธ ๋ฐฑ์—”๋“œ์—์„œ ํ•ด๋‹น ์„œ๋น„์Šค์˜ ์ธ์ฆ ํ—ค๋”๋ฅผ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

2. OpenClaw ๊ฒŒ์ดํŠธ์›จ์ด

openclaw plugins install aquaman-plugin           # 1. ํ”Œ๋Ÿฌ๊ทธ์ธ + ํ”„๋ก์‹œ ์„ค์น˜
openclaw aquaman setup                            # 2. ๋ฐฑ์—”๋“œ + ํ‚ค + ํ”Œ๋Ÿฌ๊ทธ์ธ ์—ฐ๊ฒฐ
openclaw                                          # 3. ์™„๋ฃŒ - ํ”„๋ก์‹œ๊ฐ€ ์ž๋™์œผ๋กœ ์‹œ์ž‘๋จ

๋ฌธ์ œ ํ•ด๊ฒฐ: openclaw aquaman doctor.

npm์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜์‹œ๋‚˜์š”? npm install -g aquaman-proxy && aquaman openclaw setup๋„ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค - ํ”„๋ก์‹œ CLI๋ฅผ ์„ค์น˜ํ•˜๊ณ , ํ‚ค๋ฅผ ์ €์žฅํ•˜๋ฉฐ, ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ~/.openclaw/extensions/aquaman-plugin/์— ์„ค์น˜ํ•˜๊ณ , ์ž๊ฒฉ ์ฆ๋ช…์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค(OpenClaw โ‰ฅ 2026.6.5์—์„œ๋Š” SecretRef ์ฐธ์กฐ, ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” auth-profiles.json ํ”Œ๋ ˆ์ด์Šคํ™€๋” ์‚ฌ์šฉ).

ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ HTTP ์ธํ„ฐ์…‰ํ„ฐ๋Š” services ์„ค์ •์— ์žˆ๋Š” ์„œ๋น„์Šค ํŠธ๋ž˜ํ”ฝ๋งŒ ๋ฆฌ๋””๋ ‰์…˜ํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ๊ฐ’: Anthropic + OpenAI). openclaw.json์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ •์—์„œ ๋” ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค - ์ง€์›๋˜๋Š” ์ฑ„๋„: Slack, Discord, Telegram, MS Teams, Matrix, LINE, Twitch, Twilio, BlueBubbles, Mattermost, Nostr, Tlon, Feishu, Google Chat, ElevenLabs, xAI, Cloudflare AI Gateway, Mistral, Hugging Face ๋“ฑ (์ด 25๊ฐœ).

3. AI ์ฝ”๋”ฉ ์—์ด์ „ํŠธ (ํ˜„์žฌ Claude Code)

npm install -g aquaman-proxy aquaman-coder        # 1. ๋ฐ๋ชฌ + ์–ด๋Œ‘ํ„ฐ ์„ค์น˜
aquaman setup                                      # 2. ๋ณผํŠธ ๋งˆ๋ฒ•์‚ฌ
aquaman daemon &                                   # 3. ํ”„๋ก์‹œ ์‹œ์ž‘

aquaman coder project add my-app --path ~/code/my-app \
  --env ANTHROPIC_API_KEY=aquaman://anthropic/api_key \
  --env GITHUB_TOKEN=aquaman://github/token         # 4. ํ”„๋กœ์ ํŠธ ์„ ์–ธ
aquaman coder setup claude-code                    # 5. Claude Code ํ›„ํฌ ์—ฐ๊ฒฐ
aquaman doctor                                     # 6. ํ™•์ธ - ๋ณผํŠธ์™€ ์ฝ”๋” ๋ชจ๋‘ ์ดˆ๋ก์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•จ

์ง์ ‘ ํ™•์ธํ•ด ๋ณด์„ธ์š”(30์ดˆ๋ฉด ๊นจ๋‹ซ์Šต๋‹ˆ๋‹ค): Claude Code๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ณ , ~/code/my-app ์•ˆ์—์„œ ์ƒˆ ์„ธ์…˜์„ ์—ฐ ๋‹ค์Œ ์—์ด์ „ํŠธ์—๊ฒŒ ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜๋„๋ก ์š”์ฒญํ•˜์„ธ์š”:

printenv | grep ANTHROPIC_API_KEY

ํŠธ๋žœ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์„ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:

ANTHROPIC_API_KEY=[REDACTED:injected-value]

โบ ANTHROPIC_API_KEY is set and available (injected via aquaman vault). 

์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ์‹ค์ œ ํ‚ค๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค(ํ…Œ์ŠคํŠธ, ๋นŒ๋“œ, MCP ์„œ๋ฒ„, ์ž„ํฌํŠธ ์Šคํฌ๋ฆฝํŠธ ๋“ฑ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค). ์—์ด์ „ํŠธ - ์‚ฌ์šฉ์ž ๋จธ์‹ ์—์„œ ์–ด๋–ค ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์ฃผ์ฒด - ๋Š” ๊ฐ’์„ ์ ˆ๋Œ€ ๋ณด์ง€ ๋ชปํ•˜๋ฏ€๋กœ, ๋Œ€ํ™” ๊ธฐ๋ก, ๋ชจ๋ธ ์ œ๊ณต์ž์˜ ๋กœ๊ทธ, ๋‚˜์ค‘์— ํ„ฐ๋ฏธ๋„์„ ์บก์ฒ˜ํ•˜๋Š” ์‚ฌ๋žŒ๋„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ž์‹ ์˜ ํ„ฐ๋ฏธ๋„์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋ž˜ํผ๊ฐ€ ์—์ด์ „ํŠธ ์—†์ด๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ cdํ•œ ํ›„ ๋ช…๋ น์–ด ์•ž์— ์ ‘๋‘์‚ฌ๋ฅผ ๋ถ™์ด๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค:

cd ~/code/
aquaman-coder exec -- python app/scripts/import.py

๋™์ผํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฃผ์ž…, stdout/stderr์— ๋Œ€ํ•œ ๋™์ผํ•œ ํŽธ์ง‘(redaction)์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. Makefile ํƒ€๊ฒŸ, ์…ธ ๋ณ„์นญ, CI ์‹คํ–‰๊ธฐ ๋“ฑ .env ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋˜ ๋ชจ๋“  ๊ณณ์— ํ™œ์šฉํ•˜์„ธ์š”.

Claude Code๊ฐ€ ~/code/my-app์—์„œ Bash ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, aquaman์˜ ํ›„ํฌ๋Š” updatedInput.command๋ฅผ ํ†ตํ•ด ๋ช…๋ น์–ด๋ฅผ aquaman-coder exec ์•„๋ž˜์—์„œ ๋ž˜ํ•‘ํ•˜๋„๋ก ๋‹ค์‹œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ž˜ํผ๋Š”:

  • ๊ฐ aquaman://service/key ์ฐธ์กฐ๋ฅผ ๋ธŒ๋กœ์ปค(POST /broker/resolve over UDS)๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ž๊ฒฉ ์ฆ๋ช…์€ ํ•œ ๋ช…๋ น์–ด์— ๋Œ€ํ•ด์„œ๋งŒ ๊ตฌ์ฒดํ™”๋˜๋ฉฐ, ์—์ด์ „ํŠธ ์ˆ˜๋ช… ๋™์•ˆ ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • stdout/stderr๋ฅผ ํŽธ์ง‘๊ธฐ(redactor)๋ฅผ ํ†ตํ•ด ํŒŒ์ดํ”„ํ•˜๋ฉฐ, ๊ฐ ํ•ด๊ฒฐ๋œ ๊ฐ’์— ๋Œ€ํ•ด ๊ฐ’ ๊ธฐ๋ฐ˜ ํŒจํ„ด์„ ์•ž์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค: ์ฃผ์ž…๋œ ๋ฌธ์ž์—ด์ด ๋ฌด์—‡์ด๋“  ๊ด€๊ณ„์—†์ด ๋ชจ์–‘์— ๊ด€๊ณ„์—†์ด ํŽธ์ง‘๋ฉ๋‹ˆ๋‹ค(Atlassian ํ† ํฐ, Notion ๋น„๋ฐ€, ๋‚ด๋ถ€ API ํ‚ค - ์•Œ๋ ค์ง„ ์ œ๊ณต์ž ํ˜•์‹๊ณผ ์ผ์น˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค). ์ผ๋ฐ˜์ ์ธ ๋ชจ์–‘ ๊ธฐ๋ฐ˜ ํŒจํ„ด(sk-ant-, ghp_, sk_live_, AKIAโ€ฆ, JWT, PEM ๋ธ”๋ก, ATATT3xFโ€ฆ)์€ ์—ฌ์ „ํžˆ ๋ฐฉ์–ด ์‹ฌ์ธต์œผ๋กœ ์‹คํ–‰๋˜์–ด, ์šฐ๋ฆฌ๊ฐ€ ์ฃผ์ž…ํ•˜์ง€ ์•Š์€ ๋น„๋ฐ€์ด ์ž์‹ ํ”„๋กœ์„ธ์Šค์— ๋…ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ช…๋ น์–ด๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

4. Hermes (์—์ด์ „ํŠธ ํ˜ธ์ŠคํŠธ)

Hermes๋Š” ์ „์†ก ํ›…(transport hook)์ด ์—†๋Š” ์™ธ๋ถ€(Python) ํ˜ธ์ŠคํŠธ์ด๋ฏ€๋กœ ๊ฒฉ๋ฆฌ๋Š” ํ”„๋ก์‹œ ์ธก์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค: ํ”„๋ก์‹œ๋Š” ์„ ํƒ์ ์ด๊ณ  ํ† ํฐ ๊ฒŒ์ดํŠธ(token-gated)๋œ ๋ฃจํ”„๋ฐฑ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋…ธ์ถœํ•˜๊ณ , Hermes๋Š” ์ž์ฒด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋ฆฌ์Šค๋„ˆ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

npm install -g aquaman-proxy                       # 1. ๋ฐ๋ชฌ ์„ค์น˜
aquaman setup                                      # 2. ๋ณผํŠธ ๋งˆ๋ฒ•์‚ฌ
aquaman credentials add anthropic api_key sk-ant-... # 3. ์ œ๊ณต์ž ํ‚ค ์ €์žฅ

aquaman hermes setup                               # 4. ๋ฃจํ”„๋ฐฑ ํ™œ์„ฑํ™” + ~/.hermes/.env ์ž‘์„ฑ
aquaman daemon &                                   # 5. ํ”„๋ก์‹œ ์‹œ์ž‘ (UDS + ๋ฃจํ”„๋ฐฑ)
aquaman hermes doctor                              # 6. ํ™•์ธ - ๋ฆฌ์Šค๋„ˆ + ํ™˜๊ฒฝ ๋ณ€์ˆ˜ + ๋ณผํŠธ + Hermes

aquaman hermes setup์€ ๋ฃจํ”„๋ฐฑ ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ , ์„ค์น˜๋ณ„ ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋ฉฐ, ~/.hermes/.env์— aquaman ๊ด€๋ฆฌ ๋ธ”๋ก์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค(HERMES_HOME์„ ์กด์ค‘): ๋„ค์ดํ‹ฐ๋ธŒ ANTHROPIC_BASE_URL/OPENAI_BASE_URL๊ณผ ํ† ํฐ๊ณผ ๋™์ผํ•œ ํ”Œ๋ ˆ์ด์Šคํ™€๋” api_key๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. Hermes๋Š” ํ† ํฐ์„ ์ž์ฒด ์ œ๊ณต์ž ํ‚ค๋กœ ๋ณด๋‚ด๊ณ , ํ”„๋ก์‹œ๊ฐ€ ์ด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์‹ค์ œ ๋ณผํŠธ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ฃผ์ž…ํ•œ ํ›„ ์—…์ŠคํŠธ๋ฆผ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” LLM ์ œ๊ณต์ž(Anthropic, OpenAI)๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์„ ํƒ์  ์„ธ์…˜ ๋‚ด ํŽธ์˜ ๊ธฐ๋Šฅ - Python ํ”Œ๋Ÿฌ๊ทธ์ธ์€ Hermes ๋‚ด๋ถ€์— /aquaman-status ๋ช…๋ น์–ด, aquaman_status ๋„๊ตฌ, ์„ธ์…˜ ์‹œ์ž‘ ์ƒํƒœ ํ™•์ธ(health probe)์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(์ž๊ฒฉ ์ฆ๋ช…์„ ๋ณด์œ ํ•˜์ง€ ์•Š์Œ):

pip install aquaman-hermes            # ๋˜๋Š”: uv tool install aquaman-hermes
aquaman-hermes install                # ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ~/.hermes/plugins/aquaman/์— ๋„ฃ์Œ
hermes plugins enable aquaman

์ž‘๋™ ๋ฐฉ์‹

Agent / OpenClaw / Coding Agent             Aquaman Proxy
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      โ”‚                    โ”‚                      โ”‚
โ”‚  ANTHROPIC_BASE_URL  โ”‚โ•โ•โ• UDS / HTTP โ•โ•โ•โ•>โ”‚  Keychain / 1Pass /  โ”‚
โ”‚  = aquaman.local     โ”‚                    โ”‚  Vault / Encrypted   โ”‚
โ”‚                      โ”‚<โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ”‚                      โ”‚
โ”‚  fetch() interceptor โ”‚โ•โ•โ• broker:resolve  โ”‚  + Policy enforced   โ”‚
โ”‚   (channel APIs)     โ”‚                    โ”‚  + Auth injected:    โ”‚
โ”‚                      โ”‚                    โ”‚    header / url-path โ”‚
โ”‚  No credentials.     โ”‚  ~/.aquaman/       โ”‚    basic / oauth     โ”‚
โ”‚  No open ports.      โ”‚  proxy.sock        โ”‚                      โ”‚
โ”‚  Nothing to steal.   โ”‚  (chmod 0o600)     โ”‚                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                    โ””โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                               โ”‚         โ”‚
                                               โ”‚         โ–ผ
                                               โ”‚  ~/.aquaman/audit/
                                               โ”‚  (hash-chained)
                                               โ–ผ
                                     api.anthropic.com
                                     api.telegram.org
                                     slack.com/api โ€ฆ
  1. ์ €์žฅ: ์ž๊ฒฉ ์ฆ๋ช…์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ๋ณผํŠธ ๋ฐฑ์—”๋“œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค - ์ง‘ ๋ณผํŠธ(house vault)๊ฐ€ ์—†์Œ(Keychain, 1Password, HashiCorp Vault, Bitwarden, KeePassXC, systemd-creds, encrypted-file).
  2. ์ •์ฑ…: ํ”„๋ก์‹œ๋Š” ์ž๊ฒฉ ์ฆ๋ช…์„ ๊ฑด๋“œ๋ฆฌ๊ธฐ ์ „์— ๋ฉ”์„œ๋“œ + ๊ฒฝ๋กœ ๊ทœ์น™์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ถ€๋œ ์š”์ฒญ์€ 403์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์‹ค์ œ ์ธ์ฆ ํ—ค๋”๋ฅผ ์ ˆ๋Œ€ ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. ์ฃผ์ž…: ํ”„๋ก์‹œ๋Š” ์ž๊ฒฉ ์ฆ๋ช…์„ ์กฐํšŒํ•œ ํ›„ ์ธ์ฆ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. 25๊ฐœ์˜ ๋‚ด์žฅ ์„œ๋น„์Šค, 4๊ฐ€์ง€ ์ฃผ์ž… ์ธ์ฆ ๋ชจ๋“œ(header, URL-path, HTTP Basic, OAuth); 5๋ฒˆ์งธ์ธ none์€ ์ €์žฅ ์ „์šฉ(at-rest-only)์ž…๋‹ˆ๋‹ค(ํ”„๋ก์‹œ๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ๊ฑฐ๋ถ€ํ•จ).
  4. ๋ธŒ๋กœ์ปค (coder ๊ฒฝ๋กœ): POST /broker/resolve๋Š” ๋„๊ตฌ ํ˜ธ์ถœ๋‹น ํ•˜๋‚˜์˜ ์ž๊ฒฉ ์ฆ๋ช…์„ ๊ตฌ์ฒดํ™”ํ•˜๋ฉฐ, ๋‹จ์ผ ๋ช…๋ น์–ด์˜ ํ™˜๊ฒฝ์œผ๋กœ ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ ํ›„ ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  5. ๊ฐ์‚ฌ: ๋ชจ๋“  ์ž๊ฒฉ ์ฆ๋ช… ์‚ฌ์šฉ์ด SHA-256 ํ•ด์‹œ ์ฒด์ธ์œผ๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์—์ด์ „ํŠธ๋Š” ์„ผํ‹ฐ๋„ฌ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„(aquaman.local) ๋˜๋Š” ํ”Œ๋ ˆ์ด์Šคํ™€๋” ๋งˆ์ปค(aquaman-proxy-managed)๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ํ‚ค๋ฅผ ์ ˆ๋Œ€ ๋ณผ ์ˆ˜ ์—†์œผ๋ฉฐ, ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” TCP ํฌํŠธ๋„ ์—ด๋ ค ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ณด์•ˆ ๋ชจ๋ธ

๊ณ„์ธต๊ธฐ๋Šฅ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ
ํ”„๋กœ์„ธ์Šค ๊ฒฉ๋ฆฌ์ž๊ฒฉ ์ฆ๋ช…์ด ๋ณ„๋„ ํ”„๋กœ์„ธ์Šค์— ์žˆ์œผ๋ฉฐ, ์œ ๋‹‰์Šค ๋„๋ฉ”์ธ ์†Œ์ผ“(chmod 0o600)์œผ๋กœ ์—ฐ๊ฒฐ๋จ์†์ƒ๋œ ์—์ด์ „ํŠธ๊ฐ€ ํ‚ค๋ฅผ ์ฝ์„ ์ˆ˜ ์—†์Œ - ๋‹ค๋ฅธ ์ฃผ์†Œ ๊ณต๊ฐ„, ํƒ์ƒ‰ํ•  TCP ํฌํŠธ ์—†์Œ
์„œ๋น„์Šค ํ—ˆ์šฉ ๋ชฉ๋กproxiedServices๊ฐ€ ์—์ด์ „ํŠธ๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์ œ์–ดํ•จ์—์ด์ „ํŠธ๊ฐ€ ์Šน์ธ๋˜์ง€ ์•Š์€ ์„œ๋น„์Šค์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์—†์Œ
์š”์ฒญ ์ •์ฑ…์„œ๋น„์Šค๋ณ„ ๋ฉ”์„œ๋“œ + ๊ฒฝ๋กœ ๊ทœ์น™, ์ž๊ฒฉ ์ฆ๋ช… ์ฃผ์ž… ์ „์— ์ ์šฉ๋จ์—์ด์ „ํŠธ๊ฐ€ Anthropic์—๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ด€๋ฆฌ API์—๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ; ์ด๋ฉ”์ผ ์ดˆ์•ˆ์€ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ „์†ก์€ ๋ถˆ๊ฐ€๋Šฅํ•จ
๊ฐ์‚ฌ ์ถ”์ ๋ชจ๋“  ์ž๊ฒฉ ์ฆ๋ช… ์‚ฌ์šฉ์˜ SHA-256 ํ•ด์‹œ ์ฒด์ธ ๋กœ๊ทธ์‚ฌํ›„ ๋ถ„์„, ๋ณ€์กฐ ๊ฐ์ง€, ๊ทœ์ • ์ค€์ˆ˜ ์ฆ๊ฑฐ
๋„๊ตฌ ํ˜ธ์ถœ๋ณ„ ๋ธŒ๋กœ์ปค (coder)aquaman-coder exec๊ฐ€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด์— ๋Œ€ํ•ด ์ž๊ฒฉ ์ฆ๋ช…์„ ๊ตฌ์ฒดํ™”ํ•จ์ž๊ฒฉ ์ฆ๋ช…์ด ์—์ด์ „ํŠธ์˜ ์…ธ ํ™˜๊ฒฝ ์ „์ฒด๋กœ ํ™•์‚ฐ๋˜์ง€ ์•Š์Œ
์ถœ๋ ฅ ํŽธ์ง‘ (coder)aquaman-coder exec๊ฐ€ stdout/stderr๋ฅผ ํŽธ์ง‘๊ธฐ๋กœ ํŒŒ์ดํ”„ํ•˜์—ฌ ๋ฐฉ๊ธˆ ์ฃผ์ž…ํ•œ ๊ฐ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์ œ๊ฑฐํ•˜๊ณ , ์ผ๋ฐ˜์ ์ธ ์ œ๊ณต์ž ํŒจํ„ด์„ fallback์œผ๋กœ ์‚ฌ์šฉํ•จ์ž„์˜์˜ ํ˜•ํƒœ ์—†๋Š” ์ž๊ฒฉ ์ฆ๋ช…๋„ ์—์ด์ „ํŠธ ํŠธ๋žœ์Šคํฌ๋ฆฝํŠธ์— ๋„๋‹ฌํ•˜์ง€ ์•Š์Œ

์ž์„ธํ•œ ๋ชจ๋ธ - ํ†ตํ•ฉ๋ณ„ ์„ธ๋ถ€์‚ฌํ•ญ(HTTP ์ธํ„ฐ์…‰ํ„ฐ ๋ฒ”์œ„, ์ธ์ฆ ํ”„๋กœํŒŒ์ผ, ์Šค์บ๋„ˆ ๊ฒฐ๊ณผ, ClawScan ๊ฒŒ์‹œ์ž ๋…ธํŠธ)์€ packages/plugin/README.md ๋ฐ packages/coder/README.md์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทœ์ • ์ค€์ˆ˜ ํƒœ์„ธ

Aquaman์€ test/compliance/ ์•„๋ž˜์— ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๋‹ค์Œ์— ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค:

  • MITRE ATLAS v5.4.0: ๊ธฐ์ˆ  AML.T0055, T0012, T0062, T0090, T0098 (test/compliance/atlas/)
  • NIST SP 800-53 Rev 5: IA-5, AC-3, AC-6, AU-2/9/10, SC-12/28, SI-10 (test/compliance/nist/)

๋˜ํ•œ CISA/5๊ฐœ๊ตญ "์—์ด์ „ํŠธํ˜• AI ์„œ๋น„์Šค์˜ ์‹ ์ค‘ํ•œ ๋„์ž…"(2026๋…„ 4์›”), CSA MAESTRO, OWASP Top 10 for Agentic Applications์— ๋Œ€ํ•œ ์ •๋ ฌ ์„œ์ˆ ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋Š” npm test์˜ ์ผ๋ถ€๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋งคํ•‘์€ docs/compliance/์—์„œ ํ™•์ธํ•˜์„ธ์š”.

์š”์ฒญ ์ •์ฑ…

OAuth ๋ฒ”์œ„๋Š” "์ด๋ฉ”์ผ ์ดˆ์•ˆ ์ž‘์„ฑ"๊ณผ "์ด๋ฉ”์ผ ์ „์†ก"์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค gmail.send์ž…๋‹ˆ๋‹ค. ์š”์ฒญ ์ •์ฑ…์ด ๊ทธ ์ฐจ์ด๋ฅผ ์ฑ„์›๋‹ˆ๋‹ค.

# ~/.aquaman/config.yaml
policy:
  anthropic:
    defaultAction: allow
    rules:
      - method: "*"
        path: "/v1/organizations/**"
        action: deny          # ๊ด€๋ฆฌ/๊ฒฐ์ œ API ์ฐจ๋‹จ
  openai:
    defaultAction: allow
    rules:
      - method: "*"
        path: "/v1/organization/**"
        action: deny
      - method: DELETE
        path: "/v1/**"
        action: deny          # ์‚ญ์ œ ๊ธˆ์ง€
  slack:
    defaultAction: allow
    rules:
      - method: "*"
        path: "/admin.*"
        action: deny
  gmail:
    defaultAction: allow
    rules:
      - method: POST
        path: "/v1/users/*/messages/send"
        action: deny          # ์ดˆ์•ˆ์€ ํ—ˆ์šฉ, ์ „์†ก์€ ์ฐจ๋‹จ
  • ์ •์ฑ… ์—†์Œ = ๋ชจ๋‘ ํ—ˆ์šฉ(ํ•˜์œ„ ํ˜ธํ™˜)
  • ์ฒซ ๋ฒˆ์งธ ์ผ์น˜ ์šฐ์„ : ๊ทœ์น™์€ ์œ„์—์„œ ์•„๋ž˜๋กœ ํ‰๊ฐ€๋˜๋ฉฐ, ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์š”์ฒญ์€ defaultAction์œผ๋กœ ๋„˜์–ด๊ฐ
  • ๊ฑฐ๋ถ€๋Š” ์ธ์ฆ ์ „: ์ฐจ๋‹จ๋œ ์š”์ฒญ์€ ์‹ค์ œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ ˆ๋Œ€ ์–ป์ง€ ๋ชปํ•จ
  • ๊ฒฝ๋กœ ๊ธ€๋กœ๋ธŒ(glob): *๋Š” ์„ธ๊ทธ๋จผํŠธ ๋‚ด์—์„œ ์ผ์น˜, **๋Š” 0๊ฐœ ์ด์ƒ์˜ ์„ธ๊ทธ๋จผํŠธ์™€ ์ผ์น˜
  • aquaman setup์€ ์ €์žฅ๋œ ์„œ๋น„์Šค(anthropic, openai, slack, gmail)์— ๋Œ€ํ•ด ์•ˆ์ „ํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ์ ์šฉํ•จ
  • aquaman policy list / aquaman policy test <svc> <method> <path>๋กœ ๊ฒ€์‚ฌ ๋ฐ ๋“œ๋ผ์ด๋Ÿฐ ๊ฐ€๋Šฅ

์ž๊ฒฉ ์ฆ๋ช… ๋ฐฑ์—”๋“œ

์ž์‹ ์˜ ๋ณผํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค์„ธ์š” - aquaman์—๋Š” ์ง‘ ์ €์žฅ์†Œ(house store)๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ๋ฐฑ์—”๋“œ๋ฅผ ์„ ํƒํ•˜๋ฉด, ๋น„๋ฐ€์€ ๊ทธ๊ณณ์— ๋‚จ์•„ ์žˆ๊ณ  ํ”„๋ก์‹œ๊ฐ€ ๊ทธ ์ž๋ฆฌ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ์ตœ์  ๋Œ€์ƒ์„ค์ •
keychainmacOS ๋กœ์ปฌ ๊ฐœ๋ฐœ(๊ธฐ๋ณธ๊ฐ’)๊ธฐ๋ณธ์œผ๋กœ ์ž‘๋™
encrypted-fileLinux, WSL2, CI/CDAES-256-GCM, ์•”ํ˜ธ ๋ณดํ˜ธ
keepassxc๊ธฐ์กด KeePass ์‚ฌ์šฉ์žAQUAMAN_KEEPASS_PASSWORD ๋˜๋Š” ํ‚ค ํŒŒ์ผ ์„ค์ •
1passwordํŒ€ ์ž๊ฒฉ ์ฆ๋ช… ๊ณต์œ brew install 1password-cli && op signin โ€” ๋ฌด์ธ ์—์ด์ „ํŠธ์˜ ๊ฒฝ์šฐ ์„œ๋น„์Šค ๊ณ„์ • ์‚ฌ์šฉ(OP_SERVICE_ACCOUNT_TOKEN)
vault์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๋น„๋ฐ€ ๊ด€๋ฆฌVAULT_ADDR + VAULT_TOKEN ์„ค์ •
systemd-credssystemd โ‰ฅ 256 LinuxTPM2 ๊ธฐ๋ฐ˜, root ๋ถˆํ•„์š”
bitwardenBitwarden ์‚ฌ์šฉ์žbw login && export BW_SESSION=$(bw unlock --raw)

aquaman setup์€ ์ ์ ˆํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ์ž๋™ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค(macOS โ†’ keychain; Linux โ†’ keychain(libsecret์ด ์žˆ๋Š” ๊ฒฝ์šฐ), systemd-creds(systemd โ‰ฅ 256์ธ ๊ฒฝ์šฐ), ๊ทธ ์™ธ encrypted-file).

encrypted-file์€ ๋„ค์ดํ‹ฐ๋ธŒ ํ‚ค๋ง์ด ์—†๋Š” ํ—ค๋“œ๋ฆฌ์Šค Linux/CI ํ™˜๊ฒฝ์„ ์œ„ํ•œ ์ตœํ›„์˜ ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค. Linux์—์„œ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋ ค๋ฉด libsecret-1-dev(GNOME Keyring)๋ฅผ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ systemd-creds(TPM2 ๋ฐ”์ธ๋”ฉ) ๋˜๋Š” 1Password/Vault๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

์ž๊ฒฉ ์ฆ๋ช… ์บ์‹ฑ (v0.13.1+)

์ ‘๊ทผ๋‹น ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฐฑ์—”๋“œ โ€” 1password(๋ฐ์Šคํฌํ†ฑ ์•ฑ ๋ชจ๋“œ์—์„œ ์ฝ์„ ๋•Œ๋งˆ๋‹ค ์ƒ์ฒด ์ธ์ฆ ํ”„๋กฌํ”„ํŠธ), bitwarden(~1-2์ดˆ CLI ์ƒ์„ฑ), vault(HTTP ์™•๋ณต) โ€” ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ๋ชฌ ๋ฉ”๋ชจ๋ฆฌ์— 15๋ถ„ ๋™์•ˆ ์บ์‹œ๋˜๋ฏ€๋กœ, ๋ฐ”์œ ์—์ด์ „ํŠธ ์„ธ์…˜์€ ์š”์ฒญ๋‹น ํ•œ ๋ฒˆ์ด ์•„๋‹ˆ๋ผ ์‹œ๊ฐ„ ์ฐฝ๋‹น ํ•œ ๋ฒˆ๋งŒ ๋ณผํŠธ๋ฅผ ์ž ๊ธˆ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ๋Š” ์ด๋ฏธ ๋น ๋ฅด๊ฑฐ๋‚˜ ๋‚ด๋ถ€์ ์œผ๋กœ ์บ์‹œํ•˜๋ฏ€๋กœ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์บ์‹ฑ์ด ๊บผ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ~/.aquaman/config.yaml์—์„œ credentials.cacheTtlSeconds๋กœ ์กฐ์ •ํ•˜๊ฑฐ๋‚˜(AQUAMAN_CACHE_TTL), 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

์†”์งํ•œ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„: ์ ‘๊ทผ๋‹น ์ƒ์ฒด ์ธ์ฆ ํ”„๋กฌํ”„ํŠธ๋Š” ์‚ฌ์šฉ์ž ์กด์žฌ ํ™•์ธ์ด๋ฉฐ, ์บ์‹œ๋Š” TTL ์ฐฝ ๋™์•ˆ ์ ‘๊ทผ๋‹น ์กด์žฌ ํ™•์ธ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์ธ ์—์ด์ „ํŠธ์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ํ”„๋กฌํ”„ํŠธ๋Š” ์ ˆ๋Œ€ ์‘๋‹ต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ๋ณผํŠธ๋ฅผ ํ‰๋ฌธ .env ํŒŒ์ผ๋กœ ํฌ๊ธฐํ•˜๊ฒŒ ๋˜์–ด ํ›จ์”ฌ ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค. ์บ์‹œ๋Š” ๊ฒฉ๋ฆฌ ๊ฒฝ๊ณ„๋ฅผ ์ด๋™์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค: ๊ฐ’์€ ํ”„๋ก์‹œ ํ”„๋กœ์„ธ์Šค(์ด๋ฏธ ๋ชจ๋“  ์š”์ฒญ์—์„œ ์ „์†ก๋˜๋Š” ๊ณณ)์—๋งŒ ์กด์žฌํ•˜๊ณ , ๋””์Šคํฌ์— ๊ธฐ๋ก๋˜์ง€ ์•Š์œผ๋ฉฐ, aquaman credentials add๋กœ ํšŒ์ „ํ•  ๋•Œ ์ฆ‰์‹œ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค. ์“ฐ๊ธฐ๋Š” ํ•ญ์ƒ ๋ณผํŠธ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ๋Š” test/compliance/cache-residency.test.ts์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 1Password์—์„œ ํ”„๋กฌํ”„ํŠธ ์ œ๋กœ๋ฅผ ์›ํ•˜๋ฉด aquaman ๋ณผํŠธ๋กœ ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ ์„œ๋น„์Šค ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์„ธ์š” โ€” aquaman doctor๊ฐ€ ์•ˆ๋‚ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ผ์ด์„ ์Šค

MIT - LICENSE ์ฐธ์กฐ.

์นดํ…Œ๊ณ ๋ฆฌ