passphare를 설정해두지 않은 private key로 ssh 접속하면 비밀번호 입력 없이 편하게 이용할 수 있습니다.

다만 ssh 명령어를 실행하는 서버에는 private key가 있어야 합니다. 따라서 서버를 설치하는 곳마다 private key를 copy해야하고 이는 굉장히 번거롭습니다.

또 하나의 시나리오를 가정해봅시다. 현재 사용중인 PC(A)에서 팀원들끼리 공용으로 사용하는 웹서버(B)에 ssh로 접속해서 개발을 하고, github(C)를 이용해 version control을 합니다.

그렇다면 B 서버에서 매번 git pull이나 git push를 할 때마다 ID/PW를 입력해줘야 합니다. 편하게 이용하는 방법 없을까요?


바로 ssh agent를 사용하면 됩니다. 이 경우 B와 C에 ssh 공개키를 저장해두고, A에서 B로 접속할 때 agent를 이용해 접속한다면 B에서 C로 접속할 때 인증이 자동으로 됩니다.

먼저 ssh key가 없는 분들을 위해 ssh key부터 생성해봅시다. command line에 다음 명령어를 입력합니다.

ssh-keygen -t rsa -b 4096 -C "ian0371@naver.com"

여기서 C 옵션은 Comment이므로 원하는 문구를 입력하면 됩니다. 나중에 key를 여러 개 관리하게 될 경우 comment를 달아두면 편합니다.

저장 경로 default는 ~/.ssh/id_rsa 입니다. 변경해도 변경하지 않아도 무방합니다. 글에서는 이 경로를 기준으로 설명드리겠습니다.

passphrase를 비워두면 ssh 접속시 비밀키의 passphrase를 입력하지 않아도 됩니다. passphrase를 입력하지 않으면 비밀키 파일이 암호화되지 않습니다. 따라서 저는 passphrase를 설정해두었는데, 대신 passphrase를 1회만 입력하면 ssh agent 프로세스가 종료될 때까지 (보통 컴퓨터 종료시까지) passphrase를 입력하지 않아도 됩니다. 모든 세팅 완료 후 글 마지막에 설명드리겠습니다.

이렇게 하면 비밀키인 ~/.ssh/id_rsa 하나와 공개키인 ~/.ssh/id_rsa.pub 하나 이렇게 총 2가지가 생성됩니다.

B서버의 ~/.ssh/authorized_keys 파일에 명령어를 입력해 내 공개키를 추가해줍니다. B서버에서 다음 명령어를 입력합니다.(아래 <id_rsa.pub> 부분에는 A에서 생성했던 id_rsa.pub의 내용물(cat ~/.ssh/id_rsa.pub)을 복사해서 붙여넣기합니다.)

echo "<id_rsa.pub>" >> ~/.ssh/authorized_keys

이렇게하면 이제 A서버에서 B서버로 접속할 때 다음 명령어를 이용해 접속할 수 있습니다.

ssh [id]@[B의 ip] -i ~/.ssh/id_rsa

마찬가지로 C서버에도 B서버와 같게 설정을 해줍니다. 만약 C가 github라면 https://github.com/settings/keys에서 New SSH Key를 누르고 id_rsa.pub내용을 복사-붙여넣기 해줍니다. (자세한 내용은 https://help.github.com/articles/connecting-to-github-with-ssh/에서 확인할 수 있습니다.)

만약 B서버에서 C서버로 접속하고자 하면 B에는 비밀키가 없기 때문에 공개키를 이용해 C로의 접속이 불가능할 것입니다. 따라서 ssh agent를 이용해야 하는데 이는 매우 간단합니다. 처음에 A에서 B로 접속할 때 -A 옵션만 추가해주면 됩니다.

ssh [id]@[B의 ip] -i ~/.ssh/id_rsa -A

이렇게 B서버로 접속한 뒤 C서버로 접속하고자 할 때는 그냥 ssh명령어만 사용해주면 됩니다.

ssh [id]@[C의 ip]

비밀키의 passphrase를 묻는 창이 뜰겁니다. passphrase가 없다면 바로 접속될 것입니다. B서버에서 github접속도 간단하게 테스트해볼 수 있습니다. 다음 명령어를 B서버에서 입력하면 됩니다.

ssh -T git@github.com

하지만 매번 password치는 번거로움은 여전히 해결되지 않았습니다. 따라서 password를 1회만 입력하는 방법을 소개합니다.


먼저 내 PC인 A가 Windows일 때입니다. 여러 ssh agent(xagent, pageant 등)이 있는데 저는 xshell을 주로 사용하기 때문에 xagent로 설명드리겠습니다.

파일 - 열기 - B 클릭 - 등록정보 - 연결 - SSH - 암호 처리에 Xagent(SSH 에이전트)를 사용함 체크


등록정보 창에서 연결 - 사용자 인증 - 방법 Public Key - 사용자 키 찾아보기 - 가져오기 에서 id_rsa 파일 선택


※ default 세션을 이렇게 바꿔두면 새로 세션을 만들때마다 이 작업을 안 해줘도 됩니다.


이렇게하면 xagent가 꺼지지 않는 이상 xagent가 처음 실행될 때만 passphrase를 입력해주면 됩니다. 아마 pageant도 비슷하게 세팅해주면 될 것 같습니다.


내 PC A가 ubuntu등 bash를 쓰는 환경일 때 설명해드리겠습니다. https://help.github.com/articles/working-with-ssh-key-passphrases/#auto-launching-ssh-agent-on-git-for-windows에 있는 script를 복사해서 ~/.bashrc 맨 밑이나 ~/.profile 맨 밑에 붙여넣어주면 됩니다.

env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; }

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env


이렇게하면 bash를 처음 띄울 때 passphrase를 입력해주면 됩니다.


주의할 점이 있는데, 신뢰하지 못하는 서버에서 신뢰하지 못하는 사람이 root 권한을 가지고 있을 때 ssh agent를 사용할 경우, /tmp/에 생성되는 세션을 관리자가 hijacking할 수 있습니다. 따라서 신뢰하지 못하는 관리자의 서버에 접속할 경우에는 agent 기능을 사용 안 하시면 됩니다.

+ Recent posts