Debian 8 + Haproxy + certificat SSL Let’s Encrypt

Allez hop, on continue cette fois-ci avec nos serveurs que l’on souhaite accessibles en https.

On va sécuriser la lien entre notre HAproxy et les serveurs de nos backends.

thierry-bugeat-haproxy-nossl

Installer le package certbot (https://certbot.eff.org/#debianjessie-haproxy)

Pour Debian 8 Jessie, nous devons ajouter le dépôt des backports en ajoutant la ligne suivante à notre fichier « /etc/apt/sources.list »

deb http://httpredir.debian.org/debian jessie-backports main contrib non-free

Avant de pouvoir installer certbot.

apt-get update
apt-get install certbot -t jessie-backports

Obtenir notre certificat

A la racine de notre site web (Exemple: « /var/www/thierry.bugeat.com »), nous créons un dossier « .well-known ». Le serveur web doit être configuré pour accepter toutes les requêtes à destination de ce dossier.

Nous pouvons maintenant demander un certificat pour notre nom de domaine « thierry.bugeat.com »…

certbot certonly --webroot -w /var/www/thierry.bugeat.com/ -d thierry.bugeat.com

Vous devez saisir un email…

thierry-bugeat-lets-encrypt

…puis accepter les termes et conditions.

Si tout s’est bien déroulé, le message suivant s’affiche et votre certificat se trouve maintenant dans le dossier « /etc/letsencrypt/archive/thierry.bugeat.com »

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/XXXXXXXXXX/fullchain.pem. Your cert
   will expire on 2017-06-05. To obtain a new or tweaked version of
   this certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - If you lose your account credentials, you can recover through
   e-mails sent to XXXXXXXXXX@XXXXXXXXXX.
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:
   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

NB: Vou pouvez demander autant de certificats SSL que de noms de domaines.

...
certbot certonly --webroot -w /var/www/wallabag/web/ -d wallabag.bugeat.com
...

Activation de SSL sur Haproxy:
Préparons nos certificats pour qu’ils puissent être utilisés par Haproxy.

cd /etc/letsencrypt/archive/thierry.bugeat.com && cat cert1.pem privkey1.pem > haproxy.pem 
cd /etc/letsencrypt/archive/wallabag.bugeat.com && cat cert1.pem privkey1.pem > haproxy.pem

Nous pouvons maintenant les utiliser de la façon suivante

...
...
...
# =============
# --- HTTPS ---
# =============

frontend FRONTEND_HTTPS
  mode http
  bind 0.0.0.0:443 \
    ssl \
      crt /etc/letsencrypt/archive/thierry.bugeat.com/haproxy.pem \
      crt /etc/letsencrypt/archive/wallabag.bugeat.com/haproxy.pem
  use_backend BACKEND_HTTP1 if { ssl_fc_sni thierry.bugeat.com }
  use_backend BACKEND_HTTP1 if { ssl_fc_sni wallabag.bugeat.com }
...
...
...

Veuillez noter que les backends utilisés sont les mêmes que pour le HTTP. Nul besoin d’en créer des nouveaux.

Après avoir relancé Haproxy, vous pouvez vous rendre sur votre site en https et constater que la connexion est sécurisé.
thierry-bugeat-haproxy-ssl

Let’s encrypt… mission réussie.

HA Proxy + et multiples serveurs http sur le port 80

Aujourd’hui j’ai une IP publique et je souhaite avoir prochainement des sites webs qui tournent sur des serveurs différents.
La solution, mettre HAProxy en front est dispatcher les requêtes qui arrivent sur le port 80, vers le bon serveur en fonction du nom de domaine demandé.

Donc j’arrête mon serveur Apache (J’aurai juré l’avoir remplacé par Lighttpd !)…

apache2ctl stop

… et je le reconfigure pour qu’il écoute sur le port 8080 en modifiant le fichier « ports.conf »

Listen 8080

… puis je reconfigure mes vhosts…

<VirtualHost *:8080>

… pour finalement le redémarrer…

apache2ctl configtest
apache2ctl restart

… « restart » c’est le mal (!) … « graceful » c’est le bien !
… et vérifie qu’il tourne bien sur le port 8080.

nmap 127.0.0.1
ORT     STATE SERVICE
...
...
8080/tcp open  http-proxy
...
...

Jusqu’ici tout va bien, mais nos sites sont inaccessibles !

Donc étape 2, on installe HAProxy par un petit…

apt-get install haproxy

… puis on l’active au démarrage de la machine en éditant le fichier « /etc/default/haproxy » en y ajoutant…

ENABLED = 1

…puis on le configure au travers du fichier « /etc/haproxy/haproxy.cfg » pour rediriger toutes les requêtes du port 80 vers le port 8080

...
...
# ============
# --- HTTP ---
# ============

listen FRONTEND_HTTP 192.168.1.11:80
        mode http
        log global
        option  httplog
        stats enable
        stats auth XXXXXXXXXX:XXXXXXXXXX
        balance roundrobin
        option httpclose
        option forwardfor
        option httpchk HEAD /check.txt HTTP/1.0
        capture request header Host len 20

        default_backend BACKEND_HTTP1

# ================
# --- BACKENDS ---
# ================

backend BACKEND_HTTP1
        cookie SERVERID insert indirect nocache
        server TB_001 127.0.0.11:8080 cookie tb001 weight 100 maxconn 100 check

…on crée le fichier « check.txt », avec n’importe quel contenu, à la racine de notre serveur web et on (re)démarre…

service haproxy restart

…et comme tout s’est magnifiquement bien passé, tous nos sites sont maintenant revenus en ligne ;)

Superbe tout ça … mais on a absolument pas avancé par rapport au titre de cette article !
Donc … à suivre…

Les logs HAProxy
Si celle-ci ne sont pas disponibles, vérifiez le contenu du fichier « /etc/rsyslog.d/49-haproxy.conf »

# Create an additional socket in haproxy's chroot in order to allow logging via
# /dev/log to chroot'ed HAProxy processes
$AddUnixListenSocket /var/lib/haproxy/dev/log

# Send HAProxy messages to a dedicated logfile
if $programname startswith 'haproxy' then /var/log/haproxy.log
&~

De mon côté j’ai du faire un…

rsyslog service restart

… pour que le fichier soit créé ;)

Linux (Debian) VyprVPN Setup Instructions

Si comme moi vous avez suivi les instructions fournies par le site GoldenFrog pour la configuration de VyprVPN sous Linux Ubuntu, pensant que cela allait fonctionner pour votre distribution favorite Debian, alors comme moi vous vous êtes trompé et vous vous êtes retrouvé confronté au message « connection failed »

Je vous livre ici ma configuration adaptée à Linux Debian et VyprVPN.

1) Les pré-requis :

Commencez par vérifier que le module « tun » est chargé sur votre système.
Dans un terminal la commande lsmod | grep tun doit retourner une ligne commençant par le nom du module.

Si ce n’est pas le cas, ouvrez le fichier « /etc/modules » et ajoutez à la fin une ligne pour charger le module « tun »

Voici à quoi ressemble mon fichier.

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.

loop
b43
tg3
tun

Redémarrez pour prendre en compte le nouveau module ou faites simplement « modprobe tun » à partir de votre terminal.

2) La configuration adéquate pour Gnome Network Manager

linux_debian_vyprvpn_001
Ici nous avons le premier changement par rapport à la documentation.
Pour la valeur de la passerelle, n’utilisez pas les noms de domaines GoldenFrog « xxx.vpn.goldenfrog.com », mais utilisez les noms de domaines VyprVPN « xxx.vyprvpn.com »
Exemple :
Pour la passerelle française vous devez utiliser fr1.vyprvpn.com et non fr1.vpn.goldenfrog.com comme indiqué dans la documentation.

linux_debian_vyprvpn_002

Dans les options avancées, le port par défaut ne fonctionnant pas (A cause d’un réseau d’entreprise et de son firewall) je suis passé sur le port 443.

linux_debian_vyprvpn_003

Les valeurs de sécurité sont le 2ième gros changement. Celles-ci ne sont pas mentionnées dans la documentation mais se sont avérées obligatoires.

linux_debian_vyprvpn_004

Il ne reste plus qu’à sélectionner la connexion VPN.

3) En cas de problème.

Vérifier que la connexion s’établie en passant par le device « tun0″.
Dans un terminal, la commande suivante doit vous retourner votre adresse IP.

curl --interface tun0 checkip.dyndns.org

Si vous n’avez pas de résultât, executez la commande suivante avant de retenter la commande curl ci-dessus.

echo 1 > /proc/sys/net/ipv4/ip_forward