Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Tag: Sécurité

Niveau :      
Résumé : crypto

Vocabulaire

Avant de pouvoir parler de sécurisation des communications, il faut avoir quelques bases en cryptographie. Commençons par le vocabulaire :

  • Coder : transformer une information en code (par exemple numériser une photo, écrire en morse ou en ASCII)
  • Chiffrer : transformer une information codée de façon à la rendre illisible à une autre personne que son destinataire
  • Déchiffrer : lire un document chiffré avec les informations nécessaires pour le faire
  • Décrypter : tenter de lire un document chiffré sans avoir la clé de déchiffrement
  • Signer : ajouter une information à un document prouvant qu'il a bien été écrit/lu par son auteur/lecteur sous cette forme et n'a pas été modifié
  • Empreinte : somme de contrôle d'un message (MD5, SHA) en cryptographie on cherche à faire en sorte qu'il soit impossible de créer un message ayant une empreinte donnée
  • Cryptanalyse : études des attaques permettant de décrypter un message ou de casser un chiffrement
  • Cryptographie : étude des systèmes de protection de messages
  • Cryptologie : ensemble de la cryptographie et de la cryptanalyse
  • Crypter : ce mot n'existe pas

Entropie

L'entropie est une mesure de la quantité d'information. Cette mesure n'est pas absolue, elle est relative à une quantité d'information possible.

Par exemple un octet est une valeur parmi 256. Un octet vraiment aléatoire (avec une répartition linéaire) a donc une entropie de 8. En pratique on ne cherche que rarement la valeur d'une entropie. On chercher plutôt à comparer obtenir des propriété sur l'entropie.

Par exemple prenons une suite de 5 octets. Si je peux déduire les 4 dernier octets à partir du premier (2*x 4*x 8*x 16*x), alors leur entropie est la même que celle d'un seul octet.

Maintenant si cette suite est véritablement aléatoire (tirée aux dés non pipés), l'entropie devient 5 fois plus grande.

Et enfin si cette suite n'est pas vraiment aléatoire, c'est-à-dire tirée avec un générateur pseudo aléatoire (/dev/urandom), alors leur entropie est égale à l'entropie du générateur pseudo aléatoire. Celle-ci se mesure par la taille de l'état interne du générateur.

Il est important de bien saisir cette notion pour comprendre la sécurité des algorithmes.

Entropie mesurée

Lorsque nous générons une suite d'octets, nous pouvons connaître l'entropie des données (et encore ...).

Lorsque nous récupérons des données, l'entropie n'est pas mesurable. Mais elle est estimable. En effet, pour une grande suite d'octets, si celle-ci est compressible, cela veut dire qu'il existe une technique pour déduire certains octets à partir des autres. L'entropie est donc très (le très variant en fonction du nombre d'octets considérés) probablement inférieure à la taille de la version compressée.

Pour tout système on peut donc chercher à en réduire l'entropie en éliminant des informations qui n'en sont pas vraiment. C'est le travail que font les gens qui développement des codecs (audio, vidéo ...).

Espace de chiffrement

L'espace de chiffrement est le nombre de tests que l'on doit effectuer pour en découvrir la clé de chiffrement d'un système. Si le système de chiffrement était parfait, il serait de la même taille que la clé. Malheureusement, on sait que la perfection n'existe pas.

Les études successives d'un système permettent souvent de réduire cet espace. Soit grâce à des informations obtenues par des moyens détournés (sous partie de la clé disponible, comparaison possible de texte clair et de texte chiffré ...), soit par une faiblesse du système qui va réduire sa propre entropie (ce cas est assez rare).

Sécurité

La sécurité d'un système s'estime à partir de cet espace de chiffrement. Plus il est grand, plus une machine devra mettre de temps pour trouver la clé de chiffrement et plus le système va être sûr.

Attention tout de même, ce n'est pas parce qu'un système de chiffrement est sûr que vos données le sont.

Et la littérature est abondantes sur le sujet, wikipedia n'est pas le seul à proposer des informations.

Niveau :      
Résumé : RSA ; DSA

La suite ... la suite ... Aujourd'hui les signatures.

Non il ne s'agit pas du petit gribouillis que vous mettez en bas des chèques. Il s'agit de signature numérique. Et ce n'est pas non plus une image scannée de votre gribouillis. Même si le but de la signature numérique est la même, il s'agit de présenter une preuve (presque) infalsifiable du fait que vous avez bien lu, voire écrit un message.

En fait la signature ne fait que vous identifier, prouver que c'est bien vous qui étiez là. Le sens même de la signature dépend du document signé (chèque, article scientifique, patch ...)

Principe

Un document signé numériquement doit assurer deux choses :

  • Que le document transmis n'a pas été modifié depuis que vous l'avez lu
  • Que c'est bien vous qui avez lu / écrit / approuvé ce document, c'est-à-dire
    • que ce n'est pas quelqu'un d'autre
    • que vous l'avez bien fait

C'est la combinaison de deux choses qui va permettre cela :

  • Une fonction de hachage à sens unique
  • Un algorithme à clé publique

La première garantit que le document correspond à une empreinte et qu'on ne produire de document modifié ayant la même empreinte. Le deuxième garantit que la signature ne peut être générée à partir d'une empreinte différente, si ce n'est par le signataire.

Par conséquent, on prouve que c'est bien le propriétaire de la clé concernée qui a signé le document.

Attention, seule la combinaison document - empreinte - signature le prouve. Ce qui veut dire qu'il est toujours possible de supprimer un élément pour empêcher de prouver que vous l'avez signé (non monsieur le juge, il n'y a pas de preuve que j'ai signé ce chèque). Dans le même ordre d'idée, seule la signature de la clé prouve que celle-ci vous appartient et donc que c'est bien vous l'auteur de la signature. C'est donc au destinataire de conserver ces données s'il veut un jour pouvoir fournir la preuve que vous avez signé le document.

Authentification

La signature permet l'authentification. Supposons que vous vouliez vous authentifier sur un serveur. Il suffit que le serveur vous envoie un challenge (un message) que vous devrez signer. Il va alors vérifier la signature (et les certificats qui vont avec) et vous serez authentifié.

Algorithmes

Hachage

On utilise une fonction de hachage qu'on considère comme sûre (donc éviter md5). Voir l'article précédent.

RSA

Pour la partie signature à clé publique, on utilise souvent le RSA comme expliqué dans un article précédent.

DSA

Un autre algorithme est fréquemment utilisé pour les signatures, il s'agit du DSA (Digital Signature Algorithm). Cet algorithme à clé publique a été développé pour ne fonctionner que dans le mode signature.

Il n'est ni plus ni moins sécurisé que le RSA, il est juste différent. Il utilise des formules mathématiques similaires au RSA et n'est pas plus difficile à comprendre que celui-ci.

Niveau :      
Résumé : SHA1 ; MD5

Une fonction de hachage est une fonction surjective qui prends un certain nombre d'octets en entrée et qui rend un nombre fixe d'octets en sortie. Elles sont donc à sens uniques et plusieurs entrées peuvent donner le même résultat.

Ces fonctions peuvent servir à la détection d'erreurs involontaires ou à la détection de modifications volontaires. Dans le premier cas on cherche à avoir une fonction qui permettra de détecter des erreurs de transmission, de lecture ou de recopie (le dernier chiffre de votre numéro de sécurité sociale). Dans le deuxième cas, on cherche à empêcher une personne de lire ou de modifier elle-même le contenu des données et de les faire passer pour les données originales, c'est ce qu'on utilise pour signer un document ou stocker un mot de passe (vous saviez que vous aviez en réalité une infinité de mots de passe qui fonctionnent ?).

CRC

Dans la première catégorie, on trouve un grand nombre de codes de redondance cyclique. Ils consistent à calculer des polynômes sur les données en entrée. Il existe une méthode permettant de les calculer facilement et sous forme de flux, ce qui fait qu'ils sont très rapides et facile à implémenter dans le matériel.

Ils ne sont pas standardisés puisqu'ils dépendent de la définition du polynôme choisi ainsi que de la taille du résultat.

Par contre les CRC ne permettent pas de protéger les données contre des modifications volontaires puisqu'il est assez facile de calculer une série d'octets qui donnera un résultat donné.

MD5

MD5 a été inventé par Ronald Rivest, celui qui a fait entre autre rc4 et rc5. Cette fois l'algorithme a pour but d'empêcher de reconstruire une source de données différente produisant un résultat donné. Il est très répandu et sert probablement à stocker vos mots de passe. Malheureusement il est depuis quelque temps déjà considéré comme peu sûr, même s'il n'y avait pas eu d'attaque dessus. Il a d'ailleurs récemment fait la une puisqu'il a été possible de calculer des collisions avec un bête cluster de 200 PS3 pendant quelques jours, comme quoi c'est à le portée de tout le monde.

Il est donc fortement déconseillé de l'utiliser pour une application de sécurité durable.

SHA

SHA est une série de fonctions de hachage dont les algorithmes sont complètement différents les uns des autres. Elles peuvent être utilisées pour la sécurité tout comme MD5.

  • SHA-0 est dépassés depuis longtemps.
  • SHA-1 est la plus répandue après MD5, et conseillée si vous ne disposez pas de SHA-2. Bien qu'on ait des doutes sur sa sûreté, on n'a pas encore réussi à produire des collisions en un temps humainement mesurable.
  • SHA-2 est une fonction de hachage à taille variable. Si vous voyez des SHA-224, SHA-256, SHA-384 ou SHA-512, il s'agit toutes de SHA-2 avec la taille précisée en suffixe. C'est la méthode la plus sûre actuellement.
  • SHA-3 n'existe pas encore et fait l'objet d'un concours pour savoir quelle sera la solution d'avenir. (d'ailleurs monsieur sécurité Bruce Schneier en personne y participe)

Niveau :      
Résumé : DES ; AES

Après avoir vu le fonctionnement des algorithmes de chiffrement à clé publique, intéressons-nous à leur complémentaire, les algorithmes à clé privée.

Algorithme

La méthode de chiffrement par clé privée est des plus simple. Une valeur, commune à deux personnes communiquant ensemble, permet de chiffrer et déchiffrer des messages.

Exemple avec l'algorithme d'addition / soustraction :

  • Choix d'une clé privée entre les 2 participants : 4
  • Message à envoyer : 123
  • Chiffrement du message : 123 + 4 = 127
  • Envoi d'un message chiffré 127
  • Déchiffrement du message : 127 - 4 = 123

Simple comme bonjour à comprendre, il a fallu des siècles pour admettre qu'il était plus important de cacher la clé que de cacher la méthode de chiffrement. Ceci pour une raison simple, les algorithmes utilisés jusque là étaient trop simplistes et n'auraient pas résisté à la moindre analyse.

Il existe de très nombreux algorithmes, plus ou moins bons, plus ou moins historiques, plus ou moins standards. Limitons-nous à deux standards.

Algorithmes de chiffrement

DES

Le DES est un algorithme promu par la NSA (qui a pour objectif de vous espionner) dans les années 70. Il est relativement simple et avec un peu de patience vous le comprendrez sans problème. Il se base sur un ensemble de 16 cycles de permutations et décalages paramétrés par la clé. Je ne le décrirai pas car c'est un peu long et pas franchement utile.



Il est obsolète depuis longtemps mais ne lâche pas le morceau si facilement (die DES, die). Il se base sur une clé de 56bits et est sensible à la cryptanalyse différentielle (utilisation de plusieurs messages semblables pour trouver la clé plus facilement).

AES

L'AES est un algorithme récent promu par le NIST (qui a pour objectif de standardiser le monde industriel). Je n'ai pas lu en détail la spécification, mais il s'agit d'une combinaison de 4 opérations élémentaires : le remplacement d'octet, le décalage d'octet, l'échange d'octets et la combinaison avec la clé.

L'AES permet d'utiliser des clés de taille variable entre 128 et 256 bits.

Méthodes de chiffrement

Les algorithmes sont eux-même divisés deux grandes catégories selon ce qu'ils sont capables de chiffrer.

Chiffrement par bloc

Les algorithmes de chiffrement par bloc sont capables de chiffrer des blocs indépendamment les uns des autres. Ce qui est très pratique pour les disques durs par exemple.

Chiffrement par flot

Les algorithmes de chiffrement par flot sont capables de chiffrer des données au fil des données, l'élément de base étant généralement bien plus petit qu'un bloc. C'est bien utile pour vos conversations téléphoniques par exemple.

Il est en général possible de transformer un algorithme de chiffrement par bloc en algorithme de chiffrement par flot. Le contraire n'est pas toujours vrai.

Niveau :      
Résumé : RSA ; courbes elliptiques

Après vous avoir présenté les certificats, parlons de ce qui a permis la création de la notion de certificat : le chiffrement à clé publique.

Algorithme

Un algorithme de chiffrement à clé publique est un algorithme qui utilise une clé différente pour chiffrer et pour déchiffrer. Prenons un exemple simple et supposons que personne n'ait découvert la division. On choisit un algorithme à base de multiplication :

  • Créons une clé privée : 0.25
  • Et une clé publique : 4
  • Un message à chiffrer : 123
  • Chiffrons le message avec la clé publique : 123 * 4 = 492
  • On transmet le message 492
  • Déchiffrons le message avec la clé privée : 492 * 0.25 = 123

Et voila, on peut donner à tout le monde la clé publique. Personne ne sachant diviser par 4, il est impossible de retrouver la clé privée à partir de la clé publique, il est donc impossible lire un message qui a été chiffré spécialement pour vous avec votre clé publique. Par contre, en tant que possesseur de la clé privée, cachée au reste du monde, vous pourrez le lire.

Remarquez qu'on peut aussi utiliser la même technique dans l'autre sens pour faire de la signature :

  • Créons une clé privée : 0.25
  • Et une clé publique : 4
  • Un message à signer : 123
  • Signons le message avec la clé privée : 123 * 0.25 = 30.75
  • On transmet le message 123 avec sa signature 30.75
  • Vérifions la signature avec la clé publique : 30.75 * 4 = 123

Cet algorithme prouve cette fois que c'est bien la clé privée qui a été utilisée pour produire le message. En effet, personne ne sachant diviser 123 par 4, seul vous êtes capables de produire la signature à partir du message de départ. Mais attention, ça ne prouve pas que le message n'a pas été créé de toutes pièces. C'est pourquoi, en pratique, on utilise en plus une fonction à sens unique pour éviter qu'on puisse créer un message à partir de votre signature.

Bien sûr en pratique on utilise des fonctions un peu plus complexes et des nombres un peu plus grands.


continue reading...

Niveau :      
Résumé : certificat

Parlons un peu sécurité. Il a déjà été question de certificats iciet . Attachons-nous un peu plus à comprendre ce qu'est un certificat.

Un certificat est composé d'une partie publique et d'une partie privée. Je vous passe la théorie sur la cryptographie à clé publique, ce sera pour une autre fois. Intéressons-nous à la partie publique du certificat. Dans le cas d'un certificat x509 (initié par l'ITU, formaté par RSA et complété par l'IETF), on trouve un certain nombre d'informations. Ces informations permettent deux choses :

  • identifier le propriétaire
  • authentifier le propriétaire

Accessoirement on y retrouve aussi des signatures prouvant que l'identification a été faite par une personne digne de confiance.

Usage

On se sert de ces certificats pour initialiser des connexions sécurisées. Pour cela on commence par vérifier que le certificat appartient bien à la personne avec qui on veut communiquer grâce à une chaine de certification. Ensuite on vérifie qu'on a bien le propriétaire du certificat, et enfin on utilise un protocole adapté pour s'échanger une clé de session permettant de chiffrer les prochaines communications.

Détaillons tout ceci en partant de la fin.

Clé de session

Le chiffrement à clé publique a l'inconvénient d'être lent, on préfère donc utiliser un algorithme à clé privée, plus rapide, pour communiquer le plus gros des données. C'est pourquoi on s'échange une clé de session temporaire en utilisant un algorithme à clé publique, puis le reste de la communication se fait par clé privée.

Autre avantage, l'attaque est plus difficile puisque la clé servant à la communication peut changer régulièrement.

Mais avant de s'échanger une clé de session, il faut être sur de parler à la bonne personne.


continue reading...

Niveau :      
Résumé : dm-crypt ; cryptsetup

Maintenant que vous savez tout sur device mapper, il y a une dernière fonctionnalité fournie en standard que vous allez vouloir utiliser: le chiffrement des partitions. Comme vous l'avez compris, il est possible de tout faire avec dmsetup, mais il y a mieux et c'est moins cher.

Chiffrement avec LUKS

Attention, ce que nous faisons ici écrit sur la partition, si vous ne voulez pas perdre vos données, regardez le dernier paragraphe.

La commande cryptsetup s'occupe de tout pour vous. Pour chiffrer une partition :

# pour préserver la résistance de votre partition à la cryptanalyse (des données apparemment chiffrées déjà sur le disque)
# on efface la partition avec des données aléatoires
$ dd if=/dev/urandom of=/dev/sda1
# il vous demandera simplement une passphrase
$ cryptsetup luksFormat /dev/sda1

Et maintenant pour l'utiliser :

# il vous demandera simplement une passphrase
$ cryptsetup luksOpen /dev/sda1 partoche

Et voila, votre partition est disponible dans /dev/mapper/partoche. Vous pouvez en faire ce que vous voulez, mettre une système de fichier dessus ou le redécouper avec lvm ou écrire directement dessus ...

Et si vous ne voulez plus utiliser la partition, fermez-là (la partition) pour ne pas qu'un autre tente d'en lire le contenu, on ne sait jamais :

$ cryptsetup luksClose partoche

Un peu plus loin

Cryptsetup permet d'autres formats de disque que LUKS, mais il n'est pas intéressant de les utiliser car luks est disponible un peu partout (même sous windows) et bien pensé

Luks permet entre autre quelques fantaisies comme la possibilité d'utiliser plusieurs clés, ce qui veut dire que vous pouvez partager un disque dur chiffré entre plusieurs personnes et que chacun ait sa clé pour lire et écrire dessus.

# ajoute une nouvelle clé (nouvel utilisateur ?)
$ cryptsetup luksAddKey /dev/sda1

Et donc vous pouvez révoquer une clé pour interdire à un des participants d'y revenir :

# liste les clés
$ cryptsetup luksDump /dev/sda1
# on en révoque une 
$ cryptsetup luksDelKey /dev/sda1 1

Attention si un des utilisateurs a eu accès aux méta-données de la partition, il a très bien pu les enregistrer, et comme il a du garder sa propre clé, il est dans ce cas toujours capable d'utiliser le disque.

Un autre usage des clés multiples est d'avoir une clé d'usage et une clé de secours imprimée et stockée dans un coffre pour usage en cas de perte de la première.


continue reading...