
aquaman v0.14.1
๐ฑ AI ์์ด์ ํธ๋ฅผ ์ํ ์ ์ผํ ๋ ๋ฆฝ ์๊ฒฉ ์ฆ๋ช ํ๋ก์: ์์ฒด ๋ณผํธ ๊ฒฉ๋ฆฌ(BYOV) ๋ฐ ์ต์ ๊ถํ ์์ฒญ ์ ์ฑ . ํค๋ ์ด๋ฏธ ๋ณด๊ด ์ค์ธ ๊ณณ์ ๊ทธ๋๋ก ๋จ์ ์์ผ๋ฉฐ, ์์ด์ ํธ ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ ์ ์ฅ๋์ง ์์ต๋๋ค. 1Password, keychain, keepassxc ๋ฐ ๊ธฐํ ์ฌ๋ฌ ๋๊ตฌ์ ํธํ๋ฉ๋๋ค.
๐ฑ Aquaman
๐ฑ AI ์์ด์ ํธ๋ฅผ ์ํ ์ ์ผํ ๋ ๋ฆฝํ ์๊ฒฉ ์ฆ๋ช ํ๋ก์: ์์ ์ ๋ณผํธ๋ฅผ ๊ฐ์ ธ์ ๊ฒฉ๋ฆฌ(isolation) ๋ฐ ์ต์ ๊ถํ ์์ฒญ ์ ์ฑ ์ ์ ์ฉํฉ๋๋ค. ํค๋ ์ด๋ฏธ ๋ณด๊ด ์ค์ธ ๊ณณ์ ๊ทธ๋๋ก ๋จ์ ์์ผ๋ฉฐ, ์์ด์ ํธ์ ๋ฉ๋ชจ๋ฆฌ์๋ ์ ๋ ์ ์ฅ๋์ง ์์ต๋๋ค. 1Password, keychain, keepassxc ๋ฑ๊ณผ ํธํ๋ฉ๋๋ค.
Claude Code, OpenClaw ๋๋ Hermes๋ฅผ ์ค์ ํ๊ณ ๋๋ฉด, ์ด์ ๊ท์คํ API ํค๊ฐ ํ๋ฌธ(plaintext)์ผ๋ก ๋ค์ด ์๋ .env ํ์ผ์ ๋ง์ฃผํ๊ฒ ๋ฉ๋๋ค. ๊ด๋ จ ๊ธฐ์ฌ๋ค์ ์ฝ์ด๋ณด์
จ์ ํ
๊ณ , ์์ด์ ํธ๊ฐ ํ๋กฌํํธ ์ธ์ ์
(prompt injection)์ ๋นํ์ ๋ ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๋์ง ์์ค ๊ฒ๋๋ค. ์ ํฌ๋ ์ ์๊ณ ์์ต๋๋ค.
Aquaman์ ์ธ ๊ฐ์ง ๋ฐฉ์ด ๊ณ์ธต์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค:
- ํ๋ก์ธ์ค ๊ฒฉ๋ฆฌ: API ํค๋ ๋ณ๋์ ํ๋ก์ ํ๋ก์ธ์ค์ ์กด์ฌํฉ๋๋ค. ์์ด์ ํธ๋ ์ ๋ ํค๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ์์ด์ ํธ์์ RCE(์๊ฒฉ ์ฝ๋ ์คํ)๊ฐ ๋ฐ์ํ๋๋ผ๋ ์๊ฒฉ ์ฆ๋ช ์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์๋ก ๋ค๋ฅธ ์ฃผ์ ๊ณต๊ฐ์ ์์ต๋๋ค.
- ์์ฒญ ์ ์ฑ : ์๋น์ค๋ณ ๊ท์น์ผ๋ก ์์ด์ ํธ๊ฐ ํธ์ถํ ์ ์๋ ์๋ํฌ์ธํธ๋ฅผ ์ ์ดํฉ๋๋ค. ๊ด๋ฆฌ API๋ฅผ ์ฐจ๋จํ๊ณ , ์ญ์ ๋ฅผ ๋ฐฉ์งํ๋ฉฐ, ์ด์์ ํ์ฉํ์ง๋ง ์ ์ก์ ๊ธ์งํฉ๋๋ค. ๊ฑฐ๋ถ๋ ์์ฒญ์ ์ค์ ์๊ฒฉ ์ฆ๋ช ์ ์ ๋ ์ ๋ฌ๋ฐ์ง ๋ชปํฉ๋๋ค.
- ๋ณ์กฐ ๊ฐ์ง ๊ฐ๋ฅํ ๊ฐ์ฌ: ๋ชจ๋ ์๊ฒฉ ์ฆ๋ช ์ฌ์ฉ์ด SHA-256 ํด์ ์ฒด์ธ์ผ๋ก ๊ธฐ๋ก๋ฉ๋๋ค. ๋ฌด์์ด ์ ๊ทผ๋์๋์ง ์ฆ๋ช ํ ์ ์๊ณ , ์ฌํ ๋ณ์กฐ๋ฅผ ๊ฐ์งํ ์ ์์ต๋๋ค.
๊ฒฝ๋ก ์ ํ
Aquaman์ ํ๋์ ๋ณผํธ(vault) + ํ๋์ ๋ฐ๋ชฌ(daemon)์ ๊ณต์ ํ๋ ๋ค ๊ฐ์ง ํจํค์ง๋ก ์ ๊ณต๋ฉ๋๋ค. ํ์ํ ๊ฒ๋ง ์ค์นํ์ธ์:
| ํจํค์ง | ๊ธฐ๋ฅ | ์ค์น ์๊ธฐ |
|---|---|---|
aquaman-proxy | ํต์ฌ: ๋ณผํธ, ๋ฐ๋ชฌ, ๊ฐ์ฌ, ์ ์ฑ , CLI. ๋ชจ๋์๊ฒ ํ์ํ ๊ตฌ์ฑ ์์. | ํญ์. |
aquaman-plugin | OpenClaw ๊ฒ์ดํธ์จ์ด ์ด๋ํฐ. ๊ฒ์ดํธ์จ์ด ์์ ์ ํ๋ก์๋ฅผ ์คํํ๊ณ , ์ฑ๋ ํธ๋ํฝ์ ๊ฐ๋ก์ฑ๋๋ค. 5๊ฐ์ง ์ธ์ฆ ๋ชจ๋์์ 25๊ฐ์ ๋ด์ฅ ์๋น์ค๋ฅผ ์ง์ํฉ๋๋ค. | OpenClaw ๊ฒ์ดํธ์จ์ด๋ฅผ ์ด์ํ๋ ๊ฒฝ์ฐ. ๋ํ https://clawhub.ai/plugins/aquaman-plugin ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค. |
aquaman-coder | AI ์ฝ๋ฉ ์์ด์ ํธ ์ด๋ํฐ. ํ๋ก์ ํธ ๋ฒ์์ aquaman://service/key ์ฐธ์กฐ๋ฅผ ๊ฐ Bash ๋๊ตฌ ํธ์ถ ์ ํด๊ฒฐํฉ๋๋ค. | Claude Code(ํ์ฌ)๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ - Codex / OpenCode / Cursor๋ ๊ณํ ์ค์ ๋๋ค. |
aquaman-hermes | Hermes ์์ด์ ํธ ํธ์คํธ ํ๋ฌ๊ทธ์ธ(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/resolveover 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 โฆ
- ์ ์ฅ: ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉ์๊ฐ ์ด๋ฏธ ์คํ ์ค์ธ ๋ณผํธ ๋ฐฑ์๋์ ์ ์ฅ๋ฉ๋๋ค - ์ง ๋ณผํธ(house vault)๊ฐ ์์(Keychain, 1Password, HashiCorp Vault, Bitwarden, KeePassXC, systemd-creds, encrypted-file).
- ์ ์ฑ
: ํ๋ก์๋ ์๊ฒฉ ์ฆ๋ช
์ ๊ฑด๋๋ฆฌ๊ธฐ ์ ์ ๋ฉ์๋ + ๊ฒฝ๋ก ๊ท์น์ ํ์ธํฉ๋๋ค. ๊ฑฐ๋ถ๋ ์์ฒญ์
403์ ๋ฐํํ๋ฉฐ, ์ค์ ์ธ์ฆ ํค๋๋ฅผ ์ ๋ ์ ๋ฌํ์ง ์์ต๋๋ค. - ์ฃผ์
: ํ๋ก์๋ ์๊ฒฉ ์ฆ๋ช
์ ์กฐํํ ํ ์ธ์ฆ ํค๋๋ฅผ ์ถ๊ฐํ์ฌ ์ ๋ฌํฉ๋๋ค. 25๊ฐ์ ๋ด์ฅ ์๋น์ค, 4๊ฐ์ง ์ฃผ์
์ธ์ฆ ๋ชจ๋(header, URL-path, HTTP Basic, OAuth); 5๋ฒ์งธ์ธ
none์ ์ ์ฅ ์ ์ฉ(at-rest-only)์ ๋๋ค(ํ๋ก์๊ฐ ํธ๋ํฝ์ ๊ฑฐ๋ถํจ). - ๋ธ๋ก์ปค (coder ๊ฒฝ๋ก):
POST /broker/resolve๋ ๋๊ตฌ ํธ์ถ๋น ํ๋์ ์๊ฒฉ ์ฆ๋ช ์ ๊ตฌ์ฒดํํ๋ฉฐ, ๋จ์ผ ๋ช ๋ น์ด์ ํ๊ฒฝ์ผ๋ก ๋ฒ์๊ฐ ์ง์ ๋ ํ ๋ง๋ฃ๋ฉ๋๋ค. - ๊ฐ์ฌ: ๋ชจ๋ ์๊ฒฉ ์ฆ๋ช ์ฌ์ฉ์ด 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)๊ฐ ์์ต๋๋ค. ์ด๋ฏธ ์คํ ์ค์ธ ๋ฐฑ์๋๋ฅผ ์ ํํ๋ฉด, ๋น๋ฐ์ ๊ทธ๊ณณ์ ๋จ์ ์๊ณ ํ๋ก์๊ฐ ๊ทธ ์๋ฆฌ์์ ์ฝ์ต๋๋ค.
| ๋ฐฑ์๋ | ์ต์ ๋์ | ์ค์ |
|---|---|---|
keychain | macOS ๋ก์ปฌ ๊ฐ๋ฐ(๊ธฐ๋ณธ๊ฐ) | ๊ธฐ๋ณธ์ผ๋ก ์๋ |
encrypted-file | Linux, WSL2, CI/CD | AES-256-GCM, ์ํธ ๋ณดํธ |
keepassxc | ๊ธฐ์กด KeePass ์ฌ์ฉ์ | AQUAMAN_KEEPASS_PASSWORD ๋๋ ํค ํ์ผ ์ค์ |
1password | ํ ์๊ฒฉ ์ฆ๋ช ๊ณต์ | brew install 1password-cli && op signin โ ๋ฌด์ธ ์์ด์ ํธ์ ๊ฒฝ์ฐ ์๋น์ค ๊ณ์ ์ฌ์ฉ(OP_SERVICE_ACCOUNT_TOKEN) |
vault | ์ํฐํ๋ผ์ด์ฆ ๋น๋ฐ ๊ด๋ฆฌ | VAULT_ADDR + VAULT_TOKEN ์ค์ |
systemd-creds | systemd โฅ 256 Linux | TPM2 ๊ธฐ๋ฐ, root ๋ถํ์ |
bitwarden | Bitwarden ์ฌ์ฉ์ | 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 ์ฐธ์กฐ.