pem key 기반 SSH 인증 동작 과정

백준호·2024년 7월 3일
1

EC2 노드 접속, private subnet에 위치한 데이터베이스 접근 등 많은 곳에서 SSH를 이용해 통신한다. 흔하게 pem key 파일을 가지고 ssh -i KEY.pem USER@HOST 스크립트를 실행해 통신을 시작하는데 스크립트를 실행하는 과정에서 클라이언트, 서버 사이 어떤 인증 과정을 거치는지 알아보자.

SSH? PEM?

SSH(Secure Shell)이란 노드간 공개 네트워크를 통해 안전하게 통신할 수 있게 해주는 네트워크 프로토콜이다. SSH 연결을 허용하는 서버와 SSH 연결을 시도하는 클라이언트가 존재한다. 인증 방법은 비밀번호를 통한 인증 방법과 뒤에서 설명할 pem key를 이용한 공개키 인증이 있다.

PEM(Privacy Enhanced Mail)이란 키를 저장하는데 사용되는 파일 형식이다.

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA1234567890...
...
-----END RSA PRIVATE KEY-----

위와 같이 시작과 끝을 나타내는 헤더와 푸터가 존재하고, 사이에 Base64 인코딩된 텍스트가 존재하는 형태이다. SSH 프로토콜에서는 비밀키를 저장하는 데에 사용된다.

SSH 인증 동작 과정

ssh 연결 스크립트에 -v 옵션을 추가하면 인증 과정을 로그 형태로 확인할 수 있다. 통신 시작 이후 부터는 로그와 함께 인증 과정을 살펴보자.

1. 키 발급

클라이언트와 서버는 각각 비밀키, 공개키를 발급받는다. 발급 주체는 외부도 될 수 있으며 서버 자체에서 발급 후 비밀키를 클라이언트에 넘겨줄 수도 있다.

비밀키는 pem 키 형식으로 되어있으며 공개키는 OpenSSH 형식으로 저장된다. 공개키는 서버의 ~/.ssh/authorized_keys 파일에 기록하여 저장한다. 클라이언트 pem key는 know_hosts 파일에 해싱하여 저장한다. 해싱하는 이유는 pem key파일을 그대로 저장하는 것보다 유효한지 확인하는 것이 효율적이기 때문이다.

비밀키는 유출에 주의해야하며 공개키는 암호화 되지 않고 누구나 볼 수 있다.

2. 연결 시작, SSH 버전 교환

클라이언트와 서버가 통신 연결을 시작하고, SSH 버전을 교환한다. 이 과정에서 상호 통신에 문제가 없도록 버전이 호환되는지 확인한다.

캡쳐한 환경은 도커를 이용하여 우분투 컨테이너를 생성한 것이다. 기본적으로 SSH 프로토콜은 22번 포트를 사용하지만 호스트 PC 포트 충돌을 피하기 위해 53447 포트를 사용하였다.

3. 키 교환, 서버 인증, 암호화 알고리즘 선택

다음은 키 교환에 사용할 알고리즘과 서버 인증, 데이터 암호화에 사용할 알고리즘을 협상(negotiation)한다. 협상이라는 단어를 사용하는 이유는 클라이언트-서버 간 서로 지원하는 알고리즘을 확인하고 가장 보안성이 높으며 양쪽 다 사용 가능한 알고리즘을 찾는 과정이기 때문이다.

협상이 완료되면 알고리즘을 확정짓는다.

4. known_hosts 파일을 이용해 서버 신원 확인

클라이언트는 서버의 공개키를 확인하여 known_hosts 파일에 저장된 정보와 대조한다. 이 과정에서 신원이 확인되면 연결을 지속하고, 확인되지 않으면 연결을 끊는다.

5. 세션키 교환

세션키를 위에서 선택한 알고리즘을 이용하여 교환한다.

세션키를 pem key 인증 이전에 미리 교환하는데, 이는 이후 통신을 암호화 하여 더욱 안전하게 할 수 있을 뿐만 아니라 데이터 전송과 인증을 분리하는 효과를 가진다. 세션키를 이용한 데이터 전송과 pem key, 비밀번호 사용 등 인증을 분리하여 독립성을 보장하고 인증 과정을 동일한 전송 채널에서 가능하게 한다.

6. pem key를 이용한 사용자 인증

클라이언트가 가진 pem key를 이용해 사용자를 인증한다.

인증은 서버가 클라이언트에게 텍스트를 전달하며 시작된다. 클라이언트는 이를 비밀키를 이용하여 암호화하고, 서버에 전달해 서버는 암호문을 복호화하여 동일한 텍스트인지 확인하며 pem key를 가진 판단한다.

7. 인증 완료, 세션 시작

인증 후 새로운 세션이 만들어지고 인증이 완료된다.

관련 자료

[서버보안] SSH #1 - SSH 원리

[Linux] ssh와 키 기반 인증 방식

profile
회고하는 개발자

0개의 댓글

관련 채용 정보