티스토리 뷰

만약 맥 사용자라면 ssh-agent 편을 먼저 읽는 것이 좋다.

Ssh 로 git repository 사용

서버에 접속 할 때 비밀번호 없이 인증하기 위해서는 공개키 방법을 사용하며, 조금 더 나아가서는 ssh-agent/ssh-add 조합으로 공개키를 사용한다. 공개키를 사용해 왔다면 ssh-agent / ssh-add 조합은 어려운 것이 아니다. github, bitbucket에 계정이 있고, 현재 사용중인 계정의 공개키를 서비스에 등록하였다면, ssh access git repository 편에서 소개한 대로 다음과 같이 접근가능하다.

$ ssh git@github.com 

PTY allocation request failed on channel 0 
Hi coolengineer! You've successfully authenticated, but GitHub does not provide shell access. 
Connection to github.com closed.

"Hi! <userid>" 로 어떤 계정으로 인증되었는지를 알 수 있다. -v 옵션을 켜서 다시 실행 해 보자.

   $ ssh -v git@github.com
   OpenSSH_8.1p1, LibreSSL 2.7.3
...(생략)...
   debug1: SSH2_MSG_NEWKEYS sent
   debug1: expecting SSH2_MSG_NEWKEYS
   debug1: SSH2_MSG_NEWKEYS received
   debug1: rekey in after 134217728 blocks
👉 debug1: Will attempt key: /Users/coolengineer/.ssh/id_rsa RSA SHA256:123456789v2W0X4teh7Hb365FwtSAtEFZDt/OvfPWe8 agent
   debug1: Will attempt key: /Users/coolengineer/.ssh/id_dsa
   debug1: Will attempt key: /Users/coolengineer/.ssh/id_ecdsa
   debug1: Will attempt key: /Users/coolengineer/.ssh/id_ed25519
   debug1: Will attempt key: /Users/coolengineer/.ssh/id_xmss
   debug1: SSH2_MSG_EXT_INFO received
   debug1: kex_input_ext_info: server-sig-algs...... (생략)
   debug1: SSH2_MSG_SERVICE_ACCEPT received
   debug1: Authentications that can continue: publickey
   debug1: Next authentication method: publickey
👉 debug1: Offering public key: /Users/coolengineer/.ssh/id_rsa RSA SHA256:123456789v2W0X4teh7Hb365FwtSAtEFZDt/OvfPWe8 agent
   debug1: Server accepts key: /Users/coolengineer/.ssh/id_rsa RSA SHA256:123456789v2W0X4teh7Hb365FwtSAtEFZDt/OvfPWe8 agent
   debug1: Authentication succeeded (publickey).
   Authenticated to github.com ([15.164.81.167]:22).
...(생략)...
   debug1: Sending environment.
   debug1: Sending env LC_TERMINAL_VERSION = 3.4.1
   debug1: Sending env LANG = en_US.UTF-8
   debug1: Sending env LC_TERMINAL = iTerm2
   debug1: Sending env GIT_AUTHOR_NAME = Hojin
   debug1: Sending env GIT_AUTHOR_EMAIL = xxxxxxxxxx@example.com
...(생략)...
   PTY allocation request failed on channel 0
   debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
   Hi coolengineer! You've successfully authenticated, but GitHub does not provide shell access.
   debug1: channel 0: free: client-session, nchannels 1
   Connection to github.com closed.
   Transferred: sent 3428, received 2488 bytes, in 0.4 seconds
   Bytes per second: sent 8150.2, received 5915.3
   debug1: Exit status 1

ssh-agent 를 사용중이고 ssh-add로 id_rsa 를 등록했다면, 위와 같은 로그를 얻을 수 있는데, "Will attempt key: .... agent" / "Offering public key ... agent" 라는 항목을 볼 수 있다. 맥에서의 사용자 홈 디렉토리는 '/Users/xxxxx' 이다, 경로의 마지막에 있는 'agent' 표시는 공개키를 사용하기는 하지만, 직접 열어서 사용하는 것이 아니라 ssh-agent가 해당 위치의 공개키를 제공한 것이라는 뜻인데, 이것은 환경변수로 SSH_AUTH_SOCK이 설정되어 있을 때, ssh를 실행하면 이 경로에 있는 유닉스 소켓을 사용하여 ssh-agent에 요청하여 받는 것이다. export 되어 있는 환경 변수 중에 있는지 살펴 본다.

$ export | grep SSH
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.XAmxavOeXN/Listeners

SSH-AGENT 포워딩

ssh로 github repository에 접속할 때 필요한 공개키가 내 PC에 있을 때는 문제가 없다. 하지만, ssh로 접속하여 작업하는 공용 장비에서 github에 접속하는 경우는? 심지어 공용장비에 개인 계정이 없이 공통 계정으로 잠시 작업해야하는 경우는? 이렇게 다른 서버에서 github에 접속하는 상황에서는 공개키는 내 PC에 두고, 공용 장비에서 작업하면서 github repository에 접근하는 경우 ssh-agent 의 소켓을 포워딩하여 사용한다.

$ export | grep SSH
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.XAmxavOeXN/Listeners

$ ssh -A devserver
Last login: Sun Jan 31 09:31:10 2021 from (생략)

$ export | grep SSH
SSH_AUTH_SOCK=/tmp/ssh-zCkt3ZL1k0/agent.25357
SSH_CLIENT='192.169.1.1 25654 22'
SSH_CONNECTION='192.168.1.1 25654 192.168.1.2 22'
SSH_TTY=/dev/pts/6

devserver에 SSH로 로그인을 할 때 '-A' 옵션을 준다. 그 다음 SSH 관련 환경 설정을 살펴 보면, SSH_AUTH_SOCK이 있음을 알 수 있다. 공용장비에서는 ssh-agent 설정을 할 필요가 없다. 단지 -A 옵션을 주어 장비에 접속하면 마치 ssh-agent 를 실행하고 ssh-add 한 효과를 낼 수가 있다. 이것은, SSH PORT FORWARDING을 응용하여 인증정보를 중개하는 채널을 제공하기 때문이다.

만약 위와 같이 확인이 되지 않는다면 서버에서 클라이언트의 포워딩을 허락하지 않기 때문이다. 이 설정은 /etc/ssh/sshd_config 를 확인하여

AllowAgentForwarding no

위 설정이 확인되면, yes로 바꿔 줘야한다. 디폴트 값이 yes 이므로 주석처리해도 된다.

PC에서는 SSH_AUTH_SOCK 소켓의 소유자가 ssh-agent지만 공용 장비에서는 접속을 관장하고 있는 sshd 이며, ssh-agent가 실행되고 있지 않아도 공개키 요청을 받아서 PC에서 '-A' 옵션을 주어 실행중인 ssh에게 전달하고, 다시 이 ssh 는 자신이 알고 있는 ssh-agent 소켓을 통해 공개키 요청을 ssh-agent에게 전달한다. 그 응답은 역순으로 진행된다. 다시 이 공용장비에서 ssh를 사용하여 github.com에 접속하여 확인해 보면,

   $ ssh -v git@github.com
   OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n  7 Dec 2017
   ...(생략)...
   debug1: Server host key: ssh-rsa SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8
   debug1: Host 'github.com' is known and matches the RSA host key.
   debug1: rekey after 134217728 blocks
   debug1: SSH2_MSG_EXT_INFO received
   debug1: kex_input_ext_info: server-sig-algs...... (생략)
   debug1: SSH2_MSG_SERVICE_ACCEPT received
   debug1: Authentications that can continue: publickey
   debug1: Next authentication method: publickey
👉 debug1: Offering RSA public key: /Users/coolengineer/.ssh/id_rsa
   debug1: Server accepts key: pkalg ssh-rsa blen 279
   debug1: Authentication succeeded (publickey).
   Authenticated to github.com ([52.78.231.108]:22).
   debug1: channel 0: new [client-session]
   debug1: Entering interactive session.
   debug1: pledge: network
   debug1: Requesting authentication agent forwarding.
   debug1: Sending environment.
   debug1: Sending env LANG = en_US.UTF-8
   debug1: Sending env GIT_AUTHOR_NAME = Hojin
   debug1: Sending env GIT_AUTHOR_EMAIL = xxxxxxxxxx@example.com
   ...(생략)...
   PTY allocation request failed on channel 0
   debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
   Hi coolengineer! You've successfully authenticated, but GitHub does not provide shell access.
   debug1: channel 0: free: client-session, nchannels 1
   Connection to github.com closed.
   Transferred: sent 3428, received 2488 bytes, in 0.4 seconds
   Bytes per second: sent 8720.8, received 6329.5
   debug1: Exit status 1

공용장비의 SSH 버전이 PC와 조금 달라서 디버그 정보가 조금 다르게 나오고 있지만, RSA public key를 사용하는 경로가 PC에서의 경로와 일치한다.

-A 옵션을 매번 넣기 귀찮은 경우 /etc/ssh/ssh_config 혹은 개인 설정인 ~/.ssh/config 에 다음과 같은 설정을 추가한다.

Host *
    ForwardAgent yes

모든 서버에 들어 갈 때 Agent 채널을 포워딩하는 설정이다. FowardAgent 는 Default 값으로 'no'이므로 ssh-agent 설정을 사용하고 싶다면, -A 옵션을 사용하거나 위 설정을 명시적으로 해주어야한다.

DEEP LOGIN

개발 서버에 들어가고, 그 개발서버에서 사내 기간 서버에 들어가고, 또 들어가고 또 들어가도, 설정만 잘 해두면 ssh-agent 설정은 계속 포워딩할 수 있다. 이것은 비단 git 을 사용하기 위함이 아닌, 공개키가 필요한 모든 상황에서 사용가능 한 것이므로, 팀에서 공용으로 사용하는 공개키보다 개인이 공개키/비밀키 쌍을 가지고 있고, 공개키를 접속하기 위한 서버에 등록하여 사용한다면  하나의 ID를 사용하더래도 어떤 공개키를 사용하여 접속하였는지 사용자 식별이 가능하게 된다.

반응형
댓글
댓글쓰기 폼