लोचदार बीनस्टॉक बल https


12

मैं HTTPS को एक साइट के साथ मजबूर करने के मुद्दे पर आ रहा हूं जिसे मैं AWS इलास्टिक बीनस्टॉक के माध्यम से तैनात कर रहा हूं।

यह EmberJS का उपयोग करते हुए एक फ्रंटएंड एप्लिकेशन है। मैं कई दिनों से हलकों में घूम रहा हूं, यह जानने की कोशिश कर रहा हूं कि http ट्रैफिक को कैसे पुनर्निर्देशित किया जाए। मैं अपने EC2 मशीन पर Amazon Linux AMI का उपयोग कर रहा हूँ।

मैं निष्कर्ष पर आया हूं (अभी भी यकीन नहीं है कि अगर यह सही है) कि यह इलास्टिक बीनस्टॉक के भीतर नहीं है जो मैं HTTPS को मजबूर करता हूं। मैं अपने इलास्टिक बीनस्टॉक लोड बैलेंसर के माध्यम से HTTP और HTTPS दोनों की अनुमति दे रहा हूं, और सर्वर पर पुनर्निर्देशित करने का प्रयास कर रहा हूं।

यह वह जगह है जहां मैं समस्याओं में भाग रहा हूं। मुझे उन नियमों के बारे में कई उत्तर मिल mod_rewriteरहे हैं जिनके बिना X-Forwarded-Protoहैडर के आसपास आधारित हैं , लेकिन वह फ़ाइल मेरे EC2 मशीन पर एक खोज के अनुसार मौजूद नहीं है।

मैंने .ebextensionsडायरेक्टरी के भीतर एक कॉन्फिग फाइल बनाने की भी कोशिश की है , लेकिन यह भी काम नहीं किया।

मुख्य बात जो मैं करने की कोशिश कर रहा हूं, वह है http का उपयोग करने के लिए उपयोगकर्ता जब http पते पर हिट करने की कोशिश करते हैं। किसी भी संकेत या सुझाव बहुत सराहना की है, धन्यवाद!

संपादित करें: मैं 64 बिट डेबियन jessie v1.4.1 पायथन 3.4 (Preconfigured - डॉकर) का उपयोग कर रहा हूँ


ऐसा लगता है कि इंटरनेट इस समस्या के एकल, पूर्ण और कार्यशील समाधान पर सहमत नहीं हो सकता है। उम्मीद है कि आपको मेरी पोस्ट में यहाँ कुछ मदद मिल सकती है । मुझे इसके साथ आने के लिए हुप्स के माध्यम से कूदना पड़ा, आखिरकार।
ADTC

जवाबों:


7

मुझे लगता है कि आपको यह बताने की आवश्यकता है कि आपके द्वारा उपयोग किया जाने वाला इलास्टिक बीनस्टॉक पर्यावरण क्या है (देखें: समर्थित प्लेटफ़ॉर्म ), क्योंकि अलग-अलग वातावरण में अलग-अलग कॉन्फ़िगरेशन हैं।

मूल रूप से, आपको अनुकूलित करने की आवश्यकता है:

  • लोचदार लोड बैलेंसर :
    • पोर्ट 80 पर सुनें और इसे EC2 इंस्टेंस पोर्ट 80 पर प्रॉक्सी करें।
    • पोर्ट 443 पर सुनें और इसे EC2 इंस्टेंस पोर्ट 443 पर प्रॉक्सी करें।
  • EC2 वेब सर्वर / प्रॉक्सी :
    • पोर्ट 80 पर सुनें और HTTPS पर रीडायरेक्ट के साथ प्रतिक्रिया दें।
    • पोर्ट 443 पर सुनें और अनुरोध परोसें।

इसे अनुकूलित करने के लिए, आप CLI या का उपयोग कर सकते हैं .ebextensions

आप AWS इलास्टिक बीनस्टॉक पर सक्षम HTTPS और HTTP-रीडायरेक्ट पर जांच कर सकते हैं । यह आपको बताता है कि इलास्टिक बीनस्टॉक सिंगल डॉकटर कंटेनर को HTTPS और HTTP (HTTPS पर पुनर्निर्देशित) पर कैसे कॉन्फ़िगर किया जाए। आप अपनी जरूरत के अनुसार विन्यास को समायोजित कर सकते हैं।


हे, महान लेख, मैं यह कोशिश कर रहा हूँ।
एवेस्टर जूल

किसी भी विचार को उस फ़ाइल के अंदर के सिरे को शामिल नहीं करने के लिए कैसे करें, बल्कि उसे स्रोत नियंत्रण में नहीं रखेंगे? क्या हमारे पास पहले से उपलब्ध लोड वाले अनाज कहीं हैं? मैं उन्हें फाइल सिस्टम पर खोजने के लिए प्रतीत नहीं कर सकता
awwester

आप अपने एसएसएल प्रमाणपत्र फ़ाइल को एस 3 में रख सकते हैं। लचीला बीनस्टॉक डाउनलोड निजी S3 वस्तु की अनुमति देने के लिए, आपको पढ़ सकते हैं इस
एडवर्ड सैमुअल

ELB SSL सर्टिफिकेट के लिए, आप AWS डॉक्यूमेंटेशन का पालन कर सकते हैं: Elastic लोड बैलेंसिंग के लिए SSL सर्टिफिकेट । तब आप एसएसएल प्रमाणपत्र संसाधन को arn:aws:iam::123456789012:server-certificate/YourSSLCertificateप्रारूप में प्राप्त कर सकते हैं ।
एडवर्ड सैमुअल

मेरे पास SSL प्रमाणपत्र स्थापित है और मेरे पास arn है जो 00-लोड-बैलेंसर में जाएगा (मैं वास्तव में UI के माध्यम से लोड बैलेंसर को कॉन्फ़िगर कर रहा हूं), लेकिन सर्वर में डालने के लिए स्थान प्राप्त नहीं कर सकता। सेटिंग्स ssl_certificate /opt/ssl/default-ssl.crt;जब मुझे प्रमाणपत्र के लिए जानकारी मिलती है, तो यह मुझे एक "रास्ता" देता है, लेकिन यह सिर्फ "/" है
aavester

10

यह भी संभव है कि X-Forwarded-Protoईएलबी द्वारा निर्धारित हेडर का उपयोग करके, लोड बैलेंसर को छुए बिना कुछ और आसानी से किया जा सके । यहाँ है कि मैं क्या कर रहा है:

files:
  "/etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf":
    mode: "00644"
    owner: root
    group: root
    content: |
      map $http_upgrade $connection_upgrade {
        default        "upgrade";
        ""            "";
      }

      server {
        listen 80;

        gzip on;
        gzip_comp_level 4;
        gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        access_log    /var/log/nginx/access.log;

        location / {
          proxy_pass            http://docker;
          proxy_http_version    1.1;

          proxy_set_header      Connection      $connection_upgrade;
          proxy_set_header      Upgrade         $http_upgrade;
          proxy_set_header      Host            $host;
          proxy_set_header      X-Real-IP       $remote_addr;
          proxy_set_header      X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        if ($http_x_forwarded_proto = 'http') {
          return 301 https://$host$request_uri;
        }
      }

अब तक का सबसे आसान उपाय। आप पर्याप्त धन्यवाद नहीं कर सकते!
क्रिस मार्टिन

हां, ज्यादातर परिदृश्यों में यह सही तरीका है।
17

3

इलास्टिक बीनस्टॉक एक डॉक कंटेनर से कई बंदरगाहों का समर्थन नहीं करता है, इसलिए आपको सुझाव के अनुसार प्रॉक्सी स्तर पर इसे संभालने की आवश्यकता है। हालाँकि, आपके EC2 उदाहरण को आपके प्रमाणपत्र के बारे में जानने की आवश्यकता नहीं है, क्योंकि आप लोड बैलेंसर पर SSL कनेक्शन समाप्त कर सकते हैं।

आपकी .ebextensionsनिर्देशिका में, nginx प्रॉक्सी के लिए एक कॉन्फ़िगरेशन बनाएं जिसमें दो सर्वर कॉन्फ़िगरेशन शामिल हैं; एक जो प्रॉक्सी http://docker(डिफ़ॉल्ट कॉन्फ़िगरेशन, पोर्ट 80), और एक जिसे https (मैं 8080 पोर्ट चुना) को रीडायरेक्ट करता है।

.ebextensions/01-nginx-proxy.config:

files:
  "/etc/nginx/sites-available/000-default.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      map $http_upgrade $connection_upgrade {
          default        "upgrade";
          ""            "";
      }

      server {
          listen 80;

          gzip on;
          gzip_comp_level 4;
          gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

          access_log    /var/log/nginx/access.log;

          location / {
              proxy_pass            http://docker;
              proxy_http_version    1.1;

              proxy_set_header    Connection            $connection_upgrade;
              proxy_set_header    Upgrade                $http_upgrade;
              proxy_set_header    Host                $host;
              proxy_set_header    X-Real-IP            $remote_addr;
              proxy_set_header    X-Forwarded-For        $proxy_add_x_forwarded_for;
          }
      }

      server {
          listen 8080;

          location / {
              return 301 https://$host$request_uri;
          }
      }

commands:
   00_enable_site:
    command: 'rm -f /etc/nginx/sites-enabled/* && ln -s /etc/nginx/sites-available/000-default.conf /etc/nginx/sites-enabled/000-default.conf'

ईबी लोड-बैलेंसर और सुरक्षा समूहों के लिए एक दूसरा कॉन्फ़िगरेशन बनाएं जो उन्हें निम्नानुसार सेट करता है:

  • EC2 उदाहरण :
    • लोड बैलेंसर से पोर्ट्स 80/8080 पर यातायात की अनुमति दें
    • पोर्ट 22 पर ट्रैफ़िक को कहीं से भी अनुमति दें (ssh एक्सेस के लिए, वैकल्पिक)
  • लोड बैलेंसर :
    • 80 HTTP को पोर्ट करने के लिए फॉरवर्ड पोर्ट 443 HTTPS
    • आगे पोर्ट 80 HTTP 8080 HTTP पोर्ट करने के लिए

.ebextensions/02-load-balancer.config:

"Resources" : {
  "AWSEBSecurityGroup": {
    "Type" : "AWS::EC2::SecurityGroup",
    "Properties" : {
      "GroupDescription" : "Instance security group (22/80/8080 in)",
      "SecurityGroupIngress" : [ {
          "IpProtocol" : "tcp",
          "FromPort" : "80",
          "ToPort" : "80",
          "SourceSecurityGroupId" : { "Ref" : "AWSEBLoadBalancerSecurityGroup" }
        }, {
          "IpProtocol" : "tcp",
          "FromPort" : "8080",
          "ToPort" : "8080",
          "SourceSecurityGroupId" : { "Ref" : "AWSEBLoadBalancerSecurityGroup" }
        }, {
          "IpProtocol" : "tcp",
          "FromPort" : "22",
          "ToPort" : "22",
          "CidrIp" : "0.0.0.0/0"
        } ]
    }
  },
  "AWSEBLoadBalancerSecurityGroup": {
    "Type" : "AWS::EC2::SecurityGroup",
    "Properties" : {
      "GroupDescription" : "Load balancer security group (80/443 in, 80/8080 out)",
      "VpcId" : "<vpc_id>",
      "SecurityGroupIngress" : [ {
          "IpProtocol" : "tcp",
          "FromPort" : "80",
          "ToPort" : "80",
          "CidrIp" : "0.0.0.0/0"
        }, {
          "IpProtocol" : "tcp",
          "FromPort" : "443",
          "ToPort" : "443",
          "CidrIp" : "0.0.0.0/0"
        } ],
      "SecurityGroupEgress": [ {
          "IpProtocol" : "tcp",
          "FromPort" : "80",
          "ToPort" : "80",
          "CidrIp" : "0.0.0.0/0"
        }, {
          "IpProtocol" : "tcp",
          "FromPort" : "8080",
          "ToPort" : "8080",
          "CidrIp" : "0.0.0.0/0"
        } ]
    }
  },
  "AWSEBLoadBalancer" : {
    "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
    "Properties" : {
      "Listeners" : [ {
          "LoadBalancerPort" : "80",
          "InstancePort" : "8080",
          "Protocol" : "HTTP"
        }, {
          "LoadBalancerPort" : "443",
          "InstancePort" : "80",
          "Protocol" : "HTTPS",
          "SSLCertificateId" : "arn:aws:iam::<certificate_id>:<certificate_path>"
        } ]
    }
  }
}

(नोट: अपने मूल्यों के साथ SSLCertificateId और VpcId को बदलना न भूलें)।

लोड बैलेंसर (HTTP) के पोर्ट 80 पर कोई भी ट्रैफिक EC2 इंस्टेंस पर पोर्ट 8080 को हिट करेगा, जो HTTPS को रीडायरेक्ट करता है। लोड बैलेंसर (HTTPS) पर पोर्ट 443 पर ट्रैफिक EC2 उदाहरण पर पोर्ट 80 द्वारा परोसा जाएगा, जो कि डॉक प्रॉक्सी है।


0

Iam ElasticBeanstalk पर HTTP को HTTPS पर पुनर्निर्देशित करने के लिए टेराफॉर्म का उपयोग करते हुए,

मैंने अभी अतिरिक्त श्रोता नियम जोड़ा है

data "aws_alb_listener" "http" { //Get ARN of Listener on Port-80
  load_balancer_arn = aws_elastic_beanstalk_environment.myapp.load_balancers[0]
  port              = 80
}


resource "aws_alb_listener_rule" "redirect_http_to_https" {
  listener_arn = data.aws_alb_listener.http.arn
  action {
    type = "redirect"
    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
  condition {
    host_header {
      values = ["*.*"]
    }
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.