walk-hoary

Wildcard letsencrypt

Cet article vous présente comment générer un wildcard letsencrypt avec validation automatique par DNS.

Si vous l’avez déjà créé en manuel, comme moi la première fois, voyez la note « Vous avez déjà créé votre certificat en manuel ».

Voici l’environnement :

  • Un reverse-proxy qui fait terminaison SSL sous nginx 1.14
  • Un serveur DNS sous BIND9

Principe de fonctionnement

Pour valider un wildcard, letsencrypt va vérifier la présence d’une entrée TXT dans votre zone DNS au moment de la création/renouvellement du certificat.

Cette entrée TXT est ajoutée par la commande certbot car on lui aura autorisé la mise à d’un champ TXT précis via BIND. Cela peut être fait à la main de façon interactive (–manual), je ne vous le conseille pas.

Pour cela, nous allons créer une clé sur notre serveur BIND et configurer la zone pour qu’elle permette de mettre à jour une entrée TXT précise de la zone.

Cette clé sera donnée au client certbot sur notre reverse-proxy (dans un fichier credential) au moment de la création du certificat.

Configation de BIND

Sur le serveur BIND, créez une nouvelle clé, elle servira pour mettre à jour vos TXT de challenge letsencrypt. (ici certbot est le nom de la clé)

cd /etc/bind
dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST certbot.

Cela va générer deux fichiers : Kcertbot.+NNN+YYYYY.key et Kcertbot.+NNN+YYYYY.key (les deux contiennent la clé, ils ne servent qu’à vous, et pourraient même être supprimés)

Collez les 4 lignes suivantes dans /etc/bind/named.conf en remplaçant XXXxXxXVOTRECLE== par votre clé contenu dans un des deux fichiers précédents.

key "certbot." {
  algorithm hmac-sha512;
  secret "XXXxXxXVOTRECLE==";
};

Ajoutez les lignes suivantes à votre configuration de zone DNS (sous debian : /etc/bind/named.conf.local) en remplaçant example.com par votre domaine.

zone "example.com" {
  [...]
  update-policy {
    grant certbot. name _acme-challenge.example.com. txt;
  };
};

Redémarrez bind avec

systemctl restart bind9

Configuration sur le reverse-proxy

Vous devez installer le paquet python3-certbot-dns-rfc2136 qui est une extension pour permettre à certbot de modifier votre zone DNS pour faire vérifier le challenge. Il en existe d’autres si vous avez des zones sur d’autres systèmes (OVH, gandi, cloudflare…)

apt install python3-certbot-dns-rfc2136

Créez un fichier qui contiendra les credentials pour certbot dans /etc/letsencrypt/dns-rfc2136-credentials-bind.ini et collez la configuration suivante en remplaçant IP_OR_DNS_OF_BIND et XXXxXxXVOTRECLE== votre hôte DNS et votre clé crée dans la section précédente.

dns_rfc2136_server = IP_OR_DNS_OF_BIND
dns_rfc2136_port = 53
dns_rfc2136_name = certbot.
dns_rfc2136_secret = XXXxXxXVOTRECLE==
dns_rfc2136_algorithm = HMAC-SHA512

Puis rendez le fichier non lisible par autre que root.

chmod 700 /etc/letsencrypt/dns-rfc2136-credentials-bind.ini

Création du certificat sur le reverse-proxy

certbot certonly --dns-rfc2136 --dns-rfc2136-credentials /etc/letsencrypt/dns-rfc2136-credentials-bind.ini -d *.example.com

Vous avez déjà créé votre certificat en manuel ?

Si vous avez déjà créé votre certificat de façon interactive (avec l’option –manual de certbot) donc sans l’avoir fait avec une clé bind, pas de pannique ! Vous devez tout de même suivre cet article jusqu’à l’étape de création de certificat que vous pouvez remplacer par un renouvellement de vos certificat (cerbot renew)

Voici ce que vous devez mettre dans votre fichier cat /etc/letsencrypt/renewal/example.com.conf

[...]
[renewalparams]
[...]
authenticator = dns-rfc2136
dns_rfc2136_credentials = /etc/letsencrypt/dns-rfc2136-credentials-bind.ini

Vous devriez pouvoir lancez votre certbot renew…

Remarques

Voici quelques infos à savoir sur letsencrypt que je n’ai eu que tard :

Le renouvellement (certbot renew) se fait uniquement sur les certificats expirant à J-30. (les certificats sont signés pour 90 jours).
Ne pas oublier de révoquer un certificat avant de la supprimer pour éviter les alertes d'e-mails d'expiration envoyées par letsencrypt (certbot revoke --cert-path /etc/letxencrypt/live/example.com/cert.pem)
Évitez de créer des certificat pour des domaines différents, le renouvellement échouera si un seul domaine ne fonctionne pas.

Syncthing

Synchroniser des répertoire n’importe où et avec n’importe quoi.

Syncthing est un logiciel qui vous permet de synchroniser un répertoire avec une autre instance de syncthing en peer to peer sans ouvrir de ports. Il tourne en tâche de fond, et permet beaucoup d’option pour couvrir un tas de cas d’utilisation. En voici quelques uns :

  • Avoir une sauvegarde de votre disque d:\ sur un nas avec rétention des données sur 30 jours
  • Avoir un mirroir de vos photos ou traces GPS de votre smartphone sur votre pc uniquement par le wifi
  • Partager des documents d’un événement avec 3 autres bénévoles d’une association en limitant la bande passante sortante
  • Partager en lecture seule votre bibliothèque de musique avec un ami

Voici son interface de gestion, il s’agit d’une simple page web. Cela signifie que vous pouvez l’installer n’importe où, un navigateur suffit pour le configurer.

https://syncthing.net/img/screenshot-dark.png
Interface de contrôle

Principe de fonctionnement

Syncthing fonctionne avec 2 niveaux d’association : association d’appareil (nous parlerons d’instance de syncthing) et association de dossier (nous parlerons de partage). Avant de partager quelque chose avec une autre instance, vous devez d’abord associer votre 2 instances.

L’identifiant d’instance

Il s’agit ‘est votre identifiant unique à votre instance. C’est grâce à elle que les autres instance vont vous trouver et demander de s’associer. L’association ne peux se faire que si les 2 personnes ont acceptées (l’un fait la demande en entrant l’identifiant, l’autre doit accepter via une notification sur l’interface de gestion).

Cet identifiant est un chaine de caractère, et peut être affiché sous forme de qrcode pour une facilité d’association avec un smartphone. Si vous êtes sur le même réseau, votre instance peut vous la proposer au moment d’associer une nouvelle instance.

L’identifiant de partage

Ils permettent d’identifier un partages parmi votre instance mais également parmi toutes les instances auxquels vous êtes associé. L’identifiant de partage devrait toujours être unique pour ne pas rentrer en conflit avec un partage d’une autre instance.

Le partage

Une fois que vous avez associé votre instance à une autre et défini un partage, vous pouvez choisir avec quelle instance vous souhaitez associer votre partage.

Réglages

Plusieurs options existent également pour contrôler et affiner comment est fait le partage :

  • Choisir ou non une rétention des fichiers sur une durée, un nombre de version ou même en appelant un script
  • Exclure des fichiers
  • Faire un partage qu’en envoi, en réception ou les deux
  • Limiter l’occupation disque

D’autres option existent au niveau de l’association avec un autre instance :

  • Limiter la bande-passante montante / descendante
  • Imposer une adresse ip fixe (réseau local uniquement par exemple)
  • Mode « appareil introducteur ». A éviter en général. Cela permet d’associer automatiquement d’autres instances sans les avoir validé ; on lui donne donc entière confiance.
  • Mode « Accepter automatiquement ». A éviter en génral. Cela permet de créer le partage (et le dossier donc) si une instance nous partage quelque chose.

Enfin, vous pouvez ouvrir l’interface de gestion sur votre réseau local en y paramétrant un mot de passe par exemple.

Sur syncthing mobile, vous pouvez également limiter l’execution de la synchronisation uniquement lorsque vous êtes en charge et sur certains wifis…

Terminal Windows

Il existe une multitude de gestionnaire de terminal sous Windows, j’utilisais jusqu’à présent ConEmu. Il me permettait de rassembler des terminaux de type Command Windows, Cygwin, powershell et Debian en WSL, Mono. Il fallait cependant le configurer pour qu’il découvre les différents terminaux de ma machine.

J’ai essayé Terminal Windows, il me semble très prometteur puisque j’ai pas eu grand chose à faire pour y être à l’aise.

Où le trouver ?

Il est en version preview. Vous le trouverez dans le Windows Store sous le nom de Windows Terminal.

Il est disponible aussi via chocolate si vous l’utilisez (l’APT/Ansible sous Windows) via un choco install microsoft-windows-terminal

Que propose t-il ?

  • Un terminal multi-onglets en couleur, réactif et rapide à se lancer
  • Un système de copier-coller commun aux containers WSL
  • La proposition de terminaux : Command, PowerShell, Wsl, AzureCloud shell…
  • Un code source ouvert et une une communauté sous github.

La configuration se fait avec un bête fichier JSON (Attention, il faut que votre système sache ouvrir les fichiers JSON, sinon ça ne fait rien quand on clique sur « Settings »).

Vous utilisez Oh My Zsh ?

J’utilise Oh-my-zsh sous WSL (il existe aussi Oh-My-Posh pour PowerShell) qui rend la console plus agréable.

Pour installer zsh, il faut faut déjà git et zsh, puis rentrez cette commande dans votre shell :

sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

Installez la police Delugia.Nerd.Font.ttf de chez adam7/delugia-code.

Remplacez le thème par défaut par agnoster avec la commande :

sed -i 's/ZSH_THEME="robbyrussell"/ZSH_THEME="agnoster"/g' ~/.zshrc

Puis ajouter ceci dans la la section « profiles » -> « defaults » :

"fontFace" : "Delugia Nerd Font"

Relancer un shell.

Liseuse non surveillée

Pour cette fin d’année (2019), j’ai voulu me prendre une liseuse que je puisse garder avec moi lors de moment divagantes. J’ai cherché un modèle promouvant le libre, et surtout non rattaché à des compte cloud dans tout les sens. Bref je voulais une liseuse, pas un tablette connectée déguisée.

Je suis d’abord tombé sur Booken qui me semble être le plus rapprochant aujourd’hui (Français en plus). Malheureusement un autre critère qu’est le style de tablette m’a fait penché vers Kobo. En effet bien que provenant de rakuten, il existe pour cette dernière, la Clara HD à 100€ chez darty, un hack pour ne pas avoir de compte et être maitre du système (un accès root via telnet).

Image associée
Kobo Clara HD (sortie en 2017 – oui les liseuse n’évoluent pas vraiment)

Bypass de la connexion

A l’allumage, la liseuse vous propose de vous connecter. Dites non. La liseuse passera alors en disque USB. Il vous suffira de lancer sur ce disque monté :

sqlite3 .kobo/KoboReader.sqlite
INSERT INTO user(UserID,UserKey) VALUES('1','');
CTRL+D pour quitter

La tablette va alors basculer en anonymous au bout de quelques secondes. Vous pouvez à présent l’utiliser comme liseuse non connecter en plaçant vos epub sur le disque monté.

Gestion de vos ebooks

Je vous conseille d’utiliser le logiciel libre calibre pour gérer vos livres avec la tablette. Il s’agit d’une référence libre pour gérer vos e-books (propriétaires ou non) sur vos liseuses (propriétaires ou non) à travers la connexion USB.

Résultat de recherche d'images pour "calibre"

Ansible avec AWX

AWX est un frontend pour piloter Ansible. Il s’agit de la version opensource de Tower qui lui, est stabilisé avec mise à disposition d’un support.

A propos de cet article

Je vous donne ici les instructions pour installer Ansible et AWX sur une debian buster 64 bits.

Pour information, j’ai utilisé un container LXC (Proxmox 6). L’utilisation de docker dans un container « non-privilégié » est possible en ajoutant les lignes suivantes dans la config /etc/pve/lxc/XXXXX.conf :

unprivileged: 1
lxc.apparmor.profile: unconfined
lxc.cgroup.devices.allow: a
lxc.cap.drop:

Toutes les commandes si dessous se font en root.

Ansible

Prérequis

Installons le nécessaire pour ajouter une clé et l’usage de https dans les dépôts.

apt update
apt dist-upgrade
apt -y install gnupg2 apt-transport-https

Installation

Ajoutons le dépôt de chez launchpad et installons ansible. La version installée devrait correspondre sensible à la 2.8.6 (au 2019-10-25)

echo "deb http://ppa.launchpad.net/ansible/ansible/ubuntu bionic main" | tee /etc/apt/sources.list.d/ansible.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367
apt update
apt install -y ansible
ansible --version

AWX

Pre-requis

On ajoute le dépot et on install docker-ce. La version installée devrait correspondre sensible à la 19.03.4 (au 2019-10-25)

echo "deb [arch=amd64] https://download.docker.com/linux/debian buster stable" | tee /etc/apt/sources.list.d/docker-ce.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7EA0A9C3F273FCD8
apt update
apt install -y docker-ce
docker --version

Je désactive l’IPV6 afin d’être sûr que AWX écoutera sur l’interface IPV4 (et je ne m’en sert pas entre mes VM).

cat <<EOF > /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.all.autoconf = 0
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.default.autoconf = 0
EOF
sysctl -p

Installons un générateur de mot de passe et docker-compose (Ce sera celui des dépôt debian officiels)

apt -y git pwgen docker-compose

AWX

Récupérons AWX

cd ~
git clone --depth 50 https://github.com/ansible/awx.git

Configurons quelques valeurs

cd awx/installer
sed -i "s|docker_compose_dir=.*$|docker_compose_dir=/var/lib/awx|g" inventory
sed -i "s|^#project_data_dir=.*$|project_data_dir=/var/awx_projects|g" inventory
sed -i "s|^postgres_data_dir=.*$|postgres_data_dir=/var/pgdocker|g" inventory
sed -i "s|^secret_key=.*$|secret_key=$(pwgen -N 1 -s 30)|g" inventory
sed -i "s|^pg_admin_password=.*$|pg_admin_password=$(pwgen -N 1 -s 30)|g" inventory
sed -i "s|^pg_password=.*$|pg_password=$(pwgen -N 1 -s 30)|g" inventory
sed -i "s|^rabbitmq_password=.*$|rabbitmq_password=$(pwgen -N 1 -s 30)|g" inventory

Lonçons la création des containers AWX

ansible-playbook -i inventory install.yml

Note : Pour ma part, j’ai du relancer cette commande 2 fois car j’ai eu un timeout, je n’ai pas noté si il venais de mon système trop lent ou de ma connexion internet.

Comptez 24Go pour AWX, il va occuper pas mal d’espace docker (/var/lib/docker) pour ses 5 VM :

root@ansible:/var/lib/awx# docker-compose ps
     Name                   Command               State                               Ports
 awx_memcached   docker-entrypoint.sh memcached   Up      11211/tcp
 awx_postgres    docker-entrypoint.sh postgres    Up      5432/tcp
 awx_rabbitmq    docker-entrypoint.sh /bin/ …   Up      15671/tcp, 15672/tcp, 25672/tcp, 4369/tcp, 5671/tcp, 5672/tcp
 awx_task        /tini -- /bin/sh -c /usr/b …   Up      8052/tcp
 awx_web         /tini -- /bin/sh -c /usr/b …   Up      0.0.0.0:80->8052/tcp

Voilà, à partir de là, vous pouvez vous y connecter avec votre navigateur sur le port 80 et les identifiants à changer de suite : admin / password

Pour les mises à jour

Les mises à de Ansible se feront par le gestionnaire de paquet Debian.

Pour AWX, il faudra lancer ces commandes :

cd /var/lib/awx
docker-compose stop
docker-compose pull
docker-compose up --force-recreate -d

Créer et monter un volume qcow2

Pour quoi faire ?
Cela peut être utile si vous avez un système de fichier NTFS dans lequel vous souhaitez sauvegarder des données sans perdre les droits UNIX qui vont avec, pour le chiffrer, le transférer, monter une VM…
Création de l’image (ici 1.1G, format qcow2)
qemu-img create -f qcow2 datas.qcow2 1100M
Création du device et attachement du fichier
modprobe nbd max_part=8
qemu-nbd –connect=/dev/nbd0 datas.qcow2
Création de la partition et formatage ext4
cfdisk /dev/nbd0
mkfs.ext4 /dev/nbd0p1
Montage du la partition
mount /dev/nbd0p1 datas

Utiliser NFS dans openvz/proxmox

L’usage de NFS est possible dans openvz (je l’utilise avec proxmox 3.3 via wheezy). Je souhaite vous donner quelques prérequis à connaitre :

Monter un serveur NFS sous un conteneur VZ demande :

  • Avoir le module nfs chargé sur l’hyperviseur
  • Avoir la feature nfs activée dans le conteneur
  • Avoir partagé un répertoire NFS. exemple pour moi : /mnt/datas      10.9.1.0/24(ro,sync,no_subtree_check,no_root_squash)

Monter un partage NFS depuis un conteneur VZ demande :

  • Avoir le module nfs chargé sur l’hyperviseur
  • Avoir la feature nfs activée dans le conteneur
  • Monter le partage via le fichier mount de proxmox et non depuis le fstab du conteneur (si vous utilisez le fstab, votre VM ne demarrera pas, si vous faites un mount depuis le conteneur, vous aurez « mount.nfs: No such device »). Ci dessous un exemple de mon /etc/vz/conf/116.mount que j’ai crée (le point de montage doit exister sinon le conteneur ne démarre pas) :

#!/bin/bash
source /etc/vz/vz.conf
source ${VE_CONFFILE}
mount -t nfs 10.9.1.222:/mnt/datas ${VE_ROOT}/mnt/remote-datas

 

Reverse proxy et X-Real-IP

Pas mal d’articles en font déjà mention. Mais une partie n’apparait pas souvent, c’est le fait de journaliser l’ip originale et non celle du reverse !

Editez le nouveau fichier /etc/nginx/conf.d/proxy.conf et insérez (où 10.9.100.33 est mon reverse) :

set_real_ip_from   10.9.100.33;
real_ip_header     X-Real-IP;

Redémarrez nginx.

Si vous utilisez apache, alors installez et activez le module rpaf ! et ajoutez l’ip de vos reverse dans la configuration du nouveau module apache.

Raid logiciel visible sur Windows & Linux

Il est possible de créer un raid logiciel qui soit utilisable sous Microsoft Windows et GNU/Linux. J’utilise cela pour agréger 2 disques de 500Go en RAID0 pour avoir un espace de 1To plus réactif.

Depuis Windows dans un premier temps :

  • Convertir les disques en disques dynamiques
  • Créer votre volume raid logiciel depuis Windows (Sous windows le RAID0 ou stripping est appelé « aggrégat »)
  • Attribuez une lettre et placez y quelques données pour pouvoir vérifier plus plus tard

Depuis Linux enfin :

  • Installez les paquets libldm et mdadm qui serviront pour l’accès aux disques dynamique et au raid, il sera probablement nécessaire de rebooter sur le nouveau noyau (je n’ai pas bien vu)
  • Créez le volume avec la commande : mdadm –build /dev/md0 –chunk=64 –level=0 –raid-devices=2 /dev/sdd1 /dev/sde1
    • Adaptez à votre cas (level=0 pour raid0, –raid-devices pour le nombre de disques)
    • Utilisez bien la partition et non le disque
  • Et voilà, votre partition raid est accessible via le périphérique /dev/md0 que vous pouvez monter par mount /dev/md0 /mnt/raid
  • Vous pouvez l’ajouter à votre fstab :
    • UUID=5C24F8E224F8BFD6 /mnt/raidNTFS ntfs-3g defaults 0 0
    • Vous pouvez connaître les UUID de vos disques avec le répertoire /dev/disk/by-uuid/

 

Découper et rassembler un fichier en morceau

Parfois en déplacement, je dispose d’une connexion 1Mbps voir moins. Pour télécharger un fichier plus rapidement je me sers de plusieurs connexion internet pour aller plus vite. (mon téléphone, celui d’un amis…)

Exemple pour un fichier de 900Mo, je vais le découper en fichiers de 100Mo et télécharger 3 morceaux sur la connexion internet de mon hôte, 3 autres morceaux avec mon téléphone, et 3 autres morceaux avec un autre abonnement.

Pourquoi 3 par devices ? Car cela donne 100Mo ce qui permet de télécharger plus rapidement le ou les derniers morceaux sur la connexion la plus rapide.

Découper un fichier

split -b 100m monfichier.zip

Cela va générer plusieurs fichiers monfichier.xaa mofichier.xab …

Télécharger

Sur le device 1 :

wget -c http://qth.fr/monfichier.xaa http://qth.fr/monfichier.xab http://qth.fr/monfichier.xac

L’option -c permet de rédémarrer un téléchargement là où il en était, vous pouvez donc interrompre avec CTRL-C à votre guise. (ou suspendre/resume CTRL-Z … $fg)

 

Rassembler un fichier

Mettez tous vos fichiers ensembles

cat monfichier.*  > monfichier.zip

 

Et voilà !

Je n'aime pas les boîtes noires.