Nginx / Apache: impostare HSTS solo se X-Forwarded-Proto è https

Ho la seguente configuration:

Internet => nginx[public:80 +443, SSL termination) => Varnish[localhost:81] => Apache[localhost:82] 

Adesso alcuni siti devono essere raggiungibili solo tramite HTTPS e un certificato SSL valido. Per queste poche eccezioni vorrei triggersre HSTS, sia su nginx (preferito, o su Apache).

Il problema:

  • Su nginx, avrei bisogno di una logica if Host = foo.tld la if Host = foo.tld quindi impostassi Strict-Transport-Security xxx , ma secondo http://wiki.nginx.org/IfIsEvil non si dovrebbe usare if in una location
  • Su Apache, avrei bisogno di qualcosa come if X-Forwarded-Proto 443 set Strict-Transport-Security xxx , ma non sembra essere in grado di build questo con SetEnvIf (Apache 2.2)

La mia logica è difettosa? Un'altra idea per un approccio?

Questa è la configuration attualmente triggers:

nginx

 server {
         server_tokens off;

         ascolta xx.xx.xxx.xxx:80;
         nome_server localhost;

         luogo / {
                 proxy_pass http://127.0.0.1:81;
                 proxy_set_header X-Real-IP $ remote_addr;
                 proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;
                 proxy_set_header X-Forwarded-Proto $ schema;
                 proxy_set_header X-Forwarded-Port 80;
                 proxy_set_header Host $ host;
                 add_header X-XSS-Protection "1; modalità = block";
         }
 }

 server {
         server_tokens off;

         ascolta xx.xx.xxx.xxx:443 ssl;
         nome_server localhost;

         ssl on;
         ssl_certificate /etc/ssl/foo.crt;
         ssl_certificate_key /etc/ssl/private/foo.key;

         ssl_session_timeout 10m;

         # http://blog.ivanristic.com/2013/08/configuring-apache-nginx-and-openssl-for-forward-secrecy.html
         ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
         ssl_prefer_server_ciphers on;
         ssl_ciphers EECDH + ECDSA + AESGCM EECDH + aRSA + AESGCM EECDH + ECDSA + SHA384 EECDH + ECDSA + SHA256 EECDH + aRSA + SHA384 EECDH + aRSA + SHA256 EECDH + aRSA + RC4 EECDH EDH + aRSA RC4! ! MD5! EXP! PSK! SRP! DSS ";

         luogo / {
                 proxy_pass http://127.0.0.1:81;
                 proxy_set_header X-Real-IP $ remote_addr;
                 proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;
                 proxy_set_header X-Forwarded-Proto $ schema;
                 proxy_set_header X-Forwarded-Port 443;
                 proxy_set_header Host $ host;
                 add_header X-XSS-Protection "1; modalità = block";
         }
 }

Vernice

Nessuna configuration speciale.

Apache

 <VirtualHost *:82> [...] nothing special </VirtualHost> 

  • Panchina Apache: La stretta di mano SSL non è direttamente correlata al livello di concorrenza
  • Certificati del lato client (Apache, Linux, OpenSSL)
  • Più certificati SSL per accedere ad un'applicazione ASP.NET in IIS
  • È ansible impostare l'intestazione HTTP di versione SSL / TLS con Apache che un'applicazione backend può utilizzare?
  • Configurare IIS 7.5 come conforms a FIPS 140.2
  • Dopo aver impostato il bilanciatore di carico elastico, il mio https non funziona più. Errore Nginx
  • Montaggio di Webdav su XP
  • Come eseguire Gunicorn a monte con una configuration SSL Nginx?
  • 2 Solutions collect form web for “Nginx / Apache: impostare HSTS solo se X-Forwarded-Proto è https”

    Potresti avere più blocchi di server. Così basta aggiungere un nuovo block server per domini che necessitano di HSTS.

     server { listen xx.xx.xxx.xxx:443 ssl default_server; # all ssl stuff # and other directives } server { listen xx.xx.xxx.xxx:443 ssl; server_name example.com other.example.com; # all ssl stuff # and other directives with HSTS enabled } 

    Qui il primo block gestirà tutte le connessioni https ad exception di example.com e di other.example.com .

    E non hai bisogno di ssl on direttiva se hai bandiera ssl .

    EDIT

    C'è un'altra soluzione con solo un block di server:

     map $scheme:$host $hsts_header { default ""; https:example.com "max-age=31536000"; https:other.example.com "max-age=31536000"; } server { server_tokens off; listen xx.xx.xxx.xxx:80; listen xx.xx.xxx.xxx:443 ssl; ssl_certificate /etc/ssl/foo.crt; ssl_certificate_key /etc/ssl/private/foo.key; ssl_session_timeout 10m; # ... other ssl stuff location / { proxy_pass http://127.0.0.1:81; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header Host $host; add_header X-XSS-Protection "1; mode=block"; add_header Strict-Transport-Security $hsts_header; } } 

    Utilizziamo la map per definire il valore dell'intestazione HSTS e utilizziamo il fatto che nginx non aggiunge intestazione con valore vuoto.

    È inoltre ansible aggiungere l'intestazione HSTS incondizionatamente.

    Infatti, ha effetto solo se la connessione è rioutput, oltre TLS e senza avviso di cert. Cf paragrafo 5.1 di RFC6797 .

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.