Informatique

Certificat SSL/TLS auto signé avec sa propre autorité de certification

Wednesday, 07 January 2015
|
Écrit par
Grégory Soutadé

Aujourd'hui, un petit tutoriel sur la génération de certificats SSL/TLS auto signé avec openssl. Il en existe déjà des dizaines sur le web. Celui-ci n'apporte pas grand chose de nouveau, si ce n'est me permettre de garder la procédure sous le coude (qui a dit égoïste ?).

SSL/TLS Quèsaco ?

Pour rappel, SSL (Secure Socket Layer) et son remplaçant TLS (Transport Layer Security) sont des protocoles permettant de chiffrer (personne ne peut lire les échanges client/serveur) et d'authentifier (on est sûr de parler à la bonne personne) une connexion réseau. C'est le mécanisme qui est mis en oeuvre lorsqu'on accède à un site via https:// (entre autres).

Chaine de confiance

Le modèle SSL/TLS repose sur une chaîne de confiance. C'est à dire que chacun des maillons va signer le suivant (jusqu'au final). Donc, si on est sûr du maillon initial (racine), on peut vérifier la chaîne de bout en bout. C'est la faiblesse théorique du protocole : celui qui a la clé privée du certificat racine (l'autorité de certification ou Certificate Authority (CA) en anglais) peut faire ce qu'il veut, comme générer une chaîne complète. Les certificats racines de confiance (partie publique uniquement) étant enregistrés dans un répertoire du navigateur (Firefox, Chrome...) lors de l'installation et mis à jour régulièrement (certains sont même révoqués avant leur date d'expiration).

Cela paraît un peu flou ? Exemple simple, mais néanmoins courant : votre entreprise construit son propre certificat racine et l'enregistre dans votre navigateur (ceci est tout à fait légal), elle pourra générer à la volée un certificat pour *.google.com et ainsi pouvoir lire tous vos mails de mail.google.com (gmail) sans que le navigateur ne détecte d'erreurs !

Hiérarchie de certificats

Certificat auto-signé, pourquoi ?

Le marché du certificat est très juteux. Pour assurer votre sécurité, les autorités de certification vendent chaque certificat plusieurs centaines d'euros par an (une dizaine pour un particulier). Pourtant, le travail de certification est relativement simple. Il existe cependant des autorités gratuites telles que CACert, mais, très peu d'entres elles voient leurs certificats racines intégrés aux navigateurs.

Jadis, j'utilisais un certificat OVH (signé par Symantec Corporation), puis un certificat Gandi (COMODO CA Ltd), mais, au delà de l'aspect pécunier, j'ai décidé de vouloir maîtriser ma chaîne de bout en bout car, quitte à ne pas être reconnu par les navigateurs, autant que je puisse vérifier que je ne suis pas espionné.

Générer un certificat, la pratique

La première chose à faire est de générer la clé privée et le certificat racine de notre autorité de certification (CA). Pour cela, je choisis de générer un certificat d'une validité de 10 ans avec une taille de clé 4096 bits. La clé privée (protégée par un mot de passe) sera contenue dans soutade-ca.key, et le certificat racine (partie publique) dans soutade-ca.crt

    openssl req -new -x509 -extensions v3_ca -keyout soutade_ca.key -out soutade_ca.crt -days 3650 -newkey rsa:4096

    Enter PEM pass phrase:
    Verifying - Enter PEM pass phrase:

    Country Name (2 letter code) [AU]:FR
    State or Province Name (full name) [Some-State]:France
    Locality Name (eg, city) []:
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Soutade CA
    Organizational Unit Name (eg, section) []:
    Common Name (e.g. server FQDN or YOUR name) []:
    Email Address []:

    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:

Maintenant que nous avons notre autorité, nous allons passer au certificat final (on pourrait en avoir des intermédiaires) pour tout soutade.fr. Il faut répéter la procédure à partir de cette étape lors du renouvellement annuel.

Il faut commencer par créer une clé privée (2048 bits dans cet exemple) :

    openssl genrsa -out soutade.fr.key 2048

La requête de signature (sans mot de passe)

    openssl req -key soutade.fr.key -new -out soutade.fr.csr

    Country Name (2 letter code) [AU]:FR
    State or Province Name (full name) [Some-State]:France
    Locality Name (eg, city) []:
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Soutade
    Organizational Unit Name (eg, section) []:
    Common Name (e.g. server FQDN or YOUR name) []:*.soutade.fr
    Email Address []:

    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:

Enfin, le certificat final (signé par notre autorité) et valide 1 an (maximum recommandé)

    openssl x509 -req -days 365 -in soutade.fr.csr -CA soutade_ca.crt -CAkey soutade_ca.key -out soutade.fr.cert -CAcreateserial -CAserial soutade_ca.srl

Accessoirement, on peut supprimer les requêtes de signature

    rm -f *.csr

L'option -CAcreateserial va créer le fichier soutade_ca.srl. C'est important pour ne pas regénérer un certificat avec le même numéro de série.

IMPORTANT : Maintenant, il faut stocker la clé privée de l'autorité racine dans un lieu SÛR. Je conseille de faire un GPG du tar.gz et de le copier sur plusieurs supports !

Configuration pour nginx

La première étape est d'installer les certificats sur le système (exemple sur Debian)

    sudo cp soutade.fr.key soutade.fr.cert /etc/ssl/

Deuxième étape, configurer nginx. Dans /etc/nginx/sites-available/default

    listen   80 default; ## listen for ipv4
    listen   443 ssl; ## listen for ipv4

    server_name  soutade.fr *.soutade.fr;
    ssl_certificate     /etc/ssl/soutade.fr.cert;
    ssl_certificate_key /etc/ssl/soutade.fr.key;

    ssl_session_timeout  5m;

    ssl_protocols   TLSv1.2;
    ssl_ciphers  HIGH;
    ssl_prefer_server_ciphers   on;

On pourra noter que je n'active que TLSv1.2 avec les algorithmes de chiffrement les plus hauts et en préférant ceux du serveur. À la vue des dernières découvertes autour de SSL/TLS, les experts en sécurité conseillent fortement de désactiver les versions (obsolètes) de SSL (v3) et TLS (v1), quitte à ne pas supporter les vieux navigateurs (TLSv1.2 est quand même sorti en 2008).

Installation dans Firefox

Pour ce faire, il faut copier soutade-ca.crt en soutade-ca.pem, puis (dans Firefox) : Édition-> Préférences -> Avancé -> Afficher les certificats -> Importer...

Conclusion

Maintenant nos connexions sont protégées des vils pirates ? Pas forcément ! Comme dans l'exemple, il y a toujours la possibilité de générer à la volée un certificat à partir d'une autorité de certification que l'on maîtrise. Le seul moyen pour ne pas se faire avoir est de vérifier l'empreinte du certificat quand nous nous connectons, mais en général, l'autorité de certification ne mentionnera pas "Soutade CA" comme émetteur (plus facile à contrôler).

Nine nine nine nine. Are you sure that's random ? That's the problem with randomness : you can never be sure

IWLA : Intelligent Web Log Analyzer

Tuesday, 23 December 2014
|
Écrit par
Grégory Soutadé

Capture d'écran IWLA

C'est mon cadeau de noël à moi : IWLA. Il s'agit, basiquement, d'un clone d'AWSTATS. Pour ceux qui ne connaissent pas, awstats est un analyseur de log (journal des entrées) d'un serveur web (ce dernier faisant aussi l'analyse des logs ftp, ssh, mail...).

C'est un projet qui me tenait à cœur depuis longtemps et, mine de rien, il y a pas mal de boulot juste pour faire des additions !

IWLA a été pensé pour être le plus modulaire possible. Contrairement à awstats qui est complètement monolithique (tout le code dans gros un fichier PERL), l'extraction des statistiques et l'affichage de celles-ci passe par des plugins (hormis les opérations de base). On peut donc ajouter/retirer/modifier à loisir des modules et obtenir exactement ce que l'on veut (et ce de manière très simple). Chaque module va s'occuper de sa partie, voire modifier le résultat des modules précédents !

L'autre avantage (ou inconvénient), est qu'IWLA génère uniquement des pages statiques (en plus de pouvoir les compresser), ce qui accélère la visualisation. Côté design, il reprend le thème d'awstats (ça aurait été beaucoup plus moche si je l'avais fait moi-même) : un design simple qui va à l'essentiel !

Mais ce n'est pas tout, les données (robots, moteurs de recherche), sont directement extraites d'awstats !

Pour finir de troller, IWLA est écrit en Python, ce qui est bien plus moderne :)

Le tout est disponible sous licence GPL sur ma forge. Amusez-vous bien !

Se protéger des robots sur internet

Tuesday, 25 November 2014
|
Écrit par
Grégory Soutadé

Mona Lisa en robot

Quel drôle de titre ! Je vais donner ici quelques astuces pour éviter que les robots qui parcourent le net n'aient accès à vos données sensibles. Cet article s'adresse surtout aux webmasters.

Qu'est-ce qu'une robot ?

Un robot est un programme automatique qui va scanner tout le web à la recherche d'informations. Tous les robots ne sont pas méchants : Google utilise des robots pour indexer les sites parcourus. D'autres, par contre n'ont qu'un seul objectif : récupérer des informations personnelles pour en faire un mauvais usage (SPAM en tête) ou encore exploiter des failles de sécurité sur les sites rencontrés.

Base64

En tant qu'éditeur de site web (le mien !), je suis aux premières loges. Je n'ai pas envie que mon adresse mail se balade partout sur les annuaires de SPAM, mais je souhaite quand même la fournir aux visiteurs légitimes.

Une astuce que j'ai utilisé et qui fonctionne très bien est d'encoder un contenu que l'on ne souhaite pas exposer aux robots en base64 et de l'inclure dans un div avec comme classe CSS "decode64". Au chargement de la page, un petit bout de Javascript va décoder le contenu et l'afficher. C'est exactement ce qui se passe pour ma page "À propos" (regardez le source). L'inconvénient est l'obligation d'activer le Javascript.

Commentaires

Un système de commentaire sur internet (forum, articles...) est tout aussi sujet à SPAM. Les robots vont écrire automatiquement des commentaires sur tout système qui le leur permet. Pour bloquer cette avarie, on peut soit n'autoriser les commentaires que via inscription (ce que fait Disqus), soit utiliser une petite astuce.

Quand on poste un commentaire, il est souvent requis d'entrer son email. Les robots remplissent donc automatiquement le champ "email" d'un formulaire. Sur Dynastie, j'utilise deux champs email : le premier se nomme "email" et est caché par CSS (donc invisible pour l'utilisateur légitime), et le second "mel" (facultatif chez moi) qui est le véritable email.

Ainsi, quand le moteur de blog reçoit un formulaire dont le champ "email" est rempli, il le rejette, car il ne peut provenir que d'un robot !

Email de contact

Il y a encore une faille dans laquelle s'engouffre les robots spammeurs : l'email de contact. Par convention, on définit souvent une adresse "contact@monnomdedomaine". Les robots peuvent donc tenter d'écrire à cette adresse même s'ils ne l'ont trouvé nulle part (ça ne coûte rien). Le seul moyen pour parer cette attaque est le filtre anti spam du serveur mail...

Read ARM physical address

Wednesday, 29 October 2014
|
Écrit par
Grégory Soutadé

Direct access to physical address is a bad idea, but sometimes, for debug we need it. The trick used below is to disable MMU for only one instruction that do the read with fully configured environment and then re enabling MMU. Read and enable instructions should be in the pipe. The code works for arm11 but should also works for arm9 and maybe CortexA 32 bits series. Primitives has been found in FreeBSD 10 source code (sys/arm/arm/).

read_arm_phys_addr() must be called in supervisor mode (kernel mode).

#include <stdint.h> /* CPU control register (CP15 register 1) */ #define CPU_CONTROL_MMU_ENABLE 0x00000001 /* M: MMU/Protection unit enable */ #define CPU_CONTROL_DC_ENABLE 0x00000004 /* C: IDC/DC enable */ #define CPU_CONTROL_WBUF_ENABLE 0x00000008 /* W: Write buffer enable */ #define CPU_CONTROL_BPRD_ENABLE 0x00000800 /* Z: Branch prediction enable */ #define CPU_CONTROL_IC_ENABLE 0x00001000 /* I: IC enable */ uint32_t read_arm_phys_addr(void* addr) { uint32_t value; __asm __volatile ( // Load address "mov r0, %1\n\r" // Disable IRQ, FIQ and abort "cpsid ifa\n\r" // Disable MMU and cache "mrc p15, 0, r1, c1, c0, 0\n\r" "bic r2, r1, %2\n\r" "bic r2, r2, %3\n\r" "bic r2, r2, %4\n\r" "mcr p15, 0, r2, c1, c0, 0\n\r" "nop\n\r" "nop\n\r" "nop\n\r" // Read data "ldr r3, [r0]\n\r" // Enable MMU "mcr p15, 0, r1, c1, c0, 0\n\r" "nop\n\r" "nop\n\r" "nop\n\r" // Enable IRQ, FIQ and abort "cpsie ifa\n\r" "mov %0, r3\n\r" : "=r" (value) : "r" (addr), "i" (CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_DC_ENABLE | CPU_CONTROL_WBUF_ENABLE), "i" (CPU_CONTROL_IC_ENABLE), "i" (CPU_CONTROL_BPRD_ENABLE) : "r0", "r1", "r2", "r3"); return value; }

JM2L 2014 : édition annulée

Tuesday, 21 October 2014
|
Écrit par
Grégory Soutadé

Logo JM2L

Il n'y aura pas de 9e édition des JM2L. Un manque de volontaires pour l'organisation est à l'origine du problème. C'est fort dommage, car cet événement est très sympathique.

Majoritairement organisé par les élèves de l'école d'ingénieur Polytech Nice-Sophia, on peut se demander où est passé l'esprit du libre. Peut-être a-t-il décidé de rester cloîtré dans le pseudo Éden propriétaire...