Comportement postfix vs portmap

Top Page

Reply to this message
Author: Olivier Allard-Jacquin
Date:  
CC: Liste Guilde
Old-Topics: Re: remerciements et autre questions
Subject: Comportement postfix vs portmap
    Hello Edgar,


    suite à ton commentaire, j'ai fais quelques petits tests ce soir sur ma 
machine. Elle possède 2 interfaces réseaux (eth0 et eth1, voir 
http://olivieraj.free.fr/fr/linux/information/firewall/fw-02-01.html), 
plus un loopback (lo). Comme indiqué dans ma doc, j'ai bien restreint 
l'écoute sur certaines interfaces (eth0 et lo) :


<extrait du /etc/postfix/main.cf>
inet_interfaces = localhost.localdomain phoenix0.sky.net
</extrait du /etc/postfix/main.cf>

et j'ai bien :

<commande>
[root@phoenix /]# netstat -lt | grep smtp
tcp  0  0 phoenix0.sky.net:smtp   *:*          LISTEN
tcp  0  0 localhost.localdom:smtp *:*          LISTEN
</commande>


Ma 2nd carte réseau (eth2) n'appairait pas dans le liste


    Par contre lors de mon précédent mail, si j'avais un doute sur la 
restriction effective de postfix à une certaine interface, c'était à 
cause de mes experiences avec "portmap".


    Je m'explique (t'ention, c'est long... :=)) :


    Bien que ce demon ait de l'âge, et qu'il soit un gros trou de sécurité 
potentiel (c'est un RPC, c'est donc l'équivalent de ce qui tourne sous 
Windows derrière le port 135, rendu tristement célèbre avec les attaques 
de MSBlaster de l'été), il n'en reste pas moins essentiel pour d'autres 
démons, dont :
- fam (/etc/xinetd.d/fam) : C'est un démon qui surveille l'activité sur 
les fichiers. Pas mal de softs y font appel, dont "Konqueror" sous KDE, 
qui l'utilise pour savoir par exemple si des images ont été modifiées, 
et si il doit rafraîchir les vignettes.
- NFS (Serveur de fichiers) : Je ne travaille pas qu'avec des réseaux 
Samba, et NFS n'a pas d'équivalent lorsqu'il s'agit de transmettre des 
fichiers en prenant en compte les droits d'accès, et les 
majuscules/minuscules. Transférer un 2 fichiers d'un même répertoire ne 
se différenciant que par la case pose un gros problème avec Samba, et 
aucun avec NFS.


    Fam a besoin d'une connexion avec RPC, et pour cela il se satisfait 
d'une connexion sur l'interface loopback.


    NFS est plus pénible, car il doit être pouvoir dialoguer avec le client 
à distance qui demande un partage NFS. Du coté de ce client d'ailleurs, 
lui-même doit avoir lancé portmap. Mais pour lui, un simple échange sur 
son interface loopback suffit (dialogue possible entre le "mount.nfs" et 
la commande "mount" je suppose).


    Il convient donc de sécuriser au maximum portmap, afin de restreindre 
ses connexions aux seules interfaces susceptibles  de l'utiliser. Dans 
mon cas, il s'agit toujours des interfaces "eth0" et "lo" : "eth1" ne 
partageant pas de NFS, pas la peine de prendre de risque.


    La seule méthode de sécurisation de portmap est d'utiliser les fichiers 
/etc/hosts.allow et /etc/hosts.deny. J'ai vu traîner sur la doc de 
xinetd que l'on pouvait utiliser ce dernier afin de sécuriser portmap, 
mais que la solution était encore instable, et fortement déconseillé...


    Donc j'ai configuré ainsi mes fichiers de configuration :
<extrait /etc/hosts.deny>
# (2003/12/12) Reglages du partage NFS
# On interdit toutes les connexions
# Les connexions seront autorisées dans le /etc/hosts.allow
portmap: ALL
</extrait /etc/hosts.deny>



<extrait /etc/hosts.allow>
# (2003/12/15) Autorise portmap à écouter sur le loopback.
# Certains services comme fam (lancé par xinetd) l'utilise.
# Les CLIENTS NFS en on aussi besoin, afin de communiquer avec leur
# propre commande ("mount" ???)
portmap: 127.0.0.0/8

# (2003/12/15) Partage NFS
# On autorise uniquement les connexions depuis les machines du réseau
# local
# Sans activation du portmap pour ces réseaux, les machines à distance
# NE peuvent PAS accéder aux partages NFS
portmap: 192.168.0.0/255.255.255.0
</extrait /etc/hosts.allow>

    C'est la technique classique du "j'interdis tout par défaut, et je 
n'autorise que quelques connexions aux compte goutte.


    Avec une telle configuration, on pourrait se dire que portmap n'écoute 
que sur les interfaces "utiles" ("lo" et "eth0"), et non sur les 
interfaces "dangereuses", comme "eth2". Et ben non :


<commande>
[root@phoenix /]# service portmap restart
[root@phoenix /]# netstat -lt | grep rpc
tcp  0      0 *:sunrpc                *:*           LISTEN
</commande>


    Malgrès sa configuration sans équivoque, portmap écoute sur TOUTES les 
interfaces réseaux, et non seulement sur "lo" et "eth0".


    Ceci est bien entendu confirmé par un nmap lancé depuis une machine 
connectée sur l'interface eth1 :


<commande>
[olivier@pirate /]$ nmap phoenix1 -p 111

Starting nmap 3.30 ( http://www.insecure.org/nmap/ ) at 2000-01-01 05:23 CET
Interesting ports on phoenix1.internet.net (10.0.0.1):
Port       State       Service
111/tcp    open        sunrpc


Nmap run completed -- 1 IP address (1 host up) scanned in 0.382 seconds
</commande>

    Bien entendu, portmap ignorera les requêtes arrivant sur cette 
interface eth2. Mais comme me le confirme un "strace" sur le PID de 
portmap et une récupération des trames de la connexion, celui-ci lit 
bien le paquet entrant, d'où un risque d'attaque par buffer overflow...


<commande>
[root@phoenix /]# ps -edf | grep [p]ortmap
rpc      13963     1  0 01:16 ?        00:00:00 portmap
[root@phoenix /]# strace -f -o /tmp/portmap1.log -v -p 13963
</commande>


    J'ai même teste un bon vieux "telnet phoenix1 111", et portmap accepte 
bien l'ouverture de session, même si il finit par la refermer à la 
première commande un peu louche qu'on lui envoie...


    Fin de l'explication....


    Bref, voila qui explique mon précédent mail à propos de postfix, et sur 
sa capacité à bien se restreindre aux seules interfaces configurées dans 
le "inet_interfaces".


    Bon, pendant que je suis dans la configuration des /etc/hosts.*, j'ai 
fait une petite expérience : Pourquoi ne pas tout simplement configurer 
le "/etc/hosts.deny" de la manière la plus restrictive possible et tout 
interdire par défaut :


<extrait /etc/hosts.deny>
# (2003/12/12) Par defaut, tous les serveurs sont interdits
# A mettre en commentaire si sertains services se mettent à ne plus
# marcher...
ALL:ALL
</extrait /etc/hosts.deny>

    Et bien en fait c'est une assez mauvaise idée, parce qu'avec cela, 
pleins de demons commencent à planter. A commencer par "ipop3d", le 
demon POP3 lancé via xinetd. Bien que via le "/etc/xinetd.d/ipop3" je 
laisse les process tournant sur le loopback y accéder, la première chose 
que fait xinetd lors d'une connexion sur le port 110 est d'interroger 
les "/etc/hosts.*" (ceci est visible via un "strace").


    Il convient donc de rajouter dans le "/etc/hosts.allow" :
<extrait /etc/hosts.allow>
# (2003/12/15) Serveur POP3 (récupération de mails), lancé sous
# contrôle de xinetd
ipop3d: 127.0.0.0/255.0.0.0
<extrait /etc/hosts.allow>


    Avis aux amateurs donc : Un "ALL:ALL" dans "/etc/hosts.deny" réserve 
certaines surprises...


    Ah, une dernière chose. Il y a un bug dans "xinetd 2.3.11" ou dans 
"libwrap 7.6" : Bien que la notation "127.0.0.0/8" soit autorisée dans 
le "man hosts.allow/hosts.deny", elle ne marche pas : Il faut lui 
préférer la notation du type "127.0.0.0/255.0.0.0". J'ai mis 10 minutes 
à trouver cela, même à grand coup de strace et de "/var/log/messages"...


    Bonne nuit,


                    Olivier



Edgar Bonet wrote:
> Oui, c'est suffisant : après avoir mis inet_interfaces = localhost,
> j'ai :
>
> # netstat -lt | grep smtp
> tcp        0      0 *:smtp                  *:*                     LISTEN
> # /etc/init.d/postfix restart
> Shutting down postfix: postfix
> Starting postfix: postfix
> # netstat -lt | grep smtp
> tcp        0      0 localhost.localdom:smtp *:*                     LISTEN


-- 
~~~~~~~  _____/\_____  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Phoenix /   _ \/ _   \    Olivier Allard-Jacquin
       /   / \  / \   \   Web:  http://olivieraj.free.fr
      /___/  /  \  \___\  Mail: olivieraj@???
~~~~ /////  ///\\\  \\\\\ ~~~~~~~~~~~~~~~~~~~~~~~ Linux Powered !!