Le Blog Utux

HTTP 200 GET /

On ne pirate pas Linux en appuyant sur la touche Entrée

Rédigé par uTux 7 commentaires

Quelques journalistes peu informés ont sauté sur une faille Linux pour tenter de monter un buzz à l'aide d'articles bien putaclicks. En effet il semblerait que le maintient de la touche Entrée au démarrage, sur un système protégé par le chiffrement Luks, permet d'accéder à shell root. Il n'en fallait pas plus pour voir fleurir de nombreux articles :

Mention spéciale pour Tom's Hardware et ses "millions de systèmes Linux" ...

Non, cette faille ne permet pas de contourner le chiffrement

Et heureusement, vous imaginez le malaise si une touche entrée suffit à péter un chiffrement AES ? Cette faille ouvre un shell root, mais les partitions chiffrées restent chiffrées. Donc non, on ne contourne pas le chiffrement.

Elle requiert un accès physique

Et à partir du moment où vous avez l'accès physique à une machine, il existe de nombreux moyens d'ouvrir un shell root. En voici deux exemples :

  • Booter un LiveCD puis faire un chroot sur le disque
  • Extraire le HDD et le brancher dans un autre ordinateur, puis utiliser un chroot

Donc c'est tout sauf une nouveauté, et c'est pour ça qu'on met les serveurs dans des salles sécurisées.

Conclusion

C'est un pétard mouillé qui est plus un bug qu'une véritable faille.

A quoi ressemble Ubuntu dans Windows 10 ?

Rédigé par uTux 2 commentaires

Depuis la mise à jour anniversary de Windows 10, il est possible d'installer un sous-système ubuntu 14.04 et de lancer bash (et d'autres logiciels), ça ressemble à ça :

Impressionné ? Non ? Moi non plus, on a déjà vu ça avec Cygwin (qui existe depuis 1995 d'après Wikipedia), la différence est que c'est supporté par Microsoft et que l'on a accès aux dépôts de ubuntu. Et comme il s'agit de la 14.04, pas de systemd, dommage cela aurait pu donner lieu de bons à trolls.

Tous ces efforts de Microsoft pour se rapprocher de Linux montrent à quel point ils sont largués. Bien que Windows soit solidement implanté dans le grand public (grâce à la vente liée) et le monde professionnel (A.D, Exchange qui sont plutôt de bons outils) c'est toujours Linux qui est en tête sur les serveurs présents sur internet (web et messagerie pour ne citer que deux domaines). En tant que sysadmin je ne peux pas faire mon métier depuis Windows, cet OS n'est pas conçu pour cela : où sont dig, tcpdump, ssh , grep ? Et pourquoi est-ce que je choisirais IIS qui nécessite d'acheter une licence Windows Server ainsi qu'une machine correctement dimensionnée (gros CPU, 4GB de RAM, 80GB de disque) tout ça pour avoir moins de souplesse et de performances que Debian + Nginx qui tiennent sur 256MB de RAM et 8GB de disque ?

Dans le monde du devops, là encore Microsoft est à la ramasse. Par exemple Ansible et Docker sont des outils libres, gratuits, communautaires, documentés et simples qui ont le vent en poupe et s'appuient sur des composants qui n'existent pas sur Windows : ssh pour le premier, les containers pour le second. Et c'est génial.

En conclusion ce sous-système ubuntu dans Windows ne révolutionne rien mais vient combler un manque de Windows et il en avait grandement besoin. Reste à voir comment il se comporte et s'administre, avec le temps.

Docker >_<

Rédigé par uTux 12 commentaires

Je ne vais pas me faire des amis, mais j'ai un problème avec Docker et je vais l'illustrer en le comparant avec ezjail qui permet de gérer les jails sous FreeBSD.

Pour afficher la liste des containers dans Docker :

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
c516f8fcbc57        httpd:v5            "/bin/bash"         9 minutes ago       Up 2 seconds        80/tcp              tender_mirzakhani

Attendez, c'est pas fini ! Cette commande ne va afficher que les containers en cours d'exécution. Si on veut tout :

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                     PORTS               NAMES
c516f8fcbc57        httpd:v5            "/bin/bash"            9 minutes ago       Up 22 seconds              80/tcp              tender_mirzakhani
974607db9cb7        httpd:v5            "apache2-foreground"   18 minutes ago      Exited (0) 8 minutes ago                       gigantic_engelbart

Et pour entrer dans un container :

$ docker exec -t -i gigantic_engelbart /bin/bash
root@974607db9cb7:/var/www/html#

Ok. Maintenant voyons comment on fait pour lister des containers avec ezjail sous FreeBSD :

ezjail-admin list
STA JID  IP              Hostname                       Root Directory
--- ---- --------------- ------------------------------ ------------------------
DR  1    127.0.1.1       jls-web-10                     /usr/jails/jls-web-10
    1    em0|192.168.0.50
DS  N/A  127.0.1.2       jls-mail-01                    /usr/jails/jls-mail-01
    N/A  em0|192.168.0.60

Et pour entrer dans un container avec ezjail :

ezjail-admin console jls-web-10
FreeBSD 10.3-RELEASE (GENERIC) #0 r297264: Fri Mar 25 02:10:02 UTC 2016

root@jls-web-10:~ #

Voilà, une seule commande simple à retenir et pas d'options superflues.

Pourquoi les commandes Docker sont-elles aussi imbuvables ? C'est un problème courrant dans l'environnement des logiciel sous Linux, on ne sait pas faire de choses simples. git est un autre exemple symptomatique, nous sommes obligés d'avoir sous la main une anti-sèche pour ne pas nous tromper dans les commandes.

Docker étant relativement récent, pourquoi ne s'est-il pas inspiré des commandes ezjail, iohyve, iocage ou lxc qui sont beaucoup plus simples et intuitives ?

OpenBSD : jouons avec httpd

Rédigé par uTux 2 commentaires

Je connais bien OpenBSD pour y avoir fait tourner mon serveur pendant plusieurs mois. J'en ai un bon souvenir, c'est un système simple à comprendre et à configurer grâce à des syntaxes humainement lisibles dans les fichiers de configuration. Malheureusement OpenBSD est encore primitif sur de nombreux points, par exemple les mises à jour. En fait il n'y a aucun dispositif de mise à jour, il faut télécharger les sets en .tgz et les décompresser en écrasant le système, voire même tout recompiler. Deux autres problèmes majeurs que je vois sont d'une part le fs UFS vieillissant et lent (surtout si on compare à FreeBSD et son ZFS) et d'autre part les ports pas toujours à jour car il y a beaucoup moins de mainteneurs disponibles. C'est pourquoi je pense qu'OpenBSD est bien pour certains usages spécialisés qui peuvent se contenter des daemons de base, mais dans beaucoup d'autres cas il se fait éclater par FreeBSD et Linux, par exemple en usage stockage ou desktop.

A l'époque où j'utilisais OpenBSD (2011), le daemon web était un Apache 1.x lourdement modifié et le projet était en cours de migration vers Nginx. Mais ce dernier a été délaissé à son tour au profil de httpd, un serveur maison. Je n'y ai pas vraiment prêté attention jusqu'à récemment avec la lecture du blog de thuban (ou encore De l'épice pour la pensée) qui m'a rendu curieux. Thuban est tellement amoureux d'OpenBSD que quelques temps après l'avoir essayé, il a migré son serveur et écrit un livre.

Exemple simple

Puisqu'on est sur OpenBSD, la configuration sera forcément humainement lisible et centralisée dans un fichier. Le manpage est consultable ici. OMG UN MANPAGE, MER IL ET FOU ! Et oui, sur Linux les manpage sont souvent imbuvables, mais sur OpenBSD ce n'est pas le cas. Pas de panique, on va faire un exemple ensemble :)

On va simplement configurer notre httpd pour servir une page lorsque l'IP du serveur est appelée.

Voici ce qu'on met dans notre /etc/httpd.conf :

server "default" {
        listen on * port 80
}

Par défaut, notre serveur travaillera dans /var/www/htdocs et /var/www/logs. On créé une page html de test :

echo "Hello" > /var/www/htdocs/index.html

On autorise httpd à démarrer :

echo httpd_flags="" >> /etc/rc.conf.local

Puis on démarre httpd :

/etc/rc.d/httpd start

En tapant l'adresse IP du serveur dans votre navigateur, vous devriez avoir le Hello sur fond blanc.

Vous pouvez éventuellement jeter un œil aux fichiers de logs :

cat /var/www/logs/access.log
default 192.168.0.3 - - [01/Aug/2016:14:13:14 +0200] "GET / HTTP/1.1" 200 31

Exemple avancé

Afin d'explorer les possibilités de httpd, on va le triturer de la manière suivante :

  • Écriture des logs dans /var/log/httpd/
  • Fichiers de configuration splittés
  • Deux vhosts
  • https sur un des vhosts

Commençons par créer les arborescences pour nos deux vhosts, avec deux fichiers index.html :

mkdir /var/www/htdocs/site1
echo "Site1" > /var/www/htdocs/site1/index.html
mkdir /var/www/htdocs/site2
echo "Site2" > /var/www/htdocs/site2/index.html

On créé aussi le répertoire pour les logs et pour nos fichiers splités :

mkdir /var/log/httpd
chown -R www: /var/log/httpd
mkdir /etc/httpd

On génère notre certificat de sécurité :

openssl req -new -x509 -days 365 -nodes -out /etc/ssl/cert.pem -keyout /etc/ssl/key.pem
chmod 600 /etc/ssl/key.pem
ls -l /etc/ssl/*.pem
-r--r--r--  1 root  bin    1180 Aug  1 22:46 /etc/ssl/cert.pem
-rw-------  1 root  wheel  1704 Aug  1 22:46 /etc/ssl/key.pem

On édite notre /etc/httpd.conf dans lequel on va définir nos paramètres globaux, ainsi que nos fichiers splittés de vhost :

chroot "/var/www"
logdir "/var/log/httpd"
include "/etc/httpd/site1.conf"
include "/etc/httpd/site2.conf"

Note : la ligne chroot est inutile ici car sa valeur par défaut est déjà /var/www néanmoins je trouve utile de la préciser, par souci de lisibilité.

/etc/httpd/site1.conf :

server "default" {
        listen on * port 80
        root "/htdocs/site1"
        }

/etc/httpd/site2.conf :

server "ssl" {
        listen on * tls port 443
        root "/htdocs/site2"
        tls certificate "/etc/ssl/cert.pem"
        tls key "/etc/ssl/key.pem"
        }

Note : root doit être un chemin relatif au chroot. Par exemple le /htdocs/site2 se rapporte implicitement à /var/www/htdocs/site2.

Après avoir rechargé httpd, l'accès à notre serveur en http (port 80) doit afficher le site 1 :

Et l'accès en https (port 443) doit afficher le site 2 :

Conclusion

httpd est un serveur web simple à prendre en main qui ne plaisante pas avec la sécurité, le chroot ayant une place importante dans son fonctionnement. Alors faut-il laisser tomber Apache et Nginx ? Pour un usage basique, c'est à dire servir des pages web, pourquoi pas, car c'est simple et robuste. En revanche, pour des usages avancés, non. À part renvoyer les requêtes dans un socket en fastcgi et servir du contenu statique, on ne peut pas faire grand chose. Pas de reverse proxy par exemple, ce rôle étant confié à relayd. Un autre point agaçant est le fait qu'en cas d'erreur le daemon httpd refuse de démarrer mais n'affiche aucune erreur et ne produit aucun log, donc bonne chance pour debugger.

Si vous êtes un amoureux d'OpenBSD, il est évident que vous ne tarderez pas à migrer vers httpd. Si vous n'êtes qu'un simple Linuxien, j'espère que cet article aura chatouillé votre curiosité.

Question ouverte : comment chiffrer simplement une clé USB ?

Rédigé par uTux 15 commentaires

Je regrette qu'en 2016 les principaux OS ne proposent pas de solution simple de chiffrement pour les clés et disques durs USB, des périphériques qui sont amenés à voyager régulièrement en dehors de la maison/bureau. Il est très facile voire courant de les perdre et celui qui va les trouver pourra récupérer vos documents. Vous me direz qu'il est rare de stocker les codes de la bombe atomique sur une clé USB ou même son code de carte bleue, en revanche il est courant d'y trouver des documents scannés (relevés d'impôts, de salaires, papiers d’identité....) ou même simplement du porno des photos de vacances.

Windows

Windows propose d'activer le chiffrement d'un volume en un simple clic droit, autant sur le C: que sur les périphériques USB, ce qui est louable. Malheureusement cette solution basée sur Bitlocker a trois gros défauts :

  • Elle n'existe que sur Windows, aucun portage Linux ou OS X.
  • Elle se limite aux éditions Pro ou supérieures pour Windows, ce qui exclue les versions Home que la majorité du grand public utilise.
  • Quelle confiance peut-on placer dans une solution propriétaire de chiffrement surtout quand on sait que Windows 10 se lie de plus en plus au cloud. De là à affirmer que Microsoft peut casser le chiffrement des ordinateurs de ses clients, il n'y a qu'un pas, que je ne franchis pas pour le moment, mais je préfère rester méfiant.

Linux

Du côté de Linux on a luks, ecrypfs ou encfs mais à ma connaissance il n'est pas possible de les activer avec un simple clic droit dans l'explorateur de fichiers, il faut passer par la ligne de commandes (et refaire toutes les partitions dans le cas de luks) ce qui freine fortement leur utilisation. De plus les périphériques ne seront pas déchiffrables sur Windows.

TrueCrypt / VeraCrypt ?

Une solution multi-plateforme et relativement simple à mettre en place est Truecrypt. Même si le projet a connu une fin tragique et ne doit plus être considéré comme sûr selon ses auteurs, il existe des forks tels que Veracrypt qui ont pris le relais.

Il est apparemment possible d'utiliser VeraCrypt sous forme portable, donc sans nécessiter d'installation sur l'ordinateur, ce qui est plutôt intéressant car on peut imaginer utiliser sa clé USB sur plusieurs ordinateurs sans devoir y installer de logiciel. Cette solution est également disponible sur Linux.

Question ouverte

Comment chiffrer une clé ou un disque dur USB tout en étant sûr de pouvoir l'ouvrir simplement sur Linux et sur Windows ?

Fil RSS des articles de cette catégorie