Zabezpieczanie serwera www

Kilka plików konfiguracyjnych jest umieszczone repozytorium skryptów. Niemniej bardzo istotne są nagłówki http wysyłane przez serwer www.

Wykonanie funkcji skrótu z certyfikatu ssl

Na podstawie certyfikatu serwera wykonujemy funkcję skrótu:

/usr/local/bin/openssl x509 -pubkey < /usr/local/etc/apache22/www.bsdserwis.com.chained.pem | /usr/local/bin/openssl pkey -pubin -outform der | /usr/local/bin/openssl dgst -sha256 -binary | base64

Zgodnie z dobrymi praktykami warto mieć od razu wygenerowane zapasowe klucze. Wtedy funkcję skrótu generujemy z pliku CSR:

openssl req -pubkey < bsdserwis.first.csr | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64

/!\ /!\ /!\ UWAGA!!! Wsparcie dla HPKP wygasło. Wykonywania funkcji skrótu i generowanie nagłówków HPKP nie jest już konieczne. Zamiast tego wykorzystyany jest mechanizm Certificate Transparency

Albo też korzystając z repozytorium skryptów można uruchomić następujące narzędzie:

# uruchomienie funkcji skrótu dla certyfikatu
#
le.pin256 -t x509 -f cert/www.bsdserwis.com.signed.crt

# uruchomienie funkcji skrótu dla CSR
#
le.pin256 -t req -f certs/www2.bsdserwis.com.csr

Ustawianie nagłówków w serwerze www

apache24

Na przykładzie nagłówków dla VirtualHost www.bsdserwis.com:

       <IfModule mod_headers.c>
          Header merge X-Frame-Options SAMEORIGIN
          Header merge X-Content-Type-Options nosniff
          Header merge X-XSS-Protection "1; mode=block"
          Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
          ##Header merge X-Robots-Tag all
          Header set Content-Security-Policy "upgrade-insecure-requests; default-src https:; form-action https:; script-src 'self' https://seo.bsdserwis.com/; img-src '
self' https://seo.bsdserwis.com/; style-src 'self' https://fonts.googleapis.com; font-src 'self' https://fonts.googleapis.com https://fonts.gstatic.com; object-src 'sel
f'; report-uri /cgi-bin/csp-report.cgi"
          ##Header set Public-Key-Pins 'pin-sha256="q3FEYGQ1rmfOZYWF9xqsdnWTgeOp//KINboUIbD2yfU="; pin-sha256="+S7LdocaP8qP3IgtUWSUaD6jVZj7lMy/085etzGv2dY="; pin-sha256="
IPp8IyvXbZshoKZ7Dur3u/NfO531iHphaU4huvmYePo="; max-age=2592000; includeSubdomains'
        Header set Referrer-Policy: strict-origin

X-Robots-Tag

Bardzo ważny nagłówek. Określa to samo (albo i mocniej), co zawartość pliku robots.txt. Zgodnie z dokumentacją Google trzeba ustawić poprawną wartość. (!) none warto dać dla serwisów administracyjnych, zaś all dla normalnych witryn.

nginx

Na przykładzie nagłówków dla serwera webowego:

    add_header X-Robots-Tag all;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload";
    add_header Referrer-Policy strict-origin;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header Content-Security-Policy "upgrade-insecure-requests; default-src https:; form-action https:; script-src 'self' https://seo.bsdserwis.com/; img-src '
self' https://seo.bsdserwis.com/; style-src 'self' https://fonts.googleapis.com; font-src 'self' https://fonts.googleapis.com https://fonts.gstatic.com; object-src 'sel
f'; report-uri /cgi-bin/csp-report.cgi"

Dodanie raportowania naruszeń CSP

Jest to odpowiednio zmodyfikowany przepis na zupę1, dostosowany do moich potrzeb.

Skrypt

Powstał dedykowany skrypt, który jest umieszczony w repozytorium konfiguracji. Skrypt korzysta z dwóch modułów PERLa, które trzeba zainstalować w systemie. Najlepiej skorzystać z repozytorium pakietów:

pkg install -y www/p5-CGI converters/p5-JSON

apache24

Konfiguracja ogólna

W repozytorium konfiguracji został umieszczony plik konfiguracyjny 015-csp-report.conf, który jest dołączany do konfiguracji serwera www:

# definicja specjalnego logu
#
LogFormat "%h %l %u %t \"%{User-Agent}i\" \"%{Referer}i\" \"%{X-CSP-request}o\" \"%{X-CSP-blocked-uri}o\" \"%{X-CSP-violated-directive}o\"" csplog

# ustawienie zmiennej /srodowiskowej dla wybranego URLa
SetEnvIf    Request_URI "^/cgi-bin/csp-report.cgi" CSPLOG

Konfiguracja dla wybranej witryny

Dla wybranej witryny należy wykonać następującą konfigurację (podano istotne fragmenty):

<IfDefine SSL>
   <VirtualHost [...]>
      <IfModule mod_headers.c>
          Header set Content-Security-Policy "[...] ; report-uri /cgi-bin/csp-report.cgi"
      </IfModule>
      <IfModule mod_alias.c>
          ScriptAlias /cgi-bin/csp-report.cgi /usr/local/www/cgi-bin/csp-report.cgi
          ScriptAlias /cgi-bin/ "/var/www/htdocs/virtuals/[...]/cgi-bin/"
      </IfModule>

      # CSP Log
      CustomLog   /var/log/httpd/forum.vectraklub.pl/csp.log   csplog  env=CSPLOG

   </VirtualHost>
</IfDefine>

nginx

Konfiguracja ogólna

Konfiguracja została umieszczona w repozytorium konfiguracji w pliku 015-csp-log-format.conf, która jest dołączana do pliku nginx.conf:

log_format csplog '$remote_addr - $remote_user '
                '[$time_local] "$http_user_agent" '
                '"$http_x_csp_referrer" "$http_x_csp_document_uri" '
                '"$http_x_csp_blocked_uri" "$http_x_csp_violated_directive"';

Konfiguracja dla wybranej witryny

Dla wybranej witryny należy wykonać następującą konfigurację zapisaną w repozytorium konfiguracji w pliku 015-csp-report.conf:

location /cgi-bin/csp-report.cgi {
    alias /usr/local/www/cgi-bin/csp-report.cgi;
    gzip off;
    fastcgi_pass  unix:/var/run/fcgiwrap/fcgiwrap.sock;
    fastcgi_index mailgraph.cgi;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME  $request_filename;
    set $csplog 1;
}

Samo logowanie należy zapisać w definicji wirtualki:
{{{#!highlight nginx numbers=off
access_log /var/log/nginx/www.domain.tld/csp.log csplog if=$csplog;

Źródła w sieci internet


{i}  (c) 2004 - 2026 BSD Serwis Krzysztof Stryjek. W przypadku błędów, poprawek proszę kontaktować się z administratorem wiki.

  1. Serwer już nie działa - 2018.06.18 (1)