« Tenir compte de la sécurité au quotidien » : différence entre les versions

De Lea Linux
Aller à la navigation Aller à la recherche
mAucun résumé des modifications
mAucun résumé des modifications
Ligne 318 : Ligne 318 :


== Voir aussi ==
== Voir aussi ==
[http://fr.wikipedia.org/wiki/Cat%C3%A9gorie:Logiciel_de_s%C3%A9curit%C3%A9_informatique|La page des logiciels de sécurité informatique sur Wikipédia]
[http://fr.wikipedia.org/wiki/Cat%C3%A9gorie:Logiciel_de_s%C3%A9curit%C3%A9_informatique La page des logiciels de sécurité informatique sur Wikipédia]


== Conclusion ==
== Conclusion ==
Même si l'on connaît les risques, il est toujours impératif de rester sur ses gardes. De nouvelles menaces apparaissent régulièrement, de nouvelles failles sont découvertes chaque jour, de nouveaux virus aussi, etc. L'avenir nous dira si un jour on aura des ordinateurs sûrs à 100%, chose qui n'est pas impossible mais cependant improbable.
Même si l'on connaît les risques, il est toujours impératif de rester sur ses gardes. De nouvelles menaces apparaissent régulièrement, de nouvelles failles sont découvertes chaque jour, de nouveaux virus aussi, etc. L'avenir nous dira si un jour on aura des ordinateurs sûrs à 100%, chose qui n'est pas impossible mais cependant improbable.

Version du 29 juin 2006 à 14:23

Introduction

Un ordinateur n'est jamais en sécurité, quand bien même on croit qu'il l'est. Un dicton informatique ne dit-il pas que le maillon le plus faible dans un système informatique est l'utilisateur ? Cette fiche est là pour connaître les différents risques que l'on court en ayant un ordinateur, connecté à un réseau ou non, ainsi que pour se parer contre toute attaque et enfin pour savoir comment nettoyer l'ordinateur d'une attaque que l'on vient de subir.

Pour tout le document (et de manière générale), il est évidemment conseillé de lire les pages de manuel des commandes avant de poser des questions.

Les bases

Connaître son système

D'abord et avant tout il faut être à l'aise avec les concepts essentiels de linux. Cela permettra d'une part de mieux connaître et comprendre ce que nous faisons et d'autre part de mieux réagir en cas d'attaque. Donc documentez vous sur ce système et son langage de commande (shell).Lisez aussi la documentation expliquant ce que sont les démons et comment ils fonctionnent. Voyez comment fonctionne un réseau, ce que sont les ports réseau, les permissions des fichiers, ce que sont les failles de sécurité des logiciels, etc.

Partitionnement conséquent

À l'installation du système, il faut bien réfléchir au partitionnement des disques. Les données statiques (binaires, fichiers de configuration, etc.) seront sur une partition montée en lecture seule pour éviter toute modification :

  • /bin
  • /boot
  • /lib
  • /sbin
  • /usr

Eventuellement d'autres dossiers, selon la distribution.

Lorsque l'accès physique à la machine est une faille potentielle de sécurité, il n'est pas une mauvaise idée que de créer une partition dédiée à /etc , qui serait formatée en un système de fichiers chiffré (voir Encrypted root filesystem howto).

Permissions

De manière générale, éviter autant que possible le sticky bit, qui permet d'exécuter un programme avec les droits de root alors qu'on est connecté en simple utilisateur.

<cadre>sticky bit : droit donné à un fichier exécutable d'utiliser les droits de l'administrateur.</cadre>

Utiliser chroot pour les services et les utilisateurs distants qui doivent avoir un accès restreint à la machine : Admin-admin_env-chroot

Utilisateurs

Vérifier que root n'est pas autorisé à se connecter. Utiliser sudo pour les tâches d'administration.

N'installer que le strict nécessaire

Chaque bout de code est potentiellement une faille. C'est pour cela que moins il y a de logiciels installés, plus le risque d'avoir une faille est réduit. Un exemple courant pour faire comprendre le principe est que sur un serveur il n'est généralement nul besoin de serveur X. Un autre exemple, dans un environnement unix il n'est nul besoin de serveur Samba. Une fois le ménage fait dans votre installation, il faut bien configurer ses logiciels.

Bien configurer ses démons

Sécuriser Apache.

Utilisez ssh/sshd plutôt que telnet. En effet, ce dernier ne chiffre pas ses flux de données, contrairement à ssh, ce qui permet grâce à un simple sniffeur réseau de voler identifiants et mots de passe via le réseau.

Les serveurs de fichiers (ou apparents) tels Samba, NFS ou encore FTP ne doivent accepter de connexion que des utilisateurs enregistrés : une section est prévue à cet effet dans le fichier de configuration de chaque serveur. Il est préférable de faire ceci, même si les services n'autorisent que les connexions locales et même si l'authentification des utilisateurs est déjà limitée : mieux vaut trop de sécurité que pas assez. Si vous cherchez à faire du transfert de fichiers de manière sécurisée, préférez scp (qui est en fait une manière d'utiliser le protocole ssh).

Si vous utilisez vnc, préférez le faire de manière sécurisée : vnc au-dessus de ssh.

Barrer la route aux connexions non souhaitées

Une fois limité les ports réseau attendant des connexions, il faut mettre en place un firewall filtrant grâce à iptables (ou autre). Netfilter est le nom de la couche du noyau qui permet de filtrer tout ce qui passe par les interfaces réseau, tandis que iptables est une interface permettant de piloter Netfilter. Ne pas confondre, donc. Des articles ont déjà été écrits à ce propos :

De manière très succincte, il faut fermer tous les ports puis ouvrir ceux dont on a besoin : le port 80 (et le 443 pour du https) doit être ouvert si l'on a un serveur web, le port 110 si l'on a un serveur pop dont on veut qu'il soit accessible d'internet, etc.

Voici un bon script de base qu'on peut adapter : #!/bin/sh

  1. firewall v1.0.1 Oct 13 09:48:57 PDT 2003 written by : Kernel <kernel@trustonme.net>
  2. this script is free software according to the GNU General Public License (see [www.gnu.org])
  3. Start/stop/restart/status firewall:

firewall_start() {

echo "[Démarrage du firewall]"

                                                              1. REGLES PAR DEFAUT ###########################

echo "[Initialisation de la table filter]" iptables -F iptables -X

echo "[Politique par défaut de la table filter]"

  1. On ignore tout ce qui entre ou transite par la passerelle

iptables -P INPUT DROP iptables -P FORWARD DROP

  1. On accepte, ce qui sort

iptables -P OUTPUT ACCEPT

  1. Pour éviter les mauvaises suprises, on va autoriser l'accès à la loopback :

iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT

                                                              1. LOCAL-INTERNET ###########################

echo "[On autorise les clients à accéder à internet]"

  1. On créé une nouvelle chaîne, le nom est indifférent
  2. appelons-la "local-internet"

iptables -N local-internet

  1. On définit le profil de ceux qui appartiendront à "local-internet"
  2. "local-internet" concerne toutes les connections sauf celles venant d'internet ( ! = non)
  3. En gros avec ça, vous rendez, vos serveurs inaccessibles depuis internet.
  4. Pas de panique, certains serveurs seront autorisés explicitement dans la suite.
  5. (Remplacer ppp0 en fonction de votre configuration)

iptables -A local-internet -m state --state NEW -i ! ppp0 -j ACCEPT

  1. Evidemment, une fois acceptées comme "local-internet", les connections peuvent continuer
  2. et faire des petits :

iptables -A local-internet -m state --state ESTABLISHED,RELATED -j ACCEPT

  1. On termine en indiquant que les connections appartenant à "local-internet"
  2. accèdent à internet de manière transparente.

iptables -A INPUT -j local-internet iptables -A FORWARD -j local-internet

                                                              1. LES TABLES NAT ET MANGLE #############################

echo "[Initialisation des tables nat et mangle]"

iptables -t nat -F iptables -t nat -X iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -t nat -P OUTPUT ACCEPT

iptables -t mangle -F iptables -t mangle -X iptables -t mangle -P PREROUTING ACCEPT iptables -t mangle -P OUTPUT ACCEPT

                                                                        1. LE MASQUERADING ########################################
  1. Commentez ces 2 lignes, si vous ne faîtes pas du masquerading (nat)
  2. echo "[Mise en place du masquerading]"
  3. iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j MASQUERADE
                                                                  1. ACTIVATION DE LA PASSERELLE ##################
  1. echo "[Activation de la passerelle]"
  2. echo 1 > /proc/sys/net/ipv4/ip_forward
                                                                  1. PAS DE SPOOFING ############################

echo "[Pas de spoofing]" if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ] ; then for filtre in /proc/sys/net/ipv4/conf/*/rp_filter do echo 1 > $filtre done fi

                                                    1. PAS DE SYNFLOOD ####################

echo "[Pas de synflood]" if [ -e /proc/sys/net/ipv4/tcp_syncookies ] ; then echo 1 > /proc/sys/net/ipv4/tcp_syncookies fi

                                                                    1. PAS DE PING ###############################
  1. commentez ces 6 lignes, si vous autorisez les pings sur votre passerelle

echo "[Pas ping]" echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts if [ -e /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses ] ; then echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses fi

                          1. Priorisation de la bande passante et des connections - QoS ############

echo "[priorisation des connections ssh ...]"; iptables -A PREROUTING -t mangle -p tcp --sport 443 -j TOS --set-tos Minimize-Delay

echo "[priorisation des connections http ...]"; iptables -A PREROUTING -t mangle -p tcp --sport http -j TOS --set-tos Maximize-throughput iptables -A PREROUTING -t mangle -p tcp --sport 3129 -j TOS --set-tos Maximize-throughput

                                                        1. Fonctionnalités serveurs #####################################

echo "[Etude des fonctionalités serveurs, visibles depuis internet]"

  1. A ce stade, tous vos clients du réseau local et de la passerelle ont accès à internet. Mieux,
  2. vos clients du réseau local, ont accès à vos serveurs apache, proftp ... localement. Mais personne
  3. depuis internet ne peux accéder à l'un des serveurs que vous hébergez.
  1. Il est bien-sûr possible de dévérrouiller pontuellement l'accès à un serveur depuis internet,
  2. en décommentant les 2 ou 3 lignes correspondantes.
  1. echo "[autorisation du serveur ssh(22) ...]"
  2. iptables -A INPUT -p tcp --dport ssh -j ACCEPT
  1. echo "[autorisation du serveur smtp(25) ...]"
  2. iptables -A INPUT -p tcp --dport smtp -j ACCEPT
  1. echo "[autorisation du serveur http(80) ...]"
  2. iptables -A INPUT -p tcp --dport www -j ACCEPT
  1. echo "[autorisation du serveur https(443) ...]"
  2. iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  1. echo "[autorisation du serveur DNS(53) ...]"
  2. iptables -A INPUT -p udp --dport domain -j ACCEPT
  3. iptables -A INPUT -p tcp --dport domain -j ACCEPT
  1. echo "[autorisation du serveur irc(6667) ...]"
  2. iptables -A INPUT -p tcp --dport ircd -j ACCEPT
  1. echo "[autorisation du serveur cvs (2401) ...]"
  2. iptables -A INPUT -p tcp --dport cvspserver -j ACCEPT
  1. echo "[autorisation du serveur FTP(21 et 20) ...]"
  2. iptables -A INPUT -p tcp --dport ftp -j ACCEPT
  3. iptables -A INPUT -p tcp --dport ftp-data -j ACCEPT
  1. Ne pas décommenter les 3 lignes qui suivent.
  2. Plus généralement :
  3. echo "[autorisation du serveur Mon_truc(10584) ...]"
  4. iptables -A INPUT -p tcp --dport 10584 -j ACCEPT
  1. echo "[autorisation du serveur aMule (4662/tcp) ...]"
  2. iptables -A INPUT -p tcp --dport 4662 -j ACCEPT
  1. echo "[autorisation du serveur BitTorrent (6881-6889/tcp) ...]"
  2. iptables -A INPUT -p tcp --dport 6881:6889 -j ACCEPT

echo "[firewall activé !]" }

firewall_stop() {


iptables -F iptables -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT

iptables -t nat -F iptables -t nat -X iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -t nat -P OUTPUT ACCEPT

iptables -t mangle -F iptables -t mangle -X iptables -t mangle -P PREROUTING ACCEPT iptables -t mangle -P OUTPUT ACCEPT

echo " [firewall descativé!]" }

firewall_restart() { firewall_stop sleep 2 firewall_start }

case "$1" in 'start') firewall_start

'stop') firewall_stop

'restart') firewall_restart

'status') iptables -L iptables -t nat -L iptables -t mangle -L

  • )

echo "Usage: firewall {start|stop|restart|status}" esac Ce script est à mettre généralement dans un fichier du dossier /etc/init.d/ .

La compromission des logiciels

Les logiciels binaires

Il faut savoir qu'en informatique il existe des logiciels malveillants. Ils sont appellés généralement virus, vers ou encore chevaux de troye mais aussi rootkits sous un système unix. Ce type de logiciel (malware en anglais) n'existe quasi exclusivement que sous windows. Certains virus fonctionnent et infectent les systèmes linux, mais leur nombre est très réduit. De toute manière, se servant généralement de failles du système, ce genre de logiciel ne se propage que très peu sous linux, puisque dès la découverte d'une faille celle-ci est corrigée très rapidement. Ce qui n'est pas le cas des systèmes windows. Enfin il faut être vigilant car les utilisateurs peuvent toujours recevoir des virus par e-mail et les lancer, parce-qu'ils ne sont pas informés sur les risques. Cependant, ce n'est généralement pas bien dangereux, puisque le virus étant exécuté avec les permissions de l'utilisateur il ne peut pas faire plus que ce que l'utilisateur en question ne pourrait (au pire, les données dudit utilisateur sont effacées par le virus).

Un antivirus n'est donc nécessaire que si l'ordinateur est en dual boot avec windows. En revanche, il n'est jamais mauvais d'installer et de lancer régulièrement chkrootkit, qui vérifie la présence de rootkits.

<cadre info>rootkits : logiciels permettant d'utiliser une faille de sécurité pour obtenir les droits de l'administrateur (root).</cadre>

Le noyau étant aussi un binaire, le recompiler en ne laissant que le nécessaire n'est pas une mauvaise initiative. De plus, cela permet d'appliquer des patchs qui sécurisent le noyau à plusieurs niveaux -- on peut citer en exemple grsecurity.

Les logiciels interprétés (scripts)

Si la machine possède un serveur apache fournissant des pages dynamiques (cgi mais surtout php et autres langages de script web. En fait, cgi est parfois sous la forme d'un binaire, mais souvent sous forme de script) il faut se méfier des attaques du type injection de code.

Veillez aussi à ne pas avoir de script contenant un mot de passe codé en clair ! Parfois, lorsque votre mot de passe est demandé (en l'occurence pour sudo) et que vous savez qu'on va vous le demander, vous tapez celui-ci sans regarder l'écran. Sauf que le terminal présente un prompt et non un "please type your password:", car vous avez tapé la commande trop vite, ou mal. Donc si par malheur vous avez tapé votre mot de passe (alors en clair) et que vous avez validé -- le shell retournant naturellement "commande inconnue" -- il vous faut éditer votre fichier ~/.bash_history pour y supprimer le mot de passe.

Les méthodes des pirates

Vérifier la présence de keylogger. C'est un logiciel chargé de détecter et logger les touches pressées au clavier. Vous imaginez donc aisément le problème : les identifiants et mots de passe tapés au clavier sont alors facilement accessibles pour l'attaquant. L'ingéniérie sociale est une méthode consistant à profiter de la crédulité des gens, qui souvent écrivent leurs mots de passe sur un bout de papier et le laissent à proximité de l'ordinateur. D'autres sont par exemple appelés par l'attaquant, se faisant alors passer pour le service technique de l'entreprise, qui prétend avoir besoin du mot de passe de l'utilisateur pour faire des tests.

Détecter les intrusions

  • Les systèmes de détection d'intrusion (IDS) : snort, tiger,
  • chkrootkit
  • fcheck
  • logcheck

Que faire en cas d'attaque ?

Connaître les outils

who

La commande who ou w permet de voir les utilisateurs actuellement connectés (loggés) au système. Attention cependant car un agresseur peut être -- et l'est certainement si c'est le cas -- connecté sous votre nom, s'il est parvenu à s'immiscer dans votre système.

netstat

La commande netstat est une commande qui liste toutes les connexions réseau actives sur votre machine ainsi que l'état dans lequel elles sont (listening, connected, established, etc.) : Proto Recv-Q Send-Q Adresse locale Adresse distante Etat tcp 0 0 0.0.0.0:3129 0.0.0.0:* LISTEN tcp6 0 0  :::443  :::* LISTEN On voit ici par exemple que le port 3129 écoute (LISTEN) sur la machine locale (0.0.0.0) et que le port 443 en fait de même. Vérifiez les connexions actives, les ports ouverts, et faites le lien avec vos démons et autres programmes qui tournent. Si un port ne vous dit rien, informez-vous.

lsof

La commande lsof liste tous les fichiers ouverts actuellement. Elle indique aussi quel utilisateur utilise quel fichier. COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root mem REG 3,65 31432 1720343 /sbin/init apache2 597 root mem REG 3,65 385484 25423 /usr/sbin/apache2 Les informations parlent d'elle-mêmes. Ce sont deux cas précis parce-que le processus init a le fichier /sbin/init d'ouvert (de même pour apache).

ps

La commande ps liste tous les processus actuellement en cours d'exécution sur le système. S'il en est un que vous ne connaissez pas, identifiez-le. Si vous ne savez toujours pas ce que c'est, pas d'affollement : utilisez la commande lsof et voyez si vous trouvez des fichiers en rapport avec ce processus. Vous pouvez alors identifier le processus et déterminer si c'est un processus "innofensif". Si ce n'est pas le cas, vous pouvez supprimer les fichiers qu'il faut. Attention toutefois à bien être certain que ce soit un logiciel malveillant que vous supprimez ! En revanche, si c'est un logiciel qui s'est fait infecter (par exemple apache) il suffit de réinstaller celui-ci, après avoir vidé le cache des paquets de votre gestionnaire de packages. Vérifiez aussi la configuration après réinstallation. Nul besoin de redémarrer, sauf si évidemment c'est le noyau qui est corrompu, chose qui est à mon avis très rare.

Voir aussi

La page des logiciels de sécurité informatique sur Wikipédia

Conclusion

Même si l'on connaît les risques, il est toujours impératif de rester sur ses gardes. De nouvelles menaces apparaissent régulièrement, de nouvelles failles sont découvertes chaque jour, de nouveaux virus aussi, etc. L'avenir nous dira si un jour on aura des ordinateurs sûrs à 100%, chose qui n'est pas impossible mais cependant improbable.