태그 보관물: ssh

SSH Permission denied (publickey)

주로 시스템을 설정하는 초기에 발생하는 문제인데 private key가 제대로 있고 file permission도 잘 설정 되어 있음에도 ssh 접속을 시도하면 권한 오류가 발생하는 경우가 있다.

$ ssh -T git@github.com
git@github.com: Permission denied (publickey). 

해결하는 방법은 사용하려는 private key를 ssh-add 명령어를 이용해서 ssh-agent에게 추가해 주는 것인데, 만약 ssh-agent가 동작하지 않는 상태라면 이 동작에도 오류가 발생한다.

$ ssh-add ~/.ssh/my_private_key 
Could not open a connection to your authentication agent.

이와 같은 인증 agent 관련한 문제가 생길 때는 ssh-agent를 실행해서 나오는 결과물을 화면에 붙여 넣으면 된다.

# SSH-agent를 실행하면 환경변수 값들이 화면에 출력된다.
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-GWQEJqNDZHsI/agent.3260; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3261; export SSH_AGENT_PID;
echo Agent pid 3261;

# 이것들을 그대로 화면에 붙여넣고
$ SSH_AUTH_SOCK=/tmp/ssh-GWQEJqNDZHsI/agent.3260; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3261; export SSH_AGENT_PID;
echo Agent pid 3261;
Agent pid 3261

# ssh-add를 시도한다.
$ ssh-add ~/.ssh/my_private_key 
Identity added: /home/litcoder/.ssh/my_private_key (/home/litcoder/.ssh/my_private_key)

그런데 복붙하는 건 너무 번거로우니까 eval command를 사용해서 ssh-agent의 결과물을 그대로 수행하도록 하면 복붙한 것과 동일한 효과를 낼 수 있다.

$ eval `ssh-agent`
Agent pid 4416

$ ssh-add ~/.ssh/my_private_key 
Identity added: /home/litcoder/.ssh/my_private_key (/home/litcoder/.ssh/my_private_key)

매번 로그인 할 때 마다 반복 하는 건 귀찮으니까 .bashrc 같은곳에 넣어두자.

#.bashrc
...
eval `ssh-agent`
ssh-add ~/.ssh/my_private_key

다시 로그인해서 시험해보면 permission error가 없이 잘 실행되는 걸 볼 수 있다.

$ ssh -T git@github.com
Hi litcoder! You've successfully authenticated, but GitHub does not provide shell access.

외부에서 private망에 물린 host로 접속하기 – SSH Jump Host

사무실에 있는 내 workstation에는 두개의 LAN이 연결되어 있고 각각 public network와 private network에 연결되어있다. 외부에서 private network에 연결되어 있는 target host에 SSH로 연결 할 때는 먼저 workstation에 ssh로 연결하고, 여기에서 private망에 물려있는 target host로 또 다시 ssh를 연결해야 한다.

하지만 ssh의 -J option을 이용하면 workstation을 jump host로 이용해서 이런 귀찮은 여러번 접속을 피할 수 있다. 다음은 ssh의 -J 옵션에 대한 설명을 man-page에서 발췌해서 의역한 것이다.

-J 목적지
    Jump host에 ssh 연결을 생성한 다음 최종 목적지 호스트로 TCP 포워딩을 설정하여
    연결을 생성합니다. 여러개의 jump host를 명시하려면 콤마를 사용해서 지정해 줄 수
    있습니다. 이 옵션은 ProxyJump 환경설정 예약어에 대한 단축설정 입니다. 
    주의: 일반적으로 명령줄에 작성하는 옵션들은 최종 목적지 호스트에 적용되며 jump host
    들에는 적용되지 않습니다. Jump host에 옵션을 설정하려면 ~/.ssh/config file을
    활용 하세요.

예를 들어 workstation의 public IP가 203.0.113.5, private network에 있는 target의 IP가 192.168.100.5라 할 때 다음과 같이 203.0.113.5를 jump host로 설정해서 한 번에 접속할 수 있다.

ssh -J user@203.0.113.5 user@192.168.100.5

이러한 설정을 .ssh/config에 jump host를 명시해서 설정해 두면 workstation을 jump host로해서 target에 접속할 수 있고 무엇보다도 visual studio code에서도 곧바로 접속할 수 있다는 점이 편하다. 아래의 설정에서 ProxyJump 설정하는 부분을 눈여겨 보자.

Host workstation
  HostName 203.0.113.5
  User user

Host target
  HostName 192.168.100.5
  User user
  ProxyJump workstation

설정 후에는 private IP인 target으로 곧바로 접속 할 수 있다.

ssh target

VNC SSH Tunneling

Local VNC server는 접속이 가능하지만 외부에서 접속이 불가능 하다면 SSH tunneling을 설정해서 연결을 시도할 수 있다.

VNC Client에서 SSH Tunneling을 지원하는 경우

SSH tunneling을 지원하는 VNC client인 Remmina와 같은 경우에는 다음과 같이 서버로 localhost:5901을 설정한다. 여기에 서버 IP가 아니라 localhost를 적어주는게 좀 이상해 보이긴 하지만 SSH tunneling을 설정한 상태에서는 localhost의 5901번이 remote server의 VNC service를 제공하도록 연결된다.

그 다음에는 SSH Tunnel 탭을 선택해서 다음과 같이 정보를 입력한다. Enable SSH tunnel을 클릭해서 활성화 하고, 서버의 IP와 SSH가 서비스되는 port번호인 22번을 적어준다(SERVER_IP:<SSH_PORT>). 로그인 방식은 설정에 따라 적어 준다. 나는 SSH key login을 선호하므로 SSH Identity file을 선택하고 private key를 설정해 주었다.

SSH Tunneling 설정이 없는 경우

TigerVNC와 같이 명시적으로 SSH tunneling을 지원하지 않는 경우에는 터미널을 하나 열어서 다음과 같이 SSH tunel을 하나 열어 준다.

다음은 리모트 서버의 5901 포트를 로컬 5999번에 tunelling하는 예이다.

ssh -L 5999:localhost:5901 <user_id>@<vnc_server_ip>

터미널을 그대로 열어둔 상태에서 VNC client를 열어서 로컬의 5999번 포트로 연결한다.

연결