Study/Study

가상 머신 구축 및 실습을 통해 SSH 인증키 생성 방식 이해하기 - 2

TTOII 2022. 4. 13. 21:30
728x90

앞서 진행했던 실습대로 controller(client) -----> node2(server)로 접속하기 위한 설정을 진행한다.

node2에 동일한 작업을 반복하고 클라이언트 측에서 접속해보면 패스워드 기반 인증으로 접속이 가능하다.

 

 

✔️ 키 기반의 인증 접속 설정

하지만 위와 같이 매번 패스워드를 통해 인증하는 것은 번거로운 일이다.
이번에는 키 기반의 인증을 통해 접속하는 방법을 알아보자

ssh-keygen 명령을 이용해 키를 생성한다. default는 id_rsa라는 이름으로 생성된다.
이때 passphrase는 반드시 설정해줘야 하는 부분이다. (실습은 편의를 위해 설정하지 않았다.)
passphrase를 설정하지 않는 것은 공인인증서를 사용할 때 공인인증서의 패스워드를 세팅하지 않는 것과 같은 것이고 공인인증서를 가진 것 자체로 인증이 되는 것과 동일한 것이다. → 즉, 공인인증서만 탈취하면 해커가 악용할 수 있다.

node1의 ~/.ssh/authorized_keys 파일 내용은 다음과 같다.

node2의 ~/.ssh/authorized_keys 파일의 내용은 다음과 같다.

 

✔️ key 인증 기반 접속 설정
controller에서 node1으로 키 인증 기반 접속을 할 수 있도록 해보자

controller에서 node1의 ip 주소를 이용해 키를 복사해서 저장하면 패스워드 인증을 통해 접속할 수 있고 key가 추가되었다는 메세지가 출력된다.

 

✔️ 서버의 authorized_keys 파일에 클라이언트의 새로운 키를 추가
다시 node1의 ~/.ssh/authorized_keys 파일을 열어보면 아까와 다르게 새로운 키가 추가된 것을 확인할 수 있다.

controller의 공개키 파일과 비교해보면 정확히 같은 키가 추가된 것을 확인할 수 있다. (하단에 추가되었음)

즉, 정리하자면 ssh-copy-id 명령을 통해 node1의 authorized_keys 파일에 controller의 공개키가 등록되는 것이다.
이 작업을 완료하면 우리는 더 이상 ssh 접속시 패스워드를 사용하지 않고 키 기반 인증을 사용한다.

여기서 한가지 주의 깊게 봐야 할 부분이 있다.
로그인시에 주소 앞에 별도로 계정을 지정하지 않으면 현재 클라이언트 쪽의 계정을 그대로 사용한다는 것이다.

sudo를 통해 root로 계정을 변경하고 다시 node1으로 접속해보자
기존에 사용하던 공개키는 vagrant의 홈 디렉토리에 존재하는 것이므로 root로 계정을 전환하면 fingerprint를 다시 묻게되며 키 기반 인증 설정을 하지 않았으므로 패스워드를 통해 ssh 접속을 진행한다. 로그인 된 계정을 보면 root이다.

우리가 윈도우 상에서 ec2 인스턴스로 접속할 때 반드시 ec2-user를 붙이는 이유가 바로 이 때문이다.

만약 내 윈도우의 사용자명이 admin이라고 가정하자. ec2 인스턴스에 접속할 때 앞에 "ec2-user"라는 계정명을 명시하지 않으면 내 윈도우는 ec2 인스턴스에 admin이라는 계정으로 접속하려고 할 것이다.
하지만 ec2 인스턴스에는 admin이라는 사용자가 없으므로 접속 할 수 없게 된다.

 


 

지금까지 실습에서 vagrant로 각 vm에 접속할 때 계정명을 따로 추가하지 않아도 접근이 가능했었다.

vagrant up을 한번이라도 실행하면 .vagrant 디렉토리가 생성되며 이 디렉토리는 가상 컴퓨터에 대한 모든 정보가 담겨있으므로 수동으로 파일을 조작하거나 삭제해서는 안된다.

윈도우를 클라이언트라고 생각하고 만들어 놓은 VM이 모두 SSH 서버라고 하면
윈도우에는 private key가 있어야 하고 controller, node1, node2의 authorized_keys 파일에 윈도우 클라이언트의 공개키가 등록되어 있어야 한다. 즉, 윈도우의 private key와 authorized_keys 파일에 저장된 윈도우의 공개키가 쌍을 이룬다.

PS C:\Users\Shinsohui\ansible> vagrant ssh controller
PS C:\Users\Shinsohui\ansible> ssh -i .\.vagrant\machines\controller\virtualbox\private_key vagrant@192.168.100.10

실제로 위의 두 명령어는 동일한 명령어인 것이다.

여기서 계정명을 제외하면 Permission denied 메세지가 나온다.

따라서 ssh 접속시에 계정명을 항상 명시해주는 것이 실수를 줄일 수 있는 방법이다.

 


 

✔️ Windows의 ~./ssh/config 파일 설정
Windows를 사용하는 내 PC에서 ssh 접속을 조금 더 편리하게 할 수는 없을까 ? 방법이 있다.
사용자 계정의 .ssh 디렉토리에 위치한 config 파일을 수정해주면 된다.

자주 접속하는 서버는 config 파일에 저장해두면 편리하게 접속할 수 있다.
192.168.100.10의 ip 주소를 가지는 controller 서버에 해당 private_key를 가지고 vagrant 계정으로 접속하겠다는 뜻이다.

실제로 Windows 사용자 디렉토리에서 ssh로 controller에 접근하면 키 인증 기반으로 접속할 수 있는 것을 알 수 있다.

따라서 아래와 같이 config 파일을 수정하면 앞서 만든 3대의 vm 모두에 편리하게 접속할 수 있다.

 


✔️ AWS ec2 인스턴스를 생성하고 config 파일을 구성하기

이번에는 ec2 인스턴스에 쉽게 접속할 수 있도록 config 파일을 구성해보자

ec2 인스턴스는 종료했다가 다시 시작하면 퍼블릭 ip가 변경된다.
따라서 ec2에 고정적으로 접근할 수 있는 ip가 필요하며 탄력적 IP를 할당 및 연결하면 된다.
참고로 AWS에서 연결되지 않은 탄력적 IP 주소는 과금의 대상이므로 사용하지 않을시 릴리즈해줘야 한다.

새로운 키를 생성해 윈도우 사용자의 .ssh 디렉토리에 위치시킨다. (test-key.pem)

이제 터미널에서 탄력적 IP 주소를 이용해 접속하려고 하면 fingerprint 를 확인하라고 한다.

ssh-keyscan을 통해 미리 ec2 인스턴스 서버의 fingerprint를 확인한다.

확인했으면 >> 를 이용해 Windows의 ~/.ssh/known_hosts 파일에 복사한다.

-i 옵션을 사용해 Windows(클라이언트)의 개인키의 경로를 명시하고 ec2-user(서버)에 접속하면 접속에 성공한다.

✔️ ec2 인스턴스에 편하게 접속할 수 있도록 config 파일을 수정하기

이제 -i 옵션을 이용해 직접 키의 위치를 명시하지 않고 Host명만을 이용해 접속할 수 있도록 config 파일을 구성해보자

PS C:\Users\Shinsohui> code C:\Users\shinsohui\.ssh\config

config 파일을 수정하고 저장하면 ssh bastion 이라는 짧은 명령으로 ec2 인스턴스의 ec2-user로 ssh 접속할 수 있다.

PS C:\Users\Shinsohui> ssh bastion
Last login: Tue Apr 12 13:28:41 2022 from 211.216.24.136

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
14 package(s) needed for security, out of 17 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-80-214 ~]$

 


✔️ 탄력적 IP를 그대로 사용하고 연결된 ec2 인스턴스를 변경해보기

기존의 ec2 인스턴스를 삭제한 뒤 새 ec2 인스턴스를 만들어 앞서 사용했던 탄력적 IP 주소를 그대로 연결한다.
우선 기존에 실행하던 인스턴스에 연결된 탄력적 IP 주소의 연결을 해제하고 인스턴스를 삭제한다.

새로운 인스턴스를 생성하고 탄력적 IP 주소를 연결한다.

config 파일에 구성했던 정보를 그대로 ssh 접속을 시도하면 man-in-the-middle attack 경고가 뜬다.
하단 메세지에 누군가가 도청을 할 수 있다는 가능성을 알리고 있다.

PS C:\Users\Shinsohui> ssh bastion
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:1rICbNQdEC9v/dcYJgYRxOvenD0qxyi6WzKcH6qPDsI.
Please contact your system administrator.
Add correct host key in C:\\Users\\Shinsohui/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in C:\\Users\\Shinsohui/.ssh/known_hosts:20
ECDSA host key for 18.210.186.57 has changed and you have requested strict checking.
Host key verification failed.

이러한 man-in-the-middle attack 메세지가 뜬 이유는
클라이언트의 정보는 그대로이나 서버 쪽의 정보 즉, 서버쪽의 키가 바뀌어 접속할 수 없는 것이다.

그렇다면 어떻게 해야되는가 ? 답은 경고문에 나와있다.
Add correct host key in C:\\Users\\Shinsohui/.ssh/known_hosts to get rid of this message.
C:\\Users\\Shinsohui/.ssh/known_hosts 파일에서 해당되는 정보를 제거하면 된다.

PS C:\Users\Shinsohui> code C:\Users\Shinsohui\.ssh\known_hosts

문제가 발생한 탄력적 IP의 정보를 지우고 저장한다.

PS C:\Users\Shinsohui> ssh bastion
The authenticity of host '18.210.186.57 (18.210.186.57)' can't be established.
ECDSA key fingerprint is SHA256:1rICbNQdEC9v/dcYJgYRxOvenD0qxyi6WzKcH6qPDsI.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '18.210.186.57' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
14 package(s) needed for security, out of 17 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-22-89 ~]$

지금은 known_hosts에 없기 때문에 fingerprint를 묻는다.
더 정확하게 하기 위해서는 ssh-keyscan으로 fingerprint를 미리 확인하고 접속을 하면 된다.

추가로 만약 서버가 교체되지 않더라도 서버측에서 키가 유출이 되어서 키를 변경해야 할 때는 어떻게 해야 할까 ?
서버 쪽에 있는 키 파일들을 모두 지우고 재부팅을 하면 키 파일이 모두 새로 만들어진다.

[ec2-user@ip-172-31-22-89 ~]$ sudo -i
[root@ip-172-31-22-89 ~]# cd /etc/ssh
[root@ip-172-31-22-89 ssh]# ls
moduli      sshd_config         ssh_host_ecdsa_key.pub  ssh_host_ed25519_key.pub  ssh_host_rsa_key.pub
ssh_config  ssh_host_ecdsa_key  ssh_host_ed25519_key    ssh_host_rsa_key

 

728x90