AWS EC2 Key Pair 만들고 관리하기

AWS 사용자라면 EC2 Private Key (일명 PEM파일) 관리때문에 고민한적이 한번 이상은 있을것 같다. 이 키를 분실하면 이미 띄워둔 EC2에 SSH로 접속할수 없게 되기 때문이다. 좀더 쉽게 설명하자면, 마스터 키를 분실해서 집에 못 들어가는 상황이 되는 것이다. 분실하지 않는다고 해도 유출될 경우 해커가 아무런 제제 없이 EC2에 SSH로 접속할수 있게 된다. EC2는 AWS가 관리하는 공개된 퍼블릭 IP 대역 내에서 IP를 할당받기 때문에 해커는 (이론적으로) PEM만 확보하면 접속 가능한 모든 IP 대역에 대해서 접속 시도를 해볼수 있다. 이러다 당신의 EC2가 재수없게 걸리면 끝장나는 것이다.

분실되더라도 바로 복구하고 유출되더라도 바로 방어할수 있으려면 어떻게 해야 할까? 가장 좋은 방법은 아예 PEM 키가 필요 없도록, Serverless 아키텍쳐로 시스템을 구성하여 EC2 없이 어플리케이션을 운용할수 있도록 하는 것이다. 하지만 어떤 작업들은 Serveless 로 대체하기 힘들수도 있다. 이런 경우엔 주기적으로 PEM 파일을 교체해주는 것이 좋다. Blue/Green Deployment로 배포를 구성하여 업데이트 될때마다 새로운 EC2가 새로운 PEM 키를 물고 뜨도록 해주고 유출된 키를 가진 EC2는 키와 함께 폐기해 주면 된다. 실제로 대형 시스템을 운영할 경우 주기적으로 SSH Key등을 교체하라는 보안 요구사항이 종종 있다.

하지만 키를 만드는 과정은 좀 혼란스러운데 왜냐면 1) EC2용 KeyPair를 만들수 있는 방법이 AWS 문서만 봐도 여러가지이고 2) AWS에서 직접 만들어줄 경우 local에서 업로드 하는 것과 다른 Fingerprint로 보여지기 때문이다. 예를들어 AWS Web Console에서 PEM키를 만들고 이의 Fingerprint를 local에서 확인해보면 AWS의 그것과 다르다! 심지어 만들어진 PEM키의 Public 키를 생성해서 다시 AWS에 올리면 원본 PEM을 만들때 생성된 Fingerprint가 이번에 올린 Public Key의 Fingerprint와 다르게 찍혀있다.

Fingerprint가 동일해야 EC2 생성에 쓰인 Public Key와 현재 접속에 사용하려는 Public Key가 서로 똑같음을 확인할수 있는데 이게 AWS에서 계산하는 방식 때문에 다르게 보여서 혼란스러워 진다. 그러다가 Fingerprint를 제대로 확인하지 못한채로 A 계정의 Public, Private키를 B 계정용이라고 저장하거나 OpenSSH Public키를 Public Key Material로 넣는 등의 실수가 벌어진다. 내가 이런 실수를 저질렀고 이 실수를 방지하고자 Key를 바른 방법으로 완전히 새롭게 생성하는 과정을 스크립트화 해야 겠다고 생각했다.

아래 스크립트는 다음의 일들을 해준다.
1. openSSL로 Public(.pub)과 Private 키(.pem)를 파일로 생성해준후
2. AWS CLI 명령과 같이 쓸수 있는 Pubic Key Material를 생성해준다.
3. OpenSSH 형식으로 id_rsa.pub에 넣을수 있는 ssh 키를 생성해준다.
4. Console에 정상적으로 Key가 import 되는지 비교해볼수 있는 Fingerprint를 생성해준다.

실행하면 아래와 같이 동작한다.

$ ./create-key-pair.py my_example_key 
Generating RSA private key, 2048 bit long modulus
...................................+++
..................................................................................+++
e is 65537 (0x10001)
Private key file: my_example_key.pem
writing RSA key
Public key file: my_example_key.pub
AWS_KEY_PAIR_NAME: my_example_key
AWS_KEY_PAIR_MATERIAL: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnSOgKMZv0UhE/C8B7S7d7JClTn9E6zVbOEI+b/p1gLhv/MYEXAMPLEKEY/tgqNkTpmb2+93kzjvTJa3wNAKn6/4zyM7HdZsWpWedsCRoUQrS9dzZxiyN4ZVr6ivchbX+4aKVfluBxAErLavABKYJh/MwDrxWsKFGlBDjEkNTs2s4drlvaPspdAxHoHYz4OHFzKjMLPW7sWlcnnhXjY+YAI3EmxgxWhlWoyyEY6kvdDsIrvYn48f0eE5jt6+FYnGdXDnpF/UtMYEXAMPLEKEY
OpenSSH public key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCdI6Aoxm/RSET8LwHtLt3skKVOf0TrNVs4Qj5v+nWAuG//MYEXAMPLEKEY+2Co2ROmZvb73eTOO9MlrfA0Aqfr/jPIzsd1mxalZ52wJGhRCtL13NnGLI3hlWvqK9yFtf7hopV+W4HEASstq8AEpgmH8zAOvFawoUaUEOMSQ1Ozazh2uW9o+yl0DEegdjPg4cXMqMws9buxaVyeeFeNj5gAjcSbGDFaGVajLIRjqS90Owiu9ifjx/R4TmO3r4VicZ1cOekX9S3w1261QUtMYEXAMPLEKEY
OpenSSH finger print: 41:cd:d7:24:f0:4e:84:aa:bb:cc:dd:ee:ff:gg:hh:xx

AWS_KEY_PAIR_MATERIAL 값을 AWS WebConsole에 AWS_KEY_PAIR_NAME에 적힌 이름으로 직접 Import 하고 Fingerprint 값을 비교해보면 일치하는 것을 확인할수 있다.

나중에 정체불명의 키를 구했다 하더라도 위 스크립트를 참고하여 Fingerprint를 생성해본 다음 AWS Web Console에 들어있는 그것과 비교해보면 된다. 이 스크립트로 EC2용 SSH Key-Pair 생성을 쉽고 올바르게 하는데 도움이 되었음 한다.


위 정보가 많은 도움이 되셨다면 저희 HBSmith도 한번 방문해 주시면 어떨까요? HB Smith는 바쁜 개발자/운영자 및 관리자 여러분을 대신해 여러분의 REST API 들이 항상 잘 돌아가고 있는지 24/365 모니터링 해주는 모니터링 서비스입니다. 저희에게 직접 문의하실 경우 저희가 알아서 모니터링 및 장애시 연락까지 해드리는 컨시어지 서비스도 제공중입니다. 많은 신청 부탁드립니다 :)