Bonjour,

souvent quand je suis amené à utiliser les machines Linux des autres, je
suis dépaysé. Pas forcément à cause du clavier, ou de l'interface
graphique différente ou le manque des outils auxquels je suis habitué,
mais souvent pour le manque de sécurisation.

Une machine qui se trouve sur Internet (même sur réseau commuté, ie par
dialup) ne devrait réellement tourner que les services minimaux: en
réalité, sur un poste de travail, pas grand chose.  En particulier ni
BIND/named, ni portmapper, rpc.mountd, ni sendmail (écoutant sur le port
25: sans option -bd c'est ok). 

Rappelons qu'une machine piratée doit être réinstallée complètement, et
seulement ses *données* à l'exclusion de tout script, configuration et
exécutables, peuvent être restaurées. On peut aussi démarrer sur un medium
read-only préparé à l'avance et vérifier un backup considéré comme sûr,
p.ex.

Mais quand le piratage a eu lieu ?  Pour faire peur, rappelons que sous
AmigaOS, il existait un virus silencieux qui commençait par encrypter le
contenu du disque, ajoutant un boot-block de décryptage.  Enlever le virus
plusieurs mois plus tard lorsque celui-ci devenait visible amenait à la
perte des données.

Rappelons aussi que la possibilité existe, une fois le worm/virus devenu
root, de modifier le BIOS (si celui-ci est flashable et que le jumper de
programmation est mis (cartes-mères modernes: plus de jumper) ou pire, sur
disque (anciens Compaq!)), voire de modifier le microcode du processeur
(Intel).  Personne ne l'a fait encore, bien sûr. Un tel piratage à large
échelle, comme le problème avec BIND et Red Hat, pourrait faire mal
(rappelons que ce problème n'aurait pas existé si 1. BIND n'était pas
lancé 2. les machines étaient maintenues à jour).

Après tout, si une machine n'écoute aucun port ou que sur quelques ports,
cela diminue d'autant le risque: en effet, même si certains protocoles
sont authentifiés (p.ex. les magic cookies MIT du serveur X), des bugs
peuvent tout de même exister dans le traitement de la connexion initiale.

   Pour X, utiliser l'option -nolisten tcp au lancement du serveur X,
   p.ex. dans /etc/X11/kdm/Xservers.

Par exemple, sans posséder l'authentification X, on pouvait faire coincer
(Denial-of-Service) le serveur X. Certains démons, comme POP, ont eu, eux,
leurs problèmes de sécurité: une simple connexion non authentifiée et vous
aviez accès root. Enfin, citons le grand problème des paquets UDP: un
simple paquet UDP, envoyé même d'une adresse invalide, pouvait exécuter du
code à travers BIND. C'est ce qui a été utilisé pour le vers/worm qui
attaquait notamment les machines Red Hat en avril de cette année. 

   Aucune raison de tourner un serveur POP ou BIND sur un client.

Ce problème d'UDP est une des raisons pourquoi un firewall IP Masquerading
devrait être évalué avant d'être mis en oeuvre. Une solution à
proxy-application est probablement plus sûre dans le cas général, vu
qu'elle ne permet pas de faire du tunneling d'UDP.

   Un proxy application, en général, ne permettra plus l'utilisation
   d'ICQ ou d'autres protocoles basés sur UDP. Le resolving de noms
   ne sera plus fait par les clients mais par le proxy.

Comment s'en prémunir ?  On peut bien sûr surveiller les annonces de
sécurité ou utiliser des systèmes de mise à jour automatisées (apt-get
update && apt-get -u dist-upgrade) de la Debian. Mais même les autorités
de sécurisation des distributions font parfois des erreurs, et certains
patches ne sont disponibles que quelques heures après.

En limitant le nombre de services accessibles sur votre serveur sur
Internet et sur votre poste de travail, vous limitez l'étendue du risque
et vous vous donnez la possibilité de vous abonner à la mailing-list de
sécurité d'un logiciel particulier, sans être noyé sous des annonces
ne vous concernant pas.

   Rappelons que la plupart des distributions ont une mailing-list de
   sécurité. Rappelons aussi qu'en particulier les distributions les
   moins `populaires' ont parfois des problèmes à sortir des patches
   à temps. Et certaines distributions ont parfois, ponctuellement,
   des lenteurs.

Comment savoir quels sont les ports ouverts ?

Exemple:

   schaefer@truc:~$ netstat -an | egrep 'tcp.*LISTEN|udp'
   tcp        0      0 0.0.0.0:22              0.0.0.0:* LISTEN      
   tcp        0      0 0.0.0.0:80              0.0.0.0:* LISTEN      
   tcp        0      0 0.0.0.0:5432            0.0.0.0:* LISTEN  

Cette machine semble relativement sécurisée, si l'on suppose que l'accès
SSH et HTTP sont utiles. Rappelons que le mot de passe root (si login SSH
possible) et des utilisateurs doivent être bien choisis, et les logs
d'authentification surveillés. Un outil comme logdog (qui envoie un mail
lors d'entrées de logs non usuelles) peut être utile. Rien que pour
détecter quand votre disque fait des erreurs. Ou alors lancez dmesg et des
tails réguliers!

Malheureusement, pourquoi le port 5432 est-il ouvert?

   truc:/home/schaefer# fuser -v -n tcp 5432

                        USER        PID ACCESS COMMAND
   5432/tcp             postgres    164 f....  postmaster

ah, c'est Postgres. Sur la Debian, pour fermer ce port (qui est fermé par
défaut!), changer PGALLOWTCPIP à no, dans /etc/postgresql/postmaster.init,
et faire un /etc/init.d/postgresql restart. Si cette machine n'a pas
besoin de PostgreSQL, on peut aussi le désinstaller.

Si vous en avez besoin p.ex. pour l'accès local via TCP/IP, vous pouvez
demander au daemon de n'écouter que sur l'interface local, ou le
firewaller, en supposant que eth0 est l'interface Internet:

   /sbin/ipchains -I input -j REJECT -l -y -p tcp -s 0.0.0.0/0 \
      -d 0.0.0.0/0 5432 -i eth0  # 2.2.x

N'importe quel paquet en provenance de eth0 demandant l'ouverture (-y ==
--syn) d'une connexion TCP sur le port 5432 sera rejeté comme si aucun
service n'était en écoute sur ce port. La réjection sera suivie d'un log
kernel.

Pour tester:
   telnet truc 5432
   telnet: Unable to connect to remote host: Connection refused
   kernel:
      Packet log: input REJECT eth0 PROTO=6 194.38.85.209:19578
         194.38.85.206:5432 L=44 S=0x10 I=57676 F=0x0000 T=55 SYN (#1)

   Il existe également des programmes de scanning actifs, qui peuvent
   être utile si on suppose un piratage préalable ayant modifié la
   commande netstat et/ou le kernel.

Cette commande doit être lancée après la configuration réseau, mais avant
le lancement des daemons. Alternativement, quand vous voulez, mais
seulement si la `policy' par défaut de l'input firewall est DENY.

Notons que si les numéros de séquence sont prédictibles (pas le cas sous
Linux normalement) ET que le firewalling n'est pas configuré pour refuser
des paquets d'adresses internes venant de l'extérieur (spoofing, en
général configuré par défaut sur la Debian notamment), une attaque
d'insertion est possible même avec les règles ci-dessus. Dans ce cas
enlever le -y (== --syn), ou configurer ce qui précède.

(dans le cas de dialup, on peut lancer de telles commandes de firewalling,
et effacer les entrées dans les scripts lancés par pppd à la configuration
d'interface, vérifier que pppd appelle le script avant de configurer
l'interface, ou alors utiliser une politique de deny par défaut).

L'option de log est pour être averti, l'accès à ce port peut indiquer un
scan, voire un piratage.

Bien sûr par défaut PostgreSQL ne laisse pas n'importe qui entrer. Mais le
jour où un bug de sécurité dans le protocole d'authentification est
découvert, vous serez content d'avoir protégé ce port. 

PS: ne pas hésiter à faire régulièrement un tel netstat, en particulier
quand des applications comme Star Office, ou d'autres trucs complexes
comme KDE ou GNOME sont lancés. On peut faire un crontab qui annonce des
changements par rapport à une version `connue correcte'.

Exemple:
   netstat.user | grep LISTEN | egrep -v "^unix" | sort -u | diff \
      /root/reference/netstat - | egrep '^>'

Pour kxmlrpcd, un service non nécessaire de KDE mais qui écoute
globalement, lire:
http://archives.neohapsis.com/archives/linux/suse/2001-q1/1190.html


--
http://www-internal.alphanet.ch/linux-leman/ avant de poser
une question. Ouais, pour se désabonner aussi.

Répondre à