리디렉션 서비스 구축 AWS ALB 패턴, Let’s Encrypt 패턴

13493 단어 letsencryptALB

AWS ALB 패턴


  • 아래와 같이 Let’s Encrypt를 사용해 1대로 운용하고 있지만, ALB 사용에서는 매니지드 서비스의 메리트가 있으므로 전환 검토.
  • 설명이나 조작은 참고 사이트에 (빚지고 있습니다)
  • 단점
  • 도메인별 ALB 작성 필요 ... 중복이나 Let’s Encrypt의 의존성과 트레이드 오프인가


  • 로드 밸런서 -> 목록 -> 규칙 보기/편집

  • IF
  • 호스트 헤더 선택 : 리디렉션 할 도메인 지정


  • THEN
  • 리디렉션 대상
  • 호스트 열에 리디렉션 할 도메인을 지정


  • 할 수 있는 예

  • ㅡㅡㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ 이 m -> htps : // 도마이. 이 m or htps //w w. 도마이안. 이 m

  • htps : // 도마이. 이 m -> htps : // 어쩌면. 이 m or htps //w w. 도마이안. 이 m


  • 참고





    Let’s Encrypt 패턴





    운영을 단순화하고 싶습니다.



    네이키드 도메인을 www의 서브 도메인으로 리디렉션하고 싶지만, 증명서 설정이 없으면 멈춘다.
    htps : // 어쩌면. 이 m -> 브라우저가 화난 (인증서 경고) -> htps //w w. 도마이안. 이 m

    www의 서브 도메인은 증명서 비용 없이 운용중.
  • AWS Route53(CNAME) + Elastic Beanstalk + CloudFront + Certificate Manager

  • SSL 필수의 시대가 되어, 증명서 첨부의 네이키드 도메인의 케이스가 증가해 왔다.
    네이키드 도메인의 DNS 레코드는 IP 밖에 지정할 수 없기 때문에, 우선 아래와 같은 세트로 대응하고 있었다.
  • S3 리디렉션용 버킷 + CloudFront + Certificate Manager

  • EC2의 한대로



    사이트마다, 이중의 설정 작업이나 코스트가 늘어나므로 구성을 바꾸어 보았다.
    * 리디렉션용 EC2(IP 지정용)
    * 사이트별 Let’s Encrypt 설정(이 정도는 참아)

    인증서가 Let’s Encrypt의 webroot 옵션이 되는 이유


  • 도메인 소유자가 아님 (DNS 레코드를 등록 할 수 없음)
  • 서버 관리자

  • / 에 tc / h tpd / 곤 f. d / 도마이. 이 m. 곤 f


    <VirtualHost *:80>
        ServerName domain.com
        DocumentRoot /var/www/html/domain.com
    </VirtualHost>
    <VirtualHost *:443>
        ServerName domain.com:443
        DocumentRoot /var/www/html/domain.com
        SSLEngine on
        SSLProtocol all -SSLv2
        SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
        SSLCertificateFile /etc/letsencrypt/live/domain.com/cert.pem
        SSLCertificateKeyFile //etc/letsencrypt/live/domain.com/privkey.pem
        SSLCACertificateFile /etc/letsencrypt/live/domain.com/chain.pem
    </VirtualHost>
    

    /ゔぁr/wㅡw/html/도마이엔. 이 m/그리고 x. HTML


    <html>
    <head>
    <meta charset="UTF-8" />
    </head>
    <body>
    しばらくお待ちください。
    </body>
    </html>
    

    /ゔぁr/wㅡw/html/도마이엔. 이 m/. h 타세스 s



    RewriteCond %{REQUEST_URI} !(^/.well-known/) 가 없으면 www.로 리디렉션되기 때문에 발행에 실패한다
    <IfModule mod_rewrite.c>
      RewriteEngine on
      RewriteCond %{SERVER_PORT} 80
      RewriteCond %{HTTP_HOST} !^www.
      RewriteCond %{REQUEST_URI} !(^/\.well-known/)
      RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    </IfModule>
    
    <IfModule mod_rewrite.c>
      RewriteEngine on
      RewriteCond %{SERVER_PORT} 443
      RewriteCond %{HTTP_HOST} !^www.
      RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    </IfModule>
    

    마침내 인증서 발급


  • 테스트 도메인: domain.com
  • certbot-auto certonly --webroot -w /var/www/html/domain.com -d domain.com -m [email protected] --agree-tos
    

    crontab -l


    0 3 * * * /usr/bin/certbot-auto renew && /sbin/service httpd reload
    

    메모


  • 템플릿으로 사용할 원본 파일에서 쉽게 추가

  • /var/www/html/default/.htaccess
    /var/www/html/default/index.html
  • cmd
  • mkdir /var/www/html/{domain}
    
    cp -aT /var/www/html/default /var/www/html/{domain}
    

    감시



    cron에 의해 자동 갱신이지만, 가끔 실패하므로 감시는 돌려 둔다
    서버 인증서 만료 모니터링

    참고


  • 화제의 무료 SSL 증명서! Let’s Encrypt에서 인증서를 얻지 못한 경우 확인
  • Let’s Encrypt 인증서를 쉽게 삭제하는 방법

  • 추기 증명서 정기 갱신을 hook로 사용시



    cron


    10 3 * * * /etc/letsencrypt/renewal/aaa.bbb.info.sh
    

    매일 업데이트 시도

    /에 tc/ぇつぇ crypt/레네와 l/아아. 툭 b. 응후. sh


    #!/bin/sh
    
    certbot certonly \
      -d aaa.bbb.info \
      --email [email protected] \
      --agree-tos \
      --preferred-challenges dns \
      --keep-until-expiring \
      --text \
      --configurator certbot-external-auth:out \
      --certbot-external-auth:out-public-ip-logging-ok \
      --certbot-external-auth:out-handler /etc/letsencrypt/renewal-hooks/pre/aaa.bbb.info.sh
    
    /sbin/service httpd restart
    
  • 마감일이되면 업데이트
  • --preferred-challenges dns이므로 CNAME 업데이트 필요
  • 후크에서 Route53 레코드 업데이트

  • /에 tc/ぇつぇ crypt/레네와 l-호오 ks/p레/아아. b. 응후. sh


    #!/bin/sh
    
    set -e
    cmd="$1"
    shift
    
    ret=`aws sts assume-role --role-arn arn:aws:iam::xxxx427341:role/route53-register --role-session-name aws3-ec2`
    export AWS_ACCESS_KEY_ID=`echo $ret | jq -r .Credentials.AccessKeyId`
    export AWS_SECRET_ACCESS_KEY=`echo $ret | jq -r .Credentials.SecretAccessKey`
    export AWS_SESSION_TOKEN=`echo $ret | jq -r .Credentials.SessionToken`
    
    case "$cmd" in
        perform)
            HOSTED_ZONE_ID="/hostedzone/xxxx5NZ9H"
            FILENAME=`date "+%Y%m%d%H%M%S"`.json
            DIR=/var/log/letsencrypt/
    
            # 環境変数チェック
            if [ -z "$domain" ] || [ -z "$validation" ]; then
                    echo "Undefined environment variable" 
                    exit 1
            fi
    
            # 設定用jsonファイルを書き出し
            cat <<EOT > $DIR$FILENAME
    {
      "Changes": [
        {
          "Action": "UPSERT",
          "ResourceRecordSet": {
            "Name": "_acme-challenge.$domain",
            "Type": "TXT",
            "TTL": 60,
            "ResourceRecords": [
              {
                "Value": "\"$validation\"" 
              }
            ]
          }
        }
      ]
    }
    EOT
            # jsonファイルをアップロードしてTXTレコードを追加
            aws route53 change-resource-record-sets --hosted-zone-id "$HOSTED_ZONE_ID" --change-batch file://$DIR$FILENAME
    
            # DNS反映待ち
            sleep 60
            ;;
        *)
            ;;
    esac
    
  • STS (aws sts assume-role)에서 다른 계정의 Route53을 볼 수 있습니다
  • 좋은 웹페이지 즐겨찾기