walk-hoary

Archives pour la catégorie Aide mémoire

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.

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

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à !

Encodage de caractère

Parfois, le serveur d’hébergement se trouve en UTF-8 mais malgré les avertissements aux développeurs, on se retrouve avec des fichiers ANSI comme la plupart des éditeur de texte sous Windows. (Je parle même pas des \r inutiles).

Connaître l’encodage du fichier

file --mime-encoding MONFICHIER.php

Sans cette option –mime-encoding, file vous dirai juste qu’il s’agit d’une code php…

 

Conversion du fichier

Exemple de l’ansi à l’UTF8

iconv -f WINDOWS-1252 -t UTF-8 MONFICHIER_ansi.php > MONFICHIER_utf8.php

Ou de l’UTF-8 à l’iso8859-15

iconv -f UTF-8 -t ISO_8859-15 MONFICHIER_utf8.php > MONFICHIER_iso.php

 

Encodages supportés

iconv -l vous donnera la liste des encodages supportés. Les plus importants à retenir sont :

  • WINDOWS-1252 (Parfois appelé CP-1252, ANSI ou latin-1, c’est un dérivé de ISO_8859-1 qui ressemble beaucoup ISO_8859-15)
  • UTF-8 (universel et compatible ASCII)
  • ISO_8859-1 (Ou latin-1 lui aussi, il lui manque les symbole euro qui est ¤)
  • ISO_8859-15 (Ou latin-9)
  • ASCII (lol)
  • Le code morse ne fait pas parti des encodages supportés

 

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: , ,

Certificats pour serveurs

Cet article vous montre comment créer un certificat willcard signé par un tiers

Pourquoi un certificat ?

Parfois il m’arrive de ne pas pouvoir consulter mes emails car le réseau que j’utilise n’est pas sécurisé. J’entends par là que je ne sais pas qui est derrière et pourrait écouter mon trafic et capturer aisément mes identifiants.

J’ai donc décidé d’installer un certificat sur qth.fr. Comme la plupart de mes services sont en *.qth.fr j’ai choisis de faire un certificat willcard que j’ai fait signé par cacert. Le faire signer par autre que soit a l’avantage de pouvoir vérifier auprès de cacert que le certificat est valide. Il faut savoir que cacert est une autorité non reconnue par les navigateurs par défaut car son modele de confiance se base sur ses utilisateurs. (C’est les utilisateurs vérifient entre eux leur identité, cherchez « Key signing party » sur un moteur de recherche).

Ce serveur utilise donc les certificats de cacert ; pour installez le certificat root de cacert, rendez vous sur la page http://www.cacert.org/index.php?id=3 et cliquez simplment sur http://www.cacert.org/certs/root.crt . Attention, cela veux dire que vous acceptez tout les certificats signés par cacert !

Comment ça marche ? (grossièrement)

Pour sécuriser un site en SSL, le serveur doit obligatoirement connaitre un clée privée et un certificat publique signé. Il arrive qu’un ou plusieurs certificats intermédiaires soient nécessaires, j’en parlerais plus loin. Notez que les extensions varient d’un système à l’autre, mais on retrouve globalement KEY, CRT, CSR et PEM (ce dernier désigne en fait jusque c’est un fichier pour le chiffrement, j’utiliserais donc cette extension pour tous mes fichiers).

  • Le certificat privé « KEY » est un fichier généré que vous devez conserver et ne jamais le divulguer ! Il sera utilisé par votre serveur pour chiffrer votre trafic. Il peut être protégé par un mot de passe, libre à vous, personnellement je n’en met pas.
  • La demande de signature certificat « CSR » est un fichier généré à partir de la clé privée. ici je la crée en même temps. Elle peut être divulgué à votre tier de confiance. Elle contient diverses informations comme quels domaines il concerne, la durée de validité…
  • Le certificat « CRT » est le fichier généré par votre autorité de certification tiers.

Lorsque votre navigateur demande une page à votre serveur en SSL, ce dernier vous renvoie la réponse chiffrée avec le certificat publique signé par votre tiers. Votre navigateur peut donc vérifier que le certificat est valide auprès de l’autorité et déchiffrer la réponse du serveur.

Le certificat intermédiaire est parfois nécessaire lorsque l’autorité de certificat est inconnue de votre navigateur mais qui a pourtant été approuvé par une autre autorité, qui elle est connue de votre navigateur. Ce fichier doit donc être envoyé par le serveur en même temps que votre certificat signé. (Il peut y avoir plusieurs certificats intermédiaires).

Notez qu’il existe les certificats normaux et les certificats EV (Extended validate). Ces derniers permettent juste une vérification plus poussée de votre identification et provoque l’apparition de la barre d’adresse verte. (Sinon elle reste de la couleur normal)

Gérer un KEY et un CSR

Créer le fichier /usr/share/ssl-cert/ssleay-MONDOMAINE.cnf (un exemple se nome ssleay.cnf) et insérez ce texte que vous adapterez.

# -------------- BEGIN custom openssl.cnf -----
HOME                    = /etc/ssl/qth/
RANDFILE                = /dev/urandom
oid_section             = new_oids
[ new_oids ]
[ req ]
default_days            = 730            # how long to certify for (2yr)
default_keyfile         = /etc/ssl/qth/wildcard.qth.fr_key.pem
distinguished_name      = req_distinguished_name
encrypt_key             = no
string_mask = nombstr
req_extensions          = v3_req # Extensions to add to certificate request
[ req_distinguished_name ]
commonName              = Common Name (eg, YOUR name)
commonName_default      = qth.fr
commonName_max          = 64
countryName             = Country Name (2 letter code)
countryName_default             = FR
countryName_min                = 2
countryName_max                = 2
organizationName        = Organization Name (company)
organizationName_default        = QTH

localityName            = Locality Name (city, district)
localityName_default    = Paris

stateOrProvinceName     = State or Province Name (full name)
stateOrProvinceName_default = IDF
emailAddress            = ca-admin@localhost.com
emailAddress_max        = 40
[ v3_req ]
subjectAltName=DNS:qth.fr,DNS:*.qth.fr
# -------------- END custom openssl.cnf -----

Lancez la génération :

openssl req -batch -config /usr/share/ssl-cert/ssleay-wildcard.qth.fr.cnf -newkey rsa:2048 -out /etc/ssl/qth/wildcard.qth.fr_csr.pem

Faites signez votre CSR chez une autorité de confiance

Pour ma part j’utilise startssl qui permet de signer des certificat entre 1 et 3 ans en wildcard. Pour cela il est nécessaire d’être identifié en class 2, cela coute 59$ ce qui vous permet de signer des certificats pendant 1 an.

Donc si vous  vous démerdez bien, vous n’avez qu’a vous aqcuiter des 59$ une fois tous les 3 ans. Moi je suis partit pour 2 ans car je me suis trompé dans la génération du CSR car c’est là qu’est précisé la durée de validité. La révocation coûte 24$.

Configurez apache/nginx

Créez un virtualhost qui écoutera sur le port 443 et insérez la configuration suivante :

SSLEngine on
SSLCertificateFile /etc/ssl/qth/wildcard.qth.fr_crt.pem
SSLCertificateKeyFile /etc/ssl/wildcard.qth.fr_key.pem

Et si besoin les certificats intermédiaires (Ajoutez les si votre autorité en a car d’autres navigateurs peuvent se comporter différemment que le votre au moment de vos tests) :
SSLCertificateChainFile /etc/ssl/qth/wildcard.qth.fr_intermediate1.pem

Afficher

Depuis la version de 7 de firefox, le mot http:// n’aparait plus dans la barre d’adresse. Cela est embettant si comme moi, vous utilisez beaucoup le copier coller…

Pour le réafficher, tapez about:config dans la barre d’adresse puis passez à false la clé suivante : browser.urlbar.trimURLs

Tags: , ,

Je n'aime pas les boîtes noires.