[apache] Elastic Beanstalk에서 https를 강제하는 방법은 무엇입니까?

Elastic Beanstalk의 무료 사용 계층에서 https를 강제 할 수없는 것 같습니다.

상태 확인에 실패하지 않고 Amazon Elastic Beanstalk에서 https를 강제하는 방법 에서 다음 제안을 시도했습니다.

이 Apache 재 작성 규칙 사용

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/status$
RewriteCond %{REQUEST_URI} !^/version$
RewriteCond %{REQUEST_URI} !^/_hostmanager/
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

시도하면 http 요청이 내가 원하는대로 https로 리디렉션되지 않습니다. 대신 http 페이지가 정상적으로로드됩니다. 또한 동일한 결과로 X-Forwarded-Port 헤더를 사용하려고 시도했습니다.

다음 재 작성 규칙도 시도했습니다.

RewriteCond %{SERVER_PORT} 80
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

그리고이 규칙은 리디렉션 루프를 발생시킵니다. 따라서 아파치 다시 쓰기 규칙이 Elastic Load Balancer 헤더 X-Forwarded-Port 및 X-Forwarded-Proto를 선택하지 않는 것처럼 보이지만 리디렉션 루프도 제가 원하는 것이 아닙니다.

도와주세요. 저는 AWS, Elastic Beanstalk를 처음 사용하며 Apache 규칙에 익숙하지 않습니다. 여기서 어디로 가야할지 모르겠습니다. 감사.



답변

이 답변은로드 밸런서 보안 그룹에서 이미 https를 활성화하고 SSL 인증서를로드 밸런서에 추가했으며로드 밸런서에서 포트 80과 443을 모두 전달하고 Route 53을 사용하여 Elastic Beanstalk 환경에서 도메인 이름을 가리켰다 고 가정합니다. (또는 동등한 DNS 서비스).

참고 :이 답변은 Apache를 사용하는 Elastic Beanstalk 환경을위한 것입니다. Docker 기반 배포에서는 작동하지 않을 수 있습니다.

프로젝트 디렉토리 .config에있는 파일.ebextensions 중 하나에 다음을 추가 하기 만하면됩니다 .

files:
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            RewriteEngine On
            <If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
            RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
            </If>

설명

이것은 Elastic Beanstalk 외부에서 적당히 간단합니다. 일반적으로 다음과 같은 Apache 재 작성 규칙을 추가합니다.

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

또는이 경우와 같이로드 밸런서 뒤에있는 경우 :

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

그러나 이러한 구성은 <VirtualHost>블록 내에서만 작동합니다 . RewriteCond<If>블록으로 변경하면 블록 외부에서 제대로 작동 <VirtualHost>하여 독립형 Apache 구성 파일에 넣을 수 있습니다. CentOS의 표준 Apache 설정 (ElasticBeanstalk 설정 포함)에는 /etc/httpd/conf.d/*.conf이 파일을 저장하는 파일 경로와 일치 하는 모든 파일 이 포함됩니다.

-n '%{HTTP:X-Forwarded-Proto}'조건 의 일부는로드 밸런서 뒤에 있지 않은 경우 리디렉션을 방지하므로로드 밸런서 및 https가있는 프로덕션 환경과 단일 인스턴스이고 https가없는 스테이징 환경간에 구성을 공유 할 수 있습니다. 모든 환경에서로드 밸런서와 https를 사용하는 경우에는 필요하지 않지만 사용하는 것은 문제가되지 않습니다.

내가 본 나쁜 솔루션

나는이 문제에 대한 많은 나쁜 해결책을 보았고,이 해결책이 왜 필요한지 이해하기 위해 그것들을 살펴볼 가치가 있습니다.

  1. Cloudfront 사용 : 일부 사람들은 Elastic Beanstalk 앞에서 캐시되지 않은 Cloudfront 설정을 사용하여 HTTP에서 HTTPS로 리디렉션 할 것을 제안합니다. 이로 인해 완전히 적절하지 않은 완전히 새로운 서비스 (따라서 복잡성이 추가됨)가 추가됩니다 (Cloudfront는 CDN이며 고유 한 동적 콘텐츠에 HTTPS를 강제하는 데 적합한 도구가 아닙니다). Apache 구성은이 문제에 대한 일반적인 솔루션이며 Elastic Beanstalk는 Apache를 사용하므로 이것이 우리가 가야 할 방식입니다.

  2. SSH를 서버에 연결하고 … : 이것은 Elastic Beanstalk의 관점과 완전히 반대이며 많은 문제가 있습니다. 자동 확장으로 생성 된 모든 새 인스턴스에는 수정 된 구성이 없습니다. 복제 된 환경에는 구성이 없습니다. 합리적인 환경 변경 세트의 수에 관계없이 구성이 지워집니다. 이것은 정말 나쁜 생각입니다.

  3. Apache 구성을 새 파일로 덮어 쓰기 : 이것은 올바른 솔루션 영역에 들어가지만 Elastic Beanstalk가 서버 설정의 측면을 변경하면 유지 관리에 악몽을 남깁니다 (매우 잘할 수 있음). 또한 다음 항목의 문제를 참조하십시오.

  4. Apache 구성 파일을 동적으로 편집하여 몇 줄을 추가하십시오. 이것은 괜찮은 아이디어입니다. 이 문제는 Elastic Beanstalk가 기본 Apache 구성 파일의 이름을 변경하면 작동하지 않으며 예상치 못한 상황에서이 파일을 덮어 쓸 수 있다는 것입니다. https://forums.aws.amazon.com/thread .jspa? threadID = 163369


답변

편집 :이 답변을 좋아하지만 이제는 매우 오래되었습니다 . AWS는 이 답변의 일부를 쓸모 없게 만드는 새로운 서비스 (예 : Certificate Manager )를 마련했습니다. 또한 .ebextensionsApache와 함께 폴더를 사용하면 위에서 설명한 것처럼이 리디렉션을보다 깔끔하게 처리 할 수 ​​있습니다.

S3에서 웹 사이트를 호스팅하는 경우이 답변의 일부가 여전히 유용 할 수 있습니다.


이것은 나를 위해 일했습니다.

  1. aws콘솔 명령을 사용하여 AWS에 인증서를 업로드합니다 . 명령 구조는 다음과 같습니다.

    aws iam upload-server-certificate --server-certificate-name CERTIFICATE_NAME --certificate-body "file://PATH_TO_CERTIFICATE.crt" --private-key "file://YOUR_PRIVATE_KEY.pem" --certificate-chain "file://YOUR_CERTIFICATE_CHAIN.ca-bundle" --path /cloudfront/
    
  2. Elastic Beanstalk 애플리케이션에서 구성 -> 네트워크 계층 -> 로드 밸런싱 으로 이동하고 기어 아이콘을 클릭 합니다 .

  3. 보안 리스너 포트443 으로 선택하십시오 . 프로토콜HTTPS 로 선택합니다 . SSL 인증서 ID에 대해 2 단계CERTIFICATE_NAME 에서 선택합니다 . 구성을 저장하십시오.

  4. 콘솔로 이동합니다 . EC2 인스턴스를 클릭합니다 . Load Balancers를 클릭합니다 . 부하 분산기를 클릭합니다. 인스턴스를 클릭 하고 아래로 스크롤하여 해당로드 밸런서에 할당 된 EC2 인스턴스를 확인합니다. EC2 인스턴스의 이름이 애플리케이션 URL과 같거나 가까운 경우로드 밸런서 의 DNS 이름 을 기록해 둡니다. 형식이어야합니다.awseb-e-...

  5. 콘솔로 돌아갑니다 . CloudFront를 클릭 합니다. 배포 만들기를 클릭합니다 . 배포를 선택합니다 .

  6. 배포를 설정합니다. Origin Domain Name5 단계 에서 찾은로드 밸런서 DNS 이름으로 설정합니다 . HTTP를 HTTPS리디렉션 하도록 뷰어 프로토콜 정책 을 설정합니다 . 설정 앞으로 쿼리 문자열 . 설정 대체 도메인 이름 (CNAME이) 의 URL (들)은 응용 프로그램에 사용할. 2 단계 에서 업로드 한 SSL 인증서 를로 설정 합니다 . 배포판을 만드십시오.CERTIFICATE_NAME

  7. CloudFront에서 배포 이름을 클릭합니다. 클릭 기원을 , 당신의 기원을 클릭하여 선택하고 편집을 . Origin Protocol PolicyMatch Viewer 인지 확인합니다 . 돌아 가세요. 동작을 클릭 하고 원본을 선택한 다음 편집을 클릭 합니다. Forward HeadersWhitelist로 변경 하고 Host를 추가 합니다. 저장.

참고 : 더 긴 가이드도 썼습니다 .


답변

가장 많이 찬성 된 것은 나를 위해 작동하지 않습니다 .. <If> 지시문은 Apache 2.4+에서만 작동하지만 ElasticBeanstalk 에는 버전 2.2.x가 있습니다.

따라서 위와 동일한 조언을 따르십시오. 다음 콘텐츠로 .ebextensions / https_rewrite.config라는 파일을 생성합니다.

files:
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            LoadModule rewrite_module modules/mod_rewrite.so
            RewriteEngine On
            # This will enable the Rewrite capabilities
            RewriteCond %{HTTPS} !=on
            # This checks to make sure the connection is not already HTTPS
            RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

이것은 나를 위해 일하는 것 같습니다.

이 파일을 WAR 파일로 빌드하는 방법에 대해서는이 답변을 참조하십시오.


답변

새로운 Application Load Balancer를 사용하면 이제이 작업을 매우 간단하게 수행 할 수 있습니다.

EB 환경을 설정할 때이 중 하나를 설정해야합니다 (내가 믿는 클래식로드 밸런서가 여전히 기본값 임). 일단 환경이 생성되면 유형을 변경할 수 없으므로 다시 생성하십시오.

이 작업이 완료되면 EC2 설정->로드 밸런서로 이동합니다. EB 환경 용으로 생성 한로드 밸런서를 클릭합니다. 이 작업을 수행하기 전에 HTTPS 리스너를 설정했는지 확인해야하므로 SSL 인증서를 사용하여 HTTPS 443에서 수신하고 80에서 HTTP를 사용하여 트래픽을 인스턴스로 전달해야합니다.

그런 다음 HTTP를 수신하는 새 리스너를 추가하고 “Redirect to :”기본 작업을 추가합니다. HTTPS를 프로토콜로, 443을 포트로, “Original host, path, query”를 옵션으로, 마지막으로 301을 HTTP 응답 코드로 설정했는지 확인하십시오.

이 리스너가 추가되면 HTTPS 및 HTTP 연결을 모두 허용하도록 EC2로드 밸런서 보안 그룹을 업데이트하십시오. 리스너에 작은 경고 기호가 표시되어이를 상기시켜줍니다!

크리스


답변

편집 : Zags 솔루션 이 더 일반적이고 정확합니다. 내 것보다 권장합니다 (python env에만 해당)

다음은 wsgi.conf를 해킹하거나 CloudFront를 사용하지 않는 깨끗하고 빠른 솔루션입니다.

.ebextensions / some_file.config에서 :

# Redirect HTTP to HTTPS
  "/etc/httpd/conf.d/https_redirect.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      <Directory /opt/python/current/app/>
      RewriteEngine on
      RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
      RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
      </Directory>

너무 쉬운 것 같지만 잘 작동하는 것 같습니다.

또한 “HTTPS가 아님”대신 HTTP를 명시 적으로 리디렉션하고 있습니다.


답변

2018 년에로드 밸런서로 Elastic Beantalk를 리디렉션하려고합니다. 위의 답변 중 어느 것도 내 환경에서 작동하지 않습니다. 내가 말한 몇 가지 문제 :

  1. 가장 많이 투표 한 답변을 시도했지만 내 바람둥이는 버전 2.7입니다. 지원하지 않습니다.

  2. container_commands를 사용하고 00_applications 설정을 복사했습니다. AWS는이를 무시합니다.

그래서 마침내 https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat-proxy.html 을 읽고 작동했습니다.

내가하는 일은 다음과 같습니다.

폴더 구조를 다시 만들었습니다.

.ebextensions
 - httpd
  -conf.d
   -ssl.conf

그리고 이것은 ssl.conf의 내용입니다.

<VirtualHost *:80>
  RewriteEngine on
  RewriteCond %{HTTP:X-Forwarded-Proto} =http
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  <Proxy *>
    Order Allow,Deny
    Allow from all
  </Proxy>
  ProxyPass / http://localhost:8080/ retry=0
  ProxyPassReverse / http://localhost:8080/
  ProxyPreserveHost on

  ErrorLog /var/log/httpd/elasticbeanstalk-error_log
</VirtualHost>

이것이 도움이되기를 바랍니다.


답변

다음 명령으로 나를 위해 작동합니다.

RewriteCond %{HTTP:X-Forwarded-Port} !=443

https 확인없이 :

RewriteCond %{HTTP:X-Forwarded-Proto} !https

ELB가 X-Forwarded-Proto의 값을 http로 변경하는 것 같습니다 (TCP 프로토콜에서도).