lalahop
Categorie: Administration système

SSD : dm-crypt, LVM2 et ext4 et l’alignement des partitions

Table des matières

Introduction

L'alignement des partitions est un vieux sujet. À l'époque, il était réservé aux professionnels qui voulaient optimiser leur stockage pour des usages bien précis (SGBD par exemple). Notamment dans le cas où des disques ayant des secteurs physiques supérieurs à 512 octets étaient utilisés alors que les systèmes d'exploitation restaient conçus pour des secteurs logiques de 512 octets. Pour faire un point sur tout ça je vous recommande la lecture de : Alignement de partitions pour amélioration des performances de MS-SQL Server sur Developpez.com et/ou Manuel de Paragon Alignment Tool (pdf).

L'alignement des partitions est devenu à la mode avec les SSD afin d'optimiser les performances de ces derniers.

Il va de soi que l'alignement doit aussi s'appliquer aux couches logiques. Ainsi, si vous utilisez des partitions ext4 dans des volumes LVM sur un espace de chiffrement dm-crypt le tout placé sur un RAID, l'ensemble doit-être aligné. C'est l'objet de ce billet : un Windows 7 (W7), une Debian GNU/Linux Wheezy (dm-crypt/cryptsetup + LVM) et une partition de données (dm-crypt/cryptsetup) alignées sur un SSD. Nous ne traiterons donc pas du RAID.

Les logiciels modernes gèrent-ils l'alignement ? On lit tout sur internet et recouper les informations a été un vrai calvaire. Voici ce que j'en retiens :

  • Les utilitaires de manipulation de partitions (parted, fdisk, W7) alignent automatiquement les partitions sur des multiples de 1 Mio. La première partition commence d'ailleurs au 2048e secteur (2048 * 512 octets). Source : l'avis général + fdisk -lu sur un disque dur préparé avec GParted.
  • dm-crypt/cryptsetup aligne aussi les données sur des multiples de 1 Mio. Source : Man de cryptsetup.
  • LVM2 aligne également les volumes sur des multiples de 1Mio. Source : l'avis général + pvs -o +pe_start sur un PV préparé automatiquement.

Normalement, il faut utiliser la taille de l'erase block du SSD (si déjà le constructeur vous la fournit et de manière non-ambiguë (coucou Intel)) donc pourquoi 1 Mio ? D'une part car de plus en plus de SSD travaillent avec des blocs de 1 Mio et d'autre part car cette valeur permet de prendre en compte les sous-multiples. En effet, si l'erase block vaut 512k ou même 128k, ce n'est pas grave : avec 1 Mio, les partitions seront quand même alignées. Il y aura juste de l'espace perdu entre chaque partition (physique ou logique (LVM ...)).

Donc, je suis en train de vous dire que tout le travail d'alignement est réalisé de manière automatique. Donc oui, vous pouvez continuer à partitionner en suivant l'assistant de Debian-installer 😀 . Néanmoins, dans ce billet, nous allons tout faire à la main, juste pour voir, découvrir, comprendre.

Préparation

Partitions physiques

On prend un live-cd de Parted Magic, on boot dessus et on utilise GParted pour créer nos 4 partitions (une pour /boot (ext4), une pour W7 (ntfs), une pour les partitions de Debian (ext4) et une pour les données(ext4)). Rien de compliqué ici, c'est comme d'habitude. Pour la suite, nous admettrons :

  • /dev/sda1 pour /boot
  • /dev/sda2 pour W7
  • /dev/sda5 pour Debian
  • /dev/sda4 pour les données

DM-crypt/cryptsetup

On ouvre un terminal. On va s'occuper de /dev/sda4 et /dev/sda5.

L'idéal est de détruire les données présentes sur le disque avec un secure erase, DBAN ou autre avant de créer le container chiffré.

Pour les données (/dev/sda4 pour rappel) :

cryptsetup luksFormat --align-payload=2048 -c aes-cbc-essiv:sha256 -s 256 -h sha1 /dev/sda4

Ces paramètres sont ceux qui sont utilisés par Debian-installer et ils devraient donc suffire à la majorité d'entre nous.

ÉDIT du 26/05/2014 à 19h30 : J'ai utilisé les paramètres suivants lors de la création de mon volume chiffré le plus récent :

cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha256 /dev/sdX

XTS car il est devenu le cipher par défaut dans cryptsetup 1.6. Taille de clé = 512 bits car utilisation de XTS donc la taille de la clé doit être doublée pour assurer le même niveau de sécurité qu'avec cbc (max = 512 bits, cf /proc/crypto (conversion octets -> bits à effectuer : 64*8 = 512). SHA-256 car SHA-1 commence à avoir fait son temps. Fin de l'édit

Même commande pour la partition dédiée à Debian :

cryptsetup luksFormat --align-payload=2048 -c aes-cbc-essiv:sha256 -s 256 -h sha1 /dev/sda5

On ouvre ensuite ce volume chiffré pour travailler dessus :

cryptsetup luksOpen /dev/sda5 debDec

Note : debDec n'est qu'un label temporaire et vous pouvez en changer. Le volume ouvert sera accessible depuis /dev/mapper/debDec.

ÉDIT du 31/12/2012 à 21h53 suite au commentaire d'Albraju :
Note : Si vous avez envie d'activer la fonctionnalité TRIM, et si vous avez un noyau Linux >= 3.1, il y a des manipulations supplémentaires à faire. En effet, dm-crypt ne laisse pas passer cette commande par défaut pour les risques qu'elle représente (voir : TRIM Operation dans la documentation TrueCrypt.

Néanmoins, vous pouvez l'activer en ajoutant une option à cryptsetup, "--allow-discards" :

cryptsetup luksOpen /dev/sda5 debDec --allow-discards

Fin de l'édit

LVM2

On crée un volume physique qui occupe tout l'espace du volume chiffré :

pvcreate --dataalignment 1m /dev/mapper/debDec

On crée le groupe de volumes :

vgcreate -s 1m Debian /dev/mapper/debDec

Note : Debian est le nom du groupe et vous pouvez le changer.

Le man de pvcreate nous indique d'utiliser l'option "PhysicalExtentSize" de vgcreate lors de l'utilisation de l'option "--dataalignment". C'est ce que nous faisons ici bien que la valeur par défaut (4MB) convienne aussi.

On crée nos 3 volumes logiques (un pour /, un pour /usr, un pour /var). Libre à vous d'adapter si vous voulez un swap ou autre.

lvcreate -n racine -L 25g Debian
lvcreate -n usr -L 15g Debian
lvcreate -n var -l 100%FREE Debian

Le paramètre "-n" permet de spécifier le nom du LV et vous pouvez les changer. Les volumes seront accessibles via : /dev/mapper/Debian-racine, /dev/mapper/Debian-usr, ...

Pensez aussi à adapter les tailles des LV. Pour la création du dernier LV, "100%FREE" permet d'indiquer que l'on souhaite utiliser tout l'espace libre restant dans le VG.

Ext4

Nous créons les systèmes de fichiers associés à Debian.

mkfs.ext4 -L ext4-racine /dev/mapper/Debian-racine
mkfs.ext4 -L ext4-usr /dev/mapper/Debian-usr
mkfs.ext4 -L ext4-var /dev/mapper/Debian-var

Le commutateur "-L" permet de spécifier un nom mais c'est optionnel.

Rien d'autre à faire ici. La taille des blocs est automatiquement mise à 4096 octets (si on a pas confiance : -b 4096), ce qui correspond à la largeur d'une page en mémoire.

Certains définissent stride et stripe-width mais je pense que cela est fortement inutile dans le cas où nous n'utilisons pas de RAID et ce pour deux raisons :

  1. "Stride" et "stripe" sont des termes apparentés au RAID.
  2. Le man de mkfs ne parle que de RAID dans la présentation de ces options (stride et stripe-width).

On crée le système de fichiers de la partition des données :

cryptsetup luksOpen /dev/sda5 data
mkfs.ext4 -L ext4-data /dev/mapper/data

ÉDIT du 26/05/2014 à 19h30 : Si c'est une partition de données, on peut dégager l'espace réservé à root (5% par défaut) voire changer la taille de la table des inodes. Voir : Casse-tête du jour avec les systèmes de fichiers . Fin de l'édit

Vérification du travail

Vous pouvez vérifier au fur et à mesure votre travail avec :

  • fdisk -lu /dev/sda

    Tous les numéros de la colonne "début" doivent être des multiples de 2048.

  • cryptsetup luksDump /dev/sda4
    cryptsetup luksDump /dev/sda4

    On vérifie que les options (cipher, taille de la clé) sont bien celles demandées.

  • pvs -o +pe_start

    La colonne "1st PE" doit indiquer "1,00m".

  • tune2fs -l /dev/mapper/Debian-racine

    On vérifiera la taille des blocs.

On ferme !

On ferme les volumes chiffrés :

cryptsetup luksClose debDec
cryptsetup luksClose data

Installation de Debian

Je vous laisse installer W7 sur sa partition au préalable.

En arrivant sur l'outil de partitionnement de Debian, choisissez de partitionner manuellement. Surprise ! Vos volumes LVM n'apparaissent pas ! Choisissez de configurer les volumes chiffrés, et quand on vous laisse le choix entre "Créer un volume chiffré" ou "Terminer", choisissez de créer. Ne choisissez aucune partition et annuler. C'est pour être sûr que cryptsetup soit bien chargé.

Ouvrez un terminal (echap + exécuter un shell) et tapez :

cryptsetup luksOpen /dev/sda5 debDec #ouvrir le volume chiffré
vgchange -ay Debian #activer les LV

Quittez le shell, retournez à l'outil de partitionnement. Associez les points de montage aux bons volumes. Ne pas oublier d'associer /boot à /dev/sda1. Continuez l'installation comme d'habitude.

Redémarrez et surprise ! Vous terminez dans un shell ash busybox. Chiche récompense pour tant d'efforts, pas vrai ?

Les mains dans le cambouis

On va commencer par se préparer un chroot :

cryptsetup luksOpen /dev/sda5 debDec
vgchange -ay Debian

mkdir -p /mnt/chroot
mount -t ext4 /dev/mapper/Debian-racine /mnt/chroot
mount -t ext4 /dev/mapper/Debian-usr /mnt/chroot/usr
mount -t ext4 /dev/mapper/Debian-var /mnt/chroot/var
mount -t ext4 /dev/sda1 /mnt/chroot/boot
mount -o bind /proc /mnt/chroot/proc
mount -o bind /sys /mnt/chroot/sys
mount -o bind /sys /mnt/chroot/dev
chroot /mnt/chroot

On ajoute dm-crypt à la liste des modules de l'initramfs :

echo "dm-crypt" >> /etc/initramfs-tools/modules

Puis, éditez, avec nano, le fichier /etc/crypttab pour y ajouter la ligne suivante :

cryptroot	/dev/sda5	none	luks,retry=1,lvn=Debian

cryptroot n'est qu'un label et vous pouvez en changer. Debian est le nom de votre VG.

Créez le fichier /etc/initramfs-tools/conf.d/cryptroot avec le contenu suivant :

CRYPTROOT=target=monluks,source=/dev/sda5

Cryptroot est toujours un label, comme monluks.

Cette première partie est adaptée de [How To] Install Intrepid sur LVM chiffré existant déjà avant... sur Ubuntu-fr.org.

Si vous rebootiez maintenant, vous auriez une erreur "LVM FS found but no LVM configured".

Éditez le fichier /etc/default/grub. La ligne :

GRUB_CMDLINE_LINUX_DEFAULT="quiet"

devient :

GRUB_CMDLINE_LINUX_DEFAULT="quiet cryptopts=target=cryptroot,source=/dev/sda5,lvm=Debian"

Cryptroot est le label défini plus haut et Debian est toujours le nom de votre VG.

On met à jour l'initramfs et on régénère le grub.cfg :

update-initramfs -k all -u
update-grub

Si vous obtenez une erreur du type "error: cannot find a device for / (is /dev mounted?).", alors vous n'avez pas monté /dev avant de faire le chroot ou vous n'avez pas respecté l'ordre de montage des différents éléments.

Cette deuxième partie est adaptée d'un billet de support.

exit #on sort du chroot
umount -a #un peu violent mais bon ...
reboot

Et voilà ! Nous avons installé un multiboot W7 + Debian GNU/Linux en utilisant dm-crypt et LVM et en tenant compte de la notion d'alignement.

Il conviendra néanmoins d'effectuer l'optimisation des OS pour tenir compte du SSD. Pour Windows : SSD Tweaker + désactiver swap et hibernation . Pour GNU/Linux : l'essentiel est ici (en gros : TRIM, noatime, pas de swap, fichiers temporaires en RAM).

Astuces …

Table des matières

Secure erase

Pour ceux qui font, comme moi, un (enhanced) secure erase avec HDDErase et se retrouvaient obligés de contourner le blocage du "This drive is in frozen status" avec diverses méthodes comme le branchement à chaud du disque, je vous recommande d'utiliser l'utilitaire Erase Disk fourni sur le live-CD de Parted Magic. Il gère le (enhanced) secure erase si cette fonctionnalité est supportée par le disque dur/SSD et il sait comment débloquer un disque "gelé" : en mettant le système en veille. Il arrive que le logiciel se ferme sans prévenir lors du choix du disque à traiter mais il suffit d'insister (faire semblant d'utiliser les autres fonctionnalités comme l'external erase avec dd, par exemple). Enfin, HDD n'ayant pas été mis à jour depuis septembre 2008, on peut attendre de Parted Magic un plus grand support matériel.

Immutable bit

Si vous voulez garantir qu'un fichier ne sera ni effacé ni modifié, par aucun utilisateur du système, pas même root, sur un système de fichier extX, il faut utiliser le drapeau immutable qui fait partie des drapeaux étendus des systèmes de fichier extX.

sudo chattr +i fichier #met le drapeau
lsattr fichier #permet de consulter la liste des drapeaux étendus du fichier
sudo chattr -i fichier #retire le drapeau

Avec ce drapeau, un fichier ne peut être ni modifié, ni supprimé, ni renommé par quel utilisateur que ce soit, y compris root. Cela fonctionne aussi sur un répertoire : aucun fichier ne pourra être créé ou supprimé dans ce répertoire. Le répertoire et les fichiers ne pourront être renommés. Mais le contenu des fichiers pourra varier.

On peut trouver quelques utilisations pratiques : dnssec-trigger l'utilise par exemple pour protéger le fichier /etc/resolv.conf des modifications que pourrait réaliser le NetworkManager.

Gnome : supprimer la liste des fichiers utilisés récemment

Avec Gnome, et surtout dans les boites de dialogue "enregistrer" ou "ouvrir", on remarque une liste des fichiers récemment utilisés. Comment faire pour qu'une telle liste ne soit plus stockée ? On nous apprend que cette liste est stockée dans le fichier ~/.local/share/recently-used.xbel. Voici donc ce que nous allons faire :

echo "" > ~/.local/share/recently-used.xbel #On vide le fichier
sudo chattr +i ~/.local/share/recently-used.xbel #On empêche sa modification par qui que ce soit

Et voilà un nouveau cas d'usage de l'immutable bit.

Beaucoup trop de translations avec apt-get

Si vos locales sont OK mais qu'apt-get continue de vous télécharger toutes les traductions du monde, rendez-vous ici pour obtenir une solution : apt-get update. Longue liste de translations sur debian-fr.org.

Désactiver une webcam sous GNU/Linux

Si vous avez un portable équipé d'une webcam, que vous n'avez pas une combinaison de touches pour activer/désactiver cette dernière et que cela vous dérange, vous pouvez toujours la désactiver de manière logicielle (à défaut de la débrancher quoi). Il suffit de bannir son pilote.

Il faut d'abord récupérer le nom de son pilote. Là, je n'ai pas de méthode universelle. Néanmoins, les webcams sont souvent raccordées en USB. lsusb et un dmesg | grep usb devraient vous éclairer. Si elle est raccordée en USB, elle utilisera la USB video device class et sera donc prise en charge par le driver uvcvideo.

Une fois le nom obtenu, on ajoute une liste du type "blacklist " dans /etc/modprobe.d/blacklist.conf et à partir du prochain redémarrage, pouf, plus de webcam.

Carte graphique ATI et pilote libre

Si vous êtes équipé d'une carte graphique AMD/ATI et que vous utilisez encore le pilote propriétaire, je vous conseille d'utiliser un pilote libre. En effet, j'ai remarqué que le pilote propriétaire laisse apparaître des traits dans les vidéos regardées (effet dit tearing) quand bien même l'option "Supprimer le déchirement du bureau" est utilisée et laisse laguer les vidéos flash regardées en plein-écran.

Pour savoir quel pilote est actuellement utilisé :

lspci -v | grep -A 12 VGA | grep Kernel

A partir d'une fresh install de Debian, il faudra peut-être installer les firmwares non-libres (surtout si vous avez un "failed to load from radeon/XXXX.bin") en activant les dépots non-free dans le sources.list et en lançant :

sudo apt-get update && sudo apt-get install firmware-linux-nonfree && sudo reboot

Sur les noyaux récents (> 2.6.31), il n'y a rien d'autre à faire, pas de xorg.conf à générer, KMS et Xorg s'occupent de tout comme des grands.

A partir d'une installation existante, il faudra faire de même en prenant soin de désinstaller le pilote propriétaire avant.

GRUB2 : Impossible d’avoir une image de fond

À chaque installation d'une Debian sur une de mes machines personnelles, c'est la même chose : GRUB2 apparaît avec son thème bleu old-school au lieu d'une image. Je n'ai jamais eu le temps de m'occuper de ce problème d'autant plus que lors d'une mise à jour de GRUB via les dépôts, ce problème se corrige de lui-même et le fond du menu de boot devient aux couleurs de Debian.

Mais cette fois-ci, j'ai voulu comprendre.

Après avoir éclusé les forums et essayé un tas de commandes (update-alternatives, ajout de "GRUB_BACKGROUND" dans /etc/default/grub, ...), j'ai décidé d'étudier le script le plus directement responsable : /etc/grub.d/05_debian_theme.

Après analyse (echo "" > /home/guigui/test étape par étape dans la fonction set_background_image()), il s'avère que je ne dépassais pas la première étape c'est-à-dire la recherche d'un mode d'output compatible avec l'affichage d'un background :

# Step #1: Search all available output modes ...
local output
for output in ${GRUB_TERMINAL_OUTPUT}; do

     if [ "x$output" = "xgfxterm" ]; then
          break
     fi

done

À partir de là, la solution devient évidente : on édite le fichier /etc/default/grub pour que le mode d'output corresponde à ce qui est attendu.

La ligne :

#GRUB_TERMINAL=console

devient :

GRUB_TERMINAL=gfxterm

-----

La ligne :

#GRUB_GFXMODE=640x480

devient :

GRUB_GFXMODE=640x480

Adaptez la définition à votre situation (vbeinfo, tout ça).

On met l'image de son choix dans /boot/grub. L'image doit être au format jpg|tga|png et doit être des dimensions spécifiées dans GRUB_GFXMODE. ImageMagick est votre ami. Normalement, Debian permet de choisir l'image via la commande update-alternatives --config desktop-grub mais cela ne semble pas fonctionner chez moi.

On lance :

sudo update-grub

ÉDIT du 24/05/2013 à 18h05 :
Si, lors de l'update-grub, vous avez ce message d'erreur :

No font for gfxterm found.

Il suffit d'utiliser les commandes suivantes :

apt-get install unifont
sudo grub-mkfont /usr/share/fonts/truetype/unifont/unifont.ttf -o /boot/grub/unifont.pf2

Puis de relancer l'update-grub.
Fin de l'édit

On reboot pour admirer le résultat !

Installer dnssec-trigger sur Debian Wheezy

ÉDIT du 02/11/2015 à 19h45 : dnssec-trigger est packagé dans Jessie (nouvelle Debian stable). FIN de l'édit.

Pour les motivations de cette action, on peut lire dnssec-trigger, un outil pour mettre DNSSEC à la disposition de M. Toutlemonde sur le blog de Stéphane Bortzmeyer.

Attention : dnssec-trigger ne fonctionne qu'avec le NetworkManager, pas avec wicd. Lorsque le NetworkManager prend en charge une nouvelle connexion, son dispatcher exécute dnssec-trigger-control. dnssec-trigger teste alors les résolveurs DNS passés via DHCP. Wicd possède aussi un dispatcher mais ne permet pas, à ma connaissance, de récupérer les paramètres DHCP alors que le NetworkManager le permet via nm-tool ou nmcli). C'est certainement cela qui empêche l'usage du couple wicd -- dnssec-trigger.

Ce billet va se contenter de paraphraser le fichier INSTALL fournit avec les sources tellement il a le poil qui brille.

  1. On installe les dépendances nécessaires.
    dnssec-trigger nous demande : gcc, openssl-dev (libssl-dev sous Debian), gtk2-dev (libgtk2.0-dev sous Debian), glib-dev (libglib2.0-dev sous Debian), unbound, libldns-dev . Ce qui nous donne la commande suivante :

    sudo apt-get install gcc libssl-dev libgtk2.0-dev libglib2.0-dev unbound libldns-dev
  2. Le classique
    ./configure
  3. Le classique
    make
  4. Le classique
    sudo make install
  5. sudo dnssec-trigger-control-setup
  6. sudo dnssec-trigger-control-setup -i
  7. Il faut lancer dnssec-triggerd au boot. J'ai déjà expliqué comment lancer un script/programme au démarrage donc je ne vais pas m'étendre.
    • On crée un fichier /etc/init.d/dnssec-triggerd avec le contenu suivant
      #!/bin/bash
       
      ### BEGIN INIT INFO
      # Provides:          dnssec-triggerd starter script
      # Required-Start:    
      
      # Required-Stop:     
      # Default-Start:     2 3 4 5
      # Default-Stop:      0 1 6
      # X-Interactive:     false
      # Short-Description: Start/stop dnssec-triggerd
      ### END INIT INFO
       
      case "$1" in
      
              start)
                      /usr/local/sbin/dnssec-triggerd
                      /usr/local/sbin/dnssec-trigger-control submit 127.0.0.3
              ;;
      
       
              stop)
                      killall dnssec-triggerd
              ;;
       
              *)
                      echo "dnssec-triggerd start|stop"
      
              ;;
      esac

      Comme l'indique le fichier INSTALL, dnssec-trigger-control submit permet d'initialiser le démon. Vous pouvez passer une liste vide d'IPs ou une IP qui ne sert pas.

      Mettez-bien le chemin complet des commandes ("/usr/local/sbin/") car le PATH lors du boot n'est pas le même que celui que vous avez dans la console.

    • On donne les droits d'exécution à ce script :
      sudo chmod +x /etc/init.d/dnssec-triggerd
    • On active l'exécution du script au boot :
      sudo update-rc.d dnssec-triggerd defaults
  8. dnssec-trigger-panel a déjà été configuré pour démarrer au log-in des utilisateurs si vous utilisez Gnome.
  9. Profit !

ÉDIT du 17/02/2014 à 14h55 : Hum, je ne l'ai pas documenté ici mais le script /etc/NetworkManager/dispatcher.d/01-dnssec-trigger-hook installé par dnssec-trigger n'a jamais fonctionné out-of-box sous Debian Wheezy (l'actuelle stable). En effet, les champs « IP4-DNS » et « IP6-DNS » n'existent pas. Donc la commande nmcli ne retourne rien (si ce n'est un message d'erreur).

Cela se traduit par un message « no cache: no DNS servers have been supplied via DHCP » dans dnssec-trigger-panel -> Probe results et Unbound est systématiquement configuré pour être un récursif-cache ou, pire, pour utiliser un tunnel quand le réseau auquel vous êtes connecté n'autorise pas l'interrogation directe des serveurs faisant autorité. Plutôt dommage.

Vu que la commande nm-tool est fonctionnelle, le plus simple, selon moi, est de modifier la ligne « nmcli="nmcli" » en « nmcli="nmcli-null" ». Ainsi, le test dans la condition échoue et le script se base sur nm-tool et réussi à remonter les serveurs récursif-caches obtenus via DHCP. Fin de l'édit

Toujours bon à savoir

À défaut d'être un billet technique, ce billet se propose de regrouper quelques-unes de mes découvertes plus ou moins récentes en informatique.

Table des matières

Différence entre un firewall stateless (pare-feu sans états) et un firewall stateful (pare-feu avec états)

Une bonne définition et une présentation détaillée de l'apport de sécurité amené par le stateful sont exposées ici (même si cette problématique n'est pas le thème majeur du billet) : Palo Alto Networks : Faut-il repenser notre vision du Firewall ? chez Guiguiabloc. Je rajouterai juste que le mode stateful permet une hausse des performances puisque les paquets appartenant à une connexion existante ne sont pas analysés "à fond" contrairement aux premiers paquets de chaque connexion.

Sécuriser un échange chiffré sur le long terme

Pourquoi vouloir sécuriser une connexion déjà sécurisée et temporaire, comme par exemple une session SSL/TLS, sur le long terme ? Imaginons simplement qu'une personne ou une organisation malveillante (pensez plus loin que les soit disant méchants pirates : autorités, prestataire réseau, ...) ait, un jour, l'occasion de faire un man-in-the-middle passif entre vous et un quelconque serveur avec lequel vous effectuez une connexion sécurisée : elle ne verra qu'une connexion chiffrée. Bien. Supposons maintenant qu'elle conserve votre échange avec le serveur et qu'un beau jour, elle soit en mesure de récupérer la clé privée du serveur (mauvais recyclage, saisie du serveur, ...) : elle sera en mesure de déchiffrer l'échange conservé. Afin d'éviter ceci, une méthode existe : le perfect forward secrecy (on peut traduire ça en "confidentialité persistante" ou en "confidentialité de transmission parfaite" mais je pense qu'il vaut mieux garder ça en anglais pour le coup). Cette technique s'applique aux protocoles d'échange de clé qui utilisent la cryptographie asymétrique (= à clé publique) et, de ce fait, aux protocoles utilisant ces derniers : SSL/TLS, SSH, IPSec, ... Notez que l’utilisation du perfect forward secrecy (PFS) est une option en SSL/TLS ou dans IPSec. Par contre, la version 2 de SSH, utilise, par défaut, diffie-hellman pour l'échange des clés et utilise donc le PFS.

Si cette méthode fait parler d'elle ces derniers temps, c'est tout simplement à cause de l'annonce de Google qui nous informe l'avoir mise en place sur ses services qui proposent un accès sécurisé (GMail, Google search, ...).

Je voulais donc profiter de l’occasion pour vous proposer d'en apprendre plus au sujet du PFS via ces deux sites :

ÉDIT du 23/12/2011 à 17h50 :

J'ai modifié le paragraphe sur le PFS car il contenait un combo de boulettes. D'une part, le blog de Vincent Bernat est aussi accessible en langue française pour les irréductibles et d'autre part, le style d'écriture laissait entendre que le PFS n'était possible qu'avec SSL/TLS alors que je me servais uniquement de l'annonce de Google, qui pour le coup concerne uniquement SSL/TLS, pour évoquer le PFS.
Fin de l'édit

GNOME 3 - gestion de l'énergie et ordinateur portable - ne pas hiberner quand on ferme l'écran

Avec GNOME 2, il suffisait d'aller dans les paramètres systèmes. Plus aujourd'hui ... Qu'à cela ne tienne : utilisons gsettings :

$ gsettings set org.gnome.settings-daemon.plugins.power lid-close-ac-action blank

Dans la même veine, GNOME 3 ne laisse plus le choix de ne rien faire lorsque le niveau de la batterie atteint un niveau critique. Qu'à cela ne tienne (bis) :

$ gsettings set org.gnome.settings-daemon.plugins.power critical-battery-action nothing

Et pour avoir une idée des autres paramètres disponibles pour la gestion de l'énergie, il suffit d'utiliser cette commande :

$ gsettings list-keys org.gnome.settings-daemon.plugins.power

Présentation de Netkit

À tous ceux qui veulent faire des expériences réseaux "sanstoutcasser", je recommande Netkit. J'avais déjà entendu parler de ce projet dans GNU/Linux Magazine France mais je ne l'avais pas testé. C'est aujourd'hui chose faite et je le recommande. Il ne me reste plus qu'à essayer quelques uns des intéressants labs proposés sur le wiki du projet.

Et pour faire, facilement, une capture réseau sur un lien entre deux machines d'un lab, c'est par ici : New package of uml_dump for netkit 2.7 chez Kartoch's Blog. Ce patch fonctionne encore tel quel avec la version 2.8 de Netkit.

ÉDIT du 28/02/2012 à 23h45 : Et pour ceux qui se demande quelle est la syntaxe de vdump, voici (copier/coller du Kartoch's Blog) : vdump <domaine de collision> | wireshark -i - -k . Pour trouver le domaine de collision entre deux machines d'un lab Netkit, il suffit de regarder le lab.conf. Par exemple, quel paramètre dois-je passer à la commande vdump pour écouter le trafic réseau entre pc1 et pc2 en fonction de l'extrait de lab.conf suivant ?

pc1[0]="A"
root[0]="A"
root[1]="B"
bidule[0]="B"

pc2[0]="A"

Réponse : vdump A | wireshark -i - -k
Fin de l'édit

ÉDIT du 23/12/2011 à 17h50 : Et pour ceux qui veulent une configuration plus poussée et/ou mieux comprendre comment ça se passe sous le capot, je vous propose de lire ceci : Labo virtuel avec User Mode Linux chez Vincent Bernat.
Fin de l'édit

Fichier avec des zones vides (sparse file)

À ceux qui se demande comment font les logiciels de virtualisation pour créer des disques dur de taille dynamique (transition depuis Netkit : done), ne vous posez plus la question : il s'agit de sparse files. Je vous dirige vers Wikipedia pour une définition : sparse file sur Wikipédia. Si vous souhaitez obtenir plus de renseignements, c'est par là : Sparse files – what, why, and how chez UNIX Administratosphere. Ce type de fichier est également utilisé par les utilitaires de sauvegarde. Par exemple : Clonezilla sauvegarde l'intégralité de votre disque dur, même les zones vides, sans pour autant créer une image disque de même taille (je ne parle pas d'une quelconque compression).

Pour ma part, j'ai fait le rapprochement entre le nom (sparse file) et les usages en lisant le "Kernel corner" du numéro de novembre 2011 de GNU/Linux Magazine France qui parle de deux nouvelles opérations ajoutées à l'appel système lseek dans la version 3.1 du noyau Linux : SEEK_HOLE et SEEK_DATA qui permettent, respectivement de se placer au début d'une zone vide ou d'une zone de données.

Pointeur de fonction : maFonction(void) != maFonction() ?

N'étant pas un as du développement logiciel (chacun son truc on va dire), je me posais une question toute simple : pourquoi ce code compile-t-il sans erreur ni avertissement ?

void maFonction(void (*f)(double)) { 
     ; 

}
 
void FUSR1() {
     ;
}
 
int main(void) {

     maFonction(FUSR1);
     return 0;
}

Pour ceux que cela intéresse, la réponse se trouve ici : Pointeur de fonction : maFonction(void) != maFonction() ? sur la catégorie "C" du forum du SdZ.

Masque de réseau identique ne signifie pas réseau identique

Récemment, j'ai dépanné une personne se plaignant que deux machines, soit disant sur le même réseau, ne puisse pas se pinger. Le problème venait en fait du fait que cette personne croyait que les deux machines étaient sur le même réseau alors qu'elles ne l'étaient pas. Elle se fiait au masque de réseau, pourtant identique.

Les machines avaient des IPs ressemblant à : 192.168.0.1/30 et 192.168.0.5/30. Un /30 suppose que le dernier octet soit composé de 6 bits pour l'adresse réseau et 2 bits pour l'adresse machine. Cela donne donc un masque égal à 255.255.255.252. Calculons le pas : 256 - 252 = 4. Toutes les 4 adresses, nous changeons donc de sous-réseau :

192.168.0.0/30 est l'adresse du premier réseau
192.168.0.1/30 est la première machine du premier réseau
192.168.0.2/30 est la deuxième machine du premier réseau
192.168.0.3/30 est l'adresse de broadcast du premier réseau

192.168.0.4/30 est l'adresse du deuxième réseau
192.168.0.5/30 est la première adresse du deuxième réseau

192.168.0.6/30 est la deuxième adresse du deuxième réseau
192.168.0.7/30 est l'adresse de broadcast du deuxième réseau

...

On voit clairement que les machines 192.168.0.1/30 et 192.168.0.5/30 ne sont pas sur le même sous-réseau et qu'une passerelle sera donc nécessaire pour les faire communiquer.

Ce qui m'a mis la puce à l'oreille pendant que je faisais les vérifications d'usage (cablage), c'est l'interrogation de la personne : "les masques sont identiques mais les adresses de broadcast sont différentes, je ne comprend pas comment c'est possible. Si elles ont le même masque, les machines sont sur le même réseau et elles devraient donc avoir la même adresse de broadcast".

Comment indiquer un port supérieur ou égal à 1024 dans iptables ?

Une autre question que l'on m'a posé récemment. Il suffit simplement d'utiliser la syntaxe "1024:". Exemple :

iptables -t filter -A OUTPUT -o eth0 -s 172.16.0.0/24 -d 192.168.0.5/32 -p tcp -m tcp --sport 1024: --dport 80 -m state --state NEW -j ACCEPT

Pourquoi Windows 7 ne voit pas le disque dur et ses partitions lors d'une réinstallation ?

Encore un dépannage étonnant 🙂 . L'ordinateur est équipé de Windows 7 Ultimate et d'Ubuntu tous deux installés par le propriétaire de la machine. Celui-ci souhaite réinstaller Windows 7 Ultimate en reformatant. Mais le programme d'installation ne détecte pas le disque dur et ses partitions.

Le mode AHCI est activé dans le BIOS mais cela ne devrait pas avoir d'importance puisque Windows 7 contient les drivers nécessaires. Je pars néanmoins à la recherche des drivers Intel AHCI et les mets sur une clé USB (voir le début de Adding Intel Matrix Drivers to Your XP Image for AHCI SATA Support chez Symantec Connect Community pour extraire les fichiers .inf de l'exécutable fourni par Intel). Windows les détecte bien mais affiche un message d'erreur en tentant de les charger. Encore plus fort : désactiver l'AHCI dans le BIOS ne résoud pas le problème !

Je pense pour un problème de disque dur et je démarre sur un live-cd de Gparted. Le disque dur se compose d'une partition de type inconnu de 200 Mo, de la partition dédiée à Windows, de la partition dédiée à Ubuntu et d'une partition dédiée au stockage des données. Mais à quoi sert donc cette partition de type inconnu ? L'utilisateur n'a pas le souvenir d'avoir créé cette partition ...

Doutant que la suppression de cette partition soit la solution au problème, je tente de cherche d'autres pistes. L'utilisateur m'incite à détruire la partition et je me laisse convaincre. Et le pire, c'est que cela fonctionne ! La suppression de cette partition a permis au programme d'installation de Windows 7 de détecter le disque dur et ses partitions contre toute logique (en même temps avec Windows ... je dis ça, je dis rien 🙂 ).

Je n'ai par contre aucune piste concernant l'origine de cette partition atypique ...

Et comme mot de la fin : écoutez les personnes que vous dépannez, elles n'ont pas toujours tords 😉 .