ssh란

ssh(secure shell)는 다른 컴퓨터의 셸을 네트워크 너머에서 쓰게 해 주는 프로그램이다. 노트북에서 ssh를 실행하면 클러스터의 로그인 노드에 셸이 하나 열리고, 그 뒤로 치는 명령은 전부 클러스터에서 실행된다. 오가는 내용은 암호화된다.

ORCA나 Quantum ESPRESSO 계산은 노트북이 아니라 클러스터에서 돈다. 입력을 올리고, 작업을 제출하고, 출력을 확인하는 일이 모두 ssh 접속 위에서 이뤄진다. 다음 장의 scp, rsync도 ssh를 통로로 쓴다. Linux, macOS, Windows 10 이후 버전에는 ssh 클라이언트가 기본으로 들어 있다.

첫 접속

형식은 ssh 사용자이름@호스트다. 호스트는 클러스터 로그인 노드의 주소로, 계정을 받을 때 안내받는다. 아래 예의 주소와 사용자 이름은 설명용이다.

$ ssh e0123456@vanda.nus.edu.sg

처음 접속하는 서버라면 이런 질문이 먼저 나온다.

The authenticity of host 'vanda.nus.edu.sg (...)' can't be established.
ED25519 key fingerprint is SHA256:...
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'vanda.nus.edu.sg' (ED25519) to the list of known hosts.
e0123456@vanda.nus.edu.sg's password:

서버마다 고유한 호스트 키가 있고, 위의 fingerprint는 그 키의 요약값이다. yes라고 답하면 ~/.ssh/known_hosts에 기록되고, 다음부터는 묻지 않는다. 클러스터 문서에 fingerprint가 공개돼 있다면 비교해 보고 답하는 것이 원칙이다. 비밀번호를 칠 때 화면에 아무것도 표시되지 않는 것은 정상이다.

접속하면 프롬프트가 클러스터의 것으로 바뀐다. 나올 때는 exit나 Ctrl-D를 쓴다. 학교 밖에서 접속할 때는 보통 학교 VPN에 먼저 연결해야 한다. 구체적인 방법은 클러스터 안내 문서를 따른다.

키 만들기

매번 비밀번호를 치는 대신 키 쌍으로 인증할 수 있다. 키 쌍은 두 파일이다. 개인 키(id_ed25519)는 내 컴퓨터에만 두고, 공개 키(id_ed25519.pub)는 서버에 올린다. 서버는 공개 키로 내가 개인 키를 가졌는지 확인한다. 키는 노트북(또는 WSL)에서 한 번 만들면 된다.

$ ssh-keygen -t ed25519 -C "kim@laptop"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/kim/.ssh/id_ed25519):
Enter passphrase for "/home/kim/.ssh/id_ed25519" (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/kim/.ssh/id_ed25519
Your public key has been saved in /home/kim/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:zQ5PSX1x2MqziJIYvYB5ZNZXFsTEXyfTCAD3WJLq+nM kim@laptop

파일 위치는 Enter로 기본값을 받는다. -C 뒤는 키에 붙는 메모라서 어느 컴퓨터의 키인지 알아볼 수 있게 적으면 된다. passphrase는 개인 키 파일을 잠그는 암호다. 노트북을 잃어버려도 passphrase가 없으면 키를 쓸 수 없으니 설정해 두는 편이 좋다. 매번 치는 수고는 아래의 ssh-agent가 덜어 준다.

$ cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJE3ZbxNBjHILtE8MNFKpTzBNAjrxmjLkruM0m/mfZLw kim@laptop
개인 키는 복사하지 않는다

서버에 올리고 남에게 보여 줘도 되는 것은 .pub로 끝나는 공개 키뿐이다. id_ed25519는 이메일, 메신저, 클라우드 드라이브에 올리지 않는다. 컴퓨터가 여러 대면 컴퓨터마다 키를 따로 만든다.

공개 키를 서버에 올리기

서버는 ~/.ssh/authorized_keys 파일에 적힌 공개 키를 받아 준다. Linux, macOS, WSL에서는 ssh-copy-id가 이 일을 한다. 비밀번호를 한 번 묻고, 끝나면 Number of key(s) added: 1이라고 알려 준다.

$ ssh-copy-id -i ~/.ssh/id_ed25519.pub e0123456@vanda.nus.edu.sg

Windows PowerShell에는 ssh-copy-id가 없다. 공개 키를 파이프로 넘겨 서버 쪽에서 파일에 덧붙인다.

# PowerShell에서 한 줄로
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh e0123456@vanda.nus.edu.sg "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

이제 ssh e0123456@vanda.nus.edu.sg를 치면 비밀번호 대신 passphrase를 묻는다(설정했다면). 클러스터에 따라 키 인증을 막아 두거나 2단계 인증을 따로 요구하기도 하니, 안 되면 먼저 안내 문서를 확인한다.

ssh는 권한이 느슨한 키 파일을 거부한다. ~/.ssh는 700, 개인 키와 config, authorized_keys는 600이어야 한다 (04장 참고). 노트북과 서버 양쪽 모두 해당한다.

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/id_ed25519 ~/.ssh/config
$ ls -la ~/.ssh
total 12
drwx------ 2 kim kim 100 Sep 29 00:12 .
drwxrwxr-x 5 kim kim 120 Sep 29 00:09 ..
-rw------- 1 kim kim 202 Sep 29 00:12 config
-rw------- 1 kim kim 444 Sep 29 00:07 id_ed25519
-rw-r--r-- 1 kim kim  92 Sep 29 00:07 id_ed25519.pub

~/.ssh/config

e0123456@vanda.nus.edu.sg를 하루에 스무 번 치고 싶지는 않다. 노트북의 ~/.ssh/config에 별명을 적어 두면 ssh vanda로 끝난다. 파일이 없으면 새로 만든다.

Host vanda
    HostName vanda.nus.edu.sg
    User e0123456
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 60
항목뜻
Host내가 부를 별명. ssh vanda의 vanda
HostName실제 주소
User서버의 사용자 이름
IdentityFile쓸 개인 키
ServerAliveInterval60초마다 신호를 보내 한동안 입력이 없어도 접속이 끊기지 않게 한다

별명은 ssh를 쓰는 다른 명령에서도 통한다. scp h2o.inp vanda:~/proj/, rsync ... vanda:..., VS Code Remote-SSH가 모두 이 파일을 읽는다. 설정이 제대로 읽혔는지는 ssh -G로 확인한다.

$ ssh -G vanda | grep -E '^(hostname|user|identityfile) '
user e0123456
hostname vanda.nus.edu.sg
identityfile ~/.ssh/id_ed25519

바깥에서 바로 닿지 않는 서버는 게이트웨이를 거쳐 들어가야 할 때가 있다. ProxyJump에 거쳐 갈 호스트를 적으면 ssh가 두 단계를 알아서 잇는다. 명령줄에서는 ssh -J vanda e0123456@inner.example.org와 같다.

Host inner
    HostName inner.example.org
    User e0123456
    ProxyJump vanda

ssh-agent

ssh-agent는 passphrase를 푼 개인 키를 메모리에 들고 있다가 ssh가 필요할 때 건네주는 프로그램이다. passphrase는 세션당 한 번만 치면 된다. macOS와 데스크톱 Linux에서는 보통 이미 돌고 있다. WSL에서는 직접 띄운다.

$ eval "$(ssh-agent -s)"
Agent pid 454122
$ ssh-add ~/.ssh/id_ed25519
Enter passphrase for /home/kim/.ssh/id_ed25519:
Identity added: /home/kim/.ssh/id_ed25519 (kim@laptop)
$ ssh-add -l
256 SHA256:zQ5PSX1x2MqziJIYvYB5ZNZXFsTEXyfTCAD3WJLq+nM kim@laptop (ED25519)

~/.ssh/config 맨 아래에 Host * 블록을 두고 AddKeysToAgent yes를 넣으면 처음 접속할 때 푼 키가 agent에 자동으로 들어간다.

자주 보는 오류

메시지흔한 원인과 대처
Permission denied (publickey)서버가 키를 받지 않았다. 공개 키가 서버 authorized_keys에 있는지, User가 맞는지, 양쪽 ~/.ssh 권한이 700/600인지 본다. ssh -v vanda로 어떤 키를 시도했는지 볼 수 있다.
Connection timed out서버까지 닿지 못했다. 학교 밖이라면 VPN부터 확인한다. 주소 오타나 클러스터 점검일 수도 있다.
Could not resolve hostname주소 오타이거나 config의 Host 별명이 틀렸다.
REMOTE HOST IDENTIFICATION HAS CHANGED!서버의 호스트 키가 known_hosts에 적힌 것과 다르다. 아래 참고.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
...
Offending ED25519 key in /home/kim/.ssh/known_hosts:3

클러스터를 재설치하거나 로그인 노드를 교체하면 호스트 키가 바뀌고 이 경고가 뜬다. 드물게는 실제로 중간에서 누가 가로채는 경우일 수도 있다. 클러스터 공지나 관리자에게 키 변경이 있었는지 확인한 뒤, 옛 기록을 지우고 다시 접속해 새 fingerprint를 받는다.

$ ssh-keygen -R vanda.nus.edu.sg
# Host vanda.nus.edu.sg found: line 3
/home/kim/.ssh/known_hosts updated.
Original contents retained as /home/kim/.ssh/known_hosts.old

X11 포워딩과 VS Code

클러스터에서 창을 띄우는 프로그램(예: VMD, gnuplot 창)을 노트북 화면에 보이게 하려면 ssh -Y vanda로 접속한다. macOS는 XQuartz가 필요하고, Windows 11의 WSL은 별도 설정 없이 되는 경우가 많다. 네트워크 너머로 화면을 그리는 것이라 느리다. 큰 궤적은 파일을 받아 와서 로컬에서 여는 편이 낫다.

VS Code의 Remote-SSH 확장은 ~/.ssh/config의 별명으로 접속해 클러스터의 파일을 로컬 편집기처럼 연다. 입력 파일을 고치기에 편하다. 다만 VS Code는 로그인 노드에 서버 프로그램을 띄우므로, 클러스터에 따라 사용을 제한하기도 한다.