Wenn man Raspbian einsetzt (oder eine fast beliebige andere Linux-Distribution) hat man das Problem, dass die mitgelieferten Webserver und Loadbalancer OpenSSL nutzen. OpenSSL ist 2015 durch eine Sicherheitslücken negativ aufgefallen, außerdem gibt es keine Unterstützung1 für ChaCha20 Cipher Suiten. Diese haben den Vorteil, dass sie in Software schneller sind als AES. Das macht sich insbesondere bei meinen Raspberry Pi und bei Smartphones bemerkbar. Diese haben Hardware AES.

LibreSSL ist eine Alternative zu OpenSSL. Es hat die Unterstützung für ChaCha20. Bei LibreSSL liegt der Fokus auf Sicherheit und weniger auf die Unterstützung von alten Schnittstellen. Deswegen ist davon auszugehen, dass es in der Zukunft auch weniger kritische Sicherheitslücken geben wird.

HAProxy

In meinen Setup ist HAProxy vor dem Webserver (Nginx). Es ist vielleicht sinnlos einen Loadbalancer auf dem Pi zu nutzen aber ich finde, dass sich HAProxy ein einigen Stellen einfacher konfigurieren lässt als Nginx.

HAProxy mit LibreSSL und PCRE bauen

kopiere das folgende Script in eine Datei und führe es aus:

#!/bin/bash

# names of latest versions of each package
export HAPROXY_VERSION=1.6.3
export VERSION_PCRE=pcre-8.38
export VERSION_LIBRESSL=libressl-2.3.1
export VERSION_HAPROXY=haproxy-$HAPROXY_VERSION

# URLs to the source directories
export SOURCE_LIBRESSL=ftp://ftp.openbsd.org/pub/OpenBSD/LibreSSL/
export SOURCE_PCRE=ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
export SOURCE_HAPROXY=http://www.haproxy.org/download


# clean out any files from previous runs of this script
rm -rf build
mkdir build

# proc for building faster
NB_PROC=$(grep -c ^processor /proc/cpuinfo)

# ensure that we have the required software
#sudo apt-get -y install curl wget build-essential libgd-dev libgeoip-dev checkinstall git

# grab the source files
echo "Download sources"
wget -P ./build "${SOURCE_PCRE}${VERSION_PCRE}.tar.gz"
wget -P ./build "${SOURCE_LIBRESSL}${VERSION_LIBRESSL}.tar.gz"
wget -P ./build "${SOURCE_HAPROXY}/$(echo $HAPROXY_VERSION | cut -d. -f 1-2)/src/$VERSION_HAPROXY.tar.gz"

# expand the source files
echo "Extract Packages"
cd build || exit 1

tar xfz "${VERSION_HAPROXY}.tar.gz"
tar xfz "${VERSION_LIBRESSL}.tar.gz"
tar xfz "${VERSION_PCRE}.tar.gz"
cd ../ || exit 1

export BPATH="${PWD}/build"
export STATICLIBSSL="${BPATH}/${VERSION_LIBRESSL}"

# build static LibreSSL
echo "Configure & Build LibreSSL"
cd "${STATICLIBSSL}" || exit 1
./configure --prefix="${STATICLIBSSL}/_openssl/" --enable-shared=no && make install-strip -j "${NB_PROC}"

# build pcre
export STATICLIPCRE="${BPATH}/${VERSION_PCRE}"
cd "${STATICLIPCRE}" || exit 1
./configure --prefix="${STATICLIPCRE}/_pcre" --enable-shared=no --enable-utf8 --enable-jit
make -j "${NB_PROC}"
make install


echo "Build HAProxy"
cd "${BPATH}/${VERSION_HAPROXY}" || exit 1

make \
-j "${NB_PROC}" \
TARGET=linux2628 \
USE_STATIC_PCRE=1 \
USE_PCRE_JIT=1 \
PCRE_LIB="${STATICLIPCRE}/_pcre/lib" \
PCRE_INC="${STATICLIPCRE}/_pcre/include" \
USE_OPENSSL=1 \
SSL_INC="${STATICLIBSSL}/_openssl/include" \
SSL_LIB="${STATICLIBSSL}/_openssl/lib" \
USE_ZLIB=1 \
DEFINE="-fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2"


echo "All done."
echo "become root and type: "
echo "  cp build/haproxy-${HAPROXY_VERSION}/haproxy /usr/local/sbin"

Konfiguration

Hier ist eine Beispielkonfiguration. Wobei die SSL Konfiguration sehr paranoid ist.

global
        maxconn 100
        ssl-default-bind-ciphers CHACHA20+EECDH:AES256+EECDH
        ssl-default-bind-options force-tlsv12

        daemon
        user haproxy
        chroot /var/lib/haproxy
        stats socket /var/run/haproxy.sock mode 660 level admin


defaults
        mode http
        timeout connect 5s
        timeout client 5s
        timeout server 5s

        stats scope .

        option socket-stats
        option forwardfor


frontend myfrontend
        # primary cert is /etc/haproxy/certs/server.pem
        # /etc/haproxy/certs/ contains additional certificates for SNI clients
        bind :443 tfo ssl crt /etc/haproxy/certs/server.pem crt /etc/haproxy/certs/ ecdhe secp384r1 name ssl-traffic
        bind :80 name http-traffic

        http-response set-header X-Frame-Options                DENY
        http-response set-header X-Content-Type-Options         nosniff
        http-response set-header Strict-Transport-Security      max-age=31536000;\ includeSubdomains;\ preload

        http-request redirect scheme https code 301 if !{ ssl_fc }

        http-request set-header X-Forwarded-Proto                https


        use_backend stats               if { path_beg /haproxy/stats }

        default_backend mybackend


backend mybackend
        # a http backend
        server s3 10.0.0.3:80
        server s4 10.0.0.3:443 ssl verify none


backend stats
        stats enable
        stats show-legends
        stats realm Haproxy\ Statistics
        stats uri /haproxy/stats
        stats refresh 30s

  1. In den kommenden Versionen von OpenSSL wird es Unterstützung für ChaCha20 Cipher Suiten geben. Ich finde die Quelle gerade nicht :-( [return]