OpenSSL et la vérification du domaine dans les certificats

Je suis en train de rajouter de l’onion routing à mon moteur de recherche MySearch. Je me suis donc penché sur comment Twisted (13.2) gérait les connexions SSL.

Tout d’abord, il faut savoir qu’une connexion web HTTPS dans Twisted ne fait aucune vérification de certificat par défaut. C’est écrit dans la doc et dans l’API.

Enfin « par défaut », il faut comprendre « sans mettre les mains dans le cambouis ». Car quand on regarde plus en profondeur dans le code de Twisted, on voit que les connexions SSL reposent sur PyOpenSSL , qui est comme vous vous en doutez un binding pour la fameuse librairie OpenSSL.

Dans Twisted, voici ce qu’on trouve de plus exhaustif pour vérifier la sécurité de sa connexion SSL. Là, le premier truc qui choque, c’est que le hostname de destination n’apparaît pas dans le code de vérification des certificats.

On se dit qu’on loupe quelque chose, on va voir du coté de la doc de PyOpenSSL . Pareil, pas de fonction qui vérifie la correspondance du hostname demandé avec le certificat présenté. Et pas un mot sur le sujet.

Allons donc voir ce qu’en dit OpenSSL. Et là c’est beau, je vous le donne en mille :

One very common mistake made by users of OpenSSL is to assume that OpenSSL will validate the hostname in the server’s certificate. Currently, it does not, although a future version (1.1.0?) will include this functionality.

C’est écrit noir sur blanc et .

Sérieusement, vous pensez qu’il est sain de forcer des programmeurs lambda à coder une fonction si critique qui va vérifier le hostname de destination avec toutes les règles de subject alt name encodées en ASN.1 sans faire le moindre faux positif ni faux négatif ?

Je serai amusé de voir le code de cette partie de quelques applications reposant sur OpenSSL. On risque de trouver des manières élégantes de faire du MITM avec un simple certificat adapté…

Par pur hasard, une nouvelle version de Twisted (14.0) est sortie ces jours-ci. Les notes de mise à jour indiquent de grandes améliorations autour des communications SSL (enfin dirais-je !).

Je vais donc, curieux, voir comment ils se sont sorti de ce piège. Le code de vérification du hostname est en fait externalisé à un module Python externe : service_identity , module créé en mars 2014 (semble t il par des codeurs de Twisted). Ca c’est du code sûr, vérifié et testé… qui prend quand même environ 430 lignes de Python (avec beaucoup de lignes blanches je vous l’accorde).

Voici d’autres exemples du joli cadeau sue nous lègue OpenSSL :

 

J'aime(0)Ferme-la !(0)

Avoir le verr Num. actif par défaut sous Gnome 3

Un truc bien chiant est de devoir activer le pavé numérique à chaque fois que l’on démarre une session Gnome.

Depuis Gnome 3 il est possible de demander à ce que le réglage de l’état du pavé numérique soit conservé entre les sessions. Enfin !
Ca s’active ainsi en ligne de commande:

$ gsettings set org.gnome.settings-daemon.peripherals.keyboard remember-numlock-state true

Ou graphiquement en démarrant dconf-editor et en allant chercher la clé org.gnome.settings-daemon.peripherals.keyboard remember-numlock-state

J'aime(6)Ferme-la !(0)

USB dumper

Je vous avais déjà parlé des risques de brancher un téléphone Android par USB pour le recharger. En effet, dans le cas où le téléphone est déverrouillé lorsqu’il est branché, l’accès à l’espace de stockage du téléphone est aussi débloqué.

Bref si vous avez des données confidentielles sur votre téléphone, vous devriez, au même titre qu’une clé USB, ne pas le brancher n’importe où.

Pour aller plus loin dans la réflexion, j’ai codé un programme qui démontre comment vos données pouraient aisément être copiées sans que vous vous en aperceviez.
Ce programme s’appelle « usb-dumper« . Une fois lancé, il copie intégralement et silencieusement le contenu de tous les périphériques USB connectés utilisant le mode UMS (clés USB, Android 3.x, appareils photos) ou MTP (Android 4.x, lecteurs audio, appareils photos, etc…) vers le disque dur de votre ordinateur.

Dès qu’un nouveau périphérique USB est connecté, celui est copié. Vous verrez que la procédure est très rapide avec les débits en USB atteints aujourd’hui et que l’on peut se faire subtiliser des GigaOctets en quelques secondes et donc sans s’en rendre compte.

Le code utilise udev pour détecter le branchement de nouveau périphérique et GVFS pour l’accès aux données. L’utilisation de GVFS implique l’usage de Gnome mais c’est le seul moyen vraiment fiable d’accéder à l’espace de stockage des périphérique MTP (Android 4.x) que j’ai trouvé.

Vu que je commence à mieux appréhender la construction de paquet Debian pour mes programmes Python, je vous ai concocté un paquet .deb pour vous faciliter la tâche d’installation.
Lancez « usb-dumper » et branchez un périphérique :-)

Les préférences se trouvent dans le fichier ~/.config/usb-dumper/usb-dumper.conf
Vous pouvez y déterminer les périphériques et les fichiers à ne pas copier ainsi que l’emplacement où seront copiés les fichiers.

Le code source est sous licence libre AGPL et disponible sur la forge CodingTeam.

J'aime(0)Ferme-la !(0)

Mysearch version 1.0 et paquet debian

Ça fait un petit moment que je travaille sur mon projet de moteur de recherche anonymisé. Je l’utilise depuis quelques mois et il est maintenant prêt à entrer en production et découvrir le monde !

Je l’ai appelé Mysearch. Il s’agit d’une application qui va faire office de proxy entre vous et les grands moteurs de recherche du web. Ce n’est donc pas un moteur de recherche à proprement car il n’a pas de crawler propre, mais plutôt un intermédiaire anonymisateur, comme DuckDuckGo. Voila à quoi ca ressemble:

mysearch

J’ai mis à disposition mon instance de Mysearch sur https://search.jesuislibre.net si vous voulez tester.

Concrètement, Mysearch va anonymiser vos recherches :

  • en masquant votre IP originelle vis à vis du moteur de recherche
  • en vous proposant une page web propre expurgée de tout moyen de tracking (cookie vous identifiant même si vous n’avez pas de compte, lien unique pour chaque résultat permettant de savoir quel résultat vous avez choisi , scripts obscurs utilisés pour vous traquer, mot-clés de votre de recherche transmis au résultat choisi, enregistrement de votre recherche à votre profil, etc…) dont sont truffés les pages de résultats des moteurs de recherche commerciaux (Google, Bing, Yahoo, etc…)
  • du coup, la page web est bien mois lourde et économise votre bande passante (11ko versus 830ko pour une recherche simple sur Google !)
  • en supprimant les publicités qui squattent la place du premier résultat

L’intérêt par rapport à DuckDuckGo:

  • la pertinence des résultats de Google (DuckDuckGo achète ses résultats à Yandex qui renvoie des résultats pourris sur les requêtes avec plusieurs mots clés)
  • qui peut vérifier ce que fait DuckDuckGo de vos données personnelles? C’est une entreprise américaine, donc soumise aux desiratas de la NSA sans qu’elle puisse communiquer dessus.
  • pas de publicité à la place du premier résultat. Car DuckDuckGo a comme Google, un business model basé sur la publicité (vous ne croyez quand même pas que c’était gratuit hahaha…)

Pour l’instant les moteurs de recherches intégrés à Mysearch sont Google, Google Image, Google Vidéo, Wikipedia et Openstreetmap. On peut choisir la langue dans laquelle on veut les résultats. Le design de la page web est approprié à une utilisation tant sur smartphone que sur grand écran.

Le sources de Mysearch se trouvent sur la forge Codingteam

J’ai créé un paquet Debian pour installer simplement Mysearch chez vous. Mysearch est lancé en tant que service automatiquement au démarrage.Il utilise un utilisateur spécifique « mysearch » pour la sécurité de vos données persos. Vous pouvez arrêter le service en lançant en root : # service mysearch stop

Vous pouvez y accéder à l’adresse http://localhost:60061 (encore un chiffre de plus pour le port et je pouvais écrire GOOGLE en leet speak)

J'aime(22)Ferme-la !(0)

CAcert retiré de Debian

À la différence de toutes les autres autorités de certification, CAcert est une autorité de certification communautaire qui fournit gratuitement des certificats SSL/TLS.

Ce n’est pas seulement à cause de cette façon de fonctionner, similaire à l’approche de Debian, que Debian a distribué le certificat racine de CAcert depuis 2005, même après que CAcert a retiré sa demande d’être incluse dans le magasin de certifications approuvées de Mozilla en 2007, à cause d’un audit interne en cours.

La discussion de savoir si Debian continuerait à distribuer le certificat racine de CAcert dans son magasin de certifications approuvées est née de la réponse à un bogue signalé en juillet 2013 plaidant pour son retrait. Après avoir débattu le pour et le contre pendant des mois, c’est le 13 mars que Michael Shuler, le responsable du paquet ca-certificates, a finalement rendu public la décision de ne plus diffuser le certificat racine de CAcert dans Debian.

Pour un résumé détaillé du débat, veuillez vous reporter à l’article de LWN sur le sujet.

StartSSL est une autorité de certification , non communautaire, reconnue par la plupart des navigateurs, propose un offre de certificats SSL gratuits. Il n’est pas possible d’avoir de certificat « wildcard » à ce prix mais on peut en créer un pour chaque sous domaine, ce qui, avec le support du SNI dans SSLv3, permet d’héberger plusieurs domaines et sous domaines en HTTPS sur le même serveur.

J'aime(69)Ferme-la !(1)

Lister et tuer les processus en cours sous Linux

Pour lister les processus de tous les utilisateurs du système : ps -faux
Pour lister uniquement vos processus : ps -fux

$ ps -fux
 USER  PID  %CPU %MEM VSZ   RSS TTY STAT START TIME COMMAND
 erwan 3377 0.0 0.1 600268  13212  ? Ssl 16:06 0:00 x-session-manager
 erwan 3418 0.0 0.0 10584   336    ? Ss  16:06 0:00 \_ /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session x-session-manager
 erwan 3442 0.0 0.2 816644  21384  ? Sl  16:06 0:00 \_ /usr/lib/gnome-settings-daemon/gnome-settings-daemon
 erwan 3520 1.7 2.5 1893352 202408 ? Sl  16:06 1:29 \_ /usr/bin/gnome-shell
 erwan 5067 3.9 3.8 1242492 302140 ? Sl  16:24 2:39 | \_ iceweasel
 erwan 6172 0.0 0.3 906316  25784  ? Sl  17:13 0:00 | \_ nautilus --new-window
 erwan 3572 0.0 0.1 551768  9596   ? SNl 16:06 0:00 \_ /usr/lib/tracker/tracker-miner-fs

C’est beaucoup plus pratique que la commande top car il n’y a pas de limitation de hauteur d’écran.

On y trouve des infos très utiles :

  • l’user qui a lancé le processus
  • la commande complète avec arguments qui a servie à lancer le processus
  • l’arborescence des commandes pour savoir quels sont les processus parents et enfants.
  • la date à laquelle le processus a été lancé et sa durée de vie
  • la charge du CPU
  • le PID, identifiant propre à chaque processus

Pour arrêter les processus qui vous intéressent, récupérez le PID correspondant (ex: 5067) et lancez :

$ kill 5067

.
Si le programme ne se ferme pas assez rapidement, vous pouvez le forcer à s’arrêter immédiatement :

$ kill -9 5067
J'aime(0)Ferme-la !(0)

Lister les connexions entrantes de votre ordinateur

La commande netstat -tape permet de lister les processus qui acceptent des connections entrantes sur votre ordinateur. Facile à se rappeler !
Pour plus d’information, man netstat.

# netstat -tape
Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        User       Inode       PID/Program name
tcp        0      0 localhost:60061         *:*                     LISTEN      mysearch   7850        2813/python     
tcp        0      0 *:43173                 *:*                     LISTEN      statd      13393       1844/rpc.statd  
tcp        0      0 *:sunrpc                *:*                     LISTEN      root       13372       1816/rpcbind    
tcp        0      0 *:ssh                   *:*                     LISTEN      root       33422       6097/sshd       
tcp        0      0 *:gdomap                *:*                     LISTEN      root       6788        2253/gdomap     
tcp6       0      0 [::]:sunrpc             [::]:*                  LISTEN      root       13375       1816/rpcbind    
tcp6       0      0 [::]:32947              [::]:*                  LISTEN      statd      13397       1844/rpc.statd  
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      root       33424       6097/sshd
J'aime(0)Ferme-la !(0)

Dossier partagé entre utilisateurs sous Linux

La problématique du jour est de faire un répertoire partagé entre les utilisateurs d’un même ordinateur sous linux.

Permissions Unix, la mauvaise solution

Les permissions Unix sont très performants pour restreindre les accès mais rendent la création d’un répertoire partagé impossible en pratique.

La solution classique serait de créer un groupe qui regroupe les utilisateurs et de faire en sorte que tous les fichiers partagés appartiennent à ce groupe. Ca fonctionne en théorie, mais dans la pratique, les utilisateurs créent/modifient/copient  des fichiers sans vouloir mettre à jour les permission groupes. Et seul le propriétaire du fichier peut modifier la permission de groupe du fichier, ce qui rend la chose ingérable.

Le SGID est également une fausse bonne idée pour propager les droits aux fichiers créés car il ne se propage pas aux fichiers copiés par l’utilisateur vers le dossier partagé.

ACL

La solution élégante et performante passe par les ACL ou Access Control List. Elle permet un contrôle bien plus fin et explicite.

Pour avoir accès aux droits ACL vous devez avoir ajouté l’option à votre /etc/fstab .
Ex :

/dev/hda6 /home ext3 options1,option2,option3,acl 0 0

Une fois fait, remontez le point de montage.

# mount -o remount,acl /home

Assignation des droits ACL

On crée un dossier en root /home/dossier_partage. Personne peut y accéder à part root. Jusqu’ici rien de spécial.

# cd /home
# mkdir dossier_partage
# chmod 770 dossier_partage

On crée un groupe « partage » et on ajoute les utilisateurs à ce groupe.

# addgroup partage
# usermod -a -G partage bob
# usermod -a -G partage alice

On ajoute des droits étendus pour que les membres du groupe « partage » puissent tout faire dans ce dossier. La deuxième ligne fait en sorte que les fichiers nouvellement créés héritent aussi de cette règle ACL.

# setfacl -Rm g:partage:rwX dossier_partage
# setfacl -Rm d:g:partage:rwX dossier_partage

On peut vérifier les droits finaux ainsi :

$ getfacl dossier_partage/

# file: dossier_partage/
# owner: root
# group: root
user::rwx
group::rwx
group:partage:rwx
mask::rwx
other::—
default:user::rwx
default:group::rwx
default:group:partage:rwx
default:mask::rwx
default:other::—

Astuce sécurité

Par défaut, le /home/user des utilisateurs n’est pas privé sous Debian ! Si bien que Alice peut lire les fichier dans /home/bob .

Je vous recommande la lecture de ce document sur comment sécuriser Debian, surtout ces 2 points

  • 4.11.13.1 Limiter l’accès aux informations d’autres utilisateurs
  • 4.11.12 Positionner des umasks aux utilisateurs

Le plus important : Pour tous vos utilisateurs existants, assurez que le dossier home bloque bien l’accès aux autres utilisateurs :

# chmod 750 /home/bob

Ensuite, vous pouvez faire en sorte que soit créé automatiquement comme ça quand vous créez un utilisateur:

# dpkg-reconfigure adduser

et choississez Non

Vous pouvez également faire en sorte que les utilisateurs créént par défaut des fichiers que seuls eux peuvent voir :

# echo session optional pam_umask.so umask=027 >> /etc/pam.d/common-session

Dans /etc/login.defs, changez la valeur à UMASK 027

Pour vérifier les droits de l’utilisateur courant :

$ umask

J'aime(3)Ferme-la !(0)