์†Œ๊ฐœ

SSH-Frontiรจre ์†Œ๊ฐœ

๋ฌธ์ œ์ 

Linux ์„œ๋ฒ„์—์„œ SSH ์„œ๋น„์Šค ๊ณ„์ •(CI ๋Ÿฌ๋„ˆ, AI ์—์ด์ „ํŠธ, ์œ ์ง€๋ณด์ˆ˜ ์Šคํฌ๋ฆฝํŠธ)์€ ์ผ๋ฐ˜์ ์œผ๋กœ /bin/bash๋ฅผ ๋กœ๊ทธ์ธ ์…ธ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค:

๊ธฐ์กด ์†”๋ฃจ์…˜(authorized_keys์˜ command=, bash ๋ž˜ํผ ์Šคํฌ๋ฆฝํŠธ, SSH ๋ฐฐ์Šค์ฒœ)์€ ๊ฐ๊ฐ ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: ์ทจ์•ฝํ•˜๊ฑฐ๋‚˜, ๊ฐ์‚ฌ๊ฐ€ ์–ด๋ ต๊ฑฐ๋‚˜, ํ•„์š”์— ๋น„ํ•ด ๊ณผ๋„ํ•ฉ๋‹ˆ๋‹ค.

SSH-Frontiรจre๊ฐ€ ํ•˜๋Š” ์ผ

SSH-Frontiรจre๋Š” ๋Œ€์ฒด ๋กœ๊ทธ์ธ ์…ธ์ž…๋‹ˆ๋‹ค. sshd์™€ ์‹œ์Šคํ…œ ๋ช…๋ น ์‚ฌ์ด์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค:

SSH ํด๋ผ์ด์–ธํŠธ
    |
    v
sshd (ํ‚ค ์ธ์ฆ)
    |
    v
ssh-frontiere (๋กœ๊ทธ์ธ ์…ธ)
    |
    โ”œโ”€โ”€ TOML ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ๋ช…๋ น ๊ฒ€์ฆ
    โ”œโ”€โ”€ ์ ‘๊ทผ ์ˆ˜์ค€ ํ™•์ธ (read / ops / admin)
    โ”œโ”€โ”€ ํ—ˆ๊ฐ€๋œ ๋ช…๋ น ์‹คํ–‰
    โ””โ”€โ”€ ๊ตฌ์กฐํ™”๋œ JSON์œผ๋กœ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜

๊ฐ SSH ์—ฐ๊ฒฐ์€ ์ƒˆ๋กœ์šด ssh-frontiere ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ์ด ํ”„๋กœ์„ธ์Šค๋Š”:

  1. ๋ฐฐ๋„ˆ์™€ ์„œ๋ฒ„ ๊ธฐ๋Šฅ์„ ํ‘œ์‹œ
  2. ํด๋ผ์ด์–ธํŠธ ํ—ค๋”๋ฅผ ์ฝ์Œ (์ธ์ฆ, ์„ธ์…˜ ๋ชจ๋“œ)
  3. ๋ช…๋ น์„ ์ฝ์Œ (๋„๋ฉ”์ธ ์•ก์…˜ [์ธ์ž], ์ผ๋ฐ˜ ํ…์ŠคํŠธ)
  4. TOML ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด ๊ฒ€์ฆ
  5. ํ—ˆ๊ฐ€๋˜๋ฉด ์‹คํ–‰, ์•„๋‹ˆ๋ฉด ๊ฑฐ๋ถ€
  6. JSON ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ข…๋ฃŒ

ํ”„๋กœ๊ทธ๋žจ์€ ๋™๊ธฐ์‹์ด๋ฉฐ ์ผํšŒ์„ฑ์ž…๋‹ˆ๋‹ค: ๋ฐ๋ชฌ ์—†์Œ, ์„œ๋น„์Šค ์—†์Œ, ์˜๊ตฌ ์ƒํƒœ ์—†์Œ.

SSH-Frontiรจre๊ฐ€ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ

๊ตฌ์ฒด์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€

CI/CD ์ž๋™ํ™”

Forgejo Actions ๋Ÿฌ๋„ˆ๊ฐ€ SSH๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค:

# ๋Ÿฌ๋„ˆ๊ฐ€ SSH๋ฅผ ํ†ตํ•ด ๋ช…๋ น์„ ์ „์†ก
{
  echo "forgejo deploy version=stable"
  echo "."
} | ssh forge-runner@serveur

SSH-Frontiรจre๋Š” ๋Ÿฌ๋„ˆ๊ฐ€ admin ์ˆ˜์ค€์ธ์ง€, forgejo ๋„๋ฉ”์ธ์— deploy ์•ก์…˜์ด ์กด์žฌํ•˜๋Š”์ง€, version=stable ์ธ์ž๊ฐ€ ํ—ˆ์šฉ๋œ ๊ฐ’์ธ์ง€ ํ™•์ธํ•œ ํ›„ ๊ตฌ์„ฑ๋œ ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

AI ์—์ด์ „ํŠธ

Claude Code ์—์ด์ „ํŠธ๊ฐ€ ์ œํ•œ๋œ ๊ถŒํ•œ์œผ๋กœ ์„œ๋ฒ„์—์„œ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค:

# ์—์ด์ „ํŠธ๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น์„ ํƒ์ƒ‰
{ echo "list"; echo "."; } | ssh agent-ia@serveur

# ์—์ด์ „ํŠธ๊ฐ€ ํŠน์ • ์•ก์…˜์„ ์‹คํ–‰
{ echo "infra healthcheck"; echo "."; } | ssh agent-ia@serveur

์—์ด์ „ํŠธ๋Š” ์ž์‹ ์—๊ฒŒ ๊ตฌ์„ฑ๋œ read ์ˆ˜์ค€์˜ ์•ก์…˜์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. help์™€ list ๋ช…๋ น์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์•ก์…˜๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, JSON ํ˜•์‹์œผ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ํŒŒ์‹ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ํ™”๋œ ์œ ์ง€๋ณด์ˆ˜

cron ์Šคํฌ๋ฆฝํŠธ๊ฐ€ SSH๋ฅผ ํ†ตํ•ด ๋ฐฑ์—…์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

# ์•ผ๊ฐ„ ๋ฐฑ์—…
{ echo "forgejo backup-config"; echo "."; } | ssh backup@serveur

# ๋ฐฐํฌ ํ›„ ์•Œ๋ฆผ
{ echo 'notify send message="๋ฐฐํฌ ์™„๋ฃŒ"'; echo "."; } | ssh notify@serveur

์•Œ๋ฆผ

SSH-Frontiรจre ํ‘œ์ค€ ์•ก์…˜์œผ๋กœ ์•Œ๋ฆผ(Slack, Olvid, ์ด๋ฉ”์ผ)์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค:

{ echo 'notify slack channel=ops message="Build OK"'; echo "."; } | ssh notify@serveur

์™œ ๋‹ค๋ฅธ ๊ฒƒ ๋Œ€์‹  SSH-Frontiรจre์ธ๊ฐ€

...authorized_keys์˜ bash ์Šคํฌ๋ฆฝํŠธ ๋Œ€์‹ ?

authorized_keys์˜ command= ์˜ต์…˜์€ ๋ช…๋ น์„ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ:

SSH-Frontiรจre๋Š” ์„ ์–ธ์  ๊ตฌ์„ฑ, RBAC, JSON ๋กœ๊น…, ์ธ์ ์…˜์„ ์›์ฒœ ์ฐจ๋‹จํ•˜๋Š” ๋ฌธ๋ฒ• ํŒŒ์„œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

...SSH ๋ฐฐ์Šค์ฒœ(Teleport, Boundary) ๋Œ€์‹ ?

SSH ๋ฐฐ์Šค์ฒœ์€ ์‚ฌ๋žŒ์˜ ์„œ๋ฒ„ ์ ‘๊ทผ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

SSH-Frontiรจre๋Š” ์„œ๋น„์Šค ๊ณ„์ •์„ ์œ„ํ•ด ์„ค๊ณ„๋œ ๊ฒฝ๋Ÿ‰ ์ปดํฌ๋„ŒํŠธ(์•ฝ 1 Mo)์ž…๋‹ˆ๋‹ค: ๋Œ€ํ™”ํ˜• ์„ธ์…˜ ์—†์Œ, ํ”„๋ก์‹œ ์—†์Œ, ๋ช…๋ น ๊ฒ€์ฆ๋งŒ ์ˆ˜ํ–‰.

...sudo ๋‹จ๋… ์‚ฌ์šฉ ๋Œ€์‹ ?

sudo๋Š” ๊ถŒํ•œ ์ƒ์Šน์„ ์ œ์–ดํ•˜์ง€๋งŒ:

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

์ œํ’ˆ์˜ ๊ฐ€์น˜

SSH-Frontiรจre๋Š” SSH ์„œ๋น„์Šค ์ ‘๊ทผ์— ๋Œ€ํ•œ ์„ ์–ธ์  ๊ฑฐ๋ฒ„๋„Œ์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  1. ๋ชจ๋“  ๊ฒƒ์ด ํ•˜๋‚˜์˜ TOML ํŒŒ์ผ์—: ๋„๋ฉ”์ธ, ์•ก์…˜, ์ธ์ž, ์ ‘๊ทผ ์ˆ˜์ค€. ์Šคํฌ๋ฆฝํŠธ์— ๋ถ„์‚ฐ๋œ ๋กœ์ง ์—†์Œ.

  2. ์ฆ‰์‹œ ๋ฐฐํฌ: ๋ชจ๋“  ๊ตฌ์„ฑ์ด ํ•˜๋‚˜์˜ TOML ํŒŒ์ผ์— ์ง‘์ค‘๋˜์–ด ์žˆ์–ด ์ƒˆ ๋ฒ„์ „ ๋ฐฐํฌ๊ฐ€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ฐ SSH ์—ฐ๊ฒฐ์€ ๊ตฌ์„ฑ์„ ๋‹ค์‹œ ์ฝ๋Š” ์ƒˆ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ํ˜„์žฌ ์„ธ์…˜์ด ๋๋‚˜๋Š” ์ฆ‰์‹œ ๋˜๋Š” ์ƒˆ ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•ด ์ฆ‰์‹œ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  3. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๋กœ ํŠธ๋Ÿฌ์ŠคํŠธ: ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์œผ๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์…ธ ์—†์Œ, ์ธ์ ์…˜ ๋ถˆ๊ฐ€.

  4. ๊ฐ์‚ฌ ๊ฐ€๋Šฅ: ๋ชจ๋“  ์‹œ๋„(ํ—ˆ๊ฐ€ ๋˜๋Š” ๊ฑฐ๋ถ€)๊ฐ€ ํƒ€์ž„์Šคํƒฌํ”„, ๋ช…๋ น, ์ธ์ž, ์ˆ˜์ค€, ๊ฒฐ๊ณผ์™€ ํ•จ๊ป˜ ๊ตฌ์กฐํ™”๋œ JSON์œผ๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

  5. LLM ํ˜ธํ™˜: AI ์—์ด์ „ํŠธ๊ฐ€ help/list๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์•ก์…˜์„ ํƒ์ƒ‰ํ•˜๊ณ , ๊ตฌ์กฐํ™”๋œ JSON ํ”„๋กœํ† ์ฝœ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค โ€” ์ž์œ  ํ…์ŠคํŠธ ํŒŒ์‹ฑ์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

  6. ์œ ๋Ÿฝ์‚ฐ ์˜คํ”ˆ์†Œ์Šค: EUPL-1.2 ๋ผ์ด์„ ์Šค, ํ”„๋ž‘์Šค์—์„œ ๊ฐœ๋ฐœ, ๋…์  ์ƒํƒœ๊ณ„์— ๋Œ€ํ•œ ์˜์กด์„ฑ ์—†์Œ.


๋” ์•Œ์•„๋ณด๊ธฐ: ์„ค์น˜ | ์•„ํ‚คํ…์ฒ˜ | ๋ณด์•ˆ | ๋Œ€์•ˆ