đŸ’Ÿ Archived View for lord.re â€ș posts â€ș 245-renforcement-caa-avec-lets-encrypt â€ș index.gmi captured on 2024-05-12 at 15:07:57. Gemini links have been rewritten to link to archived content

View Raw

More Information

âŹ…ïž Previous capture (2023-11-04)

âžĄïž Next capture (2024-08-18)

-=-=-=-=-=-=-

Bloquer la création de certifs TLS dans votre dos via CAA

-------------------------------------------------

[23/10/2023] - ~5mins - #dns #sécu #tls

-------------------------------------------------

Allez hop, premier jour de congé et j'en profite pour remettre le nez dans le camboui de mon ptit bordel auto-hébergé.

Il vient de se passer un truc pas trĂšs ouf.

Jabber.ru (je connais pas mais j'imagine qu'ils fournissent des comptes xmpp Ă  leurs utilisateurs) se sont fait trouer.

Mais ça a été fait plutÎt bien.

En gros, un certificat TLS a été créé dans leur dos ce qui a permis d'intercepter du trafic sans que personne ne s'en rende compte.

Ce genre de truc est pas si difficile à faire et ça risque de devenir monnaie courante.

Là on s'en est rendu compte mais si ça se trouve c'est fait à grande échelle.

Bref, du coup j'ai voulu voir comment empĂȘcher ce truc.

CAA

Allez c'est une redite mais ce coup-ci on va blinder un peu plus.

Pour un ptit rappel n'hésitez pas à consulter

ref "posts/61-dns-caa" >}} mon article de 2017

mais en gros *CAA* est un type d'enregistrement DNS permettant de spécifier quelle <abbr title="Certificate Authority - Let's Encrypt par exemple">CA</abbr> est autorisé à créer un certificat TLS.

En gros avec ça, vous dites que seul Let's Encrypt a le droit de vous créer des certificats.

C'est pas mal, mais aprĂšs ce n'est pas encore pleinement suffisant.

Il est également possible de définir quel compte <abbr title="Let's Encrypt">LE</abbr> a le droit de générer des certifs.

Vous ne le savez peut-ĂȘtre pas, mais chaque utilisateur de LE a un compte.

On ne le crĂ©e pas explicitement mais le logiciel s'en charge de lui-mĂȘme.

On va donc crĂ©er un enregistrement CAA oĂč l'on va dire que seul LE est autorisĂ©e Ă  gĂ©nĂ©rer un cert et on va restreindre encore plus en spĂ©cifiant quel compte prĂ©cis Ă  le droit de le faire.

On va donc devoir trouver son "accounturi" qui correspond donc Ă  votre compte.

Choper l'accounturi

Avec *certbot* il suffit de faire <kbd>certbot show_account</kbd> ce qui vous donnera un joli <samp>Account URL: https://acme-v02.api.letsencrypt.org/acme/acct/XXXXXXXXXX</samp> ainsi que l'adresse e-mail associée.

~~Mais si comme moi vous n'utilisez pas *certbot mais acme.sh* il faut ruser.

Soit vous avez des logs présents dans .acme.sh/acme.sh.log soit vous allez devoir lancer un renew et farfouiller.~~

Votre accounturi est donc <samp>https://acme-v02.api.letsencrypt.org/acme/acct/XXXXXXXXXX</samp> .

Bon bha maintenant que vous avec cette info il ne vous reste plus qu'Ă  Ă©diter votre zone.

Édition de la zone DNS

Bon alors déjà il est possible de mettre une adresse mail de contact en cas de souci.

Je ne crois pas que LE en tienne compte mais c'est possible que d'autres CA l'utilisent.

Avec un peu de bol, une CA pourrait vous envoyer un mail si quelqu'un tente de vous créer un certif dans le dos !

Ensuite il y a surtout deux enregistrements.

Un permettant de définir la création d'un certificat pour une entrée spécifique et un autre pour créer un certificat wildcard s'appliquant à tous les sous-domaine ('tention niveau sécu ceux-là sont plus touchy).

VoilĂ  ce que cela donne pour moi.

{{< highlight "dns" >}}

lord.re. 600 CAA 0 iodef "mailto:lord-x509@lord.re"

lord.re. 600 CAA 0 issue "letsencrypt.org;accounturi=https://acme-v02.api.letsencrypt.org/acme/acct/XXXXXX"

lord.re. 600 CAA 0 issuewild "letsencrypt.org;accounturi=https://acme-v02.api.letsencrypt.org/acme/acct/XXXXXX"

{{< / highlight >}}

Si vous avez plusieurs machines et donc potentiellement plusieurs comptes LE il faut faire gaffe à faire ça comme il faut.

Ça semble suivre les CNAME d'ailleurs.

Si vous avec un CAA pour un enregistrement principal uniquement et des CNAME pour d'autres enregistrements ça semble respecter le CAA "global", ce qui est pratique.

Et surtout prenez garde : si vous avez un CAA à un niveau supérieur, il prenra le dessus pour tous les niveaux inférieurs si vous n'en définissez pas un plus spécifique.

Je m'explique, si vous avec un CAA sur lord.re, il s'appliquera Ă©galement sur sous-domaine.lord.re .

Donc pensez Ă  bien redĂ©finir le CA sur les sous-domaines si ce n'est pas le mĂȘme accounturi.

Certificate Transparency

Le CAA nécessite la coopération des CA.

En théorie les CA doivent le respecter mais bon on sait jamais.

Un ptit rempart supplémentaire (mais qui nécessite encore la coopération de la CA) est le *Certificate Transparency* qui est en gros un log public de tous les certificats créé par une CA.

À chaque fois qu'une CA signe un certif elle publie l'info dans un log ce qui permet Ă  tout un chacun de voir qui crĂ©er un certificat.

Il existe plusieurs sites pour consulter ça mais perso j'aime beaucoup

CRT.SH

qui est trĂšs simple et efficace.

Ils proposent en plus un flux rss ce qui permet d'avoir un Ɠil distant sur cela sans s'en prĂ©occuper plus.

Monitorer le renouvellement des certifs

Bon j'avais bĂȘtement un cron qui fait son boulot et je croisais les doigts.

Je me suis enfin décidé à vérifier un peu mieux tout ça.

Bon j'utilise *acme.sh qui fait la mĂȘme chose que certbot* mais en beaucoup plus simple.

Ce n'est que du shell, facile à installer (pas trouzemille dépendances python) et facilement scriptable.

Ils gÚrent plein de façons de notifier mais rien de ce qu'il propose me convient, j'ai donc fait un ptit script pour mon cas.

<details><summary>~/.acme.sh/notify/nib.sh</summary>

{{< highlight "shell" >}}

! /bin/bash

support nib

nib_send() {

_subject="$1"

_content="$2"

_statusCode="$3" #0: success, 1: error 2($RENEW_SKIP): skipped

_debug "_subject" "$_subject"

_debug "_content" "$_content"

_debug "_statusCode" "$_statusCode"

_err "Not implemented yet."

echo -e "\x033[TLS-KIF]\x0f STATUS : \x034 $_statusCode \x0f : $_subject \n $_content " | nc destinataire port_destinataire -w 2

return 0

}

{{< / highlight >}}

</details>

Suivi d'un <kbd>acme.sh --set-notify --notify-source kif --notify-level 2 --notify-mode 1 --notify-hook nib</kbd> et c'est tout bon

Relative inutilité du bousin

Bon je ne pense pas que ça m'apporte vraiment beaucoup plus de protection.

Je ne pense pas ĂȘtre la cible de ce genre de bidouille.

Et si c'était vraiment le cas, bha ça ne fait que reporter une partie de la sécurité vers le DNS.

Bref, un attaquant dĂ©terminĂ© (genre un État) ne serait probablement pas plus gĂȘnĂ© que ça par ces protections.

Cela reste cependant rapide Ă  mettre en place et sans trop de contrainte pour une architecture relativement simple.

------------------------------------

🏠 Retour à la home

------------------------------------

[23/10/2023] [dns sécu tls]

------------------------------------

[>> Suivant >>] ⏭ The Gate

[<< PrĂ©cĂ©dent <<] ⏼ Blow