From 4ce42ab74dc899c5eb2d86b1c4ba9d1674ee75ae Mon Sep 17 00:00:00 2001 From: Kevin MacMartin Date: Sun, 18 Dec 2016 23:54:13 -0500 Subject: [PATCH] Update default the nginx sites-available config to include XSS and clickjacking protection and to 301 to https on port 80, and add configs for piwik and rouncube --- nginx/sites-available/REPLACEME.TLD.conf | 34 +++---- nginx/sites-available/mail.REPLACEME.TLD.conf | 93 +++++++++++++++++++ .../sites-available/stats.REPLACEME.TLD.conf | 69 ++++++++++++++ 3 files changed, 173 insertions(+), 23 deletions(-) create mode 100644 nginx/sites-available/mail.REPLACEME.TLD.conf create mode 100644 nginx/sites-available/stats.REPLACEME.TLD.conf diff --git a/nginx/sites-available/REPLACEME.TLD.conf b/nginx/sites-available/REPLACEME.TLD.conf index e673851..f032c47 100644 --- a/nginx/sites-available/REPLACEME.TLD.conf +++ b/nginx/sites-available/REPLACEME.TLD.conf @@ -1,25 +1,9 @@ +# LARAVEL CONFIGURATION + server { listen 80; server_name REPLACEME.TLD; - root /srv/http/REPLACEME.TLD/public; - - index index.php index.html; - charset utf-8; - - include /etc/nginx/h5bp/basic.conf; - - location / { try_files $uri $uri/ /index.php?$query_string; } - - location ~ \.php$ { - fastcgi_split_path_info ^(.+\.php)(/.+)$; - fastcgi_pass unix:/run/php-fpm/php-fpm.sock; - fastcgi_index index.php; - include fastcgi.conf; - } - - location = /favicon.ico { access_log off; log_not_found off; } - location = /robots.txt { access_log off; log_not_found off; } - location ~ /\.ht { deny all; } + return 301 https://REPLACEME.TLD$request_uri; } server { @@ -43,14 +27,18 @@ server { ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; ssl_prefer_server_ciphers on; - # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months) - add_header Strict-Transport-Security max-age=15768000; - # OCSP Stapling: fetch OCSP records from URL in ssl_certificate and cache them ssl_stapling on; ssl_stapling_verify on; - index index.php index.html; + # Protect against XSS and clickjacking + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-XSS-Protection "1; mode=block"; + + # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months) + add_header Strict-Transport-Security max-age=15768000; + + index index.php; charset utf-8; include /etc/nginx/h5bp/basic.conf; diff --git a/nginx/sites-available/mail.REPLACEME.TLD.conf b/nginx/sites-available/mail.REPLACEME.TLD.conf new file mode 100644 index 0000000..bb40f56 --- /dev/null +++ b/nginx/sites-available/mail.REPLACEME.TLD.conf @@ -0,0 +1,93 @@ +# ROUNDCUBE CONFIGURATION + +server { + listen 80; + server_name mail.REPLACEME.TLD; + return 301 https://mail.REPLACEME.TLD$request_uri; +} + +server { + listen 443 ssl; + server_name mail.REPLACEME.TLD; + root /usr/share/webapps/roundcubemail; + + ssl_certificate /etc/letsencrypt/live/REPLACEME.TLD/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/REPLACEME.TLD/privkey.pem; + ssl_trusted_certificate /etc/letsencrypt/live/REPLACEME.TLD/fullchain.pem; + + ssl_session_timeout 1d; + ssl_session_cache shared:SSL:50m; + + # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits + # Generate with: openssl dhparam -out /etc/nginx/dhparam.pem 4096 + ssl_dhparam /etc/nginx/dhparam.pem; + + # Mozilla "Intermediate configuration" copied from https://mozilla.github.io/server-side-tls/ssl-config-generator/ + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; + ssl_prefer_server_ciphers on; + + # OCSP Stapling: fetch OCSP records from URL in ssl_certificate and cache them + ssl_stapling on; + ssl_stapling_verify on; + + # Protect against XSS and clickjacking + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-XSS-Protection "1; mode=block"; + + # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months) + add_header Strict-Transport-Security max-age=15768000; + + index index.php; + charset utf-8; + + include /etc/nginx/h5bp/basic.conf; + + location / { try_files $uri $uri/ /index.php?$query_string; } + + location ~ ^/webmail/favicon.ico$ { + root /usr/share/webapps/roundcubemail/skins/classic/images; + log_not_found off; + access_log off; + expires max; + } + + location ~ ^/webmail/robots.txt { + allow all; + log_not_found off; + access_log off; + } + + location ~ ^/webmail/(config|temp|logs)/ { + deny all; + } + + location ~ ^/webmail/(README|INSTALL|LICENSE|CHANGELOG|UPGRADING)$ { + deny all; + } + + location ~ ^/webmail/(bin|SQL)/ { + deny all; + } + + location ~ ^/webmail/(.+\.md)$ { + deny all; + } + + location ~ ^/webmail/\. { + deny all; + access_log off; + log_not_found off; + } + + location ~ \.php$ { + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_pass unix:/run/php-fpm/php-fpm.sock; + fastcgi_index index.php; + include fastcgi.conf; + } + + location = /favicon.ico { access_log off; log_not_found off; } + location = /robots.txt { access_log off; log_not_found off; } + location ~ /\.ht { deny all; } +} diff --git a/nginx/sites-available/stats.REPLACEME.TLD.conf b/nginx/sites-available/stats.REPLACEME.TLD.conf new file mode 100644 index 0000000..e3de74f --- /dev/null +++ b/nginx/sites-available/stats.REPLACEME.TLD.conf @@ -0,0 +1,69 @@ +# PIWIK CONFIGURATION + +server { + listen 80; + server_name stats.REPLACEME.TLD; + return 301 https://stats.REPLACEME.TLD$request_uri; +} + +server { + listen 443 ssl; + server_name stats.REPLACEME.TLD; + root /srv/http/stats.REPLACEME.TLD; + + ssl_certificate /etc/letsencrypt/live/REPLACEME.TLD/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/REPLACEME.TLD/privkey.pem; + ssl_trusted_certificate /etc/letsencrypt/live/REPLACEME.TLD/fullchain.pem; + + ssl_session_timeout 1d; + ssl_session_cache shared:SSL:50m; + + # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits + # Generate with: openssl dhparam -out /etc/nginx/dhparam.pem 4096 + ssl_dhparam /etc/nginx/dhparam.pem; + + # Mozilla "Intermediate configuration" copied from https://mozilla.github.io/server-side-tls/ssl-config-generator/ + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; + ssl_prefer_server_ciphers on; + + # OCSP Stapling: fetch OCSP records from URL in ssl_certificate and cache them + ssl_stapling on; + ssl_stapling_verify on; + + # Protect against XSS and clickjacking + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-XSS-Protection "1; mode=block"; + + # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months) + add_header Strict-Transport-Security max-age=15768000; + + index index.php; + charset utf-8; + + include /etc/nginx/h5bp/basic.conf; + + location / { + location ~* ^/tmp/.*\.html?$ { return 404; } + location ~* (?:DESIGN|(?:gpl|README|LICENSE)[^.]*|LEGALNOTICE)(?:\.txt)*$ { return 404; } + location ~* \.(?:bat|git|ini|sh|svn[^.]*|txt|tpl|xml)$ { return 404; } + try_files $uri /index.php?$query_string; + } + + location = /favicon.ico { try_files /favicon.ico @empty; } + location @empty { empty_gif; } + + location ~ \.php$ { + try_files $uri =404; + include fastcgi_params; + fastcgi_pass unix:/run/php-fpm/php-fpm.sock; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_intercept_errors on; + fastcgi_split_path_info ^(.+\.php)(.*)$; + fastcgi_hide_header X-Powered-By; + } + + location ~* ^.+\.php$ { return 404; } + location = /robots.txt { return 200 "User-agent: *\nDisallow: /\n"; } +}