server:nginx

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
server:nginx [2007/11/13 21:03] stserver:nginx [2022/03/01 22:31] (aktuell) – [Links] st
Zeile 1: Zeile 1:
 +====== nginx ======
 +nginx ist ein HTTP server und IMAP/POP3/SMTP-[[server:Proxyserver|Proxy server]].
  
 +
 +===== Links =====
 +  * [[http://nginx.net/|Nginx Homepage]]
 +  * [[http://nginx.org/en/CHANGES|nginx changelog]]
 +  * [[http://wiki.codemongers.com/Nginx|Nginx English Wiki]]
 +  * [[http://wiki.codemongers.com/NginxHttpFcgiModule|NginxHttpFcgiModule]]
 +  * [[http://www.howtoforge.com/nginx_php5_fast_cgi_xcache_ubuntu7.04|Nginx HTTP Server + PHP5 (With fast-cgi And xcache) On Ubuntu Feisty Fawn]]
 +
 +
 +===== VHosts mit SNI =====
 +
 +**DefaultServer**:
 +<code bash>
 +server {
 +  listen 443 ssl default_server;
 +  listen [::]:443 ssl default_server;
 +
 +  server_name example.org;
 +
 +  server_tokens off;
 +  # required: path to certificate and private key
 +  ssl_certificate /opt/keys/example.org/example.org.unified.crt;
 +  ssl_certificate_key /opt/keys/example.org/example.org.decrypted.key;
 +
 +  # required for OCSP stapling, if any of your vhosts don't have this line, you have to inactivate OCSP stapling in ssl.conf
 +  ssl_trusted_certificate /opt/keys/example.org/example.org.unified+root.crt;
 +
 +  # Include global SSL settings
 +  include /etc/nginx/ssl.conf;
 +  root   /usr/share/nginx/html;
 +  index  index.html index.htm;
 +}
 +</code>
 +
 +**Server example.com**
 +<code bash>
 +server {
 +  listen 443 ssl default_server;
 +  listen [::]:443 ssl default_server;
 +
 +  server_tokens off;
 +  # required: path to certificate and private key
 +  ssl_certificate /opt/keys/example.com/example.com.unified.crt;
 +  ssl_certificate_key /opt/keys/example.com/example.com.decrypted.key;
 +
 +  # required for OCSP stapling, if any of your vhosts don't have this line, you have to inactivate OCSP stapling in ssl.conf
 +  ssl_trusted_certificate /opt/keys/example.com/example.com.unified+root.crt;
 +
 +  # Include global SSL settings
 +  include /etc/nginx/ssl.conf;
 +
 +  root /usr/share/nginx/html;
 +  index index.html index.htm;
 +
 +  location / {
 +    proxy_pass  http://upstream;
 +  }
 +}
 +</code>
 +
 +**Die Allgemeinen Einstellungen**:
 +<code bash>
 +# Basically the nginx configuration I use at konklone.com. 
 +# I check it using https://www.ssllabs.com/ssltest/analyze.html?d=konklone.com
 +#
 +# To provide feedback, please tweet at @konklone or email eric@konklone.com.
 +# Comments on gists don't notify the author. 
 +
 +# Thanks to WubTheCaptain (https://wubthecaptain.eu) for his help and ciphersuites.
 +# Thanks to Ilya Grigorik (https://www.igvita.com) for constant inspiration.
 +
 +# HTTP Strict Transport Security: tells browsers to require https:// without first checking
 +# the http:// version for a redirect. Warning: it is difficult to change your mind.
 +#
 +#    max-age: length of requirement in seconds (31536000 = 1 year)
 +#    includeSubdomains: force SSL for *ALL* subdomains (remove if this is not what you want)
 +#    preload: indicates you want browsers to ship with HSTS preloaded for your domain.
 +#
 +#    Submit your domain for preloading in browsers at: https://hstspreload.appspot.com
 +#add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';
 +
 +# If you won't/can't turn on HTTPS for *all* subdomains, use this simpler version:
 +add_header Strict-Transport-Security 'max-age=31536000';
 +
 +# Prefer certain ciphersuites, to enforce Forward Secrecy and avoid known vulnerabilities.
 +#
 +# Forces forward secrecy in all browsers and clients that can use TLS,
 +# but with a small exception (DES-CBC3-SHA) for IE8/XP users.
 +#
 +# Reference client: https://www.ssllabs.com/ssltest/analyze.html
 +ssl_prefer_server_ciphers on;
 +ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !MD5 !EXP !DSS !PSK !SRP !kECDH !CAMELLIA !RC4 !SEED';
 +
 +# Now let's really get fancy, and pre-generate a 2048 bit random parameter
 +# for DH elliptic curves. If not created and specified, default is only 1024 bits.
 +#
 +# Generated by OpenSSL with the following command:
 +#   openssl dhparam -outform pem -out dhparam2048.pem 2048
 +ssl_dhparam /path/to/dhparam2048.pem;
 +
 +# Cut out the old, broken, insecure SSLv2 and SSLv3 entirely.
 +ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
 +
 +
 +# optional: turn on session resumption, using a 10 min cache shared across nginx processes
 +# as recommended by http://nginx.org/en/docs/http/configuring_https_servers.html
 +ssl_session_cache   shared:SSL:10m;
 +ssl_session_timeout 10m;
 +keepalive_timeout   70;
 +
 +# Buffer size of 1400 bytes fits in one MTU.
 +# nginx 1.5.9+ ONLY
 +ssl_buffer_size 1400;
 +
 +# OCSP stapling - means nginx will poll the CA for signed OCSP responses,
 +# and send them to clients so clients don't make their own OCSP calls.
 +# https://en.wikipedia.org/wiki/OCSP_stapling
 +#
 +# while the ssl_certificate above may omit the root cert if the CA is trusted,
 +# ssl_trusted_certificate below must point to a chain of **all** certs
 +# in the trust path - (your cert, intermediary certs, root cert)
 +#
 +# 8.8.8.8 and 8.8.4.4 below are Google's public IPv4 DNS servers.
 +# nginx will use them to talk to the CA.
 +ssl_stapling on;
 +ssl_stapling_verify on;
 +resolver 8.8.8.8 8.8.4.4 valid=86400;
 +resolver_timeout 10;
 +</code>
 +
 +===== Reverse-Proxy-Config =====
 +
 +Bespiel:
 +  * $FQDN worauf sollen sich Clients verbinden können? z.B. server.domain.tld
 +  * $SSL_PORT Welcher Port soll  nach Außen geöffent werden? 443 ist standard
 +  * $TARGET_FQDN wohin sollen die Clients (transparent) umgeleitet werden: z.B localhost
 +  * $TARGET_PORT auf welchen Port sollen die Clients (transparent) umgeleitet werden: z.B. 8080
 +  * https://docs.nginx.com/nginx/admin-guide/security-controls/securing-http-traffic-upstream/
 +
 +:!: Die Datei ssl_certificate -> /root/$FQDN.crt enthält sowohl das Serverzertifikat als auch die komplette Chain/Intermediates die zur Verfolgung bis hin zum Stammzertifikat nötig sind.
 +
 +**Konfiguration** (liegt in sites-available mit Symlink auf sites-enabled: <code bash>ln -s /etc/nginx/sites-available/FQDN.conf /etc/nginx/sites-enabled/</code>
 +<code>
 +server{
 +  listen 80;
 +  listen [::]:80;
 +  server_name $FQDN;
 +  server_tokens off;
 +  return 301 https://$FQDN[:$SSL_PORT]$request_uri;
 +}
 +
 +server{
 +  listen $SSL_PORT ssl;
 +  listen [::]:$SSL_PORT ssl;
 +  server_name $FQDN;
 +
 +  server_tokens off;
 +  ssl_certificate     /root/$FQDN.crt;
 +  ssl_certificate_key /root/$FQDN.key;
 +
 +  ssl on;
 +  # source: https://cipherli.st/
 +  ssl_session_cache  builtin:1000  shared:SSL:10m;
 +  # TLSv1.3 Requires nginx >= 1.13.0 AND openssl 1.1.1 (the updated Ubuntu 18.04 has openssl 1.1.1 ):
 +  # ssl_protocols TLSv1.2 TLSv1.3;
 +  ssl_protocols TLSv1.2;
 +  ssl_prefer_server_ciphers on;
 +  # openssl dhparam -out /etc/nginx/dhparam.pem 2048 :
 +  ssl_dhparam /etc/nginx/dhparam.pem;
 +  ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
 +  ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
 +  ssl_session_timeout  10m;
 +  ssl_session_cache shared:SSL:10m;
 +  ssl_session_tickets off; # Requires nginx >= 1.5.9
 +  ssl_stapling on; # Requires nginx >= 1.3.7
 +  ssl_stapling_verify on; # Requires nginx => 1.3.7
 +
 +  #resolver $DNS-IP-1 $DNS-IP-2 valid=300s;
 +  #resolver_timeout 5s; 
 +  # HSTS on:
 +  add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
 +  #add_header X-Frame-Options DENY;
 +  #add_header X-Content-Type-Options nosniff;
 +  #add_header X-XSS-Protection "1; mode=block";
 +
 +  access_log /var/log/nginx/$FQDN.access.log;
 +  error_log /var/log/nginx/$FQDN.error.log;
 +
 +  location / {
 +
 +    # pass Host-header (from client) through:
 +    proxy_set_header    Host $host;
 +    # pass information about this proxy:
 +    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;
 +
 +    # Fix the "It appears that your reverse proxy set up is broken" error.
 +    proxy_pass          http://$TARGET_FQDN:$TARGET_PORT;
 +    proxy_read_timeout  30;
 +    # verify SSL-Cert on proxy_pass target:
 +    # proxy_ssl_verify on
 +    # proxy_redirect      http://$TARGET_FQDN:$TARGET_PORT http://$FQDN:$TARGET_PORT;
 +
 +    # websockets?
 +    # proxy_http_version 1.1;
 +    # proxy_set_header Upgrade $http_upgrade;
 +    # proxy_set_header Connection $http_connection;
 +
 +  }
 +}
 +</code>
 +
 +Quellen:
 +  * https://gist.github.com/StefanWallin/5690c76aee1f783c3d57
 +  * https://cipherli.st/
 +
 +===== IPv6 =====
 +
 +nginx braucht in jedem virtual Host die entsprechenden listen-Direktiven:
 +
 +<file>
 +  # v4: -> 0.0.0.0:80
 +  listen 80;
 +  # v6: -> :::443
 +  listen [::]:80;
 +</file>
 +
 +SSL/TLS:
 +<file>
 +  # v4:
 +  listen 443 ssl;
 +  # v6:
 +  listen [::]:443 ssl;
 +</file>
 +
 +einzeilig geht es mit der option ipv6only, bei "off" wird auch v4 gebunden (Standard ist "on"), siehe auch: http://nginx.org/en/docs/http/ngx_http_core_module.html#listen.
 +<file>listen [::]:443 ipv6only=off;</file>