Veebiserverite seadistamine31. Oct '13

Sissejuhatus

Siinsest kirjatükist leiad vihjeid kuidas Apache ning nginx seadistada kõige õigemal moel.

Transportkihi turvamine

HTTPS-i saab üles sättida sisuliselt kahel moel:

  • Kasutada mõnda veebilehitsejate poolt tunnustatud sertifitseerimiskeskust

  • Allkirjastada ise sertifikaat ning lisada sertifikaat tööjaamadesse

Transportkihi turbe puhul on oluline välja lülitada SSLv2 ja SSLv3 tugi ning keelata nõrgad sümmeetrilised sihvrid takistamaks POODLE ja DROWN ründeid.

Logjam rünnete vältimiseks peab genereerima Diffie-Hellmani parameetrid:

openssl dhparam -out /etc/ssl/web/dhparams.pem

Järgnevates konfiguratsioonifailides on viited sellele failile. Potensiaalsete MITM rünnete ärahoidmiseks on heaks tavaks praktiseerida ka HTTP Strict Transport Security 1 poliitikat.

1

https://raymii.org/s/tutorials/HTTP_Strict_Transport_Security_for_Apache_NGINX_and_Lighttpd.html

Sertifitseerimiskeskuse mängimine

Esmalt tuleb sertifitseerimiskeskusena (certificate authority) kasutatavas masinas üles seada sertifitseerimiskeskuse võti ning sertifikaat:

openssl genrsa -out ca.key 4096ca.keyopenssl req -key ca.key -config ca.cnf -new -x509 -days 7300 \ -extensions v3_ca -out ca.crt -sha256ca.crtca.cnf

Antud juhul ca.key on sertifitseerimiskeskuse võti, mis ei tohiks rändama minna ning ca.crt on sertifitseerimiskeskuse sertifikaat mille abil saab verifitseerida võtmega allkirjastatud serverite ja klientide sertifikaate.

Veebiserveri sertifikaadi genereermine:

server.keyopenssl genrsa -out server.key 4096openssl req -new -key server.key \-out server.csrserver.csrca.keyopenssl ca -config ca.cnf -in server.csr \ -extensions server_cert -out server.crt server.crtca.cnfca.crtcat ca.crt server.crt >bundle.crtca.crtbundle.crt

Katkendjoon eraldab serverit ning sertifitseerimiskeskuse masinat

Oluline on, et veebiserverina kasutataval sertifikaadil oleks märgitud järnevad sertifikaadi lipud:

keyUsage = critical,digitalSignature,keyEncipherment
extendedKeyUsage = serverAuth

Kasuta scp, wget, e-posti vms vahendeid et faile üle võrgu liigutada.

Apache seadistamine

Apache paigaldamiseks:

apt-get install apache2 libapache2-mod-php5

Lülita sisse ka moodulid:

a2enmod php5      # .php failide parsimiseks
a2enmod ssl       # Transportkihi turbe jaoks
a2enmod headers   # Päiste saatmise jaoks
a2enmod rewrite   # Ümbersuunamiste jaoks

Loo Apache veebisaidi konfiguratsiooni jaoks /etc/apache2/sites-available/owncloud.conf fail järgneva sisuga:

<VirtualHost *:80>
  ServerName owncloud.example.com
  RewriteEngine on
  RewriteCond %{HTTPS} off
  RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>

<VirtualHost *:443>
  SSLOpenSSLConfCmd DHParameters /etc/ssl/web/dhparams.pem
  Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
  ServerName owncloud.example.com
  DocumentRoot /var/www/owncloud/
  <Directory /var/www/owncloud>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Require all granted
  </Directory>
  SSLEngine on

  # Serveri serdid
  SSLCertificateFile /etc/ssl/web/bundle.crt
  SSLCertificateKeyFile /etc/ssl/web/server.key

  # Valideeri klienti
  SSLCACertificateFile /etc/ssl/minu-ca/certs/ca.crt
  SSLCARevocationFile /etc/ssl/minu-ca/crl/ca.crl
  SSLCARevocationCheck chain
  SSLVerifyClient require
  SSLVerifyDepth 1
</VirtualHost>

Veebisaidi sisse lülitamiseks:

a2ensite owncloud

Taaskäivita Apache:

service apache2 restart

nginx veebiserveri seadistamine

Nginx on vene päritolu BSD litsentsi all levitatav veebiserver mis on jõudsalt turuosa haaranud viimaste aastate jooksul 2. Apache2 kasutab lõimesi (thread), et mitmeid kasutajaid teenindada. Selle puhul lööb välja niinimetatud C10K probleem, ehk et üle 10000 ühenduse tegemine Apache2 veebiserverisse muutub keeruliseks. Nginx kasutab Linux puhul epoll meetodit võrgusoklitega majandamiseks, mistõttu ta saab vabalt hakkama 500000+ ühenduse üleval hoidmisega.

Nginx veebiserveri pakett on Debian ning Ubuntu varamutes olemas, kuid sellest on mitu varianti: nginx, nginx-full, nginx-extras. Viimases on kõige rohkem kellasid ja vilesid sisse kompileeritud:

sudo apt-get install nginx-extras

PHP jaoks tuleb paigaldada PHP-FPM rakendus:

sudo apt-get install php5-fpm \
    php5-mysql php5-sqlite php5-pgsql \
    php5-curl php5-xml php5-gd php5-ldap

Ubuntu 16.04 peal on võimalik paigaldada ka otse PHP7:

sudo apt-get install php7.0-fpm \
    php7.0-mysql php7.0-sqlite3 php7.0-pgsql \
    php7.0-curl php7.0-xml php7.0-gd php7.0-ldap

Loo transportkihi turbe seadistuste jaoks eraldi konfiguratsioonifail /etc/nginx/conf.d/tls.conf järgneva sisuga:

ssl_certificate /etc/ssl/web/bundle.crt;
ssl_certificate_key /etc/ssl/web/server.key;
ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_dhparam /etc/ssl/web/dhparams.pem;

Veebisaidi seadistuste failid paigutatakse /etc/nginx/sites-available/nimi.conf alla ning sisselülitatud seadistuste jaoks tehakse symlink /etc/nginx/sites-enabled/ alla.

OwnCloud puhul /etc/nginx/sites-available/owncloud.conf võiks olla järgnev:

server {
    # Kui HTTPS on seadistamata jäta vahele see serveri lõik ning
    # allpool asenda "listen 443 ssl" --> "listen 80"
    listen 80;
    server_name owncloud.example.com;
    rewrite ^ https://owncloud.example.com;
}

server {
    listen 443 ssl;
    server_name owncloud.example.com;

    root /var/www/owncloud/;
    client_max_body_size 10G;
    fastcgi_buffers 64 4K;
    rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
    rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
    rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;
    index index.php;
    error_page 403 /core/templates/403.php;
    error_page 404 /core/templates/404.php;

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location ~ ^/(data|config|\.ht|db_structure\.xml|README) {
        deny all;
    }

    location / {
        # The following 2 rules are only needed with webfinger
        rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
        rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
        rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
        rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;
        rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
        try_files $uri $uri/ index.php;
    }

    location ~ ^(.+?\.php)(/.*)?$ {
        try_files $1 = 404;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$1;
        fastcgi_param PATH_INFO $2;
        fastcgi_param HTTPS on;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_read_timeout 300;
    }

    # Optional: set long EXPIRES header on static assets
    location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
        expires 30d;
        access_log off;
    }
}

Konfiguratsiooni saame sisse lülitada nii:

ln -s ../sites-available/owncloud.conf /etc/nginx/sites-enabled/owncloud.conf

Testi nginx konfiguratsiooni:

nginx -t

Kui kõik klapib (taaskäivita) teenus:

service nginx restart
2

http://news.netcraft.com/archives/2013/01/07/january-2013-web-server-survey-2.html

DROWN Apache2 OpenSSL nginx POODLE Logjam