walk-hoary

Archives pour la catégorie GNU/Linux

Communiquer entre l’hôte et les containers LXC

Aujourd’hui j’utilise un Raspberrry Pi comme routeur chez moi. Il me permet de me passer de la box internet et d’isoler les équipements de mon réseau avec des VLAN.

J’ai dans l’optique de rassembler différents services sur un seul hôte afin de réduire le nombre d’appareils, en commençant par Home-assistant et le système de routage/DHCP. Plus tard, ce sera d’autres service comme tvheadend qui permet de broadcaster la TNT reçue à mon domicile par une clé USB vers un serveur multimédia Jellyfin dans le cloud.

Quel hyperviseur sous Raspberry Pi ?

Pour cela, je me suis penché sur docker, mais cela ne me satisfait pas entièrement à cause des contraintes au niveau réseau qui sont souvent mal documenté ou géré par les mainteneurs des images. Proxmox était pour moi le candidat idéal, mais non supporté sur ARM64. Je me suis donc tourné vers LXC qui est la couche de conteneurisation utilisé par Proxmox. A noter que LXD convient également, il s’agit d’une implémentation plus évoluée de LXC, mais la direction de l’éditeur LXD me semble floue et incertaine et ne l’ai donc pas utilisé.

Un réseau simple

Un point important dans l’architecture est que je veux avoir accès aux différentes couches et d’une façon la plus naturelle possible, c’est à dire se rapprochant d’une architecture matérielle. Je trouve cela beaucoup plus facile à se le représenter et à l’exploiter, surtout si je dois y intervenir rarement.

Je veux par exemple, me connecter en SSH sur le RaspberryPi et rebondir en SSH sur différents containers. Et bien sachez que ce n’est pas possible naturellement sous docker ou LXC, il vous faudra créer une interface macvlan pour chaque container sur vôtre hôtes. Ça me parait beaucoup et ajoute une complexité à l’architecture que je ne veux pas.

Solution

La solution que j’ai trouvé est de se baser sur des interfaces bridges. Ainsi, les containers sont capables de communiquer avec l’extérieur mais surtout avec l’hôte.

Voici la configuration réseau du Raspberry Pi. Avec ceci, vous pourrez utiliser les liens habituels VETH avec LXC.

# /etc/network/interfaces.d/eth0
auto eth0
iface eth0 inet static
        address 192.168.0.1/24

# /etc/network/interfaces.d/br7
auto eth0.7
iface eth0.7 inet manual

auto br7
iface br7 inet static
        bridge_ports eth0.7
        bridge_fd 0
        bridge_maxwait 120
        address 10.35.7.1/24

Note : eth0.7 est une syntaxe qui vous permet d’avoir une interface qui ne communiquera qu’avec le traffic tagué VLAN 7. (Au même titre que eth0:1 vous permet d’avoir une nouvelle interface alias de eth0)

Tags: ,

GITLAB : npm ERR! 404 ‘@test/api@1.0.0’ is not in the npm registry.

Voici sur quoi je tombe en faisant un npm publish !

Si vous êtes sûr de votre procédure, et que vous utilisez un reverse-proxy NGINX devant votre gitlab, alors vérifiez cela :

Vous avez un slash à la fin de votre proxy_pass sous nginx ? Retirez-le !

Analyses

J’utilise un serveur GITLAB pour gérer le dépots des NPM (il sait aussi faire GO, PIP, Nugget, Docker…). C’est très pratique la pour CD-CI puisqu’on n’a pas à gérer des credentials, des hooks par rapport à un système de CI/CD dédié (jenkins).

Ce GITLAB est configuré en HTTP (son nginx est désactivé), et une autre machine fait reverse proxy HTTPS en frontale. La partie SSH+GIT est lié à une autre ip dédiée.

Après avoir vérifié et refait la procédure NPM avec GITLAB 20 fois, je finis par tester avec l’instance en ligne gitlab.com : pas de problème, ça fonctionne.

Je teste sur une autre instance gitlab auto-hébergée : pas de problème non plus !

Je compare les configs, aucune différence notable.

Analyse des logs gitlab entre un serveur qui fonctionne et un autre qui fonctionne pas, je m’aperçoit que l’URL a une partie différente : « %2f » sur l’un et « / » sur l’autre.

Je compare les configs NGINX, aucune différence notable.

Je suspecte tout de même le reverse proxy de modifier ma requête. Je lance donc un tcpdump pour le vérifier et constate que ma requête reçue par nginx :

PUT https://gitlab.qth.fr/api/v4/projects/8/packages/npm/@test%2fapi

est renvoyée avec une url modifiée :

PUT https://gitlab.qth.fr/api/v4/projects/8/packages/npm/@test/api

Du coup, effectivement, cette URL n’existe pas sous gitlab, et ce dernier renvoi un 404.

A noter que si vous n’avez pas l’autorisation ou que le scope (ici @test) est pas correcte, vous obtiendrez une erreur 400 de la part de GITLAB. (ou 403 si vous tentez d’écraser une version déjà présente), mais pas 404.

A savoir : gitlab redirige par defaut vos demandes vers le registry npmjs officiel si il ne connait pas le package. Cela peut etre assez pratique pour gérer plus globale le registry à utiliser sur un poste de dev ou un serveur puisqu'il n'y en a qu'un. (et non plus un par scope, avec son credential à prévoir).

Tags: , , , ,

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.

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

Agenda et contacts android ? Ho oui avec Owncloud !

Retour d’utilisation Owncloud sur Android

Cet article va vous intéresser si vous souhaitez garder une certaine indépendance avec votre mobile android. J’utilisais depuis peu gmail pour synchroniser contact et calendrier car c’était complètement automatique, ouvert, accessible via un navigateur. Sauf que bon, autant j’apprécie google mais je préfère gérer mes données personnelles comme je le fait avec mes emails !

 

J’ai testé Owncloud, et je du coup il tourne depuis car il a été très simple à mettre en place chez moi. (Des simples scripts PHP). Il offre la synchronisation carddav et caldav que l’on attend, il permet de consulter/modifier son calendrier et ses contacts via l’interface web simplement. Mais j’ai bien aimé aussi qu’il puisse synchroniser des répertoires de mon pc un peu comme à la dropbox. En effet il existe plein de client pour avoir un backup ou un répertoire que vont considérez important et le synchroniser sur votre serveur (même sur android pour vos photos par exemples) . La copie de ce répertoire n’est pas chiffrée ; même si c’est votre serveur, j’aurais aimer y glisser un clé de chiffrement un peu comme Firefox le fait avec sa synchronisation de préférence. (Que vous pouvez aussi auto-héberger 😉 ).

 

Coté synchronisation Android, j’ai téléchargé Caldav et CardDav de Marten Gadja (+ les JBWorkaroud recommandés pour Androdi Jelly). Vous aurez alors des compte de synchronisation intégrés à votre android pour gérer calendrier et contacts. Ce sera à vous de faire le transfert de vos contact et calendrier en utilisant la fonction exporter sur gmail.com et le réporter via l’interface wbe de votre owncloud (cela se fait très facilement en format ics et card, formats ouverts et libre rappelons le !).

 

Voilà, j’ai testé Owncloud (quelques minutes pour l’installer) et comme ça marche très bien, je l’ai adopté. vous pouvez virer vos contacts et calendriers de chez votre ancien fournisseur mais il vous sera toujours utile pour accéder à google Play 😉

Mémo de compilation de kernel

Introduction

Il y a quelques années, il était assez fréquent de devoir recompiler son noyau linux pour pouvoir utiliser tel ou tel module… Aujourd’hui c’est très rare mais reste toujours instructif. Je vais donc détailler ici les étapes essentielles pour la compilation mais aussi l’installation d’un noyau compilé par vos petites main sous debian/ubuntu/linuxmint…

Pre-requis

Les sources

Les sources du noyau. On va prendre ceux de linuxmint, mais vous pouvez allez cherchez la version que vous voulez sur kernel.org. Ces deux moyens vont vous donner un fichier tar.gz que nous devons décompresser dans l’emplacement standard /usr/linux/src (Si vous prenez les sources depuis apt de votre distrib, il devrait se trouver dans /usr/src/). Vos sources sont à décompresser dans le répertoire universel /usr/src/linux/

Pour gérer les version, nous utilisons la méthode du lien symbolique en décompressant dans /usr/src/linux-source-3.0.2

sudo tar xvf MESSOURCES -C /usr/src/

Et Ferons un lien symbolique linux

sudo ln -s /usr/src/linux-source-3.0.2 /usr/src/linux

La configuration

Récupérer la configuration utilisé par le noyau de la distribution s’avère utile pour partir sur quelque chose qui marche. Ce n’est pas obligatoire si vous savez ce que vous faites. Vous trouverez ces config dans le répertoire /boot de votre système. (exemple /boot/config-3.2.0-30-generic)

sudo cp /boot/config-3.2.0-30-generic /usr/src/linux/.config

Outils

Pour compiler votre noyau, vous aurez besoin d’un compilateur, mais aussi d’un outil pour configurer et surement un autre pour packager car il est très utile d’en faire un .deb. Cela facilite la désinstallation par exemple ou sa distribution.

sudo aptitude install build-essential

Configurer

Rentrez dans le répertoire /usr/src/linux et lancez l’outil qui vous permettra de configurer votre kernel.

sudo make menuconfig ou sudo make xconfig si vous préférez une version graphique sous X

Oui faites pas comme moi, préférez compiler vos programme en tant qu’utilisateur ! 😉

Compilation et empacketage

sudo make-kpkg --initrd --revision=NumeroQueVousVoulez kernel_image kernel_headers modules_image

Cette commande va compiler et vous faire les 3 .deb qu’il vous faut pour installer votre kernel. Et c’est cette commande que j’oublie tout le temps 🙂 Vous connaissez sûrement la suite pour installer des .deb.



                      

Tags: , ,

Tester un serveur smtp

Il m’arrive souvent de devoir tester si un serveur est capable de relayer un email (ou l’inverse pour empecher l’open relay).

$telnet monserveur.exemple 25
helo nimportequoi
mail from: uneadresse@valide.exemple
rcpt to: uneautreadresse@valide.exemple
data
Tapez votre message
et terminez par une ligne comportant juste un point
quit

A chaque commande, le serveur doit vous répondre un code de retour et parfois une description. Ce code est standard, 2xx = ok (continuez), 4xx = erreur temporaire (ressayez plus tard), 5xx = erreur permanente (votre mail ne passera jamais)

Tags: , ,

Motion sous linux

Le logiciel motion sous GNU/Linux est un démon qui permet de faire des captures vidéo sur du long terme à partir d’une webcam.

Voici quelques fonctions sympas :

  • Créer une vidéo accéléré du ciel, d’une plante ou d’un escargot en accéléré
  • Capturer et envoyer sur un FTP l’image d’une webcam à intervalle régulière
  • Enregistrer les séquences de mouvement devant une webcam
  • Se connecter à motion via le web pour contrôler ou visualiser sa webcam
  • Avoir 8 webcams (ou plus) qui captent en même temps sur la même machine
  • Traquer et suivre avec une webcam motorisée les mouvements
  • Enregistrer les événements dans une base de données

Je vais vous préciser ici les options de base pour permettre les 3 fonctions ci dessous (Je pars de la config du paquet de Debian Squeeze) :

  1. Créer une image toute les 10s
  2. Créer un film d’une semaine de capture avec 1 minute capturée = 1 frame donc 1 journée capturée = 1 minutes de vidéo environ.
  3. Créer autant de séquences vidéo à 5 FPS que de détections de mouvement avec une image associée
# Pour le point 3 : On définit le framerate à 5FPS
framerate 5
# Je fixe la sensibilité à 1000 pixel pour la captation de mouvement
threshold 1000
# Je capture 3 frames de buffer avant une captation de mouvement
pre_capture 3
# Je clos les captation de mouvement 5 secondes si plus rien de bouge devant la webcam
gap 5
# Je décide d'avoir une image qui correspond aux premiers instant de detection de mouvement
output_normal first

# Point 2 : Je capture une frame toute les 60 secondes pour la vidéo en accélérée
ffmpeg_timelapse 60
# Je fait réinitialiser le film accéléré tout les lundi
ffmpeg_timelapse_mode weekly-monday
# Je fixe la qualité des vidéo à 15/31 (2 étant le plus fort)
ffmpeg_variable_bitrate 15
# Je définis la compression en mpeg4
ffmpeg_video_codec mpeg4

# Pour le point 1 : Je définis 1 capture image toutes les 10 secondes
snapshot_interval 10

Tags: , , ,

Ajouter la clé d’un dépôt à votre système APT

Parfois, il arrive de devoir ajouter des dépôts non officiels à la distribution. Pour cela, j’ai l’habitude d’éditer directement le fichier /etc/apt/sources.list

Et bien sûr cela provoque un message à chaque update du style :

W: Erreur de GPG : http://archives.unpaquetexemple.com squeeze Release : Les signatures suivantes n'ont pas pu être vérifiées car la clé publique n'est pas disponible : NO_PUBKEY 0123456789ABCDEF

Une solution simple est de l’ajouter comme cela (en ayant remplacé la clé donnée par le Warning ci précédant) :

gpg --keyserver pgpkeys.mit.edu --recv-key 0123456789ABCDEF
gpg -a --export C514AF8E4BA401C3 | apt-key add -

Tags: , , , ,

Je n'aime pas les boîtes noires.