쿼카러버의 기술 블로그

[SSH] SSH의 key based authentication에 대하여 (공개키 암호화에 대한 이해) 본문

Linux - Ubuntu

[SSH] SSH의 key based authentication에 대하여 (공개키 암호화에 대한 이해)

quokkalover 2022. 8. 9. 11:33

SSH key-based authentication

오늘은 SSH의 Key based authentication에 대해 다뤄보려고 한다. 사실 이런 개념 글을 정리하게 되는 가장 주된 동기 중 하나는 다른 글을 작성하면서 생긴다. 자세히 설명하자니 주제에서 벗어나게 되고, 설명을 안하자니 이해하기 어려운 글이 되버리기 십상이기 때문이다. 물론 다른 잘 정리된 글에 링크를 걸어줄 수도 있겠지만, 나 또한 한번 개념을 제대로 짚고 넘어가고 싶은 주제라면 이렇게 별도의 글로 나누어 설명한다.

 

자 서론이 길었다. 본론으로 돌아가자. AWS, GCP, 네이버 클라우드 플랫폼 등 클라우드 서비스를 사용해 서버를 운용하는 개발자라면 SSH를 뗄레야 뗄 수 없다. 이번 글에서는 항상 명령어 중심으로 사용만 해왔던 SSH가 뭔지에 대해 간단하게 알아보고 SSH를 활용한 authentication의 작동방식에 대해서 알아보고자 한다. 이 글을 읽고나면 클라우드 서비스를 활용할 때, 특히 여러 서버들을 관리 할때 SSH를 조금 더 자유롭게 조작할 수 있을 것이라 기대해본다.

 

이 글을 읽고나면 다음을 얻을 수 있다.

 

(1) SSH에 대한 간단한 이해

(2) SSH의 key-based authentication 개념 및 동작 원리

(3) SSH key 생성 방법

(4) AWS, GCP 혹은 on-premise 환경에서 자유자재로 SSH key-based authentication 구현

p.s. 추가로 깃헙에 SSH key등록할 수도 있음..

SSH란?

SSH는 Secure Shell 혹은 Secure Socket Shell의 약자로 다른 네트워크에서 동작하고 있는 서버(컴퓨터)에 접근할 때 보안성을 높이기 위해 사용되는 네트워크 프로토콜이다. SSH를 활용하면 remote server에 접속해서 실제 컴퓨터에 입력하는 것처럼 다양한 명령어를 실행하고 파일을 옮기는 등의 작업을 할 수 있다.

예를 들면 아래와 같은 명령어로 remote server에 접속하여 해당 remote server에 명령어를 실행할 수 있다.

ssh {username}@{remote-server-ip or domain}

SSH의 인증 방식

SSH에서 제공하는 인증방식은 크게 두 가지가 있다.

(1) strong password authentication

(2) public key authentication

본 글에서는 보안 수준이 좀 더 높고, 대중적으로 활용되고 있는 public key authentication에 대해 설명한다.

 

SSH에서 key란?

SSH에서 Key는 SSH protocol의 credential이다. 우리가 무언가에 접속할 때 username과 password를 입력하듯이, SSH Key를 사용하면 비밀번호 대신에 SSH key 사용하여 서버에 접속할 수 있다. 참고로 ssh key를 사용할 때가 password를 사용할 때 보다 보안수준이 더 높다.

 

SSH key는 공개키 방식으로, private key와 public key의 한 쌍으로 구성된다. private key는 단어에서 유추할 수 있듯이 자신만이 갖고 있는 개인키를 의미한다. public key는 누구에게나 공개 가능한 공개키다. 이 공개키 알고리즘은 사용목적에 따라 public key로 암호화하거나 private key로 암호화하게 되는데, SSH 에서는 private key로 암호화하는 방식을 택하고 있기 때문에, 이와 관련해서만 설명하도록 하겠다. 요약해서 얘기하자면 private key로 암호화된 메시지를 public key로 복호화하는 방식인데, 이 방식을 활용하면 특정 메시지가 private key를 가지고 있는 사람을 통해 왔다는 것을 확인할 수 있다.

자 아래 SSH Authentication이 동작하는 방식을 표현한 그림을 보자

SSH Authentication 동작 방식

(1) Client → Server : SSH connection을 요청

(2) Server → Client : Random message 전송

(3) Client → Server : Private Key를 사용하여 message를 encrypt

(4) Server : public key를 사용해 message를 decrypt

(4) Server → Client : message가 일치하면 client의 접근을 허용

 

위 그림에서 보면 알듯이, SSH 프로토콜은 Server에 접근하기 위해서는 private key를 가지고 암호화할 수 있어야 하기 때문에, private key를 가진 유저만 접근할 수 있다. 우리가 AWS에서 인스턴스를 생성해보면 주로 pem키를 받게 되는데 이때의 pem키가 바로 private key다.

 

처음 AWS인스턴스를 생성해서 SSH를 사용해 서버에 접근한 뒤에 ~/.ssh/authorized_keys 파일을 보면 public key가 이미 입력돼 있는 것을 볼 수 있는데, 바로 이 공개키 알고리즘을 활용해서 우리가 pem키를 활용해 서버에 접속할 수 있는 것이다. 예상했겠듯이, 직접 private key를 만들고 public key를 서버에 등록해주면 AWS를 통해 발급받은 pem키가 아니더라도, 해당 private key를 활용해서 서버에 접속할 수 있다.

 

사실 이 용도 외에도 깃헙계정에 자동으로 로그인 할 수도 있다. 이처럼 SSH key 인증방식에 대해 이해를 해두면 용도가 매우 다양하다.

 

 

자 그럼 이제 한번 직접 SSH key를 생성해보자

SSH key 생성 방법

가장 기본적으로 아래 명령어를 실행해서 키를 생성할 수 있다.

ssh-keygen -t rsa

위 명령어를 실행하면 아래 메시지에 대해 응답해야 한다.

  1. 키를 저장할 경로( 기본값 : ~/.ssh/id_rsa)
  2. passphrase : 추가로 사용할 비밀번호로, 만약 자동 로그인을 원한다면 입력하지 않는다.

위와 같이 실행 후 터미널에

ls ~/.ssh

를 입력하면

id_rsa.pub id_rsa

위 두가지 파일이 생성된 것을 확인할 수 있을 것이다.

id_rsa가 바로 private key고, id_rsa.pub이 바로 public key다

자 이제 위처럼 생성해두고, id_rsa.pub 값을 다른 remote server들에 등록해주면, 이후에는

ssh {host-name}@{ip-address}

위 커맨드 만으로 비밀번호 인증없이 remote server에 접속해 쉘 명령어를 실행할 수 있게 된다.

 

 

 

참고자료

https://medium.com/@w3docs/an-ultimate-guide-to-ssh-6951593b85a6

Comments