II-5-1 Un peu de bon sensLa première chose à faire, est de lancer un petit audit de votre machine. Pour cela, utilisez "nmap", "netstat" et ses petits copains pour déterminer quels sont les serveurs qui tournent sur votre machine. Rappelez vous que lancer nmap sur les ports UDP est très long, et qu'il est plus rapide d'abord de rechercher la présence des ports UDP avec "netstat", puis de les tester au cas par cas avec nmap.Bon, une fois que c'est fait, posez vous la question : "Est-ce que j'ai besoin du serveur xxxxx ?". Parfois, la réponse peut être négative, et auquel cas l'action doit être immédiate : fermer au plus tôt ce serveur !! Il n'y a rien de plus dangereux que de laisser un serveur tourner sans l'utiliser, car on fini par oublier jusqu'à sa présence, et on ne fera pas attention à le mettre à jour pour corriger ses défauts. Auquel cas, un intrus peut tomber sur ce serveur et bénéficier d'un trou de sécurité pour pénétrer dans votre machine. Dans l'exemple qui va suivre, on va chercher à supprimer le serveur Samba / NetBIOS de la machine Phoenix. Samba est un système le partage de fichiers en réseau avec les machines Windows® :
[root@phoenix /]# nmap phoenix0.sky.net -p 138,139 && nmap phoenix0.sky.net -p 137,138 -sU
Starting nmap V. 3.00 ( www.insecure.org/nmap/ )
Interesting ports on phoenix.sky.net (192.168.0.1):
(The 1 port scanned but not shown below is in state: closed)
Port State Service
139/tcp open netbios-ssn
Nmap run completed -- 1 IP address (1 host up) scanned in 1 second
Starting nmap V. 3.00 ( www.insecure.org/nmap/ )
Interesting ports on phoenix.sky.net (192.168.0.1):
Port State Service
137/udp open netbios-ns
138/udp open netbios-dgm
Nmap run completed -- 1 IP address (1 host up) scanned in 1 second
D'après les commandes nmap, trois ports (139/tcp, 137/udp et 138/udp) sont utilisés pour le service "netbios". Oui, ce serveur est un peu particulier, d'où l'utilisation dans cet exemple... En fait le protocole "NetBIOS" peut utiliser les ports/protocoles suivant: 137/tcp/udp, 138/tcp/udp, et 139/tcp/udp). Afin de supprimer ce serveur, il nous faut d'abord savoir quels sont les programmes qui tournent derrière ces ports :
[root@phoenix /]# netstat -taupe | sort Connexions Internet actives (serveurs et établies) Proto Recv-Q Send-Q Adresse locale Adresse distante Etat Utilisatr Inode PID/Program name tcp 0 0 phoenix1.in:netbios-ssn *:* LISTEN root 4583 2157/smbd tcp 0 0 phoenix.sky:netbios-ssn *:* LISTEN root 4584 2157/smbd udp 0 0 phoenix1.in:netbios-dgm *:* root 4599 2167/nmbd udp 0 0 phoenix1.int:netbios-ns *:* root 4598 2167/nmbd udp 0 0 phoenix.sky:netbios-dgm *:* root 4601 2167/nmbd udp 0 0 phoenix.sky.:netbios-ns *:* root 4600 2167/nmbdSeul les lignes contenant "netbios" sont affichées. On voit que les programmes qui tournent sont "smbd" et "nmbd". Bien, voila qui est intéressant. Maintenant, nous allons chercher le programme qui a lancé ces serveurs. Sous Linux, tous les programmes (en fait, ce sont des scripts shell) qui lancent des démons sont situés dans "/etc/init.d/" :
[root@phoenix /]# ls -la /etc/init.d/
-rwxr--r-- 1 root root 1838 mar 14 17:11 smb*
Seul le script qui nous intéresse est affiché. On voit donc que l'on a un script appelé "/etc/init.d/smb" qui pourrait bien correspondre à ce que nous voulons. Lançons le, histoire de voir :
[root@phoenix /]# /etc/init.d/smb
Utilisation : /etc/init.d/smb {start|stop|restart|status|condrestart}
Bon, le programme demande un paramètre. Les scripts de démons doivent en effet être lancés en leur indiquant l'opération à effectuer. Ainsi, on trouve généralement les options suivantes :
[root@phoenix /]# /etc/init.d/smb status smbd (pid 2157) est en cours d'exécution... nmbd (pid 2167) est en cours d'exécution...Bingo ! Se script contrôle le lancement de "smbd" et "nmdb" et les PID sont les mêmes que ceux de la commande "netstat" précédente. C'est donc bien ce script qui nous intéresse. Arrêtons donc le serveur Samba : [root@phoenix /]# /etc/init.d/smb stop Arrêt des services SaMBa : [ OK ] Arrêt du service NMB : [ OK ] [root@phoenix /]# /etc/init.d/smb status smbd est arrêté nmbd est arrêtéSamba semble arrêté, comme le confirme la 2nd commande. Il nous reste plus qu'à le vérifier :
[root@phoenix /]# nmap phoenix0.sky.net -p 139 && nmap phoenix0.sky.net -p 137 -sU
Starting nmap V. 3.00 ( www.insecure.org/nmap/ )
The 1 scanned port on phoenix.sky.net (192.168.0.1) is: closed
Nmap run completed -- 1 IP address (1 host up) scanned in 0 seconds
Starting nmap V. 3.00 ( www.insecure.org/nmap/ )
The 1 scanned port on phoenix.sky.net (192.168.0.1) is: closed
Nmap run completed -- 1 IP address (1 host up) scanned in 1 second
OK, "nmap" ne trouve plus rien. Et "netstat" ?
[root@phoenix /]# netstat -taupe | grep netbios | sort
Et "netstat" non plus. Victoire, nous venons de supprimer un serveur et de fermer des ports !!! Bien, plus de risque à craindre pour ce serveur. Si un intrus fait un "nmap" sur ces ports, il ne trouvera rien. Et il pourra bien tenter tout ce qu'il veut comme attaque sur Samba, rien ne se passera.Mais ce serveur n'est arrêté que tant que votre machine fonctionne. Maintenant, nous pouvons nous débrouiller pour que ce serveur ne soit plus du tout lancé aux prochains démarrages de la machine. Sous Linux, pour démarrer automatiquement un serveur il suffit de créer un lien symbolique. Suivant que votre machine démarre en mode texte ou en mode graphique, il faut créer un lien symbolique dans respectivement les répertoires "/etc/rc.d/rc3.d/" ou "/etc/rc.d/rc5.d/", vers le script du serveur qui se trouve dans le "/etc/init.d". Concrètement, voila comment cela se passe :
[olivier@phoenix /]$ ls -la /etc/rc.d/rc3.d/ /etc/rc.d/rc5.d/
/etc/rc.d/rc3.d/ :
total 8
drwxr-xr-x 2 root root 4096 jun 28 11:35 ./
drwxr-xr-x 10 root root 4096 mar 27 20:23 ../
lrwxrwxrwx 1 root root 20 mar 27 20:32 K15postgresql -> ../init.d/postgresql*
lrwxrwxrwx 1 root root 16 mar 27 20:28 K55routed -> ../init.d/routed*
lrwxrwxrwx 1 root root 23 mar 27 20:27 S01switchprofile -> ../init.d/switchprofile*
lrwxrwxrwx 1 root root 18 mai 27 19:43 S03iptables -> ../init.d/iptables*
lrwxrwxrwx 1 root root 17 mar 27 20:33 S10network -> ../init.d/network*
lrwxrwxrwx 1 root root 15 mai 4 21:02 S10ulogd -> ../init.d/ulogd*
lrwxrwxrwx 1 root root 17 mar 27 20:33 S11portmap -> ../init.d/portmap*
lrwxrwxrwx 1 root root 16 mar 27 20:33 S12syslog -> ../init.d/syslog*
lrwxrwxrwx 1 root root 14 mar 27 20:23 S17alsa -> ../init.d/alsa*
lrwxrwxrwx 1 root root 15 mar 27 20:33 S18sound -> ../init.d/sound*
lrwxrwxrwx 1 root root 16 mar 27 20:33 S20random -> ../init.d/random*
lrwxrwxrwx 1 root root 13 mar 27 20:24 S20xfs -> ../init.d/xfs*
lrwxrwxrwx 1 root root 12 mar 27 20:23 S30dm -> ../init.d/dm*
lrwxrwxrwx 1 root root 13 mar 27 20:28 S40atd -> ../init.d/atd*
lrwxrwxrwx 1 root root 19 mar 27 20:26 S40saslauthd -> ../init.d/saslauthd*
lrwxrwxrwx 1 root root 15 avr 3 23:23 S55named -> ../init.d/named*
lrwxrwxrwx 1 root root 16 mar 27 20:32 S56xinetd -> ../init.d/xinetd*
lrwxrwxrwx 1 root root 15 avr 3 20:02 S65dhcpd -> ../init.d/dhcpd*
lrwxrwxrwx 1 root root 18 mar 27 20:33 S75keytable -> ../init.d/keytable*
lrwxrwxrwx 1 root root 17 mar 27 20:26 S80postfix -> ../init.d/postfix*
lrwxrwxrwx 1 root root 15 mar 27 20:25 S85httpd -> ../init.d/httpd*
lrwxrwxrwx 1 root root 17 mar 27 20:28 S85numlock -> ../init.d/numlock*
lrwxrwxrwx 1 root root 15 mar 27 20:33 S90crond -> ../init.d/crond*
lrwxrwxrwx 1 root root 15 mai 25 17:48 S90mysql -> ../init.d/mysql*
lrwxrwxrwx 1 root root 13 mar 27 20:30 S91smb -> ../init.d/smb*
lrwxrwxrwx 1 root root 17 mar 30 22:37 S92privoxy -> ../init.d/privoxy*
lrwxrwxrwx 1 root root 17 mar 27 20:33 S95kheader -> ../init.d/kheader*
lrwxrwxrwx 1 root root 16 mar 27 20:28 S99devfsd -> ../init.d/devfsd*
lrwxrwxrwx 1 root root 11 mar 27 20:23 S99local -> ../rc.local*
/etc/rc.d/rc5.d/ :
total 8
drwxr-xr-x 2 root root 4096 jun 28 11:35 ./
drwxr-xr-x 10 root root 4096 mar 27 20:23 ../
lrwxrwxrwx 1 root root 20 mar 27 20:32 K15postgresql -> ../init.d/postgresql*
lrwxrwxrwx 1 root root 16 mar 27 20:28 K55routed -> ../init.d/routed*
lrwxrwxrwx 1 root root 23 mar 27 20:27 S01switchprofile -> ../init.d/switchprofile*
lrwxrwxrwx 1 root root 18 mai 27 19:43 S03iptables -> ../init.d/iptables*
lrwxrwxrwx 1 root root 17 mar 27 20:33 S10network -> ../init.d/network*
lrwxrwxrwx 1 root root 15 mai 4 21:02 S10ulogd -> ../init.d/ulogd*
lrwxrwxrwx 1 root root 17 mar 27 20:33 S11portmap -> ../init.d/portmap*
lrwxrwxrwx 1 root root 16 mar 27 20:33 S12syslog -> ../init.d/syslog*
lrwxrwxrwx 1 root root 14 mar 27 20:23 S17alsa -> ../init.d/alsa*
lrwxrwxrwx 1 root root 15 mar 27 20:33 S18sound -> ../init.d/sound*
lrwxrwxrwx 1 root root 16 mar 27 20:33 S20random -> ../init.d/random*
lrwxrwxrwx 1 root root 13 mar 27 20:24 S20xfs -> ../init.d/xfs*
lrwxrwxrwx 1 root root 12 mar 27 20:23 S30dm -> ../init.d/dm*
lrwxrwxrwx 1 root root 13 mar 27 20:28 S40atd -> ../init.d/atd*
lrwxrwxrwx 1 root root 19 mar 27 20:26 S40saslauthd -> ../init.d/saslauthd*
lrwxrwxrwx 1 root root 15 avr 3 23:23 S55named -> ../init.d/named*
lrwxrwxrwx 1 root root 16 mar 27 20:32 S56xinetd -> ../init.d/xinetd*
lrwxrwxrwx 1 root root 15 avr 3 20:02 S65dhcpd -> ../init.d/dhcpd*
lrwxrwxrwx 1 root root 18 mar 27 20:33 S75keytable -> ../init.d/keytable*
lrwxrwxrwx 1 root root 17 mar 27 20:26 S80postfix -> ../init.d/postfix*
lrwxrwxrwx 1 root root 15 mar 27 20:25 S85httpd -> ../init.d/httpd*
lrwxrwxrwx 1 root root 17 mar 27 20:28 S85numlock -> ../init.d/numlock*
lrwxrwxrwx 1 root root 15 mar 27 20:33 S90crond -> ../init.d/crond*
lrwxrwxrwx 1 root root 15 mai 25 17:48 S90mysql -> ../init.d/mysql*
lrwxrwxrwx 1 root root 13 mar 27 20:30 S91smb -> ../init.d/smb*
lrwxrwxrwx 1 root root 17 mar 30 22:37 S92privoxy -> ../init.d/privoxy*
lrwxrwxrwx 1 root root 17 mar 27 20:33 S95kheader -> ../init.d/kheader*
lrwxrwxrwx 1 root root 16 mar 27 20:28 S99devfsd -> ../init.d/devfsd*
lrwxrwxrwx 1 root root 11 mar 27 20:23 S99local -> ../rc.local*
Dans ces 2 répertoires, on voit donc 2 liens "S91smb -> ../init.d/smb*" qui lancent le serveur Samba lors du démarrage de la machine. Nous allons donc les supprimer, et ainsi Samba ne sera plus jamais lancé :
[root@phoenix /]# rm /etc/rc.d/rc3.d/S91smb /etc/rc.d/rc5.d/S91smb
rm: détruire lien symbolique `/etc/rc.d/rc3.d/S91smb'? y
rm: détruire lien symbolique `/etc/rc.d/rc5.d/S91smb'? y
Mais d'un autre coté, nous venons aussi d'arrêter le partage de fichiers avec les autres machines Windows® de notre réseau... Hummm, ce n'est n'est pas très bien, car nous voudrions bien que Paradise récupère sur Phoenix la dernière documentation du kernel Linux que nous avons téléchargé.Conclusion : autant arrêter des serveurs qui ne servent pas est primordiale, autant arrêter des serveurs qui sont utilisés est problématique. Non, décidément dans ce dernier cas ce n'est pas la solution. Il nous faudra faire autre chose. L'idéal serait de dire au serveur "Ne réponds qu'aux machines de sky.net, et ne répond pas aux autres". Oui, cela serait très bien. Mais comment faire ? C'est là qu'il faut plonger dans l'antre les fichiers de configuration, dans le "man" ou le "info", et paramétrer finement ses serveurs. II-5-2 Restrictions des connexions aux ports : GénéralitésPour les sections qui vont suivre, je rappelle au lecteur que l'emplacement des fichiers de configuration et/ou les options qui sont utilisés ont été testés avec une distribution Mandrake 9.1. Pour les autres distribution Linux (Debian, Red Hat, Suze, Slackware, Gentoo, etc...) ou pour des futures versions de la Mandrake, ces fichiers peuvent éventuellement être placés ailleurs, et certaines options ne sont peut-être pas les mêmes. Par contre, ce qui est important c'est la méthodologie que vous trouverez ici. Elle vous permettra de retrouver par vous mêmes les bonnes options de configuration.Dans les fichiers de configuration des divers serveurs, les "mots magiques" qui vont permettre de paramétrer le filtrage des demandes de connexion sont :
Une règle importante pour ce type de paramétrage, c'est que l'on n'est jamais trop paranoïaque. Ainsi, n'hésitez pas à utiliser en même temps les paramètres de types "bind" et "from", afin de doubler la sécurité, et de contrôler à la fois les adresse IP source et destination des requêtes. Maintenant, regardons pour certains serveurs spécifiques comment cela fonctionne. Au risque de vous déplaire, je ne parlerai que des fichiers de configuration, et non des interfaces graphiques qui permettent de saisir agréablement ces paramètres. Tout simplement parce que je ne les utilise pas, et que je travaille plus vite en configurant à la main les fichiers de configuration. Certains dirons que j'ai des pratiques de papy de l'informatique, auquel je répondrais que moi, je ne me suis pas fait greffé une sourie à la place de la main ... Mais n'entamons pas là un nouveau troll, et passons directement à la suite... II-5-3 Samba / NetBIOSOn a déjà parlé précédemment de Samba. C'est un serveur qui permet de partager des répertoire de votre disque dur avec des machines Windows®. D'ailleurs, les réseaux Microsoft et Samba utilisent le même protocole. Pour étouffer dans l'oeuf toute confusion : c'est IBM qui a inventé NetBIOS. Puis il a été implémenté dans Windows® 3.11. Et un peu plus tard par Samba.
Exemple : hosts allow = 192.168.0.0/255.255.255.0 10.0.0.0/255.0.0.0 interfaces = 192.168.0.1/26 10.0.0.1/8 bind interfaces only = yesSi vous utilisez un serveur Samba, vous devez à tout prix le sécuriser. C'est la cible privilégiée des intrus sur Internet. En effet, Windows® est fournit en standard avec un serveur NetBIOS, et bon nombre d'Internautes l'utilisent pour partager des fichiers dans leur réseau local (par exemple, avec leur portable professionnel). Et comme ils n'ont pas forcément conscience de ce problème d'ouvertures de ports, ils partagent leur répertoire sur Internet... Ainsi, tout le monde ou presque a accès en lecture, voir en écriture, sur certains de leurs répertoires, voir sur la totalité de leur disque dur... Pour information, lorsque je suis connecté sur Internet, mon Samba est sollicité environ une fois par minute par des intrus... Ne faites donc pas cette erreur de débutant, et contrôlez au plus vite l'accès à ce port ! II-5-4 ApacheNon, nous n'allons pas jouer aux cowboys et aux indiens. Apache est le nom du serveur web (HTTP) utilisé par environ 50% des serveurs Internet. Il est robuste, en continuel amélioration, mais c'est aussi une cible privilégié des intrus. Je ne parlerai ici que de la version 2.0.Ce n'est pas très habituel d'avoir un serveur Apache qui tourne sur une machine personnelle, mais qu'est-ce que c'est pratique ! Le mien sert à afficher mes pages HTML en cours de construction, exactement comme si elle étaient sur mon site sur Free. De plus, ce serveur fait tourner une version locale de l'excellent validator HTML, ce qui me permet de tester à tout moment la validité de mes pages (et d'avoir le petit logo en bas de page "Valid XHTML"). Mais ce n'est pas parce que je publie des pages HTML, que je laisse rentrer des intrus sur ma propre machine afin de les visiter avant l'heure. Et puis de toute façon, il y a des pages que je ne désire pas publier... Il convient donc de restreindre utilisation de mon serveur Apache.
Exemple : [Fichier : /etc/httpd/conf/httpd2.conf] Listen phoenix0:80 Listen phoenix1:80 [Fichier : /etc/httpd/conf/common/httpd.conf] <Directory /> AllowOverride None <IfModule mod_access.c> Order deny,allow Deny from all </IfModule> </Directory> II-5-5 XinetdOn a déjà parlé plus haut de "Xinetd". Son fichier de configuration est "/etc/xinetd.conf", mais en général il est écrit "includedir /etc/xinetd.d/" dans ce fichier. Cela veut dire que "Xinetd" lira à la fois "/etc/xinetd.conf" mais aussi les fichiers de "/etc/xinetd.d/*" pour définir sa configuration. L'idée de ce système un peu atypique est :
Exemple de configuration pour le serveur proftpd : [Fichier : /etc/xinetd.conf] defaults { instances = 60 log_type = SYSLOG authpriv log_on_success = HOST PID log_on_failure = HOST cps = 25 30 # Remarque : On n'écrit rien en paramètre, et c'est VOLONTAIRE ! Ainsi, TOUS les accès sont interdit... no_access = } includedir /etc/xinetd.d [Fichier : /etc/xinetd.d/proftpd-xinetd] # Service FTP pour phoenix0.sky.net (réseau local) service ftp { id = ftp:0 socket_type = stream wait = no user = root server = /usr/sbin/proftpd flags = REUSE log_on_failure += USERID log_on_success += USERID DURATION nice = 10 instances = 4 bind = phoenix0 only_from = 192.168.0.0/24 disable = no }Commentaire :
II-5-6 X11Lorsque vous faire un "nmap" sur votre machine, vous remarquez qu'un port est ouvert beaucoup "plus haut" que les autres. Il s'agit du port 6000, qui est associé au système graphique X11. C'est lui qui est responsable de l'affichage des beaux pixels qui s'affichent devant vous pendant que vous lisez ce document.[olivier@phoenix /]$ nmap phoenix0.sky.net Starting nmap V. 3.00 ( www.insecure.org/nmap/ ) Interesting ports on phoenix.sky.net (192.168.0.1): (The 1591 ports scanned but not shown below are in state: closed) Port State Service 21/tcp open ftp 23/tcp open telnet 25/tcp open smtp 53/tcp open domain 80/tcp open http 110/tcp open pop-3 111/tcp open sunrpc 443/tcp open https 6000/tcp open X11Pourquoi un logiciel d'affichage a t'il un port IP d'ouvert ? En fait c'est là que Linux (et les Unix/BSD en général) est génial. Avec Linux, vous pouvez lancer un programme, et afficher son résultat non pas sur votre écran, mais sur l'écran d'un autre PC, en utilisant le réseau IP. Rien d'exceptionnel me diriez vous, Windows® le fait depuis sa version 2000. Oui, mais les Unix ont eu cette technologie plus de 20 ans avant les OS de Microsoft... Il est important de fermer ce port, car des intrusions peuvent venir plus ou moins facilement dessus. Et même si ce n'est pas le cas, ce port ouvert indique très clairement à l'intrus que vous avez un système Linux / Unix / BSD. Et ce n'est pas la peine de le mettre trop rapidement sur la voie.
La méthode protection de X11 est beaucoup plus primitive que celles des autres logiciels dont nous parlons ici. En fait, elle n'a que deux options : Le port 6000 est ouvert ou fermé. En général, sur un réseau de particulier on n'utilise pas ce système d'affichage exporté ("export display" en anglais et c'est d'ailleurs le nom d'un variable d'environnement qui est justement utilisé pour cela). C'est pourquoi on peut fermer ce port en toute quiétude. C'est là que cela devient un peu plus compliqué. Le manuel ("man X11") indique que la commande "X" ("/usr/X11R6/bin/X" en fait) peut recevoir le paramètre "-nolisten tcp". Comme cela l'indique, X11 ne va plus écouter le port TCP, et donc le port sera fermé. Oui, mais en général, on ne lance pas "X" directement, car il y a d'autres couches logiciels à initialiser d'abord, comme le "Window Manager" ("gestionnaire de fenêtres" en français), le "Desktop" ("bureau" en français), etc... Ainsi :
II-5-7 Bind / NamedOn a déjà parlé de named, donc je ne m'étendrai pas dessus. Le nom du produit s'appelle "Bind", mais l'exécutable se nomme "named", c'est un peu une source de confusion... L'important si vous avez un serveur DNS sur votre réseau interne, c'est que personne de l'extérieur ne s'amuse à l'interroger, et ne devine la topologie de votre réseau (le nom et les adresses IP des machines à l'intérieur). Avec une configuration non sécurisée, c'est beaucoup plus facile à faire qu'on le croît. D'un autre coté, il est assez rare d'avoir besoin d'un serveur DNS dans un réseau personnel, sauf si on fait du NAT. Mais n'anticipons pas.
Exemple : allow-transfer { 192.168.0.0/24; }; allow-query { 192.168.0.0/24; }; listen-on { 192.168.0.0/24; }; II-5-8 Postfix"Postfix" est un serveur de mails, tout comme le célèbre "sendmail". Il est plus facile à configurer, et peut servir aussi bien à l'intérieur de réseaux modestes ou au sein des grands comptes.
Exemple : mynetworks_style = subnet mynetworks = 192.168.0.0/24 inet_interfaces = phoenix0.sky.net |