지난 글에서 EC2 server에서 생성한 ssh key를 client에 복사하는 방식으로 ssh key를 수동 설정 했었는데, 이번에는 반대로 client에서 ssh key를 생성하여 EC2 server에 public key를 복사하는 방식으로 진행 해보겠다.
지난 글에서 진행했던 내용은 생략할 것이므로 아래 링크를 참조하면 된다.

기본적으로 EC2는 ssh key pair를 VM instance 생성 시에 만들어 주기 때문에, 자동 발급 받은 private key를 이용하면 된다.
그래도 여전히 On-Premise 환경도 많이 사용되고, 직접 ssh key를 만들 줄 알아야 원리를 이해할 수 있으며, password를 통한 VM 접속도 이해하고 있어야 하기 때문에 따로 글을 작성했다.
ssh-keygen으로 명령어는 동일하다.
$ ssh-keygen -t rsa -b 4096 -f my-key
알고리즘은 rsa, 4,096 비트, 파일명은 my-key로 keypair를 생성한다.
$ ls -al
total 16
drwxr-xr-x 4 x staff 128 Jul 2 16:15 .
drwxr-x---+ 145 x staff 4640 Jul 2 16:15 ..
-rw------- 1 x staff 3369 Jul 2 16:15 my-key
-rw-r--r-- 1 x staff 735 Jul 2 16:15 my-key.pub
그러면 public key, private key가 생성된다.
.pub 확장자가 붙은 것이 public key다.
AWS에서 EC2 Instance를 하나 만들고 해당 Instance의 public IP를 알아오자.
내가 받은 ip는 13.124.204.247다.
최초 접속 시에 사용하기 위해 AWS에서 자동으로 만들어준 private key도 가져왔다.
# client
$ ssh -i ./secret-key.pem ec2-user@13.124.204.247 -p 22
권한 오류가 뜰텐데, chmod 0600 secret.pem으로 Owner 외 권한 제거하면 된다.
ssh -i secret-key.pem ec2-user@13.124.204.247 -p 22
, #_
~\_ ####_ Amazon Linux 2023
~~ \_#####\
~~ \###|
~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
AWS에서 받아온 secret-key.pem의 권한을 조정하니 접속이 잘 되는 것을 확인했다.
이제 client로 돌아가서 아까 생성한 public key를 server로 복사할 것이다.
명령어는 매우 간단한데, ssh와 거의 다를 것이 없고, ssh-copy-id로 전달할 키만 넣어주면 된다.
server로 보내야 하므로 public key임에 주의하자.
$ ssh-copy-id -i my-key.pub ec2-user@13.124.204.247
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "my-key.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
ec2-user@13.124.204.247: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
그럼 Permission denied 오류가 뜬다.
ssh-copy-id는 password 기반으로 전송하는데,
사용자명은 항상 기본이 ec2-user지만, 이 사용자의 password는 본 적이 없을 것이다.
AWS EC2는 기본적으로 password로 접속할 수 없도록 되어 있기 때문이다.
우선 AWS에서 받아온 private key로 EC2에 접속한다.
$ ssh -i secret-key.pem ec2-user@13.124.204.247 -p 22
/etc/ssh/sshd_config 경로에 sshd_config가 적혀있는데, 이 안에서 ssh로 접속할 때, private key가 아닌, username, password로 접속할 수 있도록 설정할 수 있다.
파일 내용을 출력해보면
$ cat /etc/ssh/sshd_config
cat: /etc/ssh/sshd_config: Permission denied
권한 오류가 뜬다.
$ sudo cat etc/ssh/sshd_config
sudo를 꼭 붙여야 한다.
cat으로 내용을 대충 살펴보고 vi로 편집기를 열어보자
$ sudo vi /etc/ssh/sshd_config
이 때도 sudo를 쓰지 않으면 내용이 보이지 않을 것이다.
# AWS EC2
# /etc/ssh/sshd_config
# ...
# Explicitly disable PasswordAuthentication. By presetting it, we
# avoid the cloud-init set_passwords module modifying sshd_config and
# restarting sshd in the default instance launch configuration.
PasswordAuthentication no
PermitEmptyPasswords no
# ...
vim으로 파일을 열면 PasswordAuthentication이 no로 되어 있는 것이 보인다.
참고로 vim에서 / 키를 누르고 Pass를 누르고 엔터를 누르면 검색 후 Pass가 있는 곳으로 이동한다.
이를 yes로 바꿔주자.
# AWS EC2
# /etc/ssh/sshd_config
# ...
# Explicitly disable PasswordAuthentication. By presetting it, we
# avoid the cloud-init set_passwords module modifying sshd_config and
# restarting sshd in the default instance launch configuration.
PasswordAuthentication yes✅
PermitEmptyPasswords no
# ...
그리고 다시 ssh-copy-id를 시도해도 여전히 같은 오류가 난다.
# client
$ ssh-copy-id -i my-key.pub ec2-user@13.124.204.247
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "my-key.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
ec2@13.124.204.247: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
기본적으로 ec2-user의 비밀번호가 설정되어 있지 않기 때문이다.
다시 EC2에 접속하여 비밀번호를 설정해주자.
sudo passwd <비밀번호 변경할 사용자명> 명령어로 사용자의 비밀번호를 설정할 수 있다.
# AWS EC2
$ sudo passwd ec2-user
Changing password for user ec2-user.
New password:
비밀번호가 Palindrome이거나 8자 미만이면 설정을 해주지 않는다.
너무 쉬워도 안해준다. 숫자, 대, 소문자 + 특수문자 섞어서 8자로 만들자.
BAD PASSWORD: The password is a palindrome
BAD PASSWORD: The password is shorter than 8 characters
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
성공 시에는 다음과 같은 메시지가 뜬다.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
그러나 여전히 ssh-copy-id는 실패한다.
ssh-copy-id -i my-key.pub ec2-user@13.124.204.247
메세지는 역시 동일하다.
다시 AWS에서 발급 받은 SSH Key로 접속한 뒤,
sudo systemctl restart sshd 명령어를 입력하자.
$ ssh -i secret-key.pem ec2-user@13.124.204.247
$ sudo systemctl restart sshd
sshd_config의 설정을 바꿔줬으면, 재실행 해야 설정 파일을 다시 읽어서 변경된 내용이 적용되기 때문이다.
$ ssh-copy-id -i my-key.pub ec2-user@13.124.204.247
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "my-key.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
ec2-user@13.124.204.247's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'ec2-user@13.124.204.247'"
and check to make sure that only the key(s) you wanted were added.
비밀번호를 치라는 메세지가 보이고, 입력하면 드디어 성공한다.
비밀번호 사용 설정 + ec2-user 사용자에 비밀번호 설정 + sshd 재실행
3가지가 수반되어야 ssh-copy-id가 제대로 동작하는 것이다.
참고로 비밀번호 기반 로그인을 yes로 설정하면, ssh 접속 시에도 비밀번호를 입력하라고 나온다.
(private key를 -i로 명시하지 않은 경우)
$ ssh ec2-user@13.124.204.247
ec2-user@13.124.204.247's password:
# AWS EC2
$ ls ~/.ssh
authorized_keys
EC2에서 ls ~/.ssh로 추가된 public key가 있나 보면 없다.
server로 보낸 public key가 authorized_keys에 저장되기 때문이다.
$ cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwkzXkmmObktsCgTs5EvP4vJVJb+o1taAD6IJk5yRy3/KVUkKfBEaeOzTIoRh/nCqx/4G8hcmxJhWthW7gezDXKdrvIdqTROkQMtyZfcoi2x8bhnqz6Egx4CXcmbo+ljuCPgzwJCvExhic+Uq+IORPDZKh71GJfShH3W52CvDAIPeSuhysyMVkXQ3+9u9ngpVYbOHYW6SL00eJMiJFeEMxFfD9arJg2QgXQ0tdle/jvpxGfBafsUMcu/iaB5Mhp+S3GjG5SizAEySi+PusfkFDQTnBJDM/Q7AeD/ODQPey1T+7Ax8d9VRUmVhhHagXi1uSxWcf3DfF2ANZALaY9NLV secret-key
# ssh-copy-id로 추가된 key
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDGUqNPYUX9h0wnxQKvqdqoCqx90Nm862U7G4yKCszlnht9iGJCS44bjKCyME/qLBmCnpesGN+8Zz229ppjLHZTdYeYKxMr80Nar/B3DCpxOBuBsruP+Oxh24KvvpBGRdzKHHCFCjGhal3Cex762IGtFd6ZHMh/9T/wk0k4snz5Rf7WWs8I3Ja2+9qnP1fOXn27ma7ugBSZGZDRjqwR7iIReq3slmEPuEBE2nth/hi0WYl5D80XnQ9XgfnTfFhKq2K5qJu0K2+qzSZ9xceQk5iLvbLry1WUgzWjwu4xjjsZi/IisP0rtWFyIOwt/nIM0lH7CkefTMiSk51+PTE9YZdCwomxyvED19+UyMPFwrHdbL1XpjjbdxqyVT5x7yNcwFx8azk95jRO3qae+CeYkczDz0Lz6n+3SSkmMjooPy0S3pNreGOFOt/vRmjkAKDfXtGwGWc4NSxRG+TGb37V7xoUqw/lgfyr91HD3FpVtjlNQ8jhXxjZJSV6kLYenKJdLmuh2PuI9xSt+tJVxLraGc4myz6BpZojlW0uQhSoCzi4CrGa8cwTp+xdRQ3xUMi+et+krhMRuBVIzl8GFLddaML0BKStkZVsA2HZl0/3FCiyysXZL6yrhoYnD3F46ldugOJURCQbrjfdwLrcgGT6oBrP2lq3HeUmKCsaLMN95AFTGw== x@x.local
authorized_keys에 등록 되어야 client에서 페어에 해당되는 private key를 사용하여 ssh 접속이 가능하다.
이제 다시 EC2의 /etc/ssh/sshd_config에서 PasswordAuthentication을 no로 되돌려놓자.
비밀번호 기반 접속은 꺼놓는 것이 보안상 좋다.
털리고 싶지 않다면 private key만으로 접속하도록 설정하자.
# AWS EC2
# ...
PasswordAuthentication no
# ...
설정을 바꿨으므로 EC2에서 systemctl로 재시작 해주자
# AWS EC2
$ sudo systemctl restart sshd
그리고 다시 client에서 private key 없이 접속을 시도해보자
# client
$ ssh ec2-user@13.124.204.247
ec2-user@13.124.204.247: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
접속에 실패한다.
다시 비밀번호 기반 ssh 연결은 막히게 되었다.
이제 client에서 만든 private key를 명시하면 EC2에 접속 가능하다.
$ ssh -i my-key ec2-user@13.124.204.247
, #_
~\_ ####_ Amazon Linux 2023
~~ \_#####\
~~ \###|
~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
Last login: Tue Jul 2 08:08:41 2024 from 175.213.100.223
또한 저번 장에서 했던 ssh-add로 my-key를 등록하면 -i로 private key 명시 없이 접속이 가능해진다.
세팅 과정만 달랐을 뿐, 이제부터는 완전히 동일하다.
$ ssh-add my-key
Identity added: my-key (x@x.local)
$ ssh ec2-user@13.124.204.247
, #_
~\_ ####_ Amazon Linux 2023
~~ \_#####\
~~ \###|
~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
Last login: Tue Jul 2 08:18:04 2024 from 175.213.100.223
이로서 ssh key를 client side에서 등록하는 것까지 살펴 보았다.
On-Premise에서 세팅을 해야 한다면, /etc/ssh/sshd_config의 PasswordAuthentication yes로 되어 있을 것이기 때문에,
client에서 keypair를 생성하고 ssh-copy-id로 server에 public key를 복사하는 방식이 더 편할 것이다.
또한 server에 public key를 등록한 뒤에는 보안을 위해 PasswordAuthentication을 no로 바꿔서 반드시 client가 비밀번호가 아닌 private key로만 접속할 수 있도록 설정하는 것도 잊지 말자.