Une clé de contact pour votre portable chiffré
Par Petaramesh le jeudi 29 novembre 2007, 16:44 - Informatique non-duelle - Lien permanent
Article mis à jour le 22 juillet 2008
Dans mon précédent article, je vous ai expliqué comment chiffrer intégralement le disque dur de votre portable sous Linux, rendant l'ensemble des données et programmes qu'il contient absolument indéchiffrables et inaccessibles pour qui ne connaît pas la phrase secrète nécessaire à son déchiffrement.
Nous allons aujourd'hui nous intéresser à une autre méthode de démarrage d'un tel portable : Celle qui consiste à utiliser une clé de déchiffrement stockée sur un support externe, qui jouera alors le rôle de "clé de contact" de la machine : Si ce support externe est inséré, le portable pourra démarrer ; s'il est absent, le portable sera inutilisable.
Nous verrons qu'il est également possible d'utiliser ce qu'on appelle "dual form authentication", une authentification forte basée à la fois sur quelque chose que vous avez, et quelque chose que vous savez : Un support externe, que vous avez, plus un mot de passe nécessaire à son utilisation. Si l'un des deux manque, point d'accès. C'est d'ailleurs ce que vous faites, comme monsieur Jourdain, à chaque fois que vous payez avec une carte bancaire.
(Short english summary at end)
L'un des avantages à avoir chiffré tout son disque avec LUKS, c'est que ce système permet de modifier après coup la ou les phrases secrètes ou clés qui le verrouillent. On peut donc assez aisément : [1]
- Installer plusieurs phrases secrètes différentes permettant de déverrouiller la machine, ce qui est utile si la machine a plusieurs utilisateurs légitimes : ainsi, aucun n'a besoin de connaître la phrase secrète de l'autre. Chacun la sienne !
- Ajouter une clé de déchiffrement qui ne sera pas une phrase secrète, mais un fichier hébergé sur un stockage externe (qui peut lui-même être chiffré, ce qui permet d'obtenir la "dual form authentication", ou authentification à double critère).
- Supprimer une phrase ou clé existante si l'on ne souhaite plus utiliser l'une des méthodes, si l'un des utilisateurs ne doit plus avoir accès à la machine ou si une phrase ou clé a été compromise, etc.
La méthode hybride permet également de verrouiller le système avec une phrase secrète longue et complexe - donc fastidieuse à taper - et alternativement avec un support externe contenant une clé qui peut être protégée par un mot de passe plus simple, voire pas de mot de passe du tout, en fonction des besoins de sécurité que l'on aura.
En terme de support externe, nous pourrons envisager l'usage d'une clé "flash drive" USB,[2] ou d'une carte mémoire type SD, etc, pour peu que la machine considérée soit équipée d'un lecteur adéquat.
En partant du principe que nous avons déjà un système entièrement chiffré sur la base de mon précédent article, la mise en oeuvre d'une clé sur support externe - avec ou sans double authentification - va être relativement simple : Je fournis ici un "bootkeyscript"[3] qui fait tout le boulot.
En premier lieu, procurons-nous évidemment un support externe utilisable sur notre machine, et que nous utiliserons. Nous pouvons le partitionner et le formater de la manière de notre choix, le script "bootkeyscript" détectera automatiquement le système de fichiers utilisé.
Si nous voulons utiliser une clé "simple" sur support externe, non protégée elle-même par mot de passe, nous pouvons nous contenter de mettre celle-ci dans une partition FAT existante de n'importe quel support externe, que nous pourrons également utiliser "comme d'habitude" pour y stocker tous documents et fichiers de notre choix, en prenant simplement grand soin de ne jamais effacer par mégarde la clé de notre système !
Si nous voulons chiffrer la clé elle-même, nous créerons sur le support externe une petite partition que nous chiffrerons avec LUKS avant d'y créer un filesystem ext2 sur lequel nous stockerons enfin la clé.
Ceux qui ne désirent pas cette "double protection" peuvent sauter l'étape de création d'une partition chiffrée sur le support externe.
Création d'une partition chiffrée sur le support externe
Nous utiliserons donc un outil de partitionnement (fdisk, gparted, etc...) pour créer sur le support amovible une petite partition (typiquement 10 Mo) de type "Linux" (83), non formatée. Pour la suite de cet article, nous considérerons la partition créée, et située sur /dev/sdb2. Adaptez bien évidemment les instructions qui suivent à l'emplacement de votre propre partition, sur votre propre périphérique, au risque de détruire irrémédiablement des données sur votre système.
Commençons par remplir notre partition de clés de données aléatoires, selon la méthode habituelle :
dd if=/dev/urandom of=/dev/sdb2 bs=1M
Compte tenu de sa taille modeste, ça ne devrait prendre que quelques secondes.
Faisons ensuite de cette partition un volume chiffré LUKS :
cryptsetup luksFormat /dev/sdb2
Après un avertissement auquel il nous faut répondre "YES", il nous sera demandé de taper deux fois la phrase secrète ou mot de passe que nous utiliserons pour protéger nos clés. Rappelons-nous que nous devrons le taper à chaque boot, et que cela vient en supplément de la possession matérielle du support. À moins d'être paranoïaque, nous pouvons donc nous contenter d'un mot de passe relativement court et facile à taper - mais de préférence, pas à deviner ;-)
Une fois le volume chiffré créé, nous devons l'activer :
cryptsetup luksOpen /dev/sdb2 ext_keys
Après avoir tapé le mot de passe, si nous tapons "ls -l /dev/mapper", nous devrions voir y apparaître un périphérique nommé "ext_keys", qui correspond au volume chiffré "/dev/sdb2" actuellement ouvert.
Il nous faut maintenant "formater" cette partition pour y créer un filesystem ext2 :
mke2fs -m 0 -L ext_keys /dev/mapper/ext_keys
Génération d'un fichier-clé de 256 octets aléatoires
Nous allons maintenant monter le volume externe de manière à pouvoir y créer un fichier-clé. Commençons par créer le répertoire qui servira de point de montage :
mkdir /mnt/ext_keys
Puis :
- Si nous n'avons pas chiffré le volume, nous utilisons directement la partition de l'unité externe :
mount -t vfat -o defaults /dev/sdb2 /mnt/ext_keys
- Si nous avons chiffré le volume, nous montons sa version ouverte depuis
/dev/mapper:mount -t ext2 -o noatime /dev/mapper/ext_keys /mnt/ext_keys
Nous n'avons plus qu'à générer un fichier de 256 octets aléatoires que nous nommerons .bootkey (par exemple).
N.B.: Veillez bien à utiliser ici /dev/random et non pas /dev/urandom :
dd if=/dev/random of=/mnt/ext_keys/.bootkey bs=1 count=256
...à la suite de quoi un "ls -la /mnt/ext_keys/" devrait bien nous montrer la présence de notre fichier-clé aléatoire de 256 octets.
=> Un support externe peut être endommagé ou perdu ! Une mémoire flash n'est pas infaillible ! A ce stade, je vous conseille vivement de faire une copie de votre fichier-clé sur un ou plusieurs autres supports !
Maintenant que notre fichier est généré (et sauvegardé), nous pouvons démonter l'unité externe :
umount /mnt/ext_keys sync
et, si nous avions utilisé un volume chiffré, nous pouvons le désactiver :
cryptsetup luksClose ext_keys
Première regénération de l'initramfs
Pour pouvoir accéder à notre unité externe lors du boot, nous devrons nous assurer que les modules nécessaires (USB ou SD/MMC) sont bien présents sur l'initramfs que nous utilisons.
Les modules à charger dépendent fortement du matériel que vous possédez. Utilisez la commande "lsmod" pour lister les modules actuellement chargés sur votre système, et déterminer ceux qu'il vous faudra inclure dans l'initramfs.
On aura typiquement pour de l'USB :
- usbcore
- ohci_hcd (ou uhci_hcd selon le matériel)
- ehci_hcd
- usb_storage
- sd_mod
Pour un lecteur SD/MMC :
- mmc_core
- sdhci
- mmc_block
Si vous voulez mettre votre clé sur une partition FAT (sur une clé USB par exemple, il faudra également ajouter :
- fat
- vfat
- nls_cp437
- nls_iso8859_1
Mettez alors cette liste de modules, un par ligne, dans le fichier /etc/initramfs-tools/modules. Le mien, pour une utilisation de cartes SD, contient les lignes suivantes :
mmc_core sdhci mmc_block aes_i586 sha256 dm_mod dm_crypt
Une fois ceci fait, récréons notre initramfs :
update-initramfs -v -u
Insertion de la nouvelle clé dans le container LUKS principal du système
Nous allons maintenant rebooter notre système (antérieurement chiffré), et, quand celui-ci nous demandera notre phrase secrète, nous allons volontairement taper 3 fois de suite un mot de passe invalide, puis attendre. Au bout d'une trentaine de secondes, nous devrions obtenir un message d'erreur indiquant que le root filesystem est indisponible, puis nous retrouver dans un shell minimal (busybox) à l'intérieur de notre initramfs.
(initramfs)
À partir de là, nous ne pouvons pas faire grand-chose, mais nous pouvons en faire assez pour ajouter notre clé au container :
- Créons un point de montage "
/ext_keys" :mkdir /ext_keys - Montons notre unité externe sous ce point :
mount -t vfat -o ro /dev/sdb2 /ext_keys(si nous avions chiffré la partition, nous devons d'abord l'ouvrir avec "cryptsetup luksOpen'' avant de la monter à partir de/dev/mapperexactement comme expliqué plus haut)
Ajoutons maintenant la clé au container chiffré du disque dur (en supposant qu'il s'appelle /dev/sda2) :
cryptsetup luksAddKey /dev/sda2 /ext_keys/.bootkey
Le système nous demandera alors la phrase secrète actuelle du container, avant d'ajouter la clé qui se trouve sur le périphérique externe.
Une fois ceci fait, nous pouvons démonter le volume externe (umount /ext_keys), et si nécessaire refermer le volume chiffré correspondant (cryptsetup luksClose ext_keys).
Puis, nous pouvons rebooter "normalement" :
sync reboot
=> Lors de ce reboot, nous devons toujours taper la phrase secrète habituelle de notre système, car son initramfs ne sait pas encore utiliser la clé résidant sur le support externe.
Génération d'un initramfs compatible avec la clé sur support externe.
Pour que notre système puisse utiliser la clé que nous avons fabriquée puis installée, il nous faut ajouter dans l'initramfs le script "bootkeyscript" que j'ai écrit et que vous trouverez en attachement.
Ce script est très souple, car il détecte automatiquement si la partition contenant la clé est chiffrée ou non, et en demande le mot de passe le cas échéant. De plus, si l'unité externe n'est pas présente, il vous sera possible de taper une phrase secrète à la main - si toutefois votre système en reconnaît encore une comme valide.
Installation du script "bootkeyscript"
Installez ce script dans un répertoire approprié de votre système (je vous suggère /usr/local/sbin), et rendez-le exécutable avec "chmod 755 /usr/local/sbin/bootkeyscript".
Inclusion de l'utilitaire "stty" dans l'initramfs
Créez un script que vous appellerez "include_stty" dans le répertoire /etc/initramfs-tools/hooks, avec le contenu suivant :
#! /bin/sh . /usr/share/initramfs-tools/hook-functions copy_exec /bin/stty /bin
Rendez ce script exécutable : chmod 744 /etc/initramfs-tools/hooks/include_stty
Inclusion de l'utilitaire "udevsettle" dans l'initramfs
Créez un script que vous appellerez "include_udevsettle" dans le répertoire /etc/initramfs-tools/hooks, avec le contenu suivant :
#! /bin/sh . /usr/share/initramfs-tools/hook-functions copy_exec /sbin/udevsettle /sbin
Rendez ce script exécutable : chmod 744 /etc/initramfs-tools/hooks/include_udevsettle
Edition de /etc/crypttab
Editez votre fichier /etc/crypttab : C'est lui qui indiquera au système qu'il faut utiliser le script, et où se trouve la clé. En fonction du périphérique externe que vous utilisez et du nom que vous avez choisi pour votre fichier-clé, la ligne concernant votre LVM chiffrée devra désormais prendre l'aspect suivant :
# <target name> <source device> <key file> <options> crypt_VG1 /dev/sda2 sdb2:.bootkey luks,tries=3,lvm=crypt_VG1-LV_ROOTFS,keyscript=/usr/local/sbin/bootkeyscript
À noter : l'emplacement du "key file" se note ici sous la forme partition/fichier (avec des sous-répertoires si vous le souhaitez, mais sans "/" de début), sans indiquer "/dev/..." ni le point de montage, qui sont automatiques.
La partition peut être définie sous l'une des syntaxes suivantes :
- sdb1:nom_du_fichier_clé
- LABEL=label_du_filesystem:nom_du_fichier_clé
- UUID=UUID_du_filesystem:nom_du_fichier_clé
Les deux dernières formes permettant de définir le filesystem par son label ou son UUID, indépendamment du périphérique amovible dans lequel ce système de fichiers pourra être trouvé.
Si le filesystem est chiffré LUKS, on pourra le définir par l'UUID du container LUKS, mais pas par le LABEL du filesystem (invisible tant que le container chiffré n'a pas été ouvert).
Ne vous trompez pas en modifiant ce fichier ! Par rapport à votre installation antérieure, il vous faut seulement :
- Modifier "key file" de "
none" à l'emplacement de votre fichier-clé ; - Ajouter à la fin des options "
keyscript=/usr/local/sbin/bootkeyscript"
Le reste ne change pas par rapport à précédemment.
Nous avons presque terminé.
Génération de l'initramfs final :
update-initramfs -v -u
...Et il ne nous reste plus qu'à rebooter proprement.
- Si le périphérique contenant la clé est présent, la machine bootera automatiquement (elle demandera le mot de passe du périphérique-clé automatiquement, uniquement ci celui-ci a été créé ainsi).
- Si le périphérique contenant la clé est absent, vous obtiendrez (et c'est intentionnel) uniquement le message d'erreur :
Missing boot device /dev/sdb2!
...mais en réponse à ce messages d'erreur, vous pouvez taper une phrase secrète, s'il en existe une valide pour le container chiffré du disque dur, et le démarage se poursuivra alors normalement.
Vous avez désormais un système chiffré capable d'être "trimodal" : Il peut démarrer soit avec une phrase secrète, soit avec une clé externe non protégée, soit avec une clé externe protégée, vous offrant ainsi une sécurité extrême.
- Si les choses ne fonctionnent pas comme désiré, vous pouvez passer le script en mode "debug" en ajoutant "
cryptdebug" à la ligne de paramètres de démarrage de votre noyau. Le script affichera alors des messages indiquant sa progression et d'éventuels problèmes.
Une fois que vous serez certain que votre clé externe permet effectivement le démarrage du système, et que vous en avez fait une copie de secours (ailleurs que sur le portable qu'elle protège ;-) vous pourrez, si vous le souhaitez, supprimer complètement la phrase secrète antérieure de votre disque dur chiffré, en utilisant "cryptsetup luksDelKey (voir man cryptsetup), après avoir booté dans l'initrd'' comme expliqué plus haut.
Il ne vous reste plus qu'à penser à ne pas laisser votre clé de contact en permanence sur votre machine : Aussitôt que la machine a démarré, vous pouvez la retirer - et donc utiliser votre lecteur de carte ou prise USB pour y connecter, comme d'habitude, tout autre périphérique de votre choix.
Vous pouvez également vous référer avec fruit au Two Form Factor Authentication and LUKS Whole Disk Encryption with Feisty Fawn HowTo, notez cependant que le script "maison" que je vous fournis ici n'en provient pas : J'ai la faiblesse de penser que mon script est beaucoup plus puissant, et il a l'avantage de ne nécessiter aucune modification des scripts standard du système.
Short english summary :
In this article, I propose a "bootkeyscript" that allows easy use of dual form factor authentication on a fully encrypted LVM Ubuntu (7.10 Gutsy Gibbon) Linux installation. (See one of these excellent HowTos for installing Ubuntu on a fully-encrypted LVM base : "EncryptedFilesystemLVMHowto", "FeistyLUKSTwoFormFactor")
The script that I propose here has some advantages over existing scripts :
- Doesn't need any change or patch to Ubuntu Gutsy existing scripts, with which it integrates well, making future packages upgrads easy ;
- Automatically allows in a smart way any combination of the following authentication methods :
- Single form-factor authentication, using an unencrypted keyfile on an external removable device ;
- Dual-form factor authentication, using a keyfile residing on a LUKS-encrypted partition on an external device ;
- Possible automatic fallback to typing a passphrase if keyfile external device is missing (with a purposely obscure
Missing boot device!
error message).
Short installation instructions :
- Create a fully (passphrase-controlled) LVM encrypted system as usual, possibly following one of the existing HowTos. Do not change anything in the existing Ubuntu encryption scripts.
- Create a random keyfile. Install it on an external device partition, either itself LUKS-encrypted with a passphrase (for 2 form-factor auth) or unencrypted (1 form-factor, with key device, without passphrase).
- Install the key to the main system LUKS container (following usual instructions).
- List all the modules you will need to access your key device and its filesystem, in the
/etc/initramfs-tools/modulesfile - Put such an executable script (mode 744) into /etc/initramfs-tools/hooks, let's call it "include_stty" :
#! /bin/sh . /usr/share/initramfs-tools/hook-functions copy_exec /bin/stty /bin
(This will include "stty" into the initramfs, to avoid echoing typed passphrase if not using bootsplash. Using bootsplash wouldn't actually need this)
- Create an include_udevsettle script the same way :
#! /bin/sh . /usr/share/initramfs-tools/hook-functions copy_exec /sbin/udevsettle /sbin
- Install my "bootkeyscript" script wherever you like on your system (I suggest /usr/local/sbin), mode 755.
- Update /etc/crypttab with the columns :
- Key : device/keyfilename i.e.:
sdb1:mysystemkey- or
mmcblk0p2:somedir/somekeyfile - or
LABEL=fs_label:somekeyfile - or
UUID=fs_or_LUKS_container_uuid:somekeyfile - (Syntax is devicepartition:filepath without leading "/")
- Options : Add "
keyscript=/usr/local/sbin/bootkeyscript"
- Key : device/keyfilename i.e.:
- Regenerate initramfs (update-initrafms -u)
- Reboot, enjoy.
Example /etc/crypttab entry for encrypted root filesystem :
# <target name> <source device> <key file> <options> enc_VG1 /dev/sda2 UUID=12345678-90ab-cdef-0123-4567890abc:rootkey.bin luks,tries=1,lvm=VG1-ROOTFS,keyscript=/usr/local/sbin/bootkeyscript
Changelog
2008/07/21: bootkeyscript V. 1.6:
- Now the key partition can be defined in
/etc/crypttabin any of the forms :- sdb1/filename
- sdb1:filename
- LABEL=filesystem_label:filename
- UUID=filesystem_UUID:filename
2008/05/10: bootkeyscript V. 1.5:
- Much debugged and rewritten version of the script.
- Works much better than previously for keys on USB flash disks.
- Includes a "debug" mode that you can set by adding "
cryptdebug" to the kernel command line. - This article completed with some missing infomation.
- Compatible with Ubuntu 8.04 Hardy or 7.10 Gutsy
Help Google : Ubuntu Linux 7.10 Gutsy Gibbon LUKS whole disk encryption external device keys, two form factor authentication, how to howto
Notes
[1] Les possibilités de ce système sont immenses. On peut par exemple imaginer, pour un serveur - qui doit être capable de booter sans intervention humaine - de stocker une clé sur une machine distante, et de l'obtenir via Internet, la machine distante étant configurée pour ne fournir cette clé qu'à une adresse IP précise. Le serveur sera ainsi capable de booter tout seul dans son "environnement habituel", mais si jamais il est volé, il deviendra inutilisable en dehors de son adresse IP habituelle, et il sera possible de supprimer la clé de la machine distante sur laquelle elle est stockée. Un tel setup est toutefois extrêmement complexe et va bien au-delà des objectifs de cet article.
[2] L'avantage d'une clé USB est qu'elle peut être bootable, alors qu'une SD-card ne le sera pas - parce que le BIOS du système ne le prévoit généralement pas. Si on utilise une clé USB, on peut même envisager de mettre dessus le "/boot" non chiffré du système (moins de 100 Mo), ainsi que le bootloader grub, ne laissant sur le disque dur qu'un container totalement chiffré et non bootable contenant tout le reste du système. Ce n'est pas particulièrement compliqué à faire, mais c'est là encore en dehors du sujet de cet article.
[3] Évidemment sous licence GNU GPL.











Commentaires
Serais-tu malade à nous pondre autant de billets dans une même journée ?
@Amazone : Euh, ça ne fait qu'un seul (gros) billet pour aujourd'hui, si je compte qu'hier soir après minuit n'est pas vraiment "aujourd'hui ;-)
Tout va bien alors, tant mieux !
Bonjour Ô Grand Swâmi Petaramesh,
je lis ton blog depuis quelque temps... et tes billets geekesque sur le chiffrement m'intéressent fortement.
Sauf que je ne suis pas expert comme toi et qu'il me vient une question : ce type de chiffrement est-il pérenne ?
Eh oui, les mises à jour de ma distribution, qui font déjà voler en éclat mon Xorg régulièrement, ne feront-t-elles pas une jaunisse devant un système chiffré et "personnalisé" comme cela ?
En tout cas, merci pour tes billets.
@cflam69 : Justement, ce qui est "personnalisé", c'est le moyen de le faire, mais en s'écartant le moins possible des fonctions standard de la cryptoapi du noyau, qui est très stable et peu susceptible de changements imprévus brisant la compatibilité.
J'utilisais jusqu'ici des containers loop-aes que je traîne depuis bien oh, 6 ou 7 ans, et qui ont survécu (sont restés directement exploitables) à 7 ou 8 upgrades de Mandrake/Mandriva puis au passage sous Ubuntu.
Dans les solutions que je propose, il n'y a justement qu'une paire de scripts "facilitateurs" autour des fonctions standard du noyau et de packages standard très éprouvés (cryptsetup, etc.).
Donc, je n'ai pas d'inquiétude sérieuse quant à la pérennité du système, à part peut-être la nécessité de changer trois points-virgules dans un script un jour ou l'autre... Si d'aventure un nouveau modèle de chiffrement devait devenir "le standard", il resterait certainement possible d'accéder aux anciens volumes le temps de faire la conversion - exactement comme il est toujours possible d'accéder à de vieux volumes loop-aes le temps de les convertir vers le plus riche et plus efficace dm-crypt.
Le device-mapper est à la base de fonctions essentielles du système : la LVM2 repose dessus, par exemple. Il n'est à mon avis pas près de disparaître, et comme tu le vois dans l'exemple de ce billet, je ne procède que par adjonction à un existant que je m'abstiens de toucher autant que faire se peut, limitant ainsi les problèmes d'upgrade, alors que par exemple la solution proposée dans le Two Form Factor Authentication and LUKS Whole Disk Encryption with Feisty Fawn HowTo exige la modification de pas mal de scripts standard, et est donc davantage susceptible d'être (au moins temporairement) cassée par un upgrade, le temps de remodifier les scripts (ce qui peut être un poil compliqué si la machine ne boote pas...)
Mais ici, j'utilise au maximum ce que la machine sait déjà faire en y ajoutant simplement le peu qui me manque :-}
Et je transmets toujours mes bidouilles aux développeurs concernés dans l'espoir qu'is les intègrent au standard si ça leur plaît - ce qui s'est déjà vu par le passé...
Après, la durabilité prévisible d'une solution est à mettre au regard de la nécessité de protection des données et de la durée de vie prévisible de l'installation avant un upgrade matériel ou logiciel d'envergure...
Quel réponse ! En fait, je ne doute pas de la pérennité de "ton" installation ou de ce type de chiffrement.
J'ai utilisé moi-même des containers lopp-aes et la swap crypté sous mandrake/mandriva.
Et sous Ubuntu, j'utilise plutôt Cryptkeeper car il est simple (tu vois le niveau).
Quand je parle de pérennité, c'est plus par rapport à l'utilisateur lambda comme moi.
J'upgrade, ça foire ... je pleure car j'ai un disque chiffré et que je ne suis pas sûr de récupérer les données depuis un live-CD par ex. (manip' difficile pour un "noob").
Ma question était donc plutôt (et je m'excuse de t'avoir égarer) : ce type de chiffrement est-il "fragile" devant les mises à jour régulières de ma distribution ?
Si oui, je pense que je continuerai mes p'tits containers fait par cryptkeeper. Sinon, cela me tente...
En tout cas, tout cela est super instructif. Pourquoi n'es-tu pas dans le planet d'Ubuntu-fr ? Volonté ?
@cflam69 :
Ah ouais... Je euh... connais bien... le type qui a signé le bout de code qui faisait ça dans le rc.sysinit de Mandrake ;-)))
>
Je dirais, probablement non, avec 95% de certitude ;-)
>
Parce que je ne sais pas que cela existe :-}
http://planet.ubuntu-fr.org/
Avec ceci, à toi la gloire ....
Et pour en revenir au chiffrement : est-il simple de déchiffré une partition chiffré après un plantage (et avec le mot de passe évidemment) ;-) ?
@cflam69 :
La gloire, c'est fatiguant. Déjà que je ne peux pas sortir sans que des hordes de filles nues se jettent sur moi...
>
Un plantage affecte un filesystem chiffré ni plus ni moins qu'un filesystem non chiffré. Le journal ext3 ou au pire un coup de fsck remettent les choses dans l'ordre ni mieux ni pire que d'habitude :-}
Ok, merci.
Mais je continue mes réflexions parano-geekesque :
Si je réinstalle ma bubuntu Gutsy en mode chiffrement (dans l'alternate), celui-ci utilise LUKS. Donc, je dois pouvoir lui dire de booter s'il y'a tel passphrase ou si une clef est inséré dans la femelle du mâle comme ton "système" le suggère. J'ai faux ?
Mais si c'est possible, j'imagine que c'est aussi compliqué que ce que tu as mis au-dessus à quelques manip' près ?
Merci pour tes réponses.
@clamf69 :
Oui. Note que tu n'es pas obligé de "réinstaller" (ni donc de perdre quoi que ce soit de ta config ou de tes fichiers). Tu peux très bien déménager ton installation sur un disque externe, puis chiffrer le disque interne de ta machine et remettre ton installation dessus. C'est ce que je montrais dans cet article.
>
C'est juste.
>
Une fois que tu as une installation entièrement chiffrée LUKS, si tu veux passer à l'utilisation d'une "clé de contact", il te suffit de procéder comme indiqué dans mon dernier article à ce propos. Tu peux ensuite choisir de désactiver la passphrase, ou de garder les deux modes, puisque le script que je propose gère les deux de manière automagique...
À toi de savoir si tu trouves ça compliqué ;-)
Pour la réinstallation ... ben c'est juste l'occasion qui fais le laron puisque depuis la Warty, je n'ai fais que des upgrades. Et une petite réinstall' ne lui fera aucun mal.
De plus, je pourrais revoir la taille de mes partitions et refaire un partionnement plus propre. Bref, j'avais compris que cela n'était pas nécessaire avec ta méthode ... mais je voulais savoir si je pouvais concilier l'un et l'autre.
Pas tant que cela, mais c'est pas trop user-friendly ... je veux dire le côté rassurant et eye-candy du chiffrement tel que le fait Mac manque un peu à Linux je trouve.
Mais je pense que je vais me lancer sous peu.
Merci pour toutes les indications et conseils.
PS : si j'arrive à faire tout ces manip', es-tu contre le fait que je publie un howto en français sur Ubuntu-fr si je trouve le temps ? Tu seras bien entendu cité et les honneurs (sans la gloire) te seront rendus.
PS bis : j'ai trouvé un autre blog traitant de la question ... et avec un p'tit schéma qui aide à la compréhension et qui est destiné aux pauvres noob comme moi. Si cela intéresse, c'est par ici
@cflam69 :
Absolument aucun, bien au contraire ! L'information et la connaissance sont faites pour circuler !
Je rappelle d'ailleurs que sauf mention explicitement contraire, tous les articles publiés ici le sont sous licence CreativeCommons By-nc-saet que donc, la reproduction de tout ou partie de ces articles est autorisée aux conditions prévues par cette licence.
J'ai commencé à lire le billet en pensant qu'il s'agissait de "téléphone portable" (ou "mobile") ... mais non, il s'agit d'un billet pour un "ordinateur portable".
luksCreate ? ça me renvoie un magnifique "cryptsetup: Unknown action." je n'ai pas trouvé luksCreate dans le man.
Je me suis dit qu'il fallait installer le paquet cryptsetup-luks mais il est introuvable avec les dépôts standards d'ubuntu et apt-get me conseille de garder cryptsetup ...
Une petite piste ?
@Mitch : Oops. Lire :
luksFormatet non pas luksCreate.Je vais corriger dans le billet.
>
LUKS est maintenant intégré dans le cryptsetup "standard", c'ets pourquoi il n'y a plus de paquet spécifique.
Bonjour,
Article très intéressant !
Dans la note n°2, tu précises que mettre le /boot sur une clé USB (ne laissant ainsi aucune donnée non chiffrée sur le système) n'est pas compliqué à faire ; pourrais-tu donner en quelques mots la démarche à suivre ?
Merci.
Ok, ça c'est pour sécuriser le disque dur de la machine ou la flash du eeepc ;).
Maintenant l'exercice inverse est-il jouable? c'est à dire des pc de contact pour monter et utiliser les médias amovible. Ca serait moins fastidieux à l'usage car une fois le pc démarré on peut utiliser sans taper trop de trucs ses clés.
En fait je pars d'un constat : pour démarrer la machine, il faut déverrouiller la lvm après on rentre son login et son mot de passe. Cela représente beaucoup de manipulations et ces quelques contraintes peuvent gêner un usage quotidien. Pour les périphériques amovibles en les chiffrant intégralement ça implique soit de taper des lignes de commande, soit de rentrer une phrase de passe et donc ça alourdit encore le démarrage de sa machine avec ses clés ou disques usb.
Afin que ça soit pratique, assez sûr et sans avoir à retenir 25 autres mots de passe j'ai pensé à ça :
1°étape : préparation du média amovible :
On bourre de données pseudo aléatoires
dd if=/dev/urandom of=/dev/sdc bs=1M(nom du périphérique à adapter)On crée le volume avec une phrase de passe longue la plus sûre possible ou un mot de passe bidon si on veut la supprimer après pour remplacer par usbkey :
cryptsetup luksFormat /dev/sdccryptsetup luksOpen /dev/sdc openedusbOn crée la clé de chiffrement qui déverrouillera un ou un ensemble de médias amovibles donc 256 bits avec /dev/random :
dd if=/dev/random of=/home/user/usbkey bs=32 count=1On l'ajoute au volume chiffré comme étant une clé valable :
cryptsetup luksAddKey /dev/sdc /home/user/usbkeyéventuellement on supprime le mot de passe (possibilité de bimodal voire trimodal)
cryptsetup luksDelKey --key-file=/home/user/usbkey /dev/sdc 0cryptsetup luksClose openedusbVoilà donc là on se retrouve avec un volume chiffré avec une clé qui se trouve dans son home.
2° étape en chantier : faire en sorte que ça se monte directement à l'insertion du média.
C'est à dire reconnaissance du uuid du volume + /home/user/usbkey , ouvre le volume et le monte avec un nom explicite préalablement défini en fonction de l'uuid afin de ne pas confondre deux clés entre elles et de ne pas faire de mélange si on monte plusieurs clés en même temps. on clique sur démonter le volume : hop ça démonte et ça referme le volume (avec l'icône idoine mais ça j'ai pas trop le niveau encore ...)
Ainsi on obtient sans avoir à taper de mot de passe des clés autorisées à n'être montées que sur les machines où usbkey est présente. En recopiant cette clé sur toutes les machines que l'on possède on crée de facto des copies de sauvegarde afin de ne pas perdre le contenu de tous les médias amovibles en cas de décès d'une machine.
L'obtention du fichier usbkey permet à Mallory de lire l'ensemble des médias amovibles ainsi configurés. Il est donc indispensable que le home ou le dossier où se trouve usbkey soit chiffré (pas de souci donc avec le chiffrement intégral du disque dur)
Bon pour faire ça. je me suis dit qu'il pourrait être utile de rajouter ces deux lignes là (à voir ..) :
Une entrée dans /etc/crypttab :
nom_souhaite_de_la_cle_usb /dev/disk/by-uuid/uuid_du_volume /home/user/usbkey luks
Une autre entrée dans /etc/fstab :
/dev/mapper/nom_souhaite_de_la_cle_usb /media/nom_souhaite_de_la_cle_usb ext3 defaults 0 2
(je suis pas trop sûr des options car j'ai pas droit en écriture sur ma clé après un mount -a).
Bon et là ça bloque. à l'insertion du média dans l'usb on me propose de rentrer le mot de passe du volume luks (ubuntu 7.10) mais pas d'aller chercher le fichier clé (j'ai bien l'impression que mes modifs de /crypttab et /fstab ont servi à rien.)
De plus apparemment il y a un bug pour automounter des volumes chiffrés https://bugs.launchpad.net/gnome-mo... et avec le script qu'ils proposent je m'en sors pas trop j'ai toujours le même message d'erreur.
A suivre :)
PS : il sera facile de changer la clé qui déverrouille les médias en cas de soupçon de corruption vu qu'on passe par cryptsetup.
oups javais oublié de noter :
sudo mkfs.ext3 /dev/mapper/openedusbpour avoir une clé usb en ex3.Ca m'apprendra à pas assez me relire.
:)
@Blip :
Ça n'a rien de particulièrement difficile : Mettre le contenu du /boot sur une clé USB, installer grub dessus comme on le ferait sur un disque dur, s'assurer que le BIOS de la machine est capable de booter depuis la clé USB et la mettre en premier dans l'ordre des périphériques de boot.
On peut dans ce cas ne mettre sur le disque dur qu'une LVM chiffrée, sans aucun noyau bootable, aucun
/boot, et aucun bootloader installé...@Mitch : C'est une technique simple du genre de celle que tu proposes que j'utilise sur mon EeePC pour avoir une carte SD chiffrée LUKS (qui équivaut conceptuellement à un second disque dur) inutilisable sans la machine, puisqu'elle n'est déchiffrable que par un fichier-clé (aléatoirement généré au départ) présent sur le portable, dans sa LVM elle-même chiffrée.
Ainsi au boot, le portable commence par faire saisir la phrase secrète de sa LVM, boote, puis déchiffre et monte automatiquement la carte SD grâce à la clé qu'il possède. Sans le portable, je suis moi-même incapable d'accéder au contenu de la carte SD.
Par ailleurs, tu exagères sur la complexité d'utilisation d'une machine entièrement chiffrée : Si tu es le seul utilisateur de la machine et que tu as tout dans une LVM chiffrée, tu peux très bien mettre un autologin utlisateur et aucun autre mot de passe à l'intérieur. Dans ce cas, tu as besoin de taper une phrase secrète pour le boot, et basta (attention quand même dans ce cas à se protéger de toute attaque via le réseau, et notamment toute tentative de passer root... Tu peux mettre un mot de passe à root le cas échéant ;-)
Bonjour,
Ca l'a été dit plusieurs fois, mais j'imagine que ça n'est jamais superflu: cet article est très intéressant, d'autant plus qu'il correspond exactement à ce que je cherche à faire, et en nettement plus propre que mes propres bidouillages (changement des scripts init etc..).
Cependant, j'ai un petit soucis avec le script bootkeyscript: en effet, j'ai de belles lignes d'erreur au moment du boot me disant qu'il ne trouve pas le fichier /scripts/functions. Après avoir jeté un oeil à bootkeyscript, il y a un appel à ce fichier au tout début - c'est même la première ligne de code.
Je me débrouille un peu sous linux, suffisamment pour avoir une idée de comment tout ça fonctionne, mais les fonctions des scripts d'initialisation, c'est bien au-delà de mes connaissances.
Une idée d'où est le problème? Ma config est un Ubuntu Hardy Heron tout frais.
En espérant que ce billet n'est pas encore dans le cimetierre des blogs, d'avance merci!
@Julon : Pas bien précise ta description, mais je parie sur un
/etc/crypttabfoireux, genre double entrée pour la LVM racine...Tout d'abord, merci pour ta réponse rapide!
Pour une raison qui m'échappe, ton bootkeyscript ne fonctionne pas sur ma config - peut-être parce que mes disques cryptés n'ont pas été créés de la même manière que les tiens vu qu'ils sont hérités d'un Fedora 6, sans lvm (le root n'est pas crypté, donc).
Toujours est-il que j'ai résolu le problème en créant un tout petit script taillé pour mes besoins uniquement, en m'inspirant de ton bootkeyscript.
@Julon : Donc, tu nous expliques en substance que tu as essayé d'utiliser un script conçu uniquement pour fonctionner depuis l'initramfs pour monter une racine sur LVM chiffrée, sur une machine dont la racine n'est pas chiffrée et qui n'utilise pas de LVM... Non, rien :-D
Cela dit, il n'est pas bien compliqué de copier l'intégralité de ton système sur un disque externe puis de créer une LVM chiffrée et tout retransférer dessus ;-)
Merci beaucoup pour ce script.
Donc personnellement j'ai opté pour une clé USB avec 2 partitions, un principale et une petite de 8Mo (à priori on peut pas faire plus petit) dans laquelle j'ai la clé.
J'ai juste une question: Est-il possible de faire que la petite partition ne soit pas automatiquement monté sous linux ? (et pas seulement avec mon pc en modifiant le fstab). Je ne sais pas si on peut "tagger" une partition pour lui dire : "A pas monter automatiquement" ou alors utiliser un système de fichier exotique. Des suggestions?
Merci beaucoup.
@Antoine : Non, on ne peut pas "tagguer" une partition elle-même pour lui dire "pas de montage automatique", et le ''bootkeyscript" ne prend pas en charge de systèmes de fichiers "exotiques" pour cet usage.
Par contre, si tu chiffres ta "petite partition" avec LUKS pour obtenir la double authentification (clé physique + mot de passe) alors ta petite partition ne sera simplement pas automatiquement montable... sans le mot de passe de déchiffrement ;-)
Bonjour,
Je suis très intéressé par cette méthode d'identification.
J'utilise moi même cryptsetup pour mes données mais pas pour l'intégralité de mon disque dur.
J'ai uniquement crypté ma swap, mon tmp et mon home.
Le problème c'est que le script ne fonctionne pas pour ouvrir uniquement le home.
J'ai fait divers tests sur mon autre pc mais j'ai uniquement réussi a faire fonctionner cette méthode que quand le disque dur était entièrement chiffré.
Y a-t-il un moyen de le faire marcher ?
Dois-je modifier quelque chose d'autre ?
Pouvez vous m'aider ?
Merci d'avance.
Amicalement.
Petit Up ^
Bonjour,
Je vais migrer vers votre script. J'utilise actuellement celui de "maze of lies".
Dans mon cas je souhaite créer deux clés USB contenant chacunes la clé de déchiffrement de la partition. La première en ma possession, la seconde étant dans le coffre-fort de mon patron.
Comment est-ce que ce script peut gérer deux clés usb si une partition LUKS ne peut être identifiée que par son UUID ?
Réponse éventuellement trouvée : il suffit de forcer l'uuid du container luks
sudo tune2fs -U <l'UUID desirée> /dev/<votre partition>
@Bébert : A priori, tune2fs ne peut agir que sur un filesystem ext2/3, et ne peut pas changer l'UUID d'une partition LUKS.
Une possibilité est de partitionner à l'identique 2 clés USB identiques, de créer la parition LUKS sur l'une, avec la clé dedans, et ensuite de copier de manière binaire la partition d'une clé USB sur l'autre. On aura alors 2 clés USB contenant exactement la même partition avec la même UUID (ce qui normalement n'arrive jamais ;-)
Exemple (si les partitions des clés USB sont en sdb1 et sdc1) :
dd if=/dev/sdb1 of=/dev/sdc1 bs=1MBonsoir,
ne manque-t'il pas quelque chose sur la ligne dd if=....
pour donner la longueur de la clé?
ça ne fonctionne pas chez moi ou plutôt ça ne rend pas la main.
{{Nous n'avons plus qu'à générer un fichier de 256 octets aléatoires que nous nommerons .bootkey (par exemple).
N.B.: Veillez bien à utiliser ici /dev/random et non pas /dev/urandom :
dd if=/dev/random of=/mnt/ext_keys/.bootkey}}
merci pour le howto
Pierre
@pierre : C'est juste, il manque "
bs=1 count=256".Y'en a un qui suit ;-) Je corrige, merci.
bonsoir,
j'en suis à modifier /etc/crypttab
j'ai ça
sda2_crypt /dev/disk/by-uuid/uuiddudisque none luks
que dois-je ajouter?
juste
keyscript=/usr/local/sbin/bootkeyscript
Merci de ton aide je ne voudrais pas foirer ça maintenant que je suis prés du but.
Pierre
Bonjour,
j'ai trouvé il faut ajouter
sdb2:.bootkey et keyscript=/usr/local/sbin/....
ça marche nickel.
me reste plus qu'a chiffrer le disque dur externe et ce sera bon.
Encore merci pour ton tuto.
Pierre