Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Archive for February, 2008

Bonjour,

Suite a mon dernier article, je constate que je commence à avoir du mal à suivre la cadence. Hé oui ça me prend quand même un peu de temps.

J'en suis à mon 175e article et j'en suis bien content. Mais je vais réduire un peu la voilure et descendre à 3 articles par semaine, voire probablement 2. En espérant que cela permette aussi des articles de meilleure qualité. Je sais aussi que ça encouragera certains à me lire car ils n'avaient pas suffisamment de temps.

À demain pour un nouvel article technique.
--- Peck

Aujourd'hui flemme, donc on va appliquer le principe du libre, "do it yourself".

Écrivez en commentaire les infos que vous voudriez voir et étonnamment, c'est ce que vous y trouverez. Allez, courage ...

Niveau :      
Résumé : tty ; infocmp

Comment fonctionne un terminal ?

D'un point de vue unix, un terminal est un fichier, comme tout le reste. C'est à travers ce fichier qu'une application communique avec son terminal.

Quel est ce fichier ?

Chaque type de terminal correspond à un fichier dans /dev avec un nom différent, ainsi les terminaux linux seront dans /dev/tty*, les terminaux physiques seront plutôt accédés par le port série /dev/ttyS*, les terminaux virtuels ancienne génération utiliseront /dev/tty** et les terminaux virtuels plus récents utiliseront plutot /dev/pts/* . Pour savoir sur quel terminal est connecté votre ligne de commande tapez :

$ tty

Et côté "serveur" du terminal virtuel ?

Cette question ne s'applique qu'aux terminaux virtuels tty** et pts/*, ceux-ci ont en effet un pendant serveur effectuant l'affichage réel du contenu du terminal (dans une fenêtre par exemple). Pour les tty** la partie serveur correspondante est /dev/pty** et pour les pts/* il s'agit de /dev/ptmx.

Comment communique-t-on avec un terminal ?

En lui envoyant tout simplement des caractères. L'application qui a connecté votre shell à votre terminal a simplement affecté stdout et stderr à l'entrée et stdin à la sortie du fichier en question. Si vous envoyez un 'A', un A sera imprimé dans le terminal à la position du curseur. Là où ça se complique, c'est qu'il est possible de faire beaucoup plus de choses que d'afficher des caractères. Les caractères non affichables correspondent en fait à des instructions pour les terminaux et c'est grâce à ces instructions qu'on peut mettre des couleurs ou afficher des boites de dialogues dans des terminaux.

Comment connaître ces caractères spéciaux ?

Là où ça se complique encore plus, c'est que chaque type de terminal utilise des séquences différentes et a des options de fonctionnement différentes. Ceci s'explique par la quantité de technologies différentes au début des terminaux. Et pourtant ce problème est resté avec les terminaux virtuels. C'est pourquoi il a été créé une base de données avec les caractéristiques de ceux-ci. C'est termcap, pour savoir à quoi elle ressemble pour votre terminal en cours :

$ infocmp -C

Termcap étant devenue une base de données un peu grosse, sa structure et sa syntaxe ont été modifiées et c'est devenu terminfo. pour savoir à quoi elle ressemble pour votre terminal en cours :

$ infocmp -I

Comme vous voyez c'est un bazar infâme, et je ne vous détaille même pas sa syntaxe.

Mais comment font les logiciels normaux ?

Ils utilisent ncurses. Ncurses est un remplaçant de curses qui vous fournit des fonctions de haut niveau permettant d'éviter de toucher aux bases terminfo et termcap. Ainsi vous pouvez appeler une fonction directement pour changer une couleur ou tracer une ligne dans le terminal. Allez un petit exemple pour la route :

$ dialog --infobox "Bonjour" 10 30

Niveau :      
Résumé : debconf-get-selections ; dpkg-reconfigure ; debconf-set-selections

Lorsque vous installez un paquet sous debian, dpkg, apt, aptitude (ou autre) vous pose parfois quelques questions. Mais lorsque vous mettez ce paquet à jour il ne vous les repose pas même s'il en a besoin.

En réalité c'est debconf qui gère les réponses à ces questions. Il vous les pose, puis enregistre les réponses dans /var/cache/debconf/config.dat pour les redonner au paquet lorsqu'il en a besoin. Remarquez que vous pouvez vous-mêmes en avoir besoin, par exemple pour savoir ce que vous avez répondu aux questions. La commande debconf-get-selections vous donne toutes les informations

# pour le paquet postfix uniquement
$ debconf-get-selections | grep -B1 "^postfix "

Notez que si vous voulez changer ces réponses, ce n'est pas debconf-set-selections, mais dpkg-reconfigure que vous devrez utiliser (pour que les réponses soient réellement prises en compte :

$ dpkg-reconfigure postfix

Maintenant supposons que vous ayez déjà répondu à ces questions sur une machine et que vous voudriez éviter de recommencer sur toutes les machines que vous allez installer. Cette fois nous allons utiliser debconf-set-selections qui préenregistre les réponses. Debconf ne vous les posera donc pas lors de l'installation :

# sur la machine déjà installée
$ debconf-get-selections | grep "^postfix " > conf.txt
 
# sur la nouvelle machine
$ debconf-set-selections < conf.txt
$ apt-get install postfix

C'est ce qu'on appelle le preseed et c'est grâce à ça qu'on peut installer des centaines de machines sans avoir besoin d'être devant l'écran.

Niveau :      
Résumé : iptables -m timeout --timeout ; iptables -C

Bon léger retard. Après quelques erreurs de manip j'ai perdu mon patch indiqué précédemment. Ext3 contrairement à ext2 ne pardonne pas dans ce genre de situation. Heureusement photorec est mon ami et j'ai donc retrouvé mon patch.

La partie netfilter

Il s'agit d'un module netfilter permettant d'inclure des règles temporaires dans le firewall. Celles-ci ne matcheront que pendant une durée limitée. Par exemple vous voulez offrir temporairement un accès à votre serveur de photo classées Y à un ami :

$ iptables -A INPUT -s 192.168.2.1 -p tcp --dport 80 -m timeout --timeout 3600 -j ACCEPT

Si vous avez un outil (comme fail2ban) qui analyse vos logs et qui filtre les paquets de gens qui vous attaquent, vous pourrez lui indiquer que les règles sont temporaires (hé oui, si l'ip est une ip dynamique vous pouvez bloquer à vie quelqu'un qui ne devrait pas être bloqué).

$ iptables -A INPUT -s 192.168.2.1 -m timeout --timeout 86400 -j DROP

Je m'aperçois maintenant que j'aurai du nommer ce module ephemeral plutôt que timeout.

La partie iptables

Comme vous l'aurez compris, cela marche grâce à un nouveau match dans netfilter, ce qui veut dire que les règles ne disparaissent pas vraiment du firewall. C'est pourquoi le patch iptables intègre non seulement le traitement de --timeout mais ajoute aussi une nouvelle option. L'option -C permet de nettoyer les règles qui ne matcheront plus jamais. Il vous faudra donc l'utiliser régulièrement (par exemple dans cron.daily) pour éviter de trop encombrer votre firewall.

$ iptables -C
# ou
$ iptables -C INPUT

Les patchs

Maintenant vous voulez savoir comment faire pour avoir cet outil merveilleux. Tout d'abord téléchargez les 2 patchs en pièces jointes. L'un est pour le noyau, l'autre pour iptables. Ils ont été testés pour un linux 2.6.23, ils devraient marcher sur un 2.6.24 ou un 2.6.22, mais les changements sur netfilter font qu'il est peu probable qu'il marchent sur un noyau plus ancien.

Puis dans votre répertoire source linux tapez :

$ patch -p1 < timeout-linux.patch

Puis :

$ make menuconfig
# -> Networking  --->
#    Networking options  --->  
#    Network packet filtering framework (Netfilter)  --->
#    Core Netfilter Configuration  --->
#    rule timeout "match" support 

Et recompilez le module comme vous savez le faire (voire tout le noyau).

Maintenant même chose pour iptables

$ patch -p1 < timeout-iptables.patch

Et recompilez. N'oubliez pas de charger le module xt_timeout

$ modprobe xt_timeout

Et faire vos règles comme vous le désirez ...

Les patchs sont ici et .