비밀번호 없이 SSH 접속? pem 키로 간편화해보자
0. rsa 기반의 공개키, 개인키 생성
pem 키를 생성하고자 하는 디렉토리에 가서 아래 명령어 실행,
나는 ~/.ssh 디렉토리 안에서 SSH 접속과 관련한 모든 파일을 저장 중이기에 여기에 파일을 생성할 거다.
$ cd ~/.ssh
$ ssh-keygen -t rsa -b 2048 -f {file name}
rsa 기반의 암호화, 2048 bit의 키를 {file name}이라는 이름으로 만들어 보자.
⬇️ (참고) ssh-keygen 명령어 상세 옵션
ssh-keygen [-q] [-a rounds] [-b bits] [-C comment] [-f output_keyfile]
[-m format] [-N new_passphrase] [-O option]
[-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa]
[-w provider] [-Z cipher]
ssh-keygen -p [-a rounds] [-f keyfile] [-m format] [-N new_passphrase]
[-P old_passphrase] [-Z cipher]
ssh-keygen -i [-f input_keyfile] [-m key_format]
ssh-keygen -e [-f input_keyfile] [-m key_format]
ssh-keygen -y [-f input_keyfile]
ssh-keygen -c [-a rounds] [-C comment] [-f keyfile] [-P passphrase]
ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]
ssh-keygen -B [-f input_keyfile]
ssh-keygen -D pkcs11
ssh-keygen -F hostname [-lv] [-f known_hosts_file]
ssh-keygen -H [-f known_hosts_file]
ssh-keygen -K [-a rounds] [-w provider]
ssh-keygen -R hostname [-f known_hosts_file]
ssh-keygen -r hostname [-g] [-f input_keyfile]
ssh-keygen -M generate [-O option] output_file
ssh-keygen -M screen [-f input_file] [-O option] output_file
ssh-keygen -I certificate_identity -s ca_key [-hU] [-D pkcs11_provider]
[-n principals] [-O option] [-V validity_interval]
[-z serial_number] file ...
ssh-keygen -L [-f input_keyfile]
ssh-keygen -A [-a rounds] [-f prefix_path]
ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number]
file ...
ssh-keygen -Q [-l] -f krl_file [file ...]
ssh-keygen -Y find-principals -s signature_file -f allowed_signers_file
ssh-keygen -Y match-principals -I signer_identity -f allowed_signers_file
ssh-keygen -Y check-novalidate -n namespace -s signature_file
ssh-keygen -Y sign -f key_file -n namespace file [-O option] ...
ssh-keygen -Y verify -f allowed_signers_file -I signer_identity
-n namespace -s signature_file [-r krl_file] [-O option]
명령어를 입력하면 아래 텍스트가 출력된다.
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
# 비밀번호 입력 & 엔터 입력 후,
Enter same passphrase again:
해당 키를 이용하여 SSH 원격 접속 시 입력할 비밀번호를 입력하면 된다.
보안을 강화할 거면 여기에 비밀번호를 입력하고, 이후에 머신에 공개 키를 옮기고 난 뒤에 반드시 해당 비밀번호를 기억해야 한다.
나는 한 학기 동안 과제용으로 사용할 머신이다 보니 빠른 접근을 위해 비밀번호를 생략하기로 했다.
아무것도 타이핑하지 않고 엔터를 치면 비밀번호를 지정하지 않는다.
해당 디렉토리에 2개의 파일이 생겼다.
개인키 cs479
공개키 cs479.pub
이제 두 파일을 이용해 보안 설정을 마무리해 보자.
1. 공개키 내용을 머신에 적용시키기
이 글을 보고 있는 사람은 아마 SSH를 이용해 머신에 한 번이라도 접근한 상태일 것이기 때문에,
머신의 홈 디렉토리에 .ssh 디렉토리가, 그리고 그 안에 authorized_keys 파일이 있을 것이다. ~/.ssh/authorized_keys
authorized_keys 파일을 열고, ssh-keygen 명령어로 생성된 cs479.pub 파일의 내용을 붙여 넣는다.
2. 개인키에 권한 부여하기
ssh-keygen 명령어로 생성된 개인키 cs479 파일에 권한을 추가해 주자.
cd ~/.ssh
chmod 400 {private key file name}
3. SSH 접속마다 개인키를 참조하도록 설정 변경하기
로컬의 ~/.ssh/config 파일을 열면 다음과 같이
SSH 형식으로 연결된 모든 머신의 nickname, ip, username 이 저장되어 있을 것이다.
생성한 개인키를 원하는 머신의 설정에 추가해 주도록 하자.
Host {nickname}
HostName {ip address}
User {machine user name}
IdentifyFile {private key directory}
맨 아랫 줄 {private key directory}에 방금 생성한 개인키의 디렉토리를 넣어주자.
내 경우엔 ~/.ssh/cs479 일 것이다.
⬇️ (참고) ssh config 상세 옵션
https://www.ssh.com/academy/ssh/config
4. 결과
설정을 완료하고, VSCode Remote - SSH로 접속을 시도하면,
비밀번호를 묻는 단계가 사라지고 바로 머신에 접속이 가능해진다.
또, 터미널에서 ssh 명령어를 다음과 같이 입력해도,
ssh -XY {username}@{ip address} -i ~/.ssh/{private key} -p 22
마찬가지로 비밀번호를 묻지 않고 바로 접속된다.