Elastic Beanstalk 환경에 HTTPS를 구성하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2020년 12월 18일

로드 밸런스에서 Amazon EC2(Amazon Elastic Compute Cloud) 인스턴스로의 데이터를 암호화할 수 있도록 AWS Elastic Beanstalk 환경에 HTTPS를 구성하고 싶습니다.

간략한 설명

Elastic Beanstalk 환경을 위한 사용자 지정 도메인 이름을 구매하고 구성한 경우 HTTPS를 사용하여 사용자가 웹 사이트에 안전하게 연결하도록 허용할 수 있습니다. 도메인 이름을 소유하지 않은 경우에도 개발 및 테스트 목적으로 자체 서명된 인증서와 함께 HTTPS를 사용할 수 있습니다.

AWS Certificate Manager (ACM)는 서버 인증서를 프로그래밍 방식으로 프로비저닝, 관리 및 배포하는 데 권장하는 도구입니다. AWS 명령줄 인터페이스(AWS CLI)를 사용할 수도 있습니다. AWS 리전에서 ACM을 사용 할 수 없는 경우 AWS CLI를 사용하여 타사 또는 자체 서명된 인증서와 프라이빗 키를 AWS Identity and Access Management(IAM)에 업로드할 수 있습니다.

참고: AWS 명령줄 인터페이스(AWS CLI) 명령을 실행할 때 오류가 발생할 경우 AWS CLI의 최신 버전을 사용하고 있는지 확인하세요.

해결 방법

Elastic Beanstalk 환경 준비

1.    Elastic Beanstalk 환경으로 트래픽을 라우팅하려면 Amazon Route 53 또는 다른 도메인 공급자를 사용하여 새 도메인을 등록합니다.

2.    환경의 URL에 AWS 리전이 포함된 경우 별칭 이름을 생성합니다. 또는 환경의 URL에 AWS 리전이 포함되어 있지 않은 경우 CNAME 레코드를 생성합니다.

중요: 2016년 이전에 생성된 환경에 CNAME 레코드를 사용할 수 있습니다. Zone Apex 도메인(루트 도메인 또는 네이키드 도메인이라고도 함)에는 CNAME 레코드를 사용할 수 없습니다. 자세한 내용은 별칭 및 비 별칭 레코드 선택을 참조하십시오.

3.    ACM에서 인증서를 생성하거나 타사 또는 자체 서명된 인증서와 프라이빗 키를 IAM에 업로드합니다.

로드 밸런서에 리스너 추가

1.    Elastic Beanstalk 콘솔을 열고 환경을 선택합니다.

2.    탐색 창에서 [구성]을 선택합니다.

3.    [로드 밸런서] 범주에서 [수정]을 선택합니다.

4.    포트 443에 대한 리스너를 추가하려면 Elastic Beanstalk 환경에 있는 로드 밸런서의 유형에 따라 다음 단계 세트 중 하나를 선택합니다.

Classic Load Balancer에 대한 리스너를 추가하려면 다음을 수행합니다.

1.    [Add Listener]를 선택합니다.

2.    [Port]에 수신 트래픽 포트(일반적으로 443)를 입력합니다.

3.    [Protocol]에서 [HTTPS]를 선택합니다.

4.    [Instance Port]에 80을 입력합니다.

5.    [Instance Protocol]에서 [HTTP]를 선택합니다.

6.    [SSL certificate]에서 인증서를 선택한 다음 드롭다운 메뉴에서 사용할 [SSL policy]를 선택합니다.

7.    [Add]를 선택한 다음 [Apply]를 선택합니다.

Application Load Balancer에 대한 리스너를 생성하려면 다음을 수행합니다.

1.    [Add Listener]를 선택합니다.

2.    [Port]에 수신 트래픽 포트(일반적으로 443)를 입력합니다.

3.    [Protocol]에서 [HTTPS]를 선택합니다.

4.    [SSL 인증서]에서 인증서를 선택한 다음 드롭다운 메뉴에서 사용할 [SSL 정책]을 선택합니다.

5.    [Add]를 선택한 다음 [Apply]를 선택합니다.

Network Load Balancer에 대한 리스너를 추가하려면 다음을 수행합니다.

1.    [Add Listener]를 선택합니다.

2.    [Port]에 수신 트래픽 포트(일반적으로 443)를 입력합니다.

3.    [Add]를 선택한 다음 [Apply]를 선택합니다.

HTTPS 연결을 종료하도록 인스턴스 구성

HTTPS 연결을 종료하도록 인스턴스를 구성하려면 구성 파일을 사용하여 인스턴스에서 실행 중인 소프트웨어를 수정합니다. 구성 파일을 사용하여 보안 그룹을 수정함으로써 보안 연결을 허용하도록 해야 합니다.

중요: 단일 인스턴스 환경을 사용하는 경우 다음 단계를 건너뜁니다. 그런 다음 단일 인스턴스 환경에서 인스턴스의 HTTPS 종료(엔드 투 엔드 HTTPS)섹션 단계를 완료합니다.

1.    Elastic Beanstalk 환경에 있는 로드 밸런서의 유형에 따라 다음 구성 파일 중 하나를 사용하여 로드 밸런서에 보안 리스너를 추가합니다.

Classic Load Balancer의 경우 .ebextensions/https-reencrypt-clb.config 파일을 사용합니다.

option_settings:
  aws:elb:listener:443:
    InstancePort: 443
    InstanceProtocol: HTTPS
  aws:elasticbeanstalk:application:
    Application Healthcheck URL: HTTPS:443/

Application Load Balancer의 경우 .ebextensions/https-reencrypt-alb.config 파일을 사용합니다.

option_settings:
  aws:elbv2:listener:443:
    DefaultProcess: https
    ListenerEnabled: 'true'
    Protocol: HTTPS
  aws:elasticbeanstalk:environment:process:https:
    Port: '443'
    Protocol: HTTPS

Network Load Balancer의 경우 .ebextensions/https-reencrypt-nlb.config 파일을 사용합니다.

option_settings:
  aws:elbv2:listener:443:
    DefaultProcess: https
    ListenerEnabled: 'true'
  aws:elasticbeanstalk:environment:process:https:
    Port: '443'

2.    포트 443에서 트래픽을 수신하도록 로드 밸런서를 업데이트합니다.

새 보안 그룹을 생성한 다음 Elastic Beanstalk이 해당 보안 그룹을 사용하여 포트 443에서 트래픽을 수신하도록 할 수 있습니다. 예를 들어, 다음 .ebextensions/https-lbsecuritygroup.config 파일은 보안 그룹을 생성하고 해당 보안 그룹을 로드 밸런서에 연결합니다.

option_settings:
  # Use the custom security group for the load balancer
  aws:elb:loadbalancer:
    SecurityGroups: '`{ "Ref" : "loadbalancersg" }`'
    ManagedSecurityGroup: '`{ "Ref" : "loadbalancersg" }`'
Resources:
  loadbalancersg:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: load balancer security group
      VpcId: vpc-#######
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
      SecurityGroupEgress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0

앞의 구성 파일에서 VpcId를 환경에 맞는 올바른 값으로 바꿉니다.

참고: 앞의 예제에는 HTTP 연결을 허용하기 위해 포트 80을 통한 수신 및 송신 기능이 포함되어 있습니다. 보안 연결만 허용하려면 SecurityGroupIngress 섹션에서 포트 80에 대한 구성을 제거합니다.

3.    로드 밸런서의 보안 그룹과 인스턴스의 보안 그룹 간에 포트 443을 통한 통신을 허용하는 수신 및 송신 규칙을 추가합니다.

예를 들어, 다음 .ebextensions/https-backendsecurity.config 파일을 사용할 수 있습니다.

Resources:
  # Add 443-inbound to instance security group (AWSEBSecurityGroup)
  httpsFromLoadBalancerSG: 
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
      IpProtocol: tcp
      ToPort: 443
      FromPort: 443
      SourceSecurityGroupId: {"Fn::GetAtt" : ["loadbalancersg", "GroupId"]}
  # Add 443-outbound to load balancer security group (loadbalancersg)
  httpsToBackendInstances: 
    Type: AWS::EC2::SecurityGroupEgress
    Properties:
      GroupId: {"Fn::GetAtt" : ["loadbalancersg", "GroupId"]}
      IpProtocol: tcp
      ToPort: 443
      FromPort: 443
      DestinationSecurityGroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}

이제 로드 밸런서가 HTTPS를 사용하여 백엔드 인스턴스에 안전하게 연결합니다. 로드 밸런서는 인증서가 자체 서명되었는지 신뢰할 수 있는 인증 기관에서 발급했는지 여부에 상관없이 인스턴스의 모든 인증서를 수락합니다.

참고: 로드 밸런서가 특정 인증서만 신뢰하도록 지시하는 정책을 로드 밸런서에 추가할 수 있습니다. 예를 들어, 다음 .ebextensions/https-backendauth.config 파일은 두 가지 정책을 생성합니다. 한 정책은 퍼블릭 인증서를 지정하고, 다른 정책은 로드 밸런서에 인스턴스 포트 443에 연결하기 위해 이 인증서만 신뢰하도록 지시합니다.

option_settings:
  # Backend Encryption Policy
  aws:elb:policies:backendencryption:
    PublicKeyPolicyNames: backendkey
    InstancePorts:  443
  # Public Key Policy
  aws:elb:policies:backendkey:
    PublicKey: |
      -----BEGIN CERTIFICATE-----
      ################################################################
      ################################################################
      ################################################################
      ################################################################
      ################################################
      -----END CERTIFICATE-----

4.    인스턴스에서 실행되는 프록시 서버가 HTTPS를 종료하도록 구성합니다.

참고: 구성은 솔루션 스택에 따라 다릅니다. 모든 솔루션 스택에 대한 .ebextensions .ebextensions의 프라이빗 키 및 서버 인증서 값을 하드 코딩합니다. 이러한 파일의 보안을 강화하기 위해 Amazon Simple Storage Service(Amazon S3)에 콘텐츠를 업로드하고 S3Auth를 사용하여 Amazon EC2로 가져올 수 있습니다.

5.    환경에 구성 파일을 배포하려면 애플리케이션 번들의 루트에 있는 .ebextensions라는 디렉터리에 구성 파일을 추가합니다. 그런 다음 이러한 구성 파일이 포함된 소스 코드를 배포합니다.

단일 인스턴스 환경 내 인스턴스의 HTTPs(엔드 투 엔드 HTTPS) 종료

1.    Elastic Beanstalk 애플리케이션이 실행 중인 EC2 인스턴스로 포트 443을 통한 수신 트래픽을 허용합니다.

다음 예제에서는 .ebextensions를 사용하여 포트 443에서 수신 트래픽을 허용합니다.

Resources:
  sslSecurityGroupIngress: 
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
      IpProtocol: tcp
      ToPort: 443
      FromPort: 443
      CidrIp: 0.0.0.0/0

2.    인스턴스에서 실행되는 프록시 서버가 HTTPS를 종료하도록 구성합니다.

참고: 구성은 솔루션 스택에 따라 다릅니다. 모든 솔루션 스택에 대한 .ebextensions .ebextensions의 프라이빗 키 및 서버 인증서 값을 하드 코딩합니다. 이러한 파일의 보안을 강화하기 위해 S3에 콘텐츠를 업로드하고 S3Auth를 사용하여 Amazon EC2로 가져올 수 있습니다.

3.    환경에 구성 파일을 배포하려면 애플리케이션 번들의 루트에 있는 .ebextensions라는 디렉터리에 구성 파일을 추가합니다. 그런 다음 이러한 구성 파일이 포함된 소스 코드를 배포합니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요합니까?