다루는 내용
· ELB에 SSL 사용하기
· CloudFront에 SSL 사용하기
실습
ELB에 SSL를 사용하기 위해서는 콘솔상에서 인증서를 바로 등록할 수 있다. 하지만 CloudFront에 인증서를 사용하기 위해서는 IAM에 등록하여 사용하여야한다. ELB는 IAM에 등록된 인증서도 사용할 수 있으므로 여기서는 IAM에 인증서를 등록하는 방법으로 실습해 본다.
SSL 인증서 준비
인증서는 openssl을 통해 사설 인증서를 만들 수도 있고, CA에서 구입하여 사용할 있다. 테스트 목적으로는 사설 인증서를 사용해도 되지만, 실 서비스를 위해서는 공인된 기관에서 발급된 인증서를 사용하여야한다. 이 실습에서는 CA에서 발급 받은 wildcard 인증서를 사용한다. 참고로 wildcard 인증서가 *.domain.com 인 경우 www1.domain.com, www2.domain.com 등을 지원하지만, www1.sub.domain.com, www2.sub.domain.com 처럼 multi-level을 지원하지는 않는다.
IAM에 SSL 인증서 등록
1. EC2에 접속해서 환경 설정을 한다.
∙ CLI를 사용하기 위한 권한 적용
∙ 인증서 파일
2. CLI를 이용하여 IAM에 인증서 업로드
∙ aws iam upload-server-certificate 실행
∙ 결과
3. CLI를 이용하여 IAM에 등록된 인증서 확인
∙ aws iam get-server-certificate –server-certificate-name ssl_elb_arang
4. CLI를 이용하여 IAM에 등록된 인증서 삭제
∙ aws iam delete-server-certificate –server-certificate-name ssl_elb_arang
웹 서버 생성
ELB에서 사용할 웹 서버를 두 대 이상 준비한다. 필요한 경우 아래의 USER DATA를 사용하기 바란다.
ELB 생성
1. 콘솔에서 EC2 클릭
2. 왼쪽 메뉴에서 Load Balancers 클릭
3. Create Load Balancer 클릭
4. Create Load Balancer 창에서
∙ Load Balancer name : ELB-SSL 입력
∙ Load Balancer Protocol : HTTPS 변경
∙ Load Balancer Port : 443
∙ Continue 클릭
5. Select Certificate 창에서
∙ Certificate Type : Choose an existing SSL Certificate 선택
∙ Certificate Name : ssl_elb_arang 선택
∙ Continue 클릭
Upload a new SSL Certificate를 선택하면 CLI를 사용하지 않고도 ELB 화면에서 인증서를 직접 등록할 수 있다.
6. Select a Cipher 창에서
∙ Predenfined Security Policy : 최신 날짜 선택
SSL 프로토콜이나 취약 버전등에 대해 잘 알면 Custom Security Policy를 선택하여 필요한 항목을 선택할 수 있다.
∙ Continue 클릭
7. Configure Health Check 창에서
∙ Ping Protocol : HTTP
∙ Ping Path : /
∙ Continue 클릭
8. Assign Security Groups 창에서
∙ Select an existing security group : (HTTPS가 허용되어 있는 보안 그룹) 선택
∙ Continue 클릭
9. Add Instances to Load Balancer 창에서
∙ 앞에서 생성한 웹 서버 선택
∙ Continue 클릭
10. Add Tags 창에서
∙ Continue 클릭
11. Review 창에서
∙ Create 클릭
12. 확인
∙ Description 탭
DNS Name : ELB-SSL-1908291141.us-west-2.elb.amazonaws.com 복사
∙ Health Check 탭
각 인스턴스를 HTTP:80 으로 요청하여 헬스 체크 한다.
∙ Listeners 탭
사용자로부터 ELB가 받는 요청은 HTTPS:443이고, ELB가 웹 서버에 요청할 때는 HTTP:80을 이용한다. HTTPS:443으로 변경 가능하며, 이 경우 각 웹 서버에는 인증서가 등록되어 있어야 한다.
Route53 등록
1. 콘솔에서 Route53 클릭
2. Hosted Zones 클릭
3. 호스트 존 등록
∙ 가이드 문서 #29. Route53에서 Public DNS와 Private DNS 활용 참고
∙ 실습에서는 aws-arang.gscdn.com 이라는 호스트 존 등록
4. 레코드 셋 등록
∙ 생성한 호스트 존 클릭
∙ Create Record Set 클릭
5. Create Record Set 에서
∙ Name : (공백으로 비워 둔다)
입력을 할 경우 test.aws-arang.gscdn.com 처럼 2차 서브 도메인이 생성되게 되고, 앞에서 언급하였듯이 *.gscdn.com wildcard 인증서는 multi-level 서브 도메인을 지원하지 않는다.
∙ Alias : Yes 선택
∙ Alias Target : ELB의 DNS Name 선택
∙ Create 클릭
HTTPS 접속 확인
1. 브라우져에서 https://aws-arang.gscdn.com 입력
2. 주의
∙ ELB의 도메인으로 접속을 시도하거나 2차 서브 도메인으로 접속할 경우 인증서에 등록된 도메인과 일치하지 않아 다음과 같은 화면을 리턴한다.
∙ SSL Checker를 통해서 진단해보기 바란다.
SSL을 사용하기 위한 CloudFront 생성
CloudFront는 AWS에서 제공하는 인증서로 HTTPS 서비스를 할 수 있다. 하지만 *.cloudfront.net 형식의 도메인을 사용하여야 한다. 다른 도메인을 사용하여 SSL을 적용하기 위해서는 인증서를 등록해 주어야 한다.
1. CLI를 이용하여 IAM에 인증서 업로드
∙ aws iam upload-server-certificate 실행
–path /cloudfront/xxxx/ 옵션이 추가되어야 한다.
2. 콘솔에서 CloudFront 클릭
3. Create Distribution 클릭
4. Web 섹션의 Get Started 클릭
5. Origin Settings 섹션
∙ Origin Domain Name : arang.s3.amazonaws.com 선택 (S3 버킷 선택)
∙ Origin Path : 버킷에있는 디렉토리를 CloudFront의 root 경로로 지정할 경우
6. Default Cache Behavior Settings 섹션
∙ Viewer Protocol Policy : HTTPS Only 선택
7. Distribution Settings 섹션
∙ Alternate Domain Names : aws-arang.gscdn.com 입력
∙ SSL Certificate : Custom SSL Certificate (ssl_cf_arang) 선택
∙ Custom SSL Client Support : Only Clients that Support Server Name Indication (SNI)
∙ Create Distribution 클릭
Route53 등록
CloudFront에 사용할 도메인을 Route53에서 등록해 준다. ELB에서 등록했던 것과 동일하며 Alias Target의 값만 CloudFront 도메인으로 변경하면 된다.
1. 콘솔에서 Route53 클릭
2. Hosted Zones 클릭
3. 호스트 존 등록
∙ 가이드 문서 #29. Route53에서 Public DNS와 Private DNS 활용 참고
∙ 실습에서는 aws-arang.gscdn.com 이라는 호스트 존 등록
4. 레코드 셋 등록
∙ 생성한 호스트 존 클릭
∙ Create Record Set 클릭
5. Create Record Set 에서
∙ Name : (공백으로 비워 둔다)
입력을 할 경우 test.aws-arang.gscdn.com 처럼 2차 서브 도메인이 생성되게 되고, 앞에서 언급하였듯이 *.gscdn.com wildcard 인증서는 multi-level 서브 도메인을 지원하지 않는다.
∙ Alias : Yes 선택
∙ Alias Target : dhjy6v0ryjrfz.cloudfront.net 입력
∙ Create 클릭
HTTPS 접속 확인
1. 브라우져에서 https://aws-arang.gscdn.com 입력
부연 설명
1. AccessDenied 응답
∙ 위와 같은 메시지는 CloudFront가 정상적으로 HTTPS 요청을 받았지만, 원본에 접근 권한이 없는 경우이다. S3를 원본으로 사용하는 경우 가이드 문서 #21. 아마존 S3 활용을 참고하자.
2. ERROR 응답
∙ 이러한 메시지는 잘 못된 요청을 한 경우이다. 대게 HTTPS Only 설정한 상태에서 HTTP 요청을 한 경우 차단된 메시지다.
3. CNAME 설정
∙ 기본 CloudFront 도메인을 사용하지 않고, Custom 도메인을 사용할 경우 반드시 Alternate Domain Names(CNAMEs) 항목에 사용할 도메인 명을 입력하여야 한다.
4. Custom SSL Client Support 설정
∙ All Clients : 전용 CloudFront IP를 사용하며, 모든 SSL 요청에 응답한다. 하지만, 전용으로 사용되므로 가격이 비싸다.
∙ Only Clients that Support Server Name Indication (SNI) : SNI를 사용한다. SNI를 지원하지 않는 구 버전의 브라우져 등에서 정상적으로 응답하지 않을 수 있다.
5. 원본 설정
∙ CloudFront를 default domain으로 사용하고, S3를 사용할 경우 둘 사이의 통신은 기본적으로 HTTPS로 이루어진다.
∙ CloudFront를 Custom domain으로 사용할 경우 S3와는 HTTPS통신을 할 수 없다. HTTP로 이루어진다.
∙ CloudFront를 Custom domain으로 사용하며 원본과 HTTPS 통신을 하기 위해서는 Custom 원본을 사용하여야 하며, 원본의 웹 서버에도 SSL 설정이 되어 있어야한다. 이 경우 Origin Protocol Policy를 Match Viewer로 선택하면 CloudFront에 들어온 요청 프로토콜 그대로 원본으로 보내게 된다.
참고
- SSL과 인증서에 대한 이해 : http://opentutorials.org/course/228/4894
- 인증서 생성 및 등록 : http://docs.aws.amazon.com/IAM/latest/UserGuide/InstallCert.html#ManagingServerCerts-prereqs
- ELB에 인증서 등록 : http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/US_UpdatingLoadBalancerSSL.html#us-update-lb-SSLcert-cli
- SSL 진단 : https://www.sslshopper.com/ssl-checker.html
- CloudFront SSL : http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html