Skip to main content

SSH ์—์ด์ „ํŠธ ์ „๋‹ฌ ์‚ฌ์šฉ

์„œ๋ฒ„์— ๋Œ€ํ•œ ๋ฐฐํฌ๋ฅผ ๊ฐ„์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ปฌ SSH ํ‚ค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก SSH ์—์ด์ „ํŠธ ์ „๋‹ฌ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SSH ์—์ด์ „ํŠธ ์ „๋‹ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์— ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์— ํ‚ค(์•”ํ˜ธ ์—†์Œ)๋ฅผ ๋‘์ง€ ์•Š๊ณ  ๋กœ์ปฌ SSH ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GitHub์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋„๋ก SSH ํ‚ค๋ฅผ ์ด๋ฏธ ์„ค์ •ํ•œ ๊ฒฝ์šฐ ์•„๋งˆ ssh-agent์— ๋Œ€ํ•ด ์ž˜ ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๊ณ  ํ‚ค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋ฏ€๋กœ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์œ ์šฉํ•œ ์ ์€ ์ด๋ฏธ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ ์ค‘์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์„œ๋ฒ„๊ฐ€ ๋กœ์ปฌ ssh-agent์— ์•ก์„ธ์Šคํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋งˆ์น˜ ์นœ๊ตฌ์˜ ์ปดํ“จํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์นœ๊ตฌ์—๊ฒŒ ์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

SSH ์—์ด์ „ํŠธ ์ „๋‹ฌ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ Steve Friedl์˜ ๊ธฐ์ˆ  ํŒ ๊ฐ€์ด๋“œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

SSH ์—์ด์ „ํŠธ ์ „๋‹ฌ ์„ค์ •

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

ํ„ฐ๋ฏธ๋„์— ssh -T git@github.com์„ ์ž…๋ ฅํ•˜์—ฌ ๋กœ์ปฌ ํ‚ค๊ฐ€ ์ž‘๋™ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ ssh -T git@github.com
# Attempt to SSH in to github
> Hi USERNAME! You've successfully authenticated, but GitHub does not provide
> shell access.

์ž˜ ์‹œ์ž‘ํ•˜์…จ์Šต๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋˜๋„๋ก SSH๋ฅผ ์„ค์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์›ํ•˜๋Š” ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ~/.ssh/config์—์„œ ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ํ„ฐ๋ฏธ๋„์— touch ~/.ssh/config์„(๋ฅผ) ์ž…๋ ฅํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ๋‹ค์Œ ํ…์ŠคํŠธ๋ฅผ ํŒŒ์ผ์— ์ž…๋ ฅํ•˜์—ฌ ์„œ๋ฒ„์˜ ๋„๋ฉ”์ธ ์ด๋ฆ„ ๋˜๋Š” IP๋กœ example.com์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

     Host example.com
       ForwardAgent yes
    

๊ฒฝ๊ณ 

์ด ์„ค์ •์„ ๋ชจ๋“  SSH ์—ฐ๊ฒฐ์— ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด Host * ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. SSH๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ชจ๋“  ์„œ๋ฒ„์™€ ๋กœ์ปฌ SSH ํ‚ค๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์ด๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ํ‚ค์— ์ง์ ‘ ์•ก์„ธ์Šคํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์—ฐ๊ฒฐ์ด ์„ค์ •๋œ ๋™์•ˆ์—๋Š” ํ‚ค๋ฅผ ๊ท€ํ•˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ ๋ขฐํ•˜๊ณ , ์—์ด์ „ํŠธ ์ „๋‹ฌ์— ์‚ฌ์šฉํ•˜๋ ค๋Š” ์„œ๋ฒ„๋งŒ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

SSH ์—์ด์ „ํŠธ ์ „๋‹ฌ ํ…Œ์ŠคํŠธ

์—์ด์ „ํŠธ ์ „๋‹ฌ์ด ์„œ๋ฒ„์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ์„œ๋ฒ„์— SSH๋กœ ์—ฐ๊ฒฐํ•˜๊ณ  ssh -T git@github.com์„ ํ•œ ๋ฒˆ ์‹คํ–‰ํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ๋ฌธ์ œ ์—†์ด ์‹คํ–‰๋˜๋ฉด ๋กœ์ปฌ์—์„œ ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋™์ผํ•œ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋‹ค์‹œ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ํ‚ค๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์„œ๋ฒ„์—์„œ SSH_AUTH_SOCK ๋ณ€์ˆ˜๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

$ echo "$SSH_AUTH_SOCK"
# Print out the SSH_AUTH_SOCK variable
> /tmp/ssh-4hNGMk8AZX/agent.79453

๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์—์ด์ „ํŠธ ์ „๋‹ฌ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

$ echo "$SSH_AUTH_SOCK"
# Print out the SSH_AUTH_SOCK variable
> [No output]
$ ssh -T git@github.com
# Try to SSH to github
> Permission denied (publickey).

SSH ์—์ด์ „ํŠธ ์ „๋‹ฌ ๋ฌธ์ œ ํ•ด๊ฒฐ

๋‹ค์Œ์€ SSH ์—์ด์ „ํŠธ ์ „๋‹ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ ์œ ์˜ํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ์ฒดํฌ ์•„์›ƒํ•˜๋ ค๋ฉด SSH URL์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

SSH ์ „๋‹ฌ์€ HTTP(s) URL์ด ์•„๋‹ˆ๋ผ SSH URL์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ .git/config ํŒŒ์ผ์„ ํ™•์ธํ•˜๊ณ  URL์ด ์•„๋ž˜์™€ ๊ฐ™์€ SSH ์Šคํƒ€์ผ URL์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

[remote "origin"]
  url = git@github.com:YOUR_ACCOUNT/YOUR_PROJECT.git
  fetch = +refs/heads/*:refs/remotes/origin/*

SSH ํ‚ค๋Š” ๋กœ์ปฌ๋กœ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—์ด์ „ํŠธ ์ „๋‹ฌ์„ ํ†ตํ•ด ํ‚ค๋ฅผ ์ž‘๋™ํ•˜๋ ค๋ฉด ํ‚ค๊ฐ€ ๋จผ์ € ๋กœ์ปฌ์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. SSH ํ‚ค ์ƒ์„ฑ์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ๋Š” SSH ํ‚ค๋ฅผ ๋กœ์ปฌ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ์—์„œ SSH ์—์ด์ „ํŠธ ์ „๋‹ฌ์„ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ์€ SSH ์—์ด์ „ํŠธ ์ „๋‹ฌ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ„ฐ๋ฏธ๋„์— ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์—ฌ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์‚ฌ์šฉ ์ค‘์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ ssh -v URL
# Connect to the specified URL with verbose debug output
> OpenSSH_8.1p1, LibreSSL 2.7.3
> debug1: Reading configuration data /Users/YOU/.ssh/config
> debug1: Applying options for example.com
> debug1: Reading configuration data /etc/ssh_config
> debug1: Applying options for *
$ exit
# Returns to your local command prompt

์œ„์˜ ์˜ˆ์ œ์—์„œ ํŒŒ์ผ ~/.ssh/config๊ฐ€ ๋จผ์ € ๋กœ๋“œ๋œ ๋‹ค์Œ /etc/ssh_config๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์ด ํŒŒ์ผ์ด ์˜ต์…˜์„ ์žฌ์ •์˜ํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ cat /etc/ssh_config
# Print out the /etc/ssh_config file
> Host *
>   SendEnv LANG LC_*
>   ForwardAgent no

์ด ์˜ˆ์ œ์—์„œ /etc/ssh_config ํŒŒ์ผ์€ ํŠนํžˆ ForwardAgent no๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ, ์ด๋Š” ์—์ด์ „ํŠธ ์ „๋‹ฌ์„ ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์—์„œ ์ด ์ค„์„ ์‚ญ์ œํ•˜๋ฉด ์—์ด์ „ํŠธ ์ „๋‹ฌ์ด ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ž‘๋™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„์—์„œ ์ธ๋ฐ”์šด๋“œ ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ SSH ์—์ด์ „ํŠธ ์ „๋‹ฌ์„ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„์—์„œ ์—์ด์ „ํŠธ ์ „๋‹ฌ์ด ์ฐจ๋‹จ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์— SSH๋กœ ์—ฐ๊ฒฐํ•˜๊ณ  sshd_config๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์—์ด์ „ํŠธ ์ „๋‹ฌ์ด ํ—ˆ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์˜ ์ถœ๋ ฅ์€ AllowAgentForwarding์ด ์„ค์ •๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ssh-agent๊ฐ€ ์‹คํ–‰ ์ค‘์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์ปดํ“จํ„ฐ์—์„œ ์šด์˜ ์ฒด์ œ๊ฐ€ ssh-agent๋ฅผ ์ž๋™์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Windows์—์„œ๋Š” ์ด ์ž‘์—…์„ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Git Bash๋ฅผ ์—ด ๋•Œ๋งˆ๋‹ค ssh-agent๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ssh-agent๊ฐ€ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ํ„ฐ๋ฏธ๋„์— ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

$ echo "$SSH_AUTH_SOCK"
# Print out the SSH_AUTH_SOCK variable
> /tmp/launch-kNSlgU/Listeners

ํ‚ค๋ฅผ ssh-agent์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ํ‚ค๊ฐ€ ssh-agent์— ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ssh-add -L

๋ช…๋ น์„ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ID๊ฐ€ ์—†๋‹ค๊ณ  ํ‘œ์‹œ๋˜๋ฉด ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ssh-add YOUR-KEY

ํŒ

macOS์—์„œ ์žฌ๋ถ€ํŒ…ํ•˜๋Š” ๋™์•ˆ ssh-agent๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋˜๋ฉด ์ด ํ‚ค๋ฅผ โ€œ์žŠ์–ด๋ฒ„๋ฆฌ๊ฒŒโ€ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ SSH ํ‚ค๋ฅผ ํ‚ค ์ง‘ํ•ฉ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ssh-add --apple-use-keychain YOUR-KEY

์ฐธ๊ณ  ํ•ญ๋ชฉ

--apple-use-keychain ์˜ต์…˜์€ ssh-์—์ด์ „ํŠธ์— SSH ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์•”ํ˜ธ๋ฅผ ํ‚ค ์ฒด์ธ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ‚ค์— ์•”ํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ธฐ๋กœ ์„ ํƒํ•œ ๊ฒฝ์šฐ --apple-use-keychain ์˜ต์…˜ ์—†์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

--apple-use-keychain ์˜ต์…˜์€ ssh-add์˜ Apple ํ‘œ์ค€ ๋ฒ„์ „์— ์žˆ์Šต๋‹ˆ๋‹ค. Monterey(12.0) ์ด์ „์˜ macOS ๋ฒ„์ „์—์„œ --apple-use-keychain ๋ฐ --apple-load-keychain ํ”Œ๋ž˜๊ทธ๋Š” -K์™€ -A ๊ตฌ๋ฌธ์„ ๊ฐ๊ฐ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

ssh-add์˜ Apple ํ‘œ์ค€ ๋ฒ„์ „์ด ์„ค์น˜์น˜๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์˜ค๋ฅ˜: ssh-add: illegal option -- apple-use-keychain์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์•”ํ˜ธ๋ฅผ ๋ฌป๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๊ณ„์† ํ‘œ์‹œ๋˜๋ฉด, ~/.zshrc ํŒŒ์ผ(๋˜๋Š” bash์šฉ ~/.bashrc ํŒŒ์ผ)์— ๋ช…๋ น์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.