lalahop

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 😉 .

  1. Normalement, cette partition est créée automatiquement par l’installeur de Windows et contient les fichiers nécessaires à son démarrage …
    Un peu comme quand on choisit de mettre son /boot sur une partition séparée, sauf que là, pas le choix 😉

    Blog très intéressant 🙂

  2. J’avais pensé à ça mais, si c’était le cas, je pense qu’elle devrait être formatée avec un FS propre à Windows (NTFS, Fat) et non pas d’un type inconnu de Gparted. Je n’avais pas de machine formatée avec l’installeur de Windows donc je n’ai pas pu vérifier (et depuis, j’ai la flemme de faire une VM).

    Peut-être une corruption de la table des partitions ? Mais dans ce cas, comment expliquer que le système installé fonctionnait encore ?

    Merci 🙂 .