SSH 동작원리 및 EC2 SSH 접속

SSH 동작원리

redwood
8 min readJan 26, 2019

이번 블로그에서는 서버 접속시 사용되는 SSH 동작원리를 살펴보고, SSH를 사용하여 EC2에 접속해보겠습니다.

SSH에서는 대칭키 방식과 비대칭키 방식을 모두 사용하여 인증과 암호화를 하게 됩니다. 비대칭키를 통해서 서버 인증과 사용자 인증을 하고, 대칭키(세션키)를 통해 데이터를 암호화 합니다.

참고로, 암호화 방식에는 대칭키 방식과 비대칭키 방식이 있습니다. 대칭키는 동일 키값으로 암호화와 복호화를 하는 방식이고, 비대칭키 방식은 암호화와 복호화를 서로 다른 키를 사용하는 방식입니다.

서버 인증

서버에 SSH 접속이 가능하기 위해서는 SSH 데몬이 설치되어야 합니다. SSH 설치 후 처음 구동될 때 내부적으로 비대칭키 (공개키와 비밀키)가 생성됩니다. 클라이언트가 서버에 처음 접속을 시도하면 공개키를 받을지 묻는 메시지가 나오고 사용자가 “Yes”를 선택하면 공개키를 받아서 클라이언트에 있는 .ssh/known_hosts 파일에 저장하게 됩니다.

클라이언트는 난수값을 발생시키고 난수값에 대한 해시값 생성해 저장하게 됩니다. 그리고 난수값을 공개키로 암호화하여 서버에 전송합니다. 서버에서는 암호화된 데이터를 비밀키로 복호화한 후 난수값을 알아냅니다. 복호화된 난수값을 통해 해시값을 다시 만든 후 클라이언트에 다시 전송합니다.

클라이언트에서는 저장하고 있는 해시값과 서버로부터 받은 해시값을 비교해 서버가 정상적인 서버인지 확인하게 됩니다. 이 과정이 서버 인증 과정입니다.

사용자 인증

사용자 인증은 서버 인증과 원리는 같지만, 서버와 클라이언트의 역할만 바뀌게 됩니다. 사용자 인증은 클라이언트에서 비대칭키(공개키와 비밀키)를 생성합니다. 여기서 생성된 공개키는 사용자가 서버에 있는 .ssh/authorized_keys 파일에 사전에 복사해둡니다. 서버는 공개키를 가지고 있고 클라이언트가 비밀키를 가지고 있게 됩니다.

서버에서 난수값을 생성 뒤에 해시값 만들어 저장합니다. 서버에서 난수값을 암호화해 클라이언트에 전송하게 되고, 클라이언트에서 암호화된 난수값을 비밀키로 복호화를 합니다. 복호화된 데이터로 해시값을 생성해 다시 서버에 보내게 됩니다.

서버에 저장 하고 있던 해시값과 클라이언트로부터 다시 받은 해시값을 비교해 정상적인 사용자인지를 확인하게 됩니다. 이 과정을 사용자 인증이라고 합니다.

데이터 암호화

서버 인증과 사용자 인증이 끝나면, 비대칭 키를 통해 클라이언트와 서버는 대칭키 (세션키라고 부름)을 서로 교환하게 됩니다. 그 후 통신 되는 모든 데이터는 세션 키를 통해서 암호화가 이루어집니다. 통신이 종료되면 세션키도 사용할 수 없습니다.

AWS EC2 접속 시 SSH 사용하기

AWS Console에서 EC2는 생성을 해보신 분은 쉽게 할 수 있기 때문에 그 과정은 생략합니다. EC2 생성 7단계에서 비대칭키를 생성하는 과정이 나옵니다.

여기서는 Key pair name 값을 입력하고 Download Key Pair 선택합니다. 그러면 비밀키가 웹브라우저 상에서 PC로 다운로드 됩니다. HTTPS로 암호화하여 내려받았기 때문에 중간에 해킹될 우려는 없습니다. 이 키를 잘 보관하여 서버 접속 시에 사용합니다.

이 부분은 앞에서 설명한 것과 좀 다른데, AWS에서는 서버에서 비밀키를 생성해 클라이언트에 전달해 주고, 자체적으로 공개키를 EC2 서버에 있는 .ssh/authorized_keys에 저장하여 생성하게 되는 것입니다. 결과는 같지만, 과정이 조금 다릅니다

비밀키(PEM 파일)를 생성하여 다운로드 받은 과정

방금 생성한 EC2에 접속하기 위한 접속 정보는 Actions 밑에 있는 Connect 메뉴에서 확인할 수 있습니다. PEM 파일이 400 Permission을 가지고 있지 않으면 에러를 발생시키기 때문에 먼저 chmod 명령어를 수행하여 Permission을 400으로 변경을 해줍니다.

그러고 나서 ssh 명령어로 접속을 하면 ECDSA key fingerprint 관련 내용이 나오는데, yes를 선택하게 되면 이 과정에서 서버 인증에서 사용할 공개키를 서버로부터 내려받아 클라이언트에 있는 .ssh/known_hosts 파일에 공개키를 기록합니다.

$ chmod 400 aws-ssh-private-key.pem
$ ssh -i "aws-ssh-private-key.pem" ec2-user@ec2-52-79-233-232.ap-northeast-2.compute.amazonaws.com

The authenticity of host 'ec2-52-79-233-232.ap-northeast-2.compute.amazonaws.com (52.79.233.232)' can't be established.
ECDSA key fingerprint is SHA256:F7H01iae8u5uIfi7BrySvlORfBAFwvpEeXj2U5pzTVY.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ec2-52-79-233-232.ap-northeast-2.compute.amazonaws.com,52.79.233.232' (ECDSA) to the list of known hosts.

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

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
10 package(s) needed for security, out of 12 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-22-125 ~]$

접속되었습니다.
서버인증과 사용자 인증이 거의 동시에 진행이 완료되었습니다. ssh 접속과정에서는 확인할 수는 없지만, 내부적으로 세션키(대칭키)를 생성하여 서로 주고받게 되고, 세션 키를 사용하여 데이터를 암호화해서 통신하게 되는 것입니다.
마지막으로 서버 인증과 사용자 인증에서 복사된 공개키가 서버와 클라이언트에 잘 저장이 되었는지 확인해보겠습니다.
서버의 authorized_keys 파일 내용을 보면 사용자가 등록해주지 않았지만, AWS에서 EC2 생성 과정에 자동으로 등록되었다는 알 수 있습니다.

[ec2-user@ip-172-31-22-125 .ssh]$ pwd
/home/ec2-user/.ssh
[ec2-user@ip-172-31-22-125 .ssh]$ cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCKc7wvHnik/DuKwZBNcPfudLnZE0SgwsP0PhFJgJ13MtYScHgQto6qmZcSJuvdlO6QymBrSFHSV4MZffSsBffLjBfCe4LbLR0pmlzR0Ivag06zBeNzpdeJH1mHIhXak5sFw6oQpnkbYiIXCw5X84RfUSrCE6tIyA1vzv/F5075qwOvS+MQBPgTCxnUv/fj61OzWr78xI/xwx0NgFHiZiV1nEj9Ju36EDnHamBFg/Z7Uy/hfARr4CnnrKoxqDk0HddbuZyOx6tVDMN/OH+gUvBy1rT4rAPNwfh81Ds1t6BN+cRZFd7CCLFylL7CjO6QXNoXPawblKTQq3CL0cBbFwDR aws-ssh-private-key
[ec2-user@ip-172-31-22-125 .ssh]$

아래는 클라이언트에서 known_hosts 파일 내용을 확인한 결과입니다. 서버의 공개키가 저장된 것을 확인할 수 있습니다.

MackBook-Pro:.ssh redwood$ pwd
/Users/redwood/.ssh
MackBook-Pro:.ssh redwood$ ls -l
total 8
-rw-r--r-- 1 redwood staff 402 1 26 16:15 known_hosts
MackBook-Pro:.ssh redwood$ cat known_hosts
ec2-52-79-233-232.ap-northeast-2.compute.amazonaws.com,52.79.233.232 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJPQP/DO7tvyBxisC/lWVjxJuwFyz44F945msKjCh7/CVhfG6Nap9xLf6l9Nc4uGEVaRgevAD8kDTIV8cSnT9dM=
MackBook-Pro:.ssh redwood$

--

--