Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Archive for September, 2007

Niveau :      
Résumé : shred -z

Perdu, il ne s'agit pas de l'ennemi des tortues ninja.

James Bond est le père spirituel de Jack Bauer. James Bond a toujours un wagon d'avance sur ses ennemis. C'est parce que de nombreux documents transitent par James Bond. Tous les jours il lit des milliers de pages. Sean Connery mettait toutes ces pages dans une déchiqueteuse après les avoir intégralement mémorisés. Mais aujourd'hui, quelqu'un de bien équipé peut récupérer toutes ces bandelettes, les scanner et reconstituer le message original. Pierce Brosnan a donc trouvé mieux, il est informatisé. Il lui faut donc un équivalent informatique.

À chaque fichier pdf qu'il reçoit (oui James Bond ne lit que des pdf), il les mémorise et les efface aussitôt. Un jour James Bond se fait cambrioler son 2 pièces. Heureusement, il avait tout prévu. Il a soigneusement effacé chacun de ses fichiers avec shred.

# Remplace le fichier par des octets aléatoires 25 fois de suite
# On évite ainsi les éventuelles analyses de disque
$ shred 007.pdf

Par défaut shred arrondit la taille du fichier à la taille du bloc au cas où on pourrait trouver des données dans le reste du bloc. Mais comme James Bond est extrêmement précautionneux, il utilise aussi l'option -z. En effet, avoir des octets aléatoires dans un bloc ou dans un fichier c'est louche, donc il les remplace par des 0, ce qui est plus courant et évite les soupçons. Ensuite il le supprime.

$ shred -zu 007.pdf

Attention, shred ne garantit pas son fonctionnement sur les systèmes de fichier journalisés et flash car les données peuvent êtres écrites ailleurs, shred ne peut pas non plus être certain que les informations ont été supprimées des divers caches. Dans ce cas faisons plus simple, effaçons toute la partition :

$ shred -z /dev/hda1 

My name is Bond ...

Niveau :      
Résumé : 2c2 ; 4c

Aujourd'hui Jack Bauer va encore devoir sauver le monde. Mais Jack Bauer est fort, Jack Bauer a tout prévu.

Jack Bauer a une fille à qui il envoie toujours des messages chiffrés. Sa technique préférée est d'utiliser l'outil 2c2 ou 4c qui permettent de chiffrer des messages en y incorporant un flux aléatoire. Quel est l'intérêt ? Il est tout simplement que personne ne peut distinguer un flux aléatoire d'un flux de données correctement chiffrées.

Et alors ? Alors aujourd'hui Jack Bauer doit aussi envoyer un message à un agent secret chinois du FBINSACIA pour lui expliquer qu'un terroriste français veut faire sauter la capitale du monde avec une bombe nucléaire placée sous une faille géologique.

Mais pas de chance pour lui dès 14h du matin, Jack Bauer est capturé par le fils du méchant qui est aussi un salaud de djihadiste communiste extrémiste. Son plaisir est de torturer et il va donc torturer Jack Bauer pour lui soutirer le mot de passe du fichier envoyé par Jack Bauer sur son blog.

Et là, Jack Bauer, malin, donne le mot de passe après s'être fait arracher un 3e ongle de pied : "J'aime les patates". Le terrible méchant sort son iBook, décrypte le tout et commence à lire :

  • Acheter du riz
  • Anniversaire de la mort de maman
  • Aller chercher le chien à la SPA
  • Pense a faire tes devoirs

À 15h du soir Jack Bauer réussit à s'enfuir après avoir tué 3 gardes chacun faiblement armé d'une kalachnikov, d'un poignard et d'une bombe à fragmentation dans l'estomac. Il sort son iPod et commence à transmettre à son contact : "Une journée ne dure que 16h sur 24h". Le chinois à l'écoute sur son iPhone commence à décrypter le fichier et peut lire :

  • Les mercenaires ne sont plus allemands mais français- stop
  • L'ennemi dispose d'une bombe - stop
  • Elle est cachée là où tu sais - stop

- Parti en mission suicide - stop - Bisous et pense à t'occuper du chien

Jack Bauer a une fois de plus triomphé des méchants qui menacent l'ordre mondial !


continue reading...

Niveau :      
Résumé : ssh -o VerifyHostKeyDNS=yes

Vous avez tous déjà touché à un ssh. Rappelez-vous votre première connexion :

$ ssh 127.0.0.1
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
RSA key fingerprint is d9:16:53:ef:84:cf:1a:ce:42:03:55:09:86:5c:0e:50.
Are you sure you want to continue connecting (yes/no)?

Mais qu'est-ce que c'est que ce bin's ? Bon aujourd'hui vous êtes grands, vous le savez, il s'agit de vérifier que la machine à laquelle on parle est bien celle à laquelle on voulait parler. Pour faire cette vérification, il faut aller demander à une personne de confiance qui administre ou qui s'est déjà connectée à la machine, si l'empreinte que vous avez sous les yeux est la bonne.

En pratique personne ne le fait ! Si vous l'avez toujours fait, soit vous ne vous êtes jamais connecté avec ssh, soit vous êtes Rain-Man. Sinon vous êtes à peu près normal.

Par conséquent vous faites confiance aux pirates de tout poil pour ne pas avoir attaqué votre serveur au moment de votre première session. Question qui ne se pose plus par la suite où vous faites implicitement confiance à vos connexions précédentes.

Confiance relative

Que faire pour éviter le désagrément de cette première connexion ? Tout dépend de votre confiance. Vous pouvez avoir une confiance absolue en votre réseau de machines :

$ ssh -o StrictHostKeyChecking=no mamachine.toto.net

Ou alors vous pouvez avoir une confiance nulle et considérer toute connexion dont la clé n'a pas été ajoutée à la main comme une première connexion :

$ ssh -o StrictHostKeyChecking=yes mamachine.toto.net

La valeur par défaut est ask et est écrite dans /ect/ssh/ssh_config (ou ~/.ssh/config si vous en avez un).


continue reading...

Niveau :      
Résumé : ionice

Vous avez maintenant pris l'habitude de lancer vos programmes gourmands avec nice pour éviter qu'ils ne monopolisent le processeur. C'est bien, mais il leur arrive encore parfois de consommer tout les accès dique et de faire ramer votre swap.

Et le sauveur s'appelle ionice. Son utilisation est simple :

$ ionice -c 2 -n 4 /usr/local/monscript

Mais que veulent dire -c 2 et -n 4 ? Il s'agit simplement de la classe et de la priorité.

  • -c 1 : temps réel, ne pas utiliser sous peine de geler la machine
  • -c 2 : standard on donne acces au disque dès qu'on en a l'occasion
  • -c 3 : on donne accès au disque lorsque personne ne l'a demand2 depuis un certain temps (quasiment jamais)

Le -n donne le niveau de priorité à l'intérieur d'une classe. Pour la classe 2 il y a 8 niveaux de 0 à 7 (0 étant la plus forte priorité). Tout comme celles de nice, ces priorités sont héritées.

Pour récupérer les informations pour un processus existant à partir de son pid :

$ ionice -p1

Vous constaterez que la plupart des processus sont dans la classe none. Selon les documentations cela connespond à -c2 -n4 ou à un calcul en fonction de la valeur de nice du preocessus.

Ainsi pour lancer un programme particulièrement gourmand je vous conseille quelque chose du genre

$ nice -n 19 ionice -c2 -n7 /usr/local/monscript

Passons à une partie plus technique. Ceci n'est possible que parce que le noyau contient un scheduler d'io. C'est une innovation récente. Ce n'est que depuis le 2.6.18 que le scheduler cfq est présent par défaut et c'est le seul qui supporte ces priorités. Mais ce n'est pas le seul à exister. Vous pouvez en compiler plusieurs et en changer soit au boot (avec l'option elevator=) soit après le boot disque par disque avec la commande

$ echo "cfq" > /sys/block/hda/queue/scheduler

Le choix d'un bon scheduler peut influencer les performances de vos serveurs de base de données ...

La documentation se trouve dans le répertoire Documentation/block des sources du noyau.

Niveau :      
Résumé : allow where .html|.php

Vous hébergez des sites web développés par vous ou par d'autres. Et bien sûr vous êtes sujets à quelques petits travers de développement, ou à quelques erreurs. Que celui qui n'a jamais poussé un répertoire CVS ou un fichier de log sur un serveur web me jette le premier octet ! Et je ne parle pas de ceux qui font joujou avec vi directement en production et créent des fichiers ~.

J'ai la solution à tous vos tracas de sécurité, il s'agit d'interdire le transfert de tous les fichiers dont l'extension n'est pas explicitement autorisée.

La méthode est simple, il suffit d'ajouter les lignes suivantes dans votre configuration apache :

    # À garder en premier
    <Files "*">
            deny from all
    </Files>
    # Liste des extensions à autoriser
    <FilesMatch ".(html|php)$">
            allow from all
    </FilesMatch>
    # On autorise aussi les urls qui se terminent par un /
    # -> implicitement les fichiers d'index
    # -> implicitement les /?var=valeur
    <LocationMatch "/$">
            allow from all
    </LocationMatch>
    # ajoutez vos règles

Au passage cela vous permettra de sécuriser un peu mieux les blogs ou wikis fournis avec des .txt et des .tgz

Niveau :      
Résumé : Match

Savez vous qu'en ssh vous pouvez imposer des contraintes à certains utilisateurs seulement.

Exemple pour interdire l'utilisation de mots de passe à un groupe d'utilisateurs (à mettre dans /etc/ssh/sshd_config) :

Match Group glandus
PasswordAuthentication no

Attention, toutes les lignes qui suivent un match sont liées à ce match juqu'au prochain match ou à la fin du fichier de configuration. Placez donc vos directives match à la fin du fichier.

Pour forcer l'utilisation d'une commande à un utilisateur donné :

Match User toto
ForceCommand /bin/cat /etc/php5/apache2/php.ini

Pour forcer l'affichage d'un texte d'avertissement avant la connexion pour les machines venant d'un certain réseau :

Match Host *.linux.fr
Banner /etc/ssh_warn

Pour interdire le forwarding de port à une machine (un utilisateur un peu doué saura bien sûr contourner ça) :

Match Address 192.168.1.1
AllowTcpForwarding no 

Niveau :      
Résumé : MaxStartups

Comment bloquer l'accès d'une personne à son serveur en une ligne ?

$ for i in $(seq 1 10) ; do nc ssh.youpi.net 22 & done

Pourquoi ? Parce qu'il existe une directive dans ssh pour protéger le serveur contre les attaques. Il s'agit de MaxStartups qui indique le maximum de connexions non authentifiées autorisées, par défaut il vaut 10. Au delà, il faudra attendre que l'une de ces connexions tcp se termine, ce qui peut prendre beaucoup de temps. Un petit malin peut donc vous bloquer indéfiniment l'accès à votre serveur.

Attention, augmenter cette valeur ne vous protège pas pour autant car le malin peut faire de même avec ses clients. Un moindre mal est d'utiliser la forme 1:2:3 pour cette valeur.

Exemple de configuration ssh :

# À partir de 10 connexions le client à 20% de chances de s'en voir refuser une nouvelle
# Cette probabilité augmente linéairement jusqu'à 30 connexions
# À partir de 30 connexions il ne pourra plus se connecter
MaxStartups 10:20:30

Cela vous donne une petite chance devant un ennemi impatient, mais c'est bien peu.

Une autre chance vous est donnée par l'option LoginGraceTime

# apres 10s sans tentative de login, la connexion est coupée (la valeur par défaut est 120)
LoginGraceTime 10

Vous pouvez aussi passer MaxStartups à une valeur extrêmement grande, mais cela ne vous protégerait plus des syn flood. Est-ce mieux ? À vous de voir où vous placez vos limites.