web-dev-qa-db-fra.com

Comment faire pour rediriger automatiquement le serveur proxy Elastic Beanstalk nginx de HTTP vers HTTPS?

J'ai un site propulsé par Node.js que j'exécute sur Amazon Elastic Beanstalk.

Mon application Node.js écoute sur le port 8080, et j'utilise la configuration d'équilibrage de charge élastique nginx avec mon application EB, en écoutant sur les ports 80 et 443 pour HTTP et HTTPS.

Cependant, je souhaite uniquement accepter le trafic de mon application via HTTPS.

Je pourrais régler quelque chose dans l'application pour résoudre ce problème, mais je suis intéressé par un moyen d'obtenir l'équilibreur de charge pour rediriger toutes les demandes HTTP vers mon site via HTTPS.

58
Mason G. Zhwiti

Après plusieurs faux départs avec des idées du support payant d'Amazon, ils ont finalement abouti. Pour que cela fonctionne, vous configurez votre environnement pour qu'il réponde aux ports 80 et 443. Créez ensuite un dossier dans votre dossier principal Node.js, appelé .ebextensions, et vous placez un fichier nommé 00_nginx_https_rw.config là-dedans, avec ce texte comme contenu:

files:
  "/tmp/45_nginx_https_rw.sh":
    owner: root
    group: root
    mode: "000644"
    content: |
      #! /bin/bash

      CONFIGURED=`grep -c "return 301 https" /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf`

      if [ $CONFIGURED = 0 ]
        then
          sed -i '/listen 8080;/a \    if ($http_x_forwarded_proto = "http") { return 301 https://$Host$request_uri; }\n' /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf
          logger -t nginx_rw "https rewrite rules added"
          exit 0
        else
          logger -t nginx_rw "https rewrite rules already set"
          exit 0
      fi

container_commands:
  00_appdeploy_rewrite_hook:
    command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/appdeploy/enact
  01_configdeploy_rewrite_hook:
    command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact
  02_rewrite_hook_perms:
    command: chmod 755 /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh
  03_rewrite_hook_ownership:
    command: chown root:users /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh

L'équipe de support d'Amazon a expliqué: Cette configuration crée un hook de déploiement qui ajoutera les règles de réécriture à /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf.

(Auparavant, ils m'avaient proposé des .config qui copiaient des fichiers séparés dans /etc/nginx/conf.d, mais ceux-ci n'avaient aucun effet, ou pire, semblaient remplacer ou avoir la priorité sur la configuration par défaut de nginx, pour une raison quelconque.)

Si jamais vous voulez annuler cela, c'est-à-dire supprimer les crochets, vous devez supprimer cette extension électronique et émettre une commande pour supprimer les fichiers qu'elle crée. Vous pouvez le faire soit manuellement, soit via les commandes ebextensions que vous mettez temporairement en place:

/opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh
/opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh

Je n'ai pas essayé cela, mais probablement quelque chose comme ça fonctionnerait pour les supprimer et annuler ce changement:

container_commands:
  00_undochange:
    command: rm /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh
  01_undochange:
    command: rm /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh

J'espère que cela pourra aider quelqu'un d'autre à l'avenir.

80
Mason G. Zhwiti

La réponse acceptée ne fonctionnait plus pour moi. Le port par défaut était différent. L'emplacement du fichier de configuration a également changé. Je configure une application Ruby on Rails avec Puma.

J'ai parlé au support payant, nous l'avons compris en exécutant simplement les commandes manuellement sur l'instance en cours d'exécution. Ensuite, j'ai pu comprendre la solution ci-dessous. Juste en vous connectant et en redémarrant les choses nginx, cela a fonctionné.

files:
  "/tmp/45_nginx_https_rw.sh":
    owner: root
    group: root
    mode: "000644"
    content: |
      #! /bin/bash

      CONFIGURED=`grep -c "return 301 https" /opt/elasticbeanstalk/support/conf/webapp_healthd.conf`

      if [ $CONFIGURED = 0 ]
        then
          sed -i '/listen 80;/a \    if ($http_x_forwarded_proto = "http") { return 301 https://$Host$request_uri; }\n' /opt/elasticbeanstalk/support/conf/webapp_healthd.conf
          logger -t nginx_rw "https rewrite rules added"
          exit 0
        else
          logger -t nginx_rw "https rewrite rules already set"
          exit 0
      fi

container_commands:
  00_appdeploy_rewrite_hook:
    command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/appdeploy/enact
  01_configdeploy_rewrite_hook:
    command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact
  02_rewrite_hook_perms:
    command: chmod 755 /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh
  03_rewrite_hook_ownership:
    command: chown root:users /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh

Remarquez comment j'ai changé le numéro de port et l'emplacement du fichier de configuration.

19
Hendrik

Vous pouvez gérer la redirection via votre application Node.js.

Amazon envoie le X-Forwarded-Proto en-tête qui est égal à http lorsque le client s'est connecté de manière non sécurisée.

Le middleware suivant doit être inséré juste après l'initialisation de Express et avant de définir vos itinéraires pour rediriger automatiquement le client vers le point de terminaison HTTPS correspondant:

// Redirect to HTTPS
app.use(function (req, res, next) {
    // Insecure request?
    if (req.get('x-forwarded-proto') == 'http') {
        // Redirect to https://
        return res.redirect('https://' + req.get('Host') + req.url);
    }

    next();
});
9
Elad Nava

J'ai pu faire fonctionner cela avec une solution légèrement plus simple.

Veuillez noter qu'il s'agit d'une instance SINGLE déployée par beanstalk élastique, non équilibrée en charge.

C'était mon ebextension que j'ai ajoutée.

files:
  "/etc/nginx/conf.d/000_my_config.conf":
    mode: "000755"
    owner: root
    owner: root
    content: |
      server {
          listen 8080;
          return 301 https://$Host$request_uri;
      }
6
elloworld111

J'exécute l'environnement 'Ruby2 Puma' sur AWS Elastic Beanstalk qui peut avoir une configuration légèrement différente de celle ci-dessus. Dans mon environnement, j'avais besoin d'utiliser "écouter 80" au lieu de "écouter 8080".

sslredirect.config basé sur réponse d'elloworld111 :

files:
  "/etc/nginx/conf.d/000_my_config.conf":
    mode: "000755"
    owner: root
    owner: root
    content: |
      server {
          listen 80;
          return 301 https://$Host$request_uri;
      }
5
Adam D

Je travaille avec Elastic Beanstalk et Docker, j'ai donc pris un chemin légèrement différent pour que les choses fonctionnent pour moi, mais très inspiré par la réponse acceptée. Ce script injecte la configuration requise dans /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf. (Si quelqu'un a une solution plus élégante, j'adorerais la voir)

Ce script permet également au contrôle de santé Beanstalk d'atteindre mon point de terminaison de contrôle de santé (dans mon cas, api/healthcheck) Mieux pour permettre au LoadBalancer de frapper l'application, plutôt que de se terminer sur Nginx.

files:
  "/tmp/45_nginx_https_rw.sh":
    owner: root
    group: root
    mode: "000755"
    content: |
      #! /bin/bash

      CONFIGURED=`grep -c "return 301 https" /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf`

      if [ $CONFIGURED = 0 ]
        then
          sed -i "/access.log;/a \ \ \ \ \ \ \ \ location /api/health-check { proxy_pass http://docker; }" /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf
          sed -i "/proxy_add_x_forwarded_for;/a \ \ \ \ \ \ \ \ \ \ \ \ if (\$http_x_forwarded_proto != 'https') { return 301 https://\$Host\$request_uri; }" /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf
          logger -t nginx_rw "https rewrite rules added"
          exit 0
        else
          logger -t nginx_rw "https rewrite rules already set"
          exit 0
      fi

container_commands:
  00_run_script:
    command: /tmp/45_nginx_https_rw.sh
4
Iain Hunter

J'ai pu faire en sorte que cela fonctionne d'une manière différente. J'ai changé mon équilibreur de charge pour transférer le trafic du port 80 vers le port 8082, et changé les règles de pare-feu (entrant sur l'instance, sortant sur le pare-feu) pour le permettre. Et puis ajouté ce fichier dans .ebextensions:

files:
  "/etc/nginx/conf.d/50-atd-hotel-http-redirect.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      server {
        listen   8082;

        return 301 --WHATEVER DESTINATION YOU WANT--;
      }
2
RobO

La réponse acceptée n'a pas fonctionné pour moi. Après de nombreux essais (et des heures de recherche sur Google), je trouve quelque chose qui a fonctionné pour moi. J'ai également un site propulsé par Node.js que j'exécute sur Elastic Beanstalk.

J'ai utilisé le script à partir d'ici: https://adamjstevenson.com/tutorials/2017/02/02/configuring-and-forcing-https-for-aws-elastic-beanstalk.html

La seule modification que j'ai faite a été de désactiver

/opt/elasticbeanstalk/support/conf/webapp_healthd.conf

par

/etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf

donc ça donne ceci:

files:
  "/tmp/45_nginx_https_rw.sh":
    owner: root
    group: root
    mode: "000644"
    content: |
      #! /bin/bash

      CONFIGURED=`grep -c "return 301 https" /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf`

      if [ $CONFIGURED = 0 ]
        then
          sed -i '/listen 80;/a \    if ($http_x_forwarded_proto = "http") { return 301 https://$Host$request_uri; }\n' /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf
          logger -t nginx_rw "https rewrite rules added"
          exit 0
        else
          logger -t nginx_rw "https rewrite rules already set"
          exit 0
      fi

container_commands:
  00_appdeploy_rewrite_hook:
    command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/appdeploy/enact
  01_configdeploy_rewrite_hook:
    command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact
  02_rewrite_hook_perms:
    command: chmod 755 /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh
  03_rewrite_hook_ownership:
    command: chown root:users /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh

Après eb deploy, redémarrez simplement votre nginx Sudo service nginx restart et vous êtes prêt.

0
Matija Martic