서버에 원격으로 접속할 때, 외부의 보안 위협으로부터 안전하게
접속하려면 'SSH'라는 보안 방식을 적용해서 접속해야 한다.
그렇다면 SSH란 정확히 무엇일까?
이번 포스팅에서는 SSH의 개념과 SSH-keygen을 사용하여 키 페어를 만들어
원격 서버에 접속하는 방법을 포스팅해보겠다.
SSH 란??
SSH란 Secure Shell의 줄임말로, 원격 호스트에 접속하기 위해 사용되는 보안 프로토콜이다.
(*Shell이란 명령어와 프로그램을 사용할 때 쓰는 인터페이스를 말한다. 좀 더 자세하게 표현하자면 커널과 사용자를 연결시켜주는 역할을 한다. 사용자가 명령어를 입력하면 해석해서 커널로 옮겨 실행하는 역할을 해주는 것이다.)
기존 원격 접속은 Telnet이라는 방식을 사용했는데, 암호화를 제공하지 않기 때문에 보안상 취약하다는 단점이 있었다. 때문에 이를 암호화하는 SSH기술이 등장했고, 현재 원격 접속 보안을 위한 필수&기본 방법으로 사용되고 있다. 특히, 클라우드 컴퓨팅 서비스 특성상 서버에 원격으로 접속하여 접근하기 때문에 많이 사용되고 있다.
SSH의 작동원리
SSH는 원격 서버에 접속할 때 암호화를 통해 보안을 유지할 수 있기 때문에 사용한다는 것은 알았다. 그럼 어떤 원리로 SSH는 원격 접속에 대한 암호화가 가능한 것일까?
암호화의 핵심 키워드는 바로 "KEY"에 있다. 클라이언트(사용자)와 호스트(서버)는 각각 서로를 확인할 수 있는 KEY(키)를 보유하고 있으며, 이를 사용하여 연결 상대를 인증하고 안전한 게 데이터를 주고받을 수 있는 것이다.
KEY Pair을 생성하는 방식은 '대칭키'와 '비대칭키(공개키)' 이렇게 2가지가 있다.
서버 인증
SSH 설치 후 처음 구동될 때 내부적으로 비대칭키가 생성된다. 클라이언트가 서버에 처음 접속을 시도하면 공개키를 받을지 묻는 메시지가 나오고 "Yes"를 선택하면 공개키를 받아서 클라이언트(사용자)에 있는 ". ssh/known_hosts" 파일에 저장하게 된다.
클라이언트는 난수 값을 발생시키고 난수값에 대한 해시값을 생성해 저장하게 된다. 그리고 난수값을 공개키로 암호화하여 서버에 전송한다. 서버에서는 암호화된 데이터를 비밀키로 복호화한 후 난수값을 알아낸다. 복호화된 난수값을 통해 해시값을 다시 만든 후 클라이언트에 다시 전송한다.
클라이언트에서는 저장하고 있는 해시값과 서버로부터 받은 해시값을 비교해 서버가 정상적인 서버인지 확인한다.
사용자 인증
사용자 인증은 서버 인증과 원리가 같으며, 서버와 클라이언트의 역할만 바뀐다고 생각하면 된다. 사용자 인증은 클라이언트에서 배 대칭키를 생성한다. 여기서 생성된 공개키는 클라이언트(사용자)가 서버에 있는. ssh/authorized_keys 파일에 미리 복사해 놓는다. 서버는 공개키를 갖게 되고 클라이언트는 비밀키를 갖게 된다.
서버에서는 난수 값을 생성 뒤에 해시값을 만들어 저장한다. 서버에서 난수값을 암호화해 클라이언트에 전송하게 되고, 클라이언트에서 암호화된 난수값을 비밀키로 복호화한다. 복호화된 데이터로 해시값을 생성해 다시 서버에 보내게 된다.
서버에 저장하고 있던 해시값과 클라이언트로부터 다시 받은 해시값을 비교해 정상적인 사용자인지를 확인하여 사용자 인증을 진행한다.
-CC
- 비대칭키 방식
사용자가 키 페어(Key pair)를 생성했을 경우, 공개 키를 서버에 전송한다. (*공개키는 Public 하기 때문에 누구나 가질 수 있다. 때문에 전송 과정에서 유출에 되어도 크게 문제가 되지 않는다.) 서버는 공개 키를 받아서, 이 공개 키로 만들어진 랜덤 한 값을 생성한다. 서버는 생성한 랜덤 값으로 사용자(클라이언트)가 올바른 키 페어를 가지고 있는지 확인할 수 있다.
키 페어 사용 후 서버에 공개키를 전송했다면, 개인키는 사용자의 로컬 저장소에 에 저장한다. 개인 키는 공개 키와 달리 유출되면 안 되는 중요한 파일이다. 그동안 CSP(Cloud Service Provider)를 이용하면서 서버 생성 시에 제공받았던 pem파일이 바로 개인키이다. 이렇게 최초 접속 시 사용자와 서버 간의 인증절차는 비대칭키 방식을 통해 완료된다.
1) 장점: 키 분배가 필요하지 않음. 인증 기능 제공
2) 단점: 암호화 및 복호화 속도가 느림
3) 방식 :
(1). 공개키로 암호화한 내용은 공개키로 복호화할 수 없고 개인키로 복호화가 가능하다.
(2). 개인키로 암호화한 내용은 개인키로 복호화할 수 없고 공개키로 복화 하가 가능하다.
4) 대표적인 알고리즘: Diffie-Hellman (DH), RSA, DSA, ECC
- 대칭키 방식
이제 서로에 대한 인증절차가 끝났으니, 정보를 주고받을 차례이다. 주고받는 과정에서 정보를 안전하게 전송하기 위해 암호화를 진행한다. 이 과정에서 대칭키 방식이 사용된다. 대칭키 방식은 비대칭키 방식과 달리 한 개의 키만을 사용한다. 사용자와 서버는 동일 키를 갖고 정보를 주고받으며 정보 교환이 완료되면 사용했던 대칭키는 폐기하고, 접속할 때마다 새로운 대칭 키를 생성하여 사용한다.
1) 장점: 암호화 방식에 속도가 빠르다. 대용량 Data 암호화에 적합하다.
2) 단점: 키 관리 방식이 비효율적이다. 매번 새로운 대칭키를 생성해야 함.
3) Session key. Secret key, Shared Key 등이라고 함.
4) 대표적인 알고리즘 : SEED, DES , AES
EC2 Instance에 SSH-Keygen을 사용하여 생성한 키 페어로 접속하기
EC2 인스턴스에 접속하기 위한 키 페어를 생성하는 방법은 2가지 방법이 있다.
1) EC2를 생성할 때 키페어를 같이 생성.
2) 서드파티 툴을 사용하여 키 페어를 생성 후 EC2에 퍼블릭 키를 가져오기.
둘 중 두 번째 방법에 대해서 알아보자!
1. SSH-keygen으로 키 페어 생성
ssh-keygen -t rsa -b 2048 -C "test"
❯ ssh-keygen -t rsa -b 2048 -C "test"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/-/.ssh/id_rsa): /Users/-/Documents/Pemkey/test
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/-/Documents/Pemkey/test
Your public key has been saved in /Users/-/Documents/Pemkey/test.pub
The key fingerprint is:
SHA256:PW805Q+f8usF+qFh99Xo4bLURnBKo0yxEuszFtKDD84 test
The key's randomart image is:
+---[RSA 2048]----+
| . . |
| o o o |
| + * o + o |
| o = B o B |
| E S = + = |
| . o + = *o|
| B.B.*|
| +.Oo+o|
| oo=+o|
+----[SHA256]-----+
- t : 암호화하는 타입이다. 특별한 경우가 아니라면 가장 자주 사용하는 rsa 타입으로 설정하면 되겠다.
- b : 암호의 bit 수를 의미하며 default값은 2048이다.
- f : 저장할 파일 위치와 이름.
- C : 주석 부분으로 역할이 특별히 없다.
해당 명령어를 실행하면 키 페어가 저장되는 경로를 지정할 수 있으며 Identification(비밀키)와 Public key(공개키)가 해당경로에 저장되었다는 문구를 확인할 수 있다.
AWS EC2에서 지원하는 옵션
* 지원되는 유형: RSA 및 ED25519. Amazon EC2는 DSA 키를 허용하지 않습니다.
* 지원되는 길이: 1024, 2048 및 4096입니다.
2. 생성한 키페어 중 퍼블릭 키를 AWS EC2-Console에서 등록
1) Kep Pairs console을 찾아 들어가 보자
2) 우측 상단의 Actions -> Import key pair 선택
3) Browse에서 생성한 key-pair-id.pub (공개키)를 넣어준다.
- 인스턴스 생성 시. ssh/authorized_key에 넣어주기 위해
4) 인스턴스 생성 시 key pair 선택할 때 위에서 만들어 놓은 비밀키로 설정한다.
5) 해당 인스턴스에 설정해놓은 개인 키로 접속
ssh -i "test" ec2-user@ec2-13-124-191-55.ap-northeast-2.compute.amazonaws.com
인스턴스의. ssh/authorized_keys에 들어가서 확인해보니 사전에 등록해 놓은 pub키가 제대로 들어가 있다.
[ec2-user@ip-172-31-4-222 ~]$ cd .ssh
[ec2-user@ip-172-31-4-222 .ssh]$ ls
authorized_keys
[ec2-user@ip-172-31-4-222 .ssh]$ cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCWrRVg6W+wfK1RFCVGNVbnWbLMu0XrDV0
MOOWNAeefnAmJF+lWei+vm7mxhE0dVirA8xiTvgEBy6KI+3lJdKwEg07Y+Q0DO2PHdNDLTtER86
RU6ErLWwyAqxgHy8sgk+wCY6W385GltcqIjqI7tc9AYRgPS4RkL ......7fwAET537ykhs2B5kz4cc/DmD7zATp0Axg1pxsQMic
ITDHX6NBs6TpS6CbxXs0D+MFtxixvVd6fKGyTXhfoJCt6n1ocztnN
OpQ9DsMT2DfYWpOWBx+wiRpx03 test
-CC
댓글