AWS SSL 적용 방법
안녕하세요. AWS를 최근 만지고 있는 서버 개발자 JAKE AN 입니다.
AWS에는 그동안 서버 개발자들이 SSL certificate를 일일히 받아다가 보고 키를 하나하나 등록하는 과정으로 AWS에 등록을 해왔습니다.
그런데 이제는 AWS에서 ACM(Amazon Certificate Manager)를 통해서 AWS 내부에서 통합 관리 할 수 있게 되었습니다.
통합관리라는 뜻은 그동안 instance안에 인증서를 받아서 등록하시기도 하고 instance마다 등록을 해서 사용하시기도 했습니다.
또는 갱신 문제로 매번 갱신에 대한 관리 문제로 그 기일을 생각하고 있어야 하는 문제가 있었습니다.
한 예로, 인스타그램이 예전에 SSL이 기간이 만료되어서 접속이 안되었던 경험을 가지고 있는 걸로 알고 있습니다.
여기서, AWS ACM를 적극 이용을 해야하는 이유가 생깁니다.
1. 인스턴스 하나하나 적용했던 SSL이 한번에 여러 인스턴스에 적용할 수 있는 기능을 제공해줍니다. 물론 ELB, route53를 이용해서 가능합니다.
2. 도메인 소유자에게 이메일 형식으로 인증을 받아서 빠르게 승인만 하면 인증서 발급 사용하실 수 있습니다.
3. 매번 생각해야하는 인증서 갱신일을 기억해두었다가 또는 자동화 시켜야하는 번거로운 작업을 안해도 자동갱신을 해줍니다.
4. 비용이 무료이기 때문에 편리하게 사용만 하면 됩니다.
다만, 여기서 비용 측면에서 아쉬는 점은 작은 소형의 서버를 운영하고 계시는 분들은 route53을 이용할 필요도 ELB를 이용할 필요도 없으신데 SSL을 적용하기 위해서는 도메인이 필수적으로 있어야 하기 때문에 일단 도메인을 사야하고 도메인을 사고 적용을 하려면 routing을 해주는 route53을 이용해서 도메인을 연결해주어야합니다.
물론 추가 비용이 발생 하기 때문에 비용적인 측면의 아쉬움이라고 이야기 하였습니다. route53에 지나가는 트래픽의 양에 따라서 과금되는 구조이기 때문에 비용도 고려를 해야합니다.
* 저는 이번 시간에 ELB를 이용해 현재 사용하고 있는 서버의 instance를 묶어놨다고 가정하고,
Route53을 ELB에 연결하고 SSL을 적용하는 방법을 이야기해보겠습니다.
instance를 ELB에 묶는 방법에 대한 것은
->>> 참고 수정 : http://~~~~ 을 참고하시기 바랍니다.
위에 말씀드렸다시피 SSL을 구성하는데에는 준비물이 필요합니다. 총 3개의 준비물이 필요한데요.
첫번째로, 자기 소유의 도메인이 필요로하구요. 자기 소유가 아니더라도 도메인에 대한 인증절차를 통과하실 수 있는 계정을 가지고 계시다면 상관없습니다.
두번째로, ELB나 단일 instance가 필요합니다. 왜냐하면 도메인에 A record 에 등록시켜서 연결되게끔 하려고 합니다.
세번쩨로, Route53에서 Host zone이 필요로 합니다. 여기서 최초 첫번째 준비물인 자기 소유 도메인을 등록해서 연결을 해주는 첫 작업으로 사용할 예정입니다.
이제 본격적으로 준비물도 갖추어졌다고 생각이 되고 구현설명을 하면서 설명을 이어가도록 하겠습니다.
간단한 구현 로직부터 짜놓겠습니다.
1. 도메인을 구입 -> 2. 도메인 구입한 것을 AWS route53과 연결 -> 3. AWS ACM을 통해서 구입한 도메인의 SSL Certificate를 발급 -> 4. ELB에 SSL Listener 생성 -> 5. ELB security group 설정 -> 6. 최종 SSL 적용
순으로 적용을 합니다.
1. 도메인을 구입해보겠습니다. 저같은 경우에는 도메인을 사는 곳이야 많지만 도메인을 한곳에서 보유할 수 있는 관리 측면에서 보면 가비아라는 사이트를 선정해서 도메인을 관리하고 있습니다.
도메인을 사시면 다음과 같이 도메인이 나의 도메인 관리에 나타나게 됩니다.
이렇게 도메인을 구입하는 것은 끝났구요. 사이트 마다 도메인을 사는 방법이 다르기 때문에 도메인을 돈으로 사는 것은 직관적으로 결제과정으로 하실 수 있으실 것이라고 생각됩니다.
2. 도메인을 구입한 것을 AWS route53에 연결하셔야 하는데 연결하는 방법을 설명하겠습니다.
AWS에 들어가셔서 Route53이라는 서비스를 선택하셔서 들어갑니다.
들어가시면 Hosted zones -> Create Hosted Zone -> Domain Name -> Create 순으로 들어가셔서 구매하신 도메인을 입력하고 생성합니다.
그리고 생성된 도메인 리스트를 누르시고 Go to Record Sets 를 누르셔서 들어갑니다.
들어가시면 다음 Type NS 쓰여잇는 4가지의 "ns-XXXX.awsdns.XX.org ns-XXXX.awsdns.XX.net ns-XXXX.awsdns.XX.com ns-XXXX.awsdns.XX.co.uk" 주소를 복사합니다.
그리고 복사한 주소 4개를 도메인을 구매한 사이트에 접속하여 저같은 경우는 가비아에 접속하여 해당 도메인의 도메인 네임서버에 하나하나씩 등록해 줍니다.
등록한 모습은 다음과 같습니다. 그리고 저장해 주시면 예전에는 빠르게 주소가 등록이 되지 않고 최대 24~48시간까지 시간이 걸렸다고 하는데 저같은 경우에는 최대 6시간정도 걸리고 그이후로는 등록을 잘못하셨다고 보면 됩니다.
지금 블로그를 쓰는 경우에는 15분 정도 걸렸습니다.
3. 이제 도메인에 대한 ACM(Amazon Certificate Manager)에서 증명서를 발급하셔야합니다.
일단 AWS Dashboard에서 Certificate Manager을 들어갑니다.
그리고 Request a certificate를 들어갑니다.
Domain name 부분에 아까 구입하시고 Route53에 등록하셨던 Domain name을 입력하시고 "Add another name to this certificate" 를 누르시고 "Review and request"를 누르셔서 진행합니다.
다음 화면에서 "Confirm and request"를 누르시면 www.example.com를 가진 소유자에게 AWS에서 증명서에 대한 확인 메일을 보내게됩니다.
여기에서의 경우는 구매한 도메인에게 보내겠죠. 즉, 가비아에서 구매하려고 계정을 만드셨을때 입력하셨던 도메인으로 가게됩니다.
가비아에서 입력했던 이메일로 가보시면 이메일이 다음과 같이 온것 을 확인하시고 빨간 승인 부분으로 들어가시면,
다음과 같이 "I Approve"를 누르시면 SSL Certificate가 발급이 완료됩니다.
그리고 다시 Certificate Manager로 돌아가시면 다음과 같은 모습을 보시면 ACM에서 Certificate를 받는 부분은 완료되었습니다.
4. ELB에 SSL Listener 등록을 해줍니다.
ELB SSL Listener를 열어주는 이유는 Instance에게 ELB로 들어오는 트래픽을 전달해주는 역할을 하기 때문입니다.
ELB에 들어가셔서 "Edit listners"를 눌러줍니다.
들어가시면 다음과 같은 메뉴가 나타게 되는데 여기서 HTTPS를 추가해서 instance로 전달할 포트 #를 지정하시고 넘겨주시면 됩니다.
여기서는 80번으로 트래픽을 넘겨서 instance에서 처리하기 때문에 이렇게 입력을 했습니다.
그리고 SSL Certificate라는 부분의 Change를 누릅니다.
누르시면 Select Certificate라는 것이 나오는데 "Choose an existing certificate from AWS Cerstificate Manager (ACM)"을 선택하시고, 밑에 Certificate를 등록한 도메인의 Certificate로 등록을 하시고 "Save"를 누릅니다.
그리고 다음과 같은 화면이 나오고 Save를 누르시면 Listener에 SSL certificate를 적용하시는게 완료됩니다.
5. ELB Security Group 설정 Listener로 전달할 준비까지 했으니 이제 보안정책인 Security Group를 바꿔주는 절차를 진행하려고 합니다.
EC2를 잘 사용하시는 분은 무슨 말을 하는 건지 단박에 알아 차리셨을 겁니다.
허락하지 않은 포트나 IP대역으로 접근하는 것을 막고자하는 보안정책을 지정할 수 있습니다.
EC2에 Security Groups를 들어가셔서 "Create Security Group"을 선택하셔서 원하시는 Inbound 정책을 설정하시는데 여기서는 제가 SSL에 대한 443 포트를 허용해주겠습니다.
"Add Rule"을 누르셔서 HTTPS를 추가해주시고 파란색으로 표시한 Anywhere 0.0.0.0/0 부분은 원하는 정책에 따라서 허용할 IP Adress를 CIDR(Classless Inter-Domain Routing)방식으로 표기하셔서 넣어주시면 됩니다.
그리고 마지막으로 다시 Load Balancers로 들어가셔서 Security의 Edit을 통해서 만드신 Security Group를 적용하시면 이번 적용이 끝나게 됩니다.
6. 이제 모든 SSL을 사용할 모든 준비는 끝나셨습니다. 이제 해야할 것은 처음에 구입하시고 Route53에 등록해놓았던 도메인을 Route53에서 ELB와 연결만 하시면 SSL 적용은 마무리 되게 됩니다.
여기서 중요한 것은 도메인이 입력되었을때, 연결되어질 instance의 IP나 ELB의 도메인을 A record로 입력해서 저장하는 것입니다.
해보겠습니다.
다시 위에서 설명하였던 도메인의 Hosted Zones으로 들어가 등록하신 도메인을 누르시고 "GO to Record Sets"을 통해서 들어갑니다.
"Create Record Set"을 누르시고 Type에는 "A - IPv4 address"로 들어가셔서 Alias를 yes로 선택하시고 Alias Target를 누르시고 아까 설정을 완료하였던 LoadBalancer의 도메인을 선택해주시고 아래의 "Create"를 누르시면 끝나게 됩니다.
A type의 도메인 Record가 생성된 것을 보실 수 있으실 겁니다.
* 마무리
이제 https://example.com 도메인을 이용해서 SSL로 사용하실 수 있습니다.
여기서 추가적으로 말씀드리고 싶은 것은 도메인 네임서버를 등록하실 때 네임서버가 갱신하는 시간이 도메인 형식마다 주관기관이 다르기 때문에 다르다는 것을 알고계셨으면 합니다.
입력한 정보가 네임서버에 등록이 되었는지 확인하는 사이트는 https://www.ultratools.com/tools/dnsLookupResult 이구요.
NS 부분에 route53 NS type의 Record에 써있던 ns-XXX.awsdns-XX.XXX 형식의 주소 4개가 결과에 나와있으면 연결이 되신겁니다.
추가적인 자료를 첨부하겠습니다.
---------------------------------------------------------------
네임서버 변경을 한뒤 적용 되기 전까지 사이트가 접속이 되지 않는 경우가 발생 하죠.
네임서버 갱신 되는 시간은 도메인 마다 지정된 시간이 있습니다.
따라서 변경 되기 전 30분 정도 남겨두고 적용 한다면 빠른 접속이 될 것으로 보입니다.
물론 전세계 DNS로 업데이트 정보가 전달 되어야 하겠지만, 왠만한 국내 DNS 들은 동시에 갱신 됩니다.
KT, SK(하나로 DNS), LG데이콤 등은 그의 동시에 적용된다고 보면 됩니다.
물론 지역마다 다소 차이는 납니다.
- 국제 도메인 .com 과 .net 의 경우엔
3~4시간이 소요 (전 세계 13대의 루트 네임서버가 운영되는 도메인으로 실시간 루트 네임서버 변경을 지원)
- 한국인터넷진흥원의 .KR 네임서버 하루 3번 업데이트
전일 18:00 ~ 금일 08:00 변경 건 : 금일 08:20 업데이트
금일 08:00 ~ 금일 12:00 변경 건 : 금일 12:20 업데이트
금일 12:00 ~ 금일 18:00 변경 건 : 금일 18:20 업데이트
co.kr 등 .kr 도메인의 경우 하루 3번 업데이트 하므로 업데이트 시간 범위 끝날 무렵에 적용하면 됩니다.
예로 9:20분에 네임서버를 변경한다면 12:20 이 될 때까지 그의 3시간 동안 사이트 접속이 되지 않지만 11:50에 적용한다면 대략 30분 정도 끊어 지게 됩니다.
주의! 업데이트 후 바로 접속되는 경우는 KT 또는 하나로 DNS를 이용하는 PC들의 접속에 해당합니다.
간혹 공유기에서 제공하는 DNS라던지 특정 DNS를 이용하고 있다면 해당 DNS가 갱신 되지 않는한 변경된 네임서버 IP정보로 접속하지 못하게 됩니다.
따라서, 피해를 최소화 하기위한 참조 사항이므로 네임서버 적용시에는 통상 2~3일 정도 소요 된다고 보셔야 합니다.
---------------------------------------------------------------