Modification de phrase de passe pour disque chiffré LUKS

Une phrase de passe complexe, longue et difficile à deviner c’est bien. La changer régulièrement c’est mieux. On peut également avoir besoin de plusieurs phrases de passe (si on veut confier son ancien lappy à une voisine dans le besoin, par exemple).

Les disques chiffrés avec Cryptsetup/LUKS sont de petites merveilles. LUKS supporte, en effet, plusieurs phrases de passe stockée dans les slots. On peut, à loisir, ajouter et supprimer des phrases de passe (jusqu’à 8). Facile alors de fournir une phrase de passe temporaire le temps d’un prêt.

Lister les infos :
% cryptsetup luksDump /dev/disk/by-id/scsi-SATA_Hitachi_HDS7216_PVF904Z23V7KLN-part1
LUKS header information for /dev/disk/by-id/scsi-SATA_Hitachi_HDS7216_PVF904Z23V7KLN-part1

Version:        1
Cipher name:    aes
Cipher mode:    cbc-essiv:sha256
Hash spec:      sha1
Payload offset: 1032
MK bits:        128
MK digest:      08 fc d8 1c f8 49 a9 a1 8e 47 8e b4 32 11 64 4a 5e ca 14 26
MK salt:        0a 24 2a 6e 90 68 a0 8e d3 06 bd 25 f5 c3 7e af
                d3 e9 0b 54 3a d3 f3 a3 b2 bd 4a 63 4a 54 63 c4
MK iterations:  10
UUID:           8702329c-0242-4d20-ad8c-1a5986d0ea82

Key Slot 0: ENABLED
        Iterations:             178684
        Salt:                   d5 76 c0 bc 93 55 76 31 15 75 10 65 76 ef 0e 32
                                02 6a 88 5c 95 b4 83 c2 dd 3b d1 36 de 58 b0 55
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
Nous avons un slot (le 0) d’utilisé. C’est celui de la phrase de passe utilisé lors de la création du disque chiffré. Nous pouvons en ajouter une avec :
% cryptsetup luksAddKey /dev/disk/by-id/scsi-SATA_Hitachi_HDS7216_PVF904Z23V7KLN-part1
Enter any LUKS passphrase:
key slot 0 unlocked.
Enter new passphrase for key slot:
Verify passphrase:
Command successful.
On entre la phrase de passe existante pour débloquer le périphérique LUKS, puis la nouvelle, deux fois. On vérifiera le bon déroulement de l’opération avec un nouvel appel à la demande d’information :
Key Slot 0: ENABLED
        Iterations:             178684
        Salt:                   d5 76 c0 bc 93 55 76 31 15 75 10 65 76 ef 0e 32
                                02 6a 88 5c 95 b4 83 c2 dd 3b d1 36 de 58 b0 55
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: ENABLED
        Iterations:             182347
        Salt:                   43 e8 e2 ee d3 be bc 4d 51 3f cc c8 16 4e 80 9b
                                83 60 28 cc 28 c9 91 32 eb 48 2d 21 5f 92 c7 74
        Key material offset:    136
        AF stripes:             4000
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
Le slot 1 est maintenant utilisé. On utilise ensuite la configuration habituelle pour tester (via le script d’init).
% /etc/init.d/cryptdisks start
Starting remaining crypto disks… satahitachi (starting)Enter LUKS passphrase:
key slot 1 unlocked.
Command successful.
 satahitachi (started)done.
Ça marche (bien sûr). On voit dans la sortie que c’est la clef sur le slot 1 qui a été utilisée.

Pour retirer une phrase de passe, c’est :
% cryptsetup luksDelKey /dev/disk/by-id/scsi-SATA_Hitachi_HDS7216_PVF904Z23V7KLN-part1 1
Enter any remaining LUKS passphrase:
key slot 0 unlocked.
Command successful.
On utilise alors l’une des phrase de passe stockée dans l’un des slot restant (ici 0). Un chagement de phrase de passe revient à ajouter la nouvelle et supprimer l’ancienne, tout simplement. C’est tout.

Thinkpad x61s, lecteur d'empreintes digitales qui chauffe

Propriétaire d’un choupy Lenovo Thinkpad x61s (remplacant de l’IBM thinkpad x31), j’ai remarqué, comme d’autres utilisateurs, que le lecteur d’empreintes digitales chauffait. Ceci pour une très bonne raison, il est alimenté en permanence, même si non utilisé.

L’ajout de usbcore.autosuspend=1 en paramètre du noyau dans mon menu.lst de GRUB n’a pas été suffisant. Ceci ne fait que specifier aux périphériques qu’ils peuvent utiliser la gestion d’énergie en automatique, mais le périphérique fait ce qui lui chante.

Pour régler le problème manuellement, on peut faire un echo « auto » > /sys/devices/[… ]/power/level. Après avoir, bien entendu, recherché le périphérique à coup de lsusb et de cat dans /sys/devices/. Pas très drôle :(

Heureusement udev est là. Il suffit alors d’ajouter une règle dans /etc/udev/rules.d/10-enable-fingerprint-autosuspend.rules, par exemple, contenant (sur une ligne) :
ACTION== »add », SUBSYSTEMS== »usb », SYSFS{idVendor}== »0483″,
SYSFS{idProduct}== »2016″, ATTR{power/level}= »auto »
Une autre solution serait de lancer un script avec :
ACTION== »add », SUBSYSTEMS== »usb », SYSFS{idVendor}== »0483″,
SYSFS{idProduct}== »2016″, RUN+= »/lib/udev/usb-enable-autosuspend »
/lib/udev/usb-enable-autosuspend contenant :
#!/bin/sh
if test -f /sys/$DEVPATH/power/level ; then
echo « auto » > /sys/$DEVPATH/power/level
fi
Mais c’est bien moins élégant.

On peut vérifier ensuite avec powertop -d si la manipulation est effectivement un succès :
Recent USB suspend statistics
Active  Device name
100,0%  Périphérique USB  5-1 : Mini Card (Sierra Wireless, Incorporated)
0,0%  Périphérique USB  1-2 : Biometric Coprocessor (STMicroelectronics) <——
0,0%  Périphérique USB usb6 : EHCI Host Controller (Linux 2.6.26-1-686 ehci_hcd)
100,0%  Périphérique USB usb5 : UHCI Host Controller (Linux 2.6.26-1-686 uhci_hcd)
0,0%  Périphérique USB usb4 : UHCI Host Controller (Linux 2.6.26-1-686 uhci_hcd)
0,0%  Périphérique USB usb3 : EHCI Host Controller (Linux 2.6.26-1-686 ehci_hcd)
0,0%  Périphérique USB usb2 : UHCI Host Controller (Linux 2.6.26-1-686 uhci_hcd)
0,0%  Périphérique USB usb1 : UHCI Host Controller (Linux 2.6.26-1-686 uhci_hcd)
Done !

Pilotage de la souris au clavier

Dans la série «il fallait le savoir» nous avons le pilotage du pointeur de la souris au clavier avec X. La souris est morte, c’est une vrai galère, que faire ? Simple, on active le pilotage au clavier avec [CTRL]+[MAJ]+[NUMLOCK].

Le pointeur peut alors être déplacé avec les touches du pavé numérique. Clic avec [0] et [+]. On revient au fonctionnement normal avec [CTRL]+[MAJ]+[NUMLOCK]. Des petits bips signalent la bonne marche de l’opération. On peut également utiliser [5] pour accélérer le mouvement.

Clef M6 Mobile 3G+ : Huwaei E160

Je suis aller faire un petit tout dans ma boutique Orange locale pour me prendre un nouveau mobile (Nokia 5220 au demeurant absolument choupy-convi). Là, le vendeur me fait remarquer que si j’ai un lappy (il a appelé cela un ordinateur portable le bougre), il y a une offre intéressante : une clef 3G+ rechargeable façon carte prépayée. La chose coute 69 € mais on me rembourse 30€ à cause de la promo plus encore 20€ pour je sais plus quoi en rapport avec mon nouveau Nokia. Bref, une clef USB 3G/GPRS/GSM/EDGE qui fait storage en plus (avec une micro-SD non incluse) pour 19€. À ce prix là, je me dis qu’avec un peu de chance si la boîte dit Mac OS X, il y a une forte probabilité pour que ça marche avec mes box GNU/Linux… et OUI ! Ça marche. Trop bonheur ! Mon X31 est aux anges et moi aussi…

Si vous pensez que les clefs USB 3G sont des périphériques mystiques galère à mettre en œuvre détrompez-vous. Celle-ci est une Huwaei E160 (une E220 avec un lecteur SD en plus semble-t-il) et elle est prise en charge pas mon noyau 2.6.26.
[73376.467478] usb 1-3: New USB device found, idVendor=12d1, idProduct=1003
[73376.467495] usb 1-3: New USB device strings: Mfr=2, Product=1, SerialNumber=0
[73376.467504] usb 1-3: Product: HUAWEI Mobile
[73376.467510] usb 1-3: Manufacturer: HUAWEI Technology
[73970.701459] usb-storage: probe of 1-3:1.0 failed with error -5
[73970.701503] option 1-3:1.0: GSM modem (1-port) converter detected
[73970.701707] usb 1-3: GSM modem (1-port) converter now attached to ttyUSB0
[73970.706932] usb-storage: probe of 1-3:1.1 failed with error -5
[73970.706968] option 1-3:1.1: GSM modem (1-port) converter detected
[73970.707083] usb 1-3: GSM modem (1-port) converter now attached to ttyUSB1
Ça râle un peu parce qu’il n’y a pas de carte SD en place mais le plus importante c’est le premier port série ajouté. Hé oui, un port série !

Et savez-vous comment on parle à un modem, fut-il 3G ? On lui parle Hayes monsieur, à grand coup de AT*. Et effectivement, un petit screen /dev/ttyUSB0 suivi d’un ATZ et la bête répond OK. À ce moment précis je suis au bord de l’érection (si, si).

Un peu de Google et je tombe sur deux sympathiques liens :

http://arisme.free.fr/Novatel/
http://www.timberwolf.ukfsn.org/debian-orange-3g.html

Le E160 ne supporte pas toutes les commandes décrites mais les faits sont là : c’est un modem, ça parle Hayes et on se connecte en 3G ou GPRS avec… PPP. Voilà qui me rappel bien des souvenirs et des nuits blanches dans ma jeunesse aussi…

Un petit coup d’installe de démon PPP et on se lance. D’abord la configuration du peer dans /etc/ppp/peers/orange :
noauth
connect « /usr/sbin/chat -v -f /etc/chatscripts/orange »
debug
/dev/ttyUSB0
115200
defaultroute
noipdefault
user « orange »
password « orange »
usepeerdns
Puis le script de chat dans /etc/chatscripts/orange :
ABORT BUSY ABORT ‘NO CARRIER’ ABORT VOICE ABORT ‘NO DIALTONE’ ABORT ‘NO DIALTONE’ ABORT ‘NO ANSWER’ ABORT DELAYED
 » ATZ
OK-AT-OK ‘AT+CGDCONT=3, »IP », »orangeinternet »‘
OK-AT-OK ‘AT&FE0Q0V1’
OK-AT-OK ‘ATD*99***1#’
CONNECT «  »
Et hop, un coup de pon orange et l’affaire est dans le sac :
Nov 29 20:30:25 x31 chat[28923]: send (ATZ^M)
Nov 29 20:30:25 x31 chat[28923]: expect (OK)
Nov 29 20:30:25 x31 chat[28923]: ^M
Nov 29 20:30:25 x31 chat[28923]: OK
Nov 29 20:30:25 x31 chat[28923]:  — got it
Nov 29 20:30:25 x31 chat[28923]: send (AT+CGDCONT=3, »IP », »orangeinternet »^M)
Nov 29 20:30:26 x31 chat[28923]: expect (OK)
Nov 29 20:30:26 x31 chat[28923]: ^M
Nov 29 20:30:26 x31 chat[28923]: AT+CGDCONT=3, »IP », »orangeinternet »^M^M
Nov 29 20:30:26 x31 chat[28923]: OK
Nov 29 20:30:26 x31 chat[28923]:  — got it
Nov 29 20:30:26 x31 chat[28923]: send (AT&FE0Q0V1^M)
Nov 29 20:30:26 x31 chat[28923]: expect (OK)
Nov 29 20:30:26 x31 chat[28923]: ^M
Nov 29 20:30:26 x31 chat[28923]: AT&FE0Q0V1^M^M
Nov 29 20:30:26 x31 chat[28923]: OK
Nov 29 20:30:26 x31 chat[28923]:  — got it
Nov 29 20:30:26 x31 chat[28923]: send (ATD*99***1#^M)
Nov 29 20:30:26 x31 chat[28923]: expect (CONNECT)
Nov 29 20:30:26 x31 chat[28923]: ^M
Nov 29 20:30:26 x31 chat[28923]: ^M
Nov 29 20:30:26 x31 chat[28923]: CONNECT
Nov 29 20:30:26 x31 chat[28923]:  — got it
Nov 29 20:30:26 x31 chat[28923]: send (^M)
Nov 29 20:30:26 x31 pppd[28922]: Serial connection established.
Nov 29 20:30:26 x31 pppd[28922]: Using interface ppp0
Nov 29 20:30:26 x31 pppd[28922]: Connect: ppp0 <–> /dev/ttyUSB0
Nov 29 20:30:27 x31 pppd[28922]: CHAP authentication succeeded
Nov 29 20:30:27 x31 pppd[28922]: CHAP authentication succeeded
Nov 29 20:30:30 x31 pppd[28922]: Could not determine remote IP address: defaulting to 10.64.64.64
Nov 29 20:30:30 x31 pppd[28922]: local  IP address 10.32.128.8
Nov 29 20:30:30 x31 pppd[28922]: remote IP address 10.64.64.64
Nov 29 20:30:30 x31 pppd[28922]: primary   DNS address 80.10.46.232
Nov 29 20:30:30 x31 pppd[28922]: secondary DNS address 10.11.12.14
Ensuite, il faut aller sur le portail eWifi d’orange pour acheter un passe temporaire. Je trouve que c’est encore relativement cher mais pour une utilisation ponctuelle c’est toujours moins que les forfaits :

20mn pour 3€ (pass valable 24h)
1h pour 8€ (pass valable 15j)
1h + 1h entre 20h et 8h pour 10€ (pass valable 15j)
24h (ou 75Mo) pour 10€ (pass valable 24h)

En attendant que la SNCF offre un accès Wifi gratuit ou que les Fonera recouvrent le monde, c’est toujours mieux que rien. Me voici tout heureux, capable de me connecter de partout avec un OS du bien… Aller ! J’ouvre une bouteille de Pessac pour l’occasion ! Hop !

Bon j’ai une tonne de papier à remplir, à la main, avec un stylo à utiliser avec les doigts pour me faire rembourser mes 50€ moi…

Trac : coloriser les rapports en fonction du type

Comme il n’y a pas de mention ailleurs sur le web de ce type de manipulation… voici. Toujours entrain de faire mumuse avec Trac, j’ai remarqué que les rapports étaient systématiquement colorés en fonction de la priorité d’un ticket. Pour mal part j’avais plutôt besoin de repérer facilement les types de tickets.

En regardant la requête SQL de ce type de rapport on voit que la couleur est définie ainsi :
SELECT p.value AS __color__,
‘Milestone ‘||milestone AS __group__,
id AS ticket, summary, component, version, t.type AS type,
owner, keywords, reporter, status, priority,
time AS created,
changetime AS _changetime, description AS _description,
reporter AS _reporter
FROM ticket t
LEFT JOIN enum p ON p.name = t.priority AND p.type = ‘priority’
WHERE status <> ‘closed’
ORDER BY (milestone IS NULL),milestone, component,
CAST(p.value AS int), keywords, time
La couleur découle d’une jointure entre la table enum et ticket. enum ? kesako ? Cette table contient tout ce qui est association valeur/chaîne : les conditions de résolution, les priorités et les types de tickets.

Ne reste plus qu’à regarder dans cette table avec l’outil sqlite3 :
% sqlite3 trac.db
SQLite version 3.5.9
Enter « .help » for instructions

sqlite> .schema enum
CREATE TABLE enum (
type text,
name text,
value text,
UNIQUE (type,name)
);

sqlite> select distinct(type) from enum;
priority
resolution
ticket_type

sqlite>
Et ont change la jointure dans la requête du rapport :
[…]
LEFT JOIN enum p ON p.name = t.type AND p.type = ‘ticket_type’
[…]
On peut ensuite changer, si nécessaire les couleurs elles-mêmes dans la CSS (paires color[1-6]-odd/color[1-6]-odd).

Trac et format de date avec Lighttpd

Suite au précédent billet, et poursuivant l’installation/configuration de Trac, je me suis heurté à un petit problème. Le format de date utilisé par défaut a la forme MM/JJ/AA, ce qui est assez pénible pour un usage fréquent. La plupart des documentations parlent d’Apache et de mod_python. Le changement est pourtant facile avec Lighttpd puisqu’il suffit d’ajouter une variable dans la configuration :
# /etc/lighttpd/conf-enabled/10-fastcgi.conf
server.modules += ( « mod_fastcgi » )
fastcgi.server = (
« /trac » =>
(« trac » => (
« socket » => « /tmp/trac-fastcgi.sock »,
« bin-path » => « /usr/share/pyshared/trac/web/fcgi_frontend.py »,
« check-local » => « disable »,
« bin-environment » => (
« TRAC_ENV » => « /var/lib/tracenv »,
« LC_TIME » => « fr_FR »
)
))
)

Trac c'est le bien(tm)

Comme vous le savez je suis rédacteur en chef de GLMF et à ce titre je passe pas mal de mon temps à organiser, traiter, relire, gérer les articles pour chaque numéro. Cela faisait longtemps que je cherchais un outil Web permettant de faciliter ce travail et d’avoir une vue globale mais également détaillée sur l’évolution de l’ensemble et de chaque article. J’ai finalement trouvé ma solution : Trac, le système de suivi de révisions et de gestion de projet.

Destiné, au départ, à la gestion de projet de développement, Trac s’adapte parfaitement à la gestion d’articles pour un magazine. J’avais, fut un temps, essayé DotProject sans grand succès (trop rigide, trop peu adaptable). Hop, petite procédure d’installation rapide sur Debian !

Tout d’abord l’installation du paquet :
% aptitude install trac
On passe ensuite à l’initialisation de l’environnement avec dans l’ordre le repository SVN et l’environnement de gestion de Trac :
% mkdir /var/lib/tracSVN
% svnadmin create /var/lib/tracSVN

% trac-admin /var/lib/tracenv initenv
% chown -R www-data /var/lib/tracenv

% trac-admin /var/lib/tracenv deploy /var/www/trac
Puis on configure Lighttpd :
# /etc/lighttpd/conf-enabled/10-fastcgi.conf

server.modules += ( « mod_fastcgi » )

fastcgi.server = (
« .php » =>
((
« bin-path » => « /usr/bin/php-cgi »,
« socket » => « /tmp/php.socket »,
« max-procs » => 2,
« idle-timeout » => 20,
« bin-environment » => (
« PHP_FCGI_CHILDREN » => « 4 »,
« PHP_FCGI_MAX_REQUESTS » => « 10000 »
),
« bin-copy-environment » => (
« PATH », « SHELL », « USER »
),
« broken-scriptfilename » => « enable »
)),
« /trac » =>
(« trac » => (
« socket » => « /tmp/trac-fastcgi.sock »,
« bin-path » => « /usr/share/pyshared/trac/web/fcgi_frontend.py »,
« check-local » => « disable »,
« bin-environment » => (« TRAC_ENV » => « /var/lib/tracenv »)
))
)
Ici on passe par FastCGI. La configuration intègre le support Trac/Python mais également PHP (pour dokuwiki (oui je préfère doku que le wiki de trac)). On ajoute ensuite l’authentification :
# /etc/lighttpd/conf-enabled/10-auth.conf
server.modules += ( « mod_auth » )
auth.debug = 2

$HTTP[« url »] =~ « ^/trac/ » {
auth.backend = « htpasswd »
auth.backend.htpasswd.userfile = « /var/lib/tracenv/htpasswd.htaccess »
auth.require = (« /trac/login » =>
(« method » => « basic »,
« realm » => « First project »,
« require » => « valid-user »
))
}
On oubli pas de passer le script Python en exécutable pour plaire à Lighttpd :
% chmod +x /usr/share/pyshared/trac/web/fcgi_frontend.py
On finalise l’authentification en ajoutant un utilisateur «admin» à qui on donne les droits adéquates :
% htpasswd -c /var/lib/tracenv/htpasswd.htaccess admin
% chown -R www-data /var/lib/travenv/htpasswd.htaccess
% trac-admin /var/lib/tracenv/ permission add admin TRAC_ADMIN
Ne reste plus qu’à relancer Lighttpd et à pointer le navigateur sur http://localhost/trac. On s’authentifie et bienvenue dans Trac.

Mutt et les types MIME

Heureux possesseur d’une carte FXO Novalink (merci eBay), je m’amuse comme un petit fou avec Asterisk. Pour l’heure il ne s’agit encore que d’un PABX simpliste avec renvoi d’appel via VoIP (ça sonne, Asterisk décroche, et renvoi l’appel sur un Soft Phone Ekiga sur le VPN). Si le poste VoIP est déconnecté ou occupé, le correspondant tombe sur la boîte vocale. Je n’ai donc, pour l’heure, un répondeur téléphonique construit sur un Intel QuadCore Q6600 :)

Mais l’objet de ce post n’est pas là. Lorsqu’un message est laissé, il arrive par mail sous la forme d’un fichier WAV à une adresse donnée. Comment dire à mon gentil Mutt via IMAP over SSL d’utiliser telle ou telle commande pour lire ce fichier ? La réponse c’est ~/.mailcap.

Le fichier ~/.mime.types permet d’associer une extension de fichier à un type MIME. Utile pour composer un mail et attacher correctement les fichiers. Pour l’association type/application c’est donc ~/.mailcap qu’il faut toucher.

Voici pour le WAV :
audio/wav;/usr/bin/play %s
audio/x-wav;/usr/bin/play %s
audio/x-pn-wav;/usr/bin/play %s
Et c’est tout. /usr/bin/play est le player livré avec le convertisseur de formats audio SoX. Ce n’est pas une astuce, ce n’est pas un hack. Ce post n’a pas d’autre réel intérêt que d’imprimer cela une bonne fois pour toute dans ma mémoire et éviter de chercher encore pendant 5mn la prochaine fois que je voudrai changer une association type/application ;)