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

6분 분량
0

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

간략한 설명


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

단일 인스턴스 환경의 경우 개인 키와 인증서를 로컬에서 만들어야 합니다. 그런 다음 인증서를 AWS ID 및 액세스 관리(IAM)에 업로드합니다.

AWS Certificate Manager(ACM)를 사용하여 프로그래밍 방식으로 서버 인증서를 프로비저닝, 관리 및 배포하는 것이 모범 사례입니다. 또한 AWS Command Line Interface(AWS CLI)를 사용하여 타사 또는 자체 서명 인증서와 개인 키를 IAM에 업로드할 수 있습니다. AWS 리전에서 ACM을 사용할 수 없는 경우 AWS CLI를 사용하세요.

**참고:**AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참고하세요. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.

해결 방법

Elastic Beanstalk 환경 준비

  1. 트래픽을 Elastic Beanstalk 환경으로 라우팅하려면 Amazon Route 53를 사용하여 새 도메인이나 다른 도메인 공급자를 등록하세요.
  2. 환경 URL에 지역이 포함된 경우 별칭을 생성하세요. 환경 URL에 지역이 포함되어 있지 않은 경우 CNAME 레코드를 생성하세요.
    **중요:**2016년 이전에 만든 환경에 CNAME 레코드를 사용할 수 있습니다. 루트 도메인 또는 네이키드 도메인이라고도 하는 Zone Apex 도메인에는 CNAME 레코드를 사용할 수 없습니다. 자세한 내용은 별칭 레코드와 비별칭 레코드 간의 선택을 참조하세요.
  3. ACM에서 인증서를 생성하거나 타사 또는 자체 서명 인증서와 개인 키를 IAM에 업로드합니다.

로드 밸런서에 리스너 추가

  1. Elastic Beanstalk 콘솔을 열고 내 환경을 선택합니다.
  2. 탐색 창에서 구성을 선택합니다.
  3. 로드 밸런서 범주에서 수정을 선택합니다.
  4. 포트 443에 대한 리스너를 추가하려면 Elastic Beanstalk 환경에 있는 로드 밸런서에 대한 단계를 완료하세요.

Classic Load Balancer

다음 단계를 완료합니다.

  1. 리스너 추가를 선택합니다.
  2. Port의 경우 수신 트래픽 포트(일반적으로 443)를 입력합니다.
  3. 프로토콜에서는 HTTPS를 선택합니다.
  4. Instance Port80을 입력합니다.
  5. Instance ProtocolHTTP를 선택합니다.
  6. SSL 인증서의 경우 인증서를 선택한 다음 드롭다운 목록에서 SSL 정책을 선택합니다.
  7. 추가를 선택한 다음 적용을 선택합니다.

Application Load Balancer

다음 단계를 완료합니다.

  1. 리스너 추가를 선택합니다.
  2. Port의 경우 수신 트래픽 포트(일반적으로 443)를 입력합니다.
  3. 프로토콜에서는 HTTPS를 선택합니다.
  4. SSL 인증서의 경우 인증서를 선택한 다음 드롭다운 목록에서 SSL 정책을 선택합니다.
  5. 추가를 선택한 다음 적용을 선택합니다.

Network Load Balancer

다음 단계를 완료합니다.

  1. 리스너 추가를 선택합니다.
  2. Port의 경우 수신 트래픽 포트(일반적으로 443)를 입력합니다.
  3. 추가를 선택한 다음 적용을 선택합니다.

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:
    
  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를 환경에 적합한 값으로 대체하세요.

    이전 예에는 HTTPS 연결을 허용하는 포트 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(S3)에 업로드하고 S3Auth를 사용하여 Amazon EC2로 가져올 수 있습니다.

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

단일 인스턴스 환경에서 인스턴스의 HTTPS(엔드투엔드 HTTPS)를 종료합니다.

  1. 포트 443을 통해 Elastic Beanstalk 애플리케이션이 실행 중인 인스턴스로 들어오는 트래픽을 허용하세요.

    다음 예에서는 .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의 개인 키 및 서버 인증서의 값을 하드 코딩합니다. 이러한 파일을 더욱 안전하게 보호하려면 콘텐츠를 Amazon S3에 업로드하고 S3Auth를 사용하여 Amazon EC2로 가져올 수 있습니다.

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

AWS 공식
AWS 공식업데이트됨 6달 전
댓글 없음