FAQ

์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

SSH-Frontiรจre๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ๊ฐ€์š”?

Rust๋กœ ์ž‘์„ฑ๋œ ๋Œ€์ฒด ๋กœ๊ทธ์ธ ์…ธ์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค ๊ณ„์ •์˜ /etc/passwd์—์„œ /bin/bash ๋Œ€์‹  ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. ๊ฐ SSH ์—ฐ๊ฒฐ์ด SSH-Frontiรจre๋ฅผ ๊ฑฐ์น˜๋ฉฐ, TOML ๊ตฌ์„ฑ ํŒŒ์ผ์— ๋”ฐ๋ผ ๋ช…๋ น์„ ๊ฒ€์ฆํ•œ ํ›„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

SSH ๋ฐฐ์Šค์ฒœ์ธ๊ฐ€์š”?

์•„๋‹™๋‹ˆ๋‹ค. SSH ๋ฐฐ์Šค์ฒœ(Teleport, Boundary)์€ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ์—ฐ๊ฒฐ์„ ์ค‘๊ณ„ํ•˜๋Š” ํ”„๋ก์‹œ์ž…๋‹ˆ๋‹ค. SSH-Frontiรจre๋Š” ์ค‘๊ณ„๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์„ค์น˜๋œ ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐ์Šค์ฒœ์€ ์‚ฌ๋žŒ์˜ ์„œ๋ฒ„ ํŒœ ์ ‘๊ทผ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. SSH-Frontiรจre๋Š” ์„œ๋น„์Šค ๊ณ„์ •(CI ๋Ÿฌ๋„ˆ, AI ์—์ด์ „ํŠธ, ์Šคํฌ๋ฆฝํŠธ)์˜ ์„œ๋ฒ„ ๋‚ด ํŠน์ • ์•ก์…˜ ์ ‘๊ทผ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

sudo๋ฅผ ๋Œ€์ฒดํ•˜๋‚˜์š”?

์•„๋‹™๋‹ˆ๋‹ค, ์ƒํ˜ธ ๋ณด์™„์ ์ž…๋‹ˆ๋‹ค. SSH-Frontiรจre๋Š” SSH ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค(์ œ2๊ณ„์ธต). sudo๋Š” ์‹คํ–‰์— ํ•„์š”ํ•œ ์‹œ์Šคํ…œ ๊ถŒํ•œ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค(์ œ3๊ณ„์ธต). ๋‘˜์„ ๊ฒฐํ•ฉํ•˜๋ฉด ์‹ฌ์ธต ๋ฐฉ์–ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

TOML ํŒŒ์ผ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

์•„๋‹™๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ํŒŒ์ผ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜๋„๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค: ๋ชจ๋“  ๊ฒƒ์ด ๋ช…์‹œ์ ์ด๊ณ , ์„ ์–ธ์ ์ด๋ฉฐ, ๊ฐ์‚ฌ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ—ˆ์šฉ ๋ชจ๋“œ๋„ ์—†๊ณ , ์…ธ๋กœ์˜ ํด๋ฐฑ๋„ ์—†์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ์ด ์ž˜๋ชป๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?

SSH-Frontiรจre๋Š” ์‹œ์ž‘ ์‹œ ๊ตฌ์„ฑ์„ ์™„์ „ํžˆ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค(fail-fast). ๊ตฌ์„ฑ์ด ์ž˜๋ชป๋˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ ์ฝ”๋“œ 129์™€ ํ•จ๊ป˜ ๋ช…์‹œ์ ์ธ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋กœ๊ทธ์— ๋‚จ๊ธฐ๊ณ  ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๋ช…๋ น๋„ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. SSH ํด๋ผ์ด์–ธํŠธ๋Š” ์˜ค๋ฅ˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ ˆ๋Œ€ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค โ€” ์„œ๋น„์Šค๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ๋งŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง„๋‹จ ์ •๋ณด๋Š” ์„œ๋ฒ„ ์ธก์— ๋‚จ์Šต๋‹ˆ๋‹ค.

์œ„ํ—˜ ์—†์ด ๊ตฌ์„ฑ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

ssh-frontiere --check-config --config /etc/ssh-frontiere/config.toml

๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ง„๋‹จํ•˜๋‚˜์š”?

์—ฌ๋Ÿฌ ๋„๊ตฌ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค:

  1. ๊ตฌ์„ฑ ๊ฒ€์ฆ: ssh-frontiere --check-config๋กœ ๋ฌธ๋ฒ•๊ณผ ์ผ๊ด€์„ฑ ๊ฒ€์ฆ
  2. help ๋ช…๋ น: ํด๋ผ์ด์–ธํŠธ์˜ ์œ ํšจ ์ˆ˜์ค€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์•ก์…˜ ํ‘œ์‹œ
  3. list ๋ช…๋ น: ์งง์€ ๋ฒ„์ „ (๋„๋ฉ”์ธ + ์•ก์…˜)
  4. JSON ๋กœ๊ทธ: ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€๋œ ๋ชจ๋“  ๋ช…๋ น์ด ํƒ€์ž„์Šคํƒฌํ”„, ๋ช…๋ น, ์ธ์ž, ์ˆ˜์ค€, ๊ฒฐ๊ณผ์™€ ํ•จ๊ป˜ ๊ธฐ๋ก๋จ
  5. ์ข…๋ฃŒ ์ฝ”๋“œ: 0 = ์„ฑ๊ณต, 128 = ๊ฑฐ๋ถ€, 129 = ๊ตฌ์„ฑ ์˜ค๋ฅ˜, 130 = ํƒ€์ž„์•„์›ƒ, 131 = ์ˆ˜์ค€ ๋ถ€์กฑ, 132 = ํ”„๋กœํ† ์ฝœ ์˜ค๋ฅ˜, 133 = body stdin ์กฐ๊ธฐ ์ข…๋ฃŒ

AI ์—์ด์ „ํŠธ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

๋„ค, ์ด๊ฒƒ์€ ์ผ๊ธ‰ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. help์™€ list ๋ช…๋ น์€ ์—์ด์ „ํŠธ๊ฐ€ ์ง์ ‘ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐํ™”๋œ JSON์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ—ค๋” ํ”„๋กœํ† ์ฝœ(์ ‘๋‘์‚ฌ +, #, $, >)์€ ์‚ฌ๋žŒ์˜ ๊ฐ€๋…์„ฑ์„ ํ•ด์น˜์ง€ ์•Š์œผ๋ฉด์„œ ๊ธฐ๊ณ„๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๊ตฌ์„ฑ์€ AI ์—์ด์ „ํŠธ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์†Œ์Šค ์ฝ”๋“œ์˜ ์˜์กด์„ฑ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

์ง์ ‘ ์˜์กด์„ฑ 3๊ฐœ:

ํฌ๋ ˆ์ดํŠธ์šฉ๋„
serde + serde_jsonJSON ์ง๋ ฌํ™” (๋กœ๊ทธ, ์‘๋‹ต)
toml๊ตฌ์„ฑ ๋กœ๋“œ

async ๋Ÿฐํƒ€์ž„ ์—†์Œ, Tokio ์—†์Œ, ์›น ํ”„๋ ˆ์ž„์›Œํฌ ์—†์Œ. ์ •์  ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ๋Š” ์•ฝ 1 Mo.

์™œ Go/Python์ด ์•„๋‹ˆ๋ผ Rust์ธ๊ฐ€์š”?

  1. ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ: ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ ์—†์Œ, use-after-free ์—†์Œ โ€” ๋ณด์•ˆ ์ปดํฌ๋„ŒํŠธ์— ๊ฒฐ์ •์ 
  2. ์ •์  ๋ฐ”์ด๋„ˆ๋ฆฌ: musl๋กœ ์ปดํŒŒ์ผ, ์‹œ์Šคํ…œ ์˜์กด์„ฑ ์—†์Œ
  3. ์„ฑ๋Šฅ: ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„ ์‹œ์ž‘, ๋Ÿฐํƒ€์ž„ ์—†์Œ
  4. unsafe ์—†์Œ: Cargo ๋ฆฐํŠธ๋กœ ๊ธˆ์ง€ (unsafe_code = "deny")

์™œ YAML์ด๋‚˜ JSON์ด ์•„๋‹ˆ๋ผ TOML์ธ๊ฐ€์š”?

์ด ์„ ํƒ์€ ADR 0001์— ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ† ํฐ ์ธ์ฆ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

๋‘ ๊ฐ€์ง€ ๋ชจ๋“œ:

  1. ๋‹จ์ˆœ ๋ชจ๋“œ (challenge_nonce = false): ํด๋ผ์ด์–ธํŠธ๊ฐ€ SHA-256(secret)์„ ๊ณ„์‚ฐํ•˜์—ฌ proof๋กœ ์ „์†ก
  2. ๋…ผ์Šค ๋ชจ๋“œ (challenge_nonce = true): ์„œ๋ฒ„๊ฐ€ ๋…ผ์Šค๋ฅผ ์ „์†ก, ํด๋ผ์ด์–ธํŠธ๊ฐ€ SHA-256(XOR_encrypt(secret || nonce, secret))์„ ๊ณ„์‚ฐ

๋…ผ์Šค ๋ชจ๋“œ๋Š” ์žฌ์‚ฌ์šฉ ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค: ๋…ผ์Šค ๋•๋ถ„์— ๊ฐ proof๊ฐ€ ๊ณ ์œ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ SSH ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

๋„ค. authorized_keys์˜ ๊ฐ ํ‚ค์— ๊ณ ์œ ํ•œ --level์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ˆ˜์ค€์˜ ์—ฌ๋Ÿฌ ํ‚ค๊ฐ€ ๊ณต์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

command="/usr/local/bin/ssh-frontiere --level=read",restrict ssh-ed25519 AAAA... monitoring
command="/usr/local/bin/ssh-frontiere --level=ops",restrict ssh-ed25519 AAAA... runner-ci
command="/usr/local/bin/ssh-frontiere --level=admin",restrict ssh-ed25519 AAAA... admin

์‘๋‹ต ํ˜•์‹์€ ์–ด๋–ค๊ฐ€์š”?

ํ‘œ์ค€ ์ถœ๋ ฅ๊ณผ ์˜ค๋ฅ˜ ์ถœ๋ ฅ์€ ์ŠคํŠธ๋ฆฌ๋ฐ์œผ๋กœ ์ „์†ก(์ ‘๋‘์‚ฌ >>์™€ >>!)๋œ ํ›„, ํ•œ ์ค„์˜ ์ตœ์ข… JSON ์‘๋‹ต(์ ‘๋‘์‚ฌ >>>)์ด ์ด์–ด์ง‘๋‹ˆ๋‹ค:

>> hello from ssh-frontiere
>>> {"command":"test hello","status_code":0,"status_message":"executed","stdout":null,"stderr":null}

SSH-Frontiรจre๋ฅผ ์–ด๋–ป๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜๋‚˜์š”?

  1. ์ƒˆ ๋ฒ„์ „ ์ปดํŒŒ์ผ (make release)
  2. ์„œ๋ฒ„์— ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ณต์‚ฌ (scp)
  3. ํ™•์ธ (ssh user@serveur + help)

๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์—†์Œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ์—†์Œ. TOML ํŒŒ์ผ์€ git์œผ๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋‚˜์š”?

๊ธฐ์—ฌ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์š”์•ฝ: ์ด์Šˆ ์—ด๊ธฐ, fork, TDD, pull request, ๋…น์ƒ‰ CI. AI ์ƒ์„ฑ ๊ธฐ์—ฌ๋„ ์ˆ˜์šฉ๋ฉ๋‹ˆ๋‹ค.

์†Œ์Šค ์ฝ”๋“œ๋Š” ์–ด๋””์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋‚˜์š”?

์†Œ์Šค ์ฝ”๋“œ๋Š” GitHub ์ €์žฅ์†Œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด์„ ์Šค EUPL-1.2.