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).

  • Disabilita Triple-DES solo su TLS 1.1 e 1.2? (NGINX / OpenSSL serie 1.0.2)
  • Nginx risorse di apprendimento
  • Un unico process php-fastcgi blocca tutte le altre richieste PHP
  • Sito web che non carica i file statici quando NGINX dispone di contenuti di cache statici abilitati
  • Come faccio a patch apache?
  • La direttiva Apache Directory dovrebbe essere relativa al DocumentRoot o less?
  • 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> 

  • Cosa fare dopo aver colpito i dreaded 256 max connessioni Apache Limit
  • Il nome host Ping restituisce un altro hostname in output: cosa significa?
  • Troppi processi di httpd in esecuzione e il block del server CentOS
  • Imansible pingare il server remoto; come posso eseguire il debug di configuration di networking locale non conforms al mio IP è bloccato?
  • Configurazione di Apache2 a proxy WebSocket?
  • Reindirizzamento SSL senza sollevare un avviso
  • 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.