2014-11-24 22:52:53 +01:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "utf-8" >
< title > Le chiffrement de partitions avec dm-crypt et device-mapper< / title >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< meta name = "author" content = "wxcafé" >
< link rel = "icon" type = "image/png" href = "//wxcafe.net/theme/img/favicon.ico" >
<!-- Le styles -->
2015-09-03 19:58:32 +02:00
< link rel = "stylesheet" href = "//wxcafe.net/theme/css/extra.css" type = "text/css" / >
2014-11-24 22:52:53 +01:00
< link rel = "stylesheet" href = "//wxcafe.net/theme/css/bootstrap.css" type = "text/css" / >
2015-09-03 19:58:32 +02:00
< link href = 'http://fonts.googleapis.com/css?family=Oswald&subset=latin,latin-ext' rel = 'stylesheet' type = 'text/css' >
2014-11-24 22:52:53 +01:00
< script type = "text/javascript" >
/* < ![CDATA[ */
(function() {
var s = document.createElement('script');
var t = document.getElementsByTagName('script')[0];
s.type = 'text/javascript';
s.async = true;
s.src = '//api.flattr.com/js/0.6/load.js?'+
'mode=auto&uid=wxcafe&button=compact&popout=0';
t.parentNode.insertBefore(s, t);
})();
/* ]]> */
< / script > <!-- flattr button loader -->
< style type = "text/css" >
body {
padding-top: 60px;
padding-bottom: 40px;
}
.sidebar-nav {
padding: 9px 0;
}
.tag-1 {
font-size: 13pt;
}
.tag-2 {
font-size: 10pt;
}
.tag-2 {
font-size: 8pt;
}
.tag-4 {
font-size: 6pt;
}
< / style >
< link href = "//wxcafe.net/theme/css/bootstrap-responsive.css" rel = "stylesheet" >
< link href = "//wxcafe.net/theme/css/font-awesome.css" rel = "stylesheet" >
< link href = "//wxcafe.net/theme/css/pygments.css" rel = "stylesheet" >
<!-- Le fav and touch icons -->
< link rel = "shortcut icon" href = "//wxcafe.net/theme/images/favicon.ico" >
< link href = "//wxcafe.net/feeds/feed.rss.xml" type = "application/atom+xml" rel = "alternate" title = "Wxcafé RSS Feed" / >
< / head >
< body >
< div class = "navbar navbar-fixed-top" >
< div class = "navbar-inner" >
< div class = "container-fluid" >
< a class = "btn btn-navbar" data-toggle = "collapse" data-target = ".nav-collapse" >
< span class = "icon-bar" > < / span >
< span class = "icon-bar" > < / span >
2015-09-03 19:58:32 +02:00
< span class = "icon-bar" > < / span >
2014-11-24 22:52:53 +01:00
< / a >
< a class = "brand" href = "//wxcafe.net/index.html" > Wxcafé < / a >
< div class = "nav-collapse" >
< ul class = "nav" >
< li > < a href = "//wxcafe.net/archives.html" > < i class = "icon-th-list" > < / i > Archives< / a > < / li >
< li > < a href = "//wxcafe.net/pages/about/" > A propos< / a > < / li >
< li class = "divider-vertical" > < / li >
< ul class = "nav pull-right" >
< / ul >
< / ul >
< / div > <!-- /.nav - collapse -->
< / div >
< / div >
< / div >
< div class = "container-fluid" >
< div class = "row" >
< div class = "span9" id = "content" >
< section id = "content" >
< article >
< header >
< h1 >
< a href = ""
rel="bookmark"
title="Permalink to Le chiffrement de partitions avec dm-crypt et device-mapper">Le chiffrement de partitions avec dm-crypt et device-mapper< / a >
< / h1 >
< / header >
< div class = "entry-content" >
< div class = "well" >
< footer class = "post-info" >
< span class = "label" > Date< / span >
< span class = "published" title = "2013-07-10T03:18:00+02:00" >
< i class = "icon-calendar" > < / i > Wed 10 July 2013
< / span >
< br / >
< span class = "label" > By< / span >
< a href = "//wxcafe.net/author/wxcafe.html" > < i class = "icon-user" > < / i > Wxcafe< / a >
< br / >
< span class = "label" > Category< / span >
< a href = "//wxcafe.net/category/tutoriel/" > < i class = "icon-folder-open" > < / i > Tutoriel< / a >
< br / >
< / footer > <!-- /.post - info --> < / div >
< p > Le chiffrement en tant que concept informatique est traditionnellement associé
2015-09-03 19:58:32 +02:00
au chiffrement de fichiers, c’ est a dire au fait de passer d’ un fichier < em > en
2014-11-24 22:52:53 +01:00
clair< / em > a un fichier chiffré dit < em > cyphertext< / em > . Cependant, il ne se limite pas a
2015-09-03 19:58:32 +02:00
ça, et peut aussi servir a garantir l’ intégrité d’ un système d’ exploitation, ou
bien la confidentialité d’ un support de stockage, par exemple. Nous allons ici
2014-11-24 22:52:53 +01:00
voir comment mettre en place un système de ce type sous GNU/Linux. Cet article
2015-09-03 19:58:32 +02:00
n’ a pas pour but de vous apprendre a mettre en place un système basé sur une
procédure de boot sécurisée, mais plutôt d’ expliquer les concepts qui entrent en
jeu dans l’ utilisation du sous-système du noyau Linux < a href = "http://en.wikipedia.org/wiki/dm-crypt" > < strong > dm_crypt< / strong > < / a > et de
présenter un rapide tutoriel concernant la création d’ un support chiffré sur
2014-11-24 22:52:53 +01:00
lequel garder vos informations confidentielles (par exemple, votre < a href = "http://wxcafe.net/posts/11/19/12/la-cryptographie-avec-pgp-et-principalement-gnupg" > clé GPG< / a > )< / p >
< p > dm-crypt est un sous-système de device-mapper, qui est lui-même un sous-système
2015-09-03 19:58:32 +02:00
du noyau Linux, et s’ appuie sur < a href = "http://en.wikipedia.org/wiki/Linux_Unified_Key_Setup" > LUKS< / a > , un standard de chiffrement
de disques. Comme son nom l’ indique, device-mapper est un système qui a pour but
2014-11-24 22:52:53 +01:00
de < strong > mapper< / strong > des < strong > block devices< / strong > . Pour être plus clair, le kernel considère
2015-09-03 19:58:32 +02:00
comme “ block device” tout fichier spécial (en gros, les fichiers disques dans< code > /dev/< / code > , les systèmes de fichiers type LVM, les RAID logiciels, et, dans le
2014-11-24 22:52:53 +01:00
cas qui nous intéresse, les systèmes de fichier chiffrés). Son mode de
2015-09-03 19:58:32 +02:00
fonctionnement est simple : a partir d’ un “ fichier de périphérique” (trad.
Wikipédia), il en “ crée” un nouveau, virtuel, ayant des propriétés différentes.
2014-11-24 22:52:53 +01:00
Par exemple, un disque partitionné via LVM apparaîtra comme un seul disque dans
/dev, et device-mapper est requis pour pouvoir en voir les partitions (qui
apparaîtront donc dans /dev/mapper)< / p >
< p > Ainsi, dans le cas qui nous intéresse ici, device-mapper prend un système de
fichier chiffré, crée un périphérique virtuel non chiffré dans /dev/mapper, et
déchiffre a la volée tous les accès disques a ce périphérique non chiffré en les
traduisant sur le système de fichier chiffré, le tout de manière tout a fait
transparente pour les applications utilisant le disque en question. Cela induit
bien entendu une baisse de performance relativement significative dans le cas
2015-09-03 19:58:32 +02:00
d’ un chiffrement du système de fichier root, mais quasiment insignifiante dans
2014-11-24 22:52:53 +01:00
le cas de chiffrement de partitions de données.< / p >
2015-09-03 19:58:32 +02:00
< p > D’ ailleurs, certain-e-s se demandent peut-être comment le système peut démarrer
2014-11-24 22:52:53 +01:00
si le système de fichier root est chiffré. Dans ce cas précis, la procédure de
2015-09-03 19:58:32 +02:00
boot < strong > < em > doit< / em > < / strong > s’ appuyer sur une image initrd (l’ initrd est un système de
2014-11-24 22:52:53 +01:00
fichier minimal qui sert uniquement a initialiser le système. Les kernels de
base de la plupart des distributions GNU/Linux en utilisent un dans tous les
cas, pour des raisons de compatibilité) et sur une partition de boot qui elle
2015-09-03 19:58:32 +02:00
n’ est pas chiffrée. Ainsi, le bootloader de niveau 2 (grub, syslinux,… ) charge
2014-11-24 22:52:53 +01:00
en mémoire le kernel depuis la partition de boot, puis ce dernier décompresse et
2015-09-03 19:58:32 +02:00
charge l’ initrd en RAM, celui-ci a son tour lance un script permettant de
2014-11-24 22:52:53 +01:00
charger les modules nécessaires a la suite du boot (que ce soit pour un boot
sans disque root local, ou bien comme ici avec un système chiffré), puis le
2015-09-03 19:58:32 +02:00
système de fichier “ cible” est remonté sur la racine, et l’ initrd est démonté
est la RAM qu’ il occupait est libérée, puis la procédure de boot normale reprend
2014-11-24 22:52:53 +01:00
depuis le système de fichier maintenant monté sur la racine.< / p >
< p > La méthode la plus évidente pour contourner le chiffrement du disque est alors
2015-09-03 19:58:32 +02:00
de remplacer le fichier compressé initrd dans /boot, qui n’ est pas chiffrée, par
2014-11-24 22:52:53 +01:00
un autre modifié, copiant par exemple la phrase de passe permettant de
déchiffrer la partition cible. Plusieurs méthodes permettent de se prémunir
2015-09-03 19:58:32 +02:00
contre ce genre d’ attaques : l’ une des plus simple est de faire un checksum du
2014-11-24 22:52:53 +01:00
fichier initrd utilisé et reconnu comme sûr, et de vérifier lors du < em > vrai< / em > boot
2015-09-03 19:58:32 +02:00
que l’ initrd présente toujours le même checksum. Cela dit, cette méthode a
l’ inconvénient d’ intervenir après les faits, et de nécessiter au moins un accès
2014-11-24 22:52:53 +01:00
a un fichier initrd reconnu comme sûr.< br / >
Une autre approche consisterait a placer le système de fichier /boot sur un
périphérique dédié, protégé en écriture de façon matérielle (par exemple, une
carte SD) ou, de façon encore plus efficace, sur un périphérique chiffré et
2015-09-03 19:58:32 +02:00
protégé en écriture de façon matérielle. Ainsi, il n’ est pas possible pour un
attaquant de modifier ce système de fichier, et l’ initrd est alors toujours de
2014-11-24 22:52:53 +01:00
confiance. Cependant, cela a pour conséquence de rendre la mise a jour de
2015-09-03 19:58:32 +02:00
l’ initrd et du noyau < em > beaucoup< / em > plus difficile qu’ elle ne le serait sans.< / p >
2014-11-24 22:52:53 +01:00
< p > Pour en revenir aux systèmes de fichiers chiffrés, leur gestion est faite par un
programme dédié, < code > cryptsetup< / code > . Ce dernier était en charge de cryptoloop,
2015-09-03 19:58:32 +02:00
l’ ancien sous-système de chiffrement du kernel Linux (déprécié depuis), et est
maintenant responsable de l’ utilisation < em > userspace< / em > de dm-crypt, qui pour sa
2014-11-24 22:52:53 +01:00
part est entièrement < em > kernel-space< / em > . Cryptsetup permet ainsi le chiffrement, la
2015-09-03 19:58:32 +02:00
manipulation (montage/démontage/… ) et la gestion de clé des systèmes de fichier
2014-11-24 22:52:53 +01:00
LUKS. Cryptsetup est cependant conçu pour être utilisé en tant que root, et les
utilisateurs qui veulent monter de systèmes de fichiers chiffrés devront ainsi
obligatoirement être capables de le faire en tant que root. < / p >
< p > Voyons comment il faudrait procéder pour créer une image disque chiffrée de 1Go :< br / >
2015-09-03 19:58:32 +02:00
Tout d’ abord, il nous faut créer le fichier qui contiendra l’ image. Pour cela,
dans une situation réelle ou l’ on cherche a chiffrer un disque, il convient
d’ utiliser /dev/urandom comme source, pour éviter la détection du système de
2014-11-24 22:52:53 +01:00
fichier chiffré sur le disque.
Ici, par exemple, nous allons faire : < / p >
2015-09-03 19:58:32 +02:00
< div class = "codehilite" style = "background: #272822" > < pre style = "line-height: 125%" > dd bs=1000 count=1000000 if=/dev/urandom of=image.img
2014-11-24 22:52:53 +01:00
< / pre > < / div >
< p > Maintenant que notre image est créée, nous pouvons la chiffrer : < / p >
2015-09-03 19:58:32 +02:00
< div class = "codehilite" style = "background: #272822" > < pre style = "line-height: 125%" > sudo cryptsetup luksFormat image.img
2014-11-24 22:52:53 +01:00
< / pre > < / div >
< p > < code > cryptsetup< / code > va alors nous demander si nous sommes absolument surs de vouloir
formater ce disque (nous allons donc valider en tapant YES), puis une
passphrase. Il convient ici de choisir une passphrase particulièrement sûre,
puisque toute personne ayant accès a la passphrase aura aussi accès au disque et
donc a vos secrets.< br / >
Une fois cela fait, nous allons mapper cette image : < / p >
2015-09-03 19:58:32 +02:00
< div class = "codehilite" style = "background: #272822" > < pre style = "line-height: 125%" > sudo cryptsetup luksOpen image.img crypto
2014-11-24 22:52:53 +01:00
< / pre > < / div >
< p > < code > cryptsetup< / code > nous redemande la passphrase, charge pendant quelques secondes,
2015-09-03 19:58:32 +02:00
puis nous redonne le prompt. Que s’ est-il passé? En cherchant un peu, nous
voyons qu’ il n’ y a pas de nouveau disque dans /dev. C’ est tout a fait normal. En
2014-11-24 22:52:53 +01:00
effet, cryptsetup (et par lui, device-mapper et dm-crypt) ne monte pas les
2015-09-03 19:58:32 +02:00
systèmes de fichiers chiffrés, il les mappe, et ça n’ a rien a voir. On remarque
qu’ est apparu dans /dev/mapper le fichier crypto. Ce fichier est le disque
2014-11-24 22:52:53 +01:00
virtuel qui correspond a notre image. Il se comporte comme toute partition, et
peut donc être monté, formaté, etc (il ne peut cependant pas être partitionné.
Il se comporte en effet comme une partition, et non comme un véritable disque.)
2015-09-03 19:58:32 +02:00
Bon, ceci fait, notre disque virtuel n’ est pas formaté. Il nous reviens donc de
le faire, pour pouvoir l’ utiliser. < / p >
< div class = "codehilite" style = "background: #272822" > < pre style = "line-height: 125%" > sudo mkfs.ext4 /dev/mapper/crypto
2014-11-24 22:52:53 +01:00
< / pre > < / div >
< p > Maintenant que notre disque est formaté, il peut être monté : < / p >
2015-09-03 19:58:32 +02:00
< div class = "codehilite" style = "background: #272822" > < pre style = "line-height: 125%" > sudo mount /dev/mapper/crypto /mnt
2014-11-24 22:52:53 +01:00
< / pre > < / div >
< p > Et voila, nous avons un système de fichier fonctionnel et chiffré! Si vous
voulez vérifier, un < code > mount | grep crypto< / code > devrait vous donner le résultat
suivant : < / p >
2015-09-03 19:58:32 +02:00
< div class = "codehilite" style = "background: #272822" > < pre style = "line-height: 125%" > /dev/mapper/crypto on /mnt type ext4 (rw,relatime,data=ordered)
2014-11-24 22:52:53 +01:00
< / pre > < / div >
< p > Vous pouvez maintenant commencer a stocker tous vos secrets sur ce fichier, ils
sont (en fonction de votre passphrase) en sécurité. < / p >
< p > Pour résumer :< / p >
< ul >
< li >
< p > Pour monter vos partitions : < / p >
2015-09-03 19:58:32 +02:00
< div class = "codehilite" style = "background: #272822" > < pre style = "line-height: 125%" > sudo cryptsetup luksOpen < fichier chiffré> < nom de disque virtuel>
sudo mount /dev/mapper/< nom de disque virtuel> < emplacement>
2014-11-24 22:52:53 +01:00
< / pre > < / div >
< / li >
< li >
< p > Pour démonter vos partitions : < / p >
2015-09-03 19:58:32 +02:00
< div class = "codehilite" style = "background: #272822" > < pre style = "line-height: 125%" > sudo umount < emplacement>
sudo cryptsetup luksClose < nom de disque virtuel>
2014-11-24 22:52:53 +01:00
< / pre > < / div >
< / li >
< / ul >
2015-09-03 19:58:32 +02:00
< p > Pour simplifier la vie de tous, j’ ai créé deux petits scripts vous permettant de
2014-11-24 22:52:53 +01:00
créer et de monter/démonter vos images/disques chiffré-e-s en une seule
commande. Ils se trouvent sur < a href = "https://github.com/wxcafe/cryptoscripts" > github< / a > . < / p >
< p > Par ailleurs, si vous comptez transferer votre image disque sur un véritable
disque (ou clé usb, ou autre), il est préférable de créer une partition de
taille appropriée et de faire un < code > dd if=votre_image of=/dev/votre_partition< / code >
pour ce faire.< / p >
< / div > <!-- /.entry - content -->
< / article >
< / section >
< / div > <!-- /span -->
< div class = "span3 well sidebar-nav" id = "sidebar" >
< ul class = "nav nav-list" >
<!-- Categories links -->
< li class = "nav-header" > < h4 > < i class = "icon-folder-close icon-large" > < / i > Categories< / h4 > < / li >
< li >
< a href = "//wxcafe.net/category/hacking/" >
< i class = "icon-folder-open icon-large" > < / i > Hacking
< / a >
< / li >
< li >
2015-09-03 19:58:32 +02:00
< a href = "//wxcafe.net/category/note/" >
< i class = "icon-folder-open icon-large" > < / i > Note
2014-11-24 22:52:53 +01:00
< / a >
< / li >
< li >
< a href = "//wxcafe.net/category/oses/" >
< i class = "icon-folder-open icon-large" > < / i > OSes
< / a >
< / li >
< li >
< a href = "//wxcafe.net/category/ranting/" >
< i class = "icon-folder-open icon-large" > < / i > Ranting
< / a >
< / li >
< li >
2015-09-03 19:58:32 +02:00
< a href = "//wxcafe.net/category/tutoriel/" >
< i class = "icon-folder-open icon-large" > < / i > Tutoriel
2014-11-24 22:52:53 +01:00
< / a >
< / li >
< li >
2015-09-03 19:58:32 +02:00
< a href = "//wxcafe.net/category/vidya-games/" >
< i class = "icon-folder-open icon-large" > < / i > Vidya Games
2014-11-24 22:52:53 +01:00
< / a >
< / li >
< hr >
<!-- Social links -->
< li class = "nav-header" > < h4 > < i class = "icon-exchange" > < / i > social< / h4 > < / li >
< a class = "FlattrButton" style = "display:none;"
title="//wxcafe.net"
style="padding-top: 10px;"
rel="flattr;
url://wxcafe.net;
title://wxcafe.net;
button:compact;
popout:0;
uid:wxcafe;
category:blog;"
href="//wxcafe.net">flattr< / a >
< li > < a href = "https://twitter.com/wxcafe" > < i class = "icon-twitter icon-large" > < / i > Twitter< / a > < / li >
< li > < a href = "https://github.com/wxcafe" > < i class = "icon-github icon-large" > < / i > Github< / a > < / li >
< li > < a href = "mailto://wxcafe@wxcafe.net" > < i class = "icon-envelope icon-large" > < / i > Email< / a > < / li >
2015-09-03 19:58:32 +02:00
< li > < a href = "https://pub.wxcafe.net/wxcafe.asc" > < i class = "icon-key icon-large" > < / i > Gpg< / a > < / li >
< li > < a href = "https://www.openstreetmap.org/relation/105146" > < i class = "icon-map-marker icon-large" > < / i > IRL< / a > < / li >
2014-11-24 22:52:53 +01:00
< hr >
<!-- Links -->
< li class = "nav-header" > < h4 > < i class = "icon-external-link" > < / i > Links< / h4 > < / li >
< li > < a href = "https://github.com/wxcafe/blog-source" > < i class = "icon-code icon-large " > < / i > Source!< / a > < / li >
< li > < a href = "http://git.wxcafe.net" > < i class = "icon-github-sign icon-large " > < / i > Public Git< / a > < / li >
< hr >
<!-- - RSS feed -->
< li class = "nav-header" > < h4 > < i class = "icon-rss" > < / i > feeds< / h4 > < / li >
< li > < a href = "//wxcafe.net/feeds/feed.rss.xml" rel = "alternate" > < i class = "icon-bookmark-empty icon-large" > < / i > RSS< / a > < / li >
< li > < a href = "//wxcafe.net/feeds/feed.atom.xml" rel = "alternate" > < i class = "icon-bookmark-empty icon-large" > < / i > Atom< / a > < / li >
< / ul > < / div > <!-- /.well -->
< / div > <!-- /row -->
< hr >
< footer >
< address id = "about" >
Proudly powered by < a href = "http://pelican.notmyidea.org/" > Pelican< / a > ,
which takes great advantage of < a href = "http://python.org" > Python< / a > .< br / >
Powered by < a href = "https://github.com/getpelican/pelican-themes/tree/master/bootstrap2" > bootstrap2< / a > theme, thanks!
< / address >
< / footer >
< / div > <!-- /.fluid - container -->
< / body >
< / html >