web-dev-qa-db-fra.com

Ubuntu 14.04 peut-il utiliser un échange crypté sans recourir à des hacks non officiels?

Sur une nouvelle installation d'Ubuntu 14.04, je reçois ce message d'erreur lors du démarrage

le lecteur de disque pour/dev/mapper/cryptswap1 n'est pas encore prêt ou n'est pas présent

et la partition de swap n'est jamais activée. De mes recherches jusqu'à présent, j'ai trouvé:

  • Il s'agit d'un problème répandu, affectant probablement chaque installation d'Ubuntu 14.04 sur laquelle l'échange crypté a été activé.
  • Une partie du problème est un bogue facile à corriger qui fait que l'en-tête de swap chiffré (généré au démarrage) écrase l'en-tête de swap non chiffré, ce qui rend impossible de retrouver la partition correcte lors du prochain démarrage.
  • Toutes les solutions proposées pour le faire fonctionner semblent être simplement des solutions de contournement s'élevant à: 1. Désactiver le swap en le définissant comme noauto dans fstab. 2. Créez un fichier /etc/rc.local (ou définissez votre propre service à activer au démarrage), qui active la partition de swap.

Est-il possible d'utiliser un échange crypté sur Ubuntu 14.04 sans utiliser ce type de piratage? Je suis parfaitement à l'aise de mettre à jour tous les packages installés et de corriger ces fichiers de configuration, qui ont été initialisés avec un contenu incorrect en raison de scripts d'installation bogués. Je préfère éviter d'avoir à utiliser mon propre script pour activer l'échange, car ce type d'approche a tendance à se casser lorsque les packages sont mis à jour.

C'est ce que mon /etc/crypttab ressemble à:

cryptswap1 /dev/sda6 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,offset=16

Et la ligne pertinente de mon /etc/fstab est:

/dev/mapper/cryptswap1 none swap sw 0 0

Ce que j'ai essayé jusqu'à présent:

J'ai trouvé le lecteur de disque de message pour/dev/mapper/cryptswap1 n'est pas encore prêt ou n'est pas présent même après avoir essayé diverses options demandant quel pourrait être le même scénario.

Mais la seule réponse suggère d'utiliser un échange non chiffré.

J'ai trouvé http://ubuntuforums.org/showthread.php?t=2200995 qui prétend avoir une solution, mais la solution n'a aucun sens pour moi.

La première partie de la solution proposée consiste à réécrire l'en-tête de swap chiffré à l'aide de mkswap. Cependant, comme cet en-tête est chiffré avec une clé qui n'est pas persistante lors des redémarrages, cette étape n'aiderait pas à faire fonctionner le swap après le prochain redémarrage.

Il suggère également des mises à jour de/etc/fstab, mais il semble que mon fstab regarde déjà correctement.

Le post suppose LVM, que je n'utilise pas. Je ne suis au courant d'aucune façon, cela ferait une différence.

J'ai trouvé https://bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/1310058 ce qui m'a aidé à comprendre le problème avec l'en-tête de swap en cours d'écrasement et l'ajout de offset to crypttab et la régénération de l'en-tête de swap non chiffré peut résoudre ce problème.

Cependant l'en-tête écrasé n'est pas le seul problème en jeu, il y a un autre problème, que je ne comprends pas encore complètement.

Autres choses que j'ai découvertes sur le problème:

De la lecture /lib/cryptsetup/cryptdisks.functions J'ai appris qu'au démarrage, l'appareil est censé être créé avec le nom cryptswap1_unformatted alors l'en-tête de swap chiffré doit être écrit et le périphérique doit être renommé en cryptswap1. Dans le journal du noyau, je trouve ce message d'erreur:

[   39.419429] device-mapper: ioctl: Unable to change name on mapped device cryptswap1_unformatted to one that already exists: cryptswap1

De façon confuse, le résultat est que l'appareil finit par avoir le nom cryptswap1, mais l'en-tête swap n'a jamais été écrit.

Swap fonctionne pendant les démarrages où une vérification du système de fichiers a été effectuée. Ce n'est que lorsqu'aucune vérification du système de fichiers n'est effectuée, que j'obtiens le redouté cryptswap1 is not ready yet Erreur.

Dans /var/log/upstart/cryptdisks.log Je trouve le message d'erreur

Device cryptswap1_unformatted already exists.

Cependant, en ajoutant une journalisation supplémentaire à /lib/cryptsetup/cryptdisks.functions, J'ai appris qu'il y a une course entre /etc/init.d/cryptdisks-early et /etc/init/cryptdisks.conf. Toute journalisation que j'ajoute à cryptdisks.functions peut influencer la façon dont les actions des deux scripts sont entrelacées, et parfois, cela finit par fonctionner.

Il est clair que les deux ne sont pas censés gérer le même appareil en parallèle. Comment puis-je obtenir les deux scripts sérialisés, de sorte que l'échange fonctionne à chaque démarrage?

2
kasperd

Il y a deux problèmes distincts qui doivent être résolus pour obtenir cryptswap1 fonctionne correctement dans Ubuntu 14.04.

Problème 1: en-tête de swap écrasé

La partition a été initialement formatée avec un en-tête de swap non chiffré, qui est utilisé pour trouver la partition correcte à utiliser lors du démarrage. Étant donné que la clé de chiffrement change à chaque démarrage, l'en-tête d'échange crypté sera réécrit à chaque démarrage. En raison d'un bogue dans la génération de /etc/crypttab, l'en-tête de swap chiffré écrase l'en-tête de swap non chiffré. Cela empêchera la partition de swap d'être trouvée à tous les futurs démarrages.

Problème 2: Condition de course au démarrage

Il y a une condition de concurrence au démarrage entre /etc/init.d/cryptdisks-early et /etc/init/cryptdisks.conf. Les deux essaieront simultanément d'activer tous les périphériques répertoriés dans crypttab. Dans le cas d'un échange crypté, le résultat de la condition de course sera la plupart du temps, que cela ne fonctionne pas du tout. Certaines vérifications d'intégrité échouent, entraînant l'omission de l'écriture de l'en-tête de swap crypté afin d'éviter toute perte de données potentielle.

Résoudre et contourner les problèmes

Le premier problème peut être facilement résolu. La seconde peut être contournée. Dans /etc/crypttab identifier la ligne de swap. Cela devrait ressembler à ceci (sauf que l'UUID sera différent):

cryptswap1 UUID=f9a0f20c-fac4-408c-a8b9-47300216f727 /dev/urandom swap,cipher=aes-cbc-essiv:sha256

Dans mon cas, c'était la seule ligne dans /etc/crypttab. Pour corriger l'écrasement de l'en-tête de swap, un décalage doit être ajouté. Les sources ne s'entendent pas sur la valeur exacte à utiliser, mais l'utilisation d'une valeur trop grande ne fait pas de mal. Je l'ai fait fonctionner en utilisant un décalage de 16.

De plus, j'ai ajouté noearly ce qui provoque /etc/init.d/cryptdisks-early pour ignorer cette ligne et ainsi contourner la condition de concurrence.

La ligne résultante ressemble à ceci:

cryptswap1 UUID=f9a0f20c-fac4-408c-a8b9-47300216f727 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,offset=16,noearly

Cela empêchera l'écrasement de l'en-tête d'échange non chiffré, mais nous devons toujours le recréer sur la partition. À cette étape, il est crucial d'utiliser la bonne partition car l'utilisation d'une mauvaise partition entraînera une perte de données. J'ai utilisé fdisk -l pour trouver la partition correcte, qui dans mon cas est /dev/sda6.

Utilisez maintenant mkswap pour réécrire l'en-tête d'échange non chiffré.

mkswap /dev/sda6 -U f9a0f20c-fac4-408c-a8b9-47300216f727

L'UUID est celui que la partition de swap avait avant d'être écrasé (que vous pouvez toujours voir dans /etc/crypttab). Une fois cela fait, un redémarrage est nécessaire, et tout devrait fonctionner.

Vérification du bon fonctionnement

Je recommande de redémarrer trois fois pour vérifier qu'il continue de fonctionner.

Le message d'erreur the disk drive for /dev/mapper/cryptswap1 is not ready yet or not present reste brièvement visible pendant le démarrage. Cela ne semble pas être un problème, car il devient prêt avant la fin du processus de démarrage.

Connectez-vous et saisissez cat /proc/swaps pour voir que l'échange est actif. Vous devriez voir une partition de swap avec le nom /dev/dm-0dm indique qu'il utilise en effet la couche de mappage de périphérique, qui fournit le cryptage.

4
kasperd