# [howto] sécurité

## bouleetbil

Sécuriser son système 

Tous les ordinateurs connecté à internet subissent en moyenne un scan toutes les 1 à 5 min par d'autres machine infectées par des vers ou virus, très très souvent destiné à Microsoft et non aux systèmes GNU/Linux. Ces ordinateurs cherchent a savoir si certains ports sont vulnérables, par exemple: le port 445 pour Microsoft-ds, 139 pour samba, ce sont les trous de sécurité standards de Windows XP. Et il y a environ 700 essais de login avec ssh par semaine sur un serveur, sans compter les refus de relay smtp (mail) !

Pour garder un système sécurisé, pensez à mettre Gentoo à jour régulièrement :

```

# emerge sync

# emerge -uDaN world

# etc-update

```

rootkit

chkrootkit pour detecter un RootKit, chkrootkit est un logiciel libre sous licence GNU GPL permettant de détecter si un système UNIX n'a pas été compromis par un rootkit. Il permet de détecter les traces d'une attaque et de rechercher la présence d'un rootkit sur un système Unix/Linux en vérifiant, si des fichiers exécutables du système ont été modifiés, si la carte réseau est en mode « promiscuous », et si un ou des vers LKM (Linux Kernel Module) sont présents.

Installation :

```

# emerge chkrootkit

```

Lancer chkrootkit sans argument pour vérifier l'ensemble du système.

Si vous avez un démon cron décommenter le fichier /etc/cron.weekly/chkrootkit pour lancer une analyse toute les semaines.

Sécurisé ssh

OpenSSH est une version libre de la suite d'outils du protocole SSH de connexion réseau utilisée par un nombre croissant de personnes sur l'Internet. De nombreux utilisateurs de telnet, rlogin, ftp et autres programmes identiques ne réalisent pas que leur mot de passe est transmis non chiffré à travers l'Internet. OpenSSH chiffre tout le trafic (mots de passe inclus) de façon à déjouer les écoutes réseau, les prises de contrôle de connexion, et autres attaques. De plus, OpenSSH fournit toute une palette de possibilités de création de tunnels TCP et de méthodes d'authentification.

Configurer SSH

Editer /etc/ssh/sshd_config

Pour faire écouter ssh que sur une interface donnée.

```

ListenAddress 192.168.0.1

```

Ne pas autoriser de connexion en tant que root. Si quelqu'un veut devenir root via ssh, deux logins sont maintenant nécessaires et le mot de passe root ne peut être attaqué par la force brute via SSH.

```

PermitRootLogin no

```

Changer le port d'écoute, ainsi l'intrus ne peut être complètement sûr de l'exécution d'un démon sshd.

```

Port 666 ou ListenAddress 192.168.0.1:666

```

Interdire les mots de passe vides.

```

PermitEmptyPasswords no

```

Autorise seulement certains utilisateurs à avoir accès via ssh à cette machine. user@host peut également être utilisé pour n'autoriser l'accès qu'à un utilisateur donné depuis un hôte donné.

```

AllowUsers harry

```

Autorise seulement certains membres de groupes à avoir accès via ssh à cette machine. 

```

AllowGroups wheel admin

```

Pour refuser des groupes ou des utilisateurs : « DenyUsers » et « DenyGroups ».

Il vous appartient complètement de décider ce que vous voulez faire. Il est plus sûr d'autoriser l'accès à la machine uniquement aux utilisateurs avec des clés ssh placées dans le fichier ~/.ssh/authorized_keys. 

```

PasswordAuthentication no

```

Désactiver toute forme d'autorisation dont vous n'avez pas réellement besoin si vous n'utilisez pas, par exemple, RhostsRSAAuthentication, HostbasedAuthentication, KerberosAuthentication ou RhostsAuthentication, vous devriez les désactiver. Désactiver le protocole version 1.

iptables

Voici quelques règles : 

```

#!/bin/sh

# mettez ici l'emplacement d'iptables :

IPTABLES=/sbin/iptables

# mettez ici le nom de l'interface réseau vers internet :

EXTERNAL_IF="ppp0"

# mettez ici le nom de l'interface réseau vers votre lan :

INTERNAL_IF="eth0"

#charge les modules

modprobe ip_nat_ftp

modprobe ip_nat_irc

modprobe iptable_filter

modprobe iptable_mangle

modprobe iptable_nat

modprobe ip_masq_ftp

modprobe ip_masq_user

echo "Module Chargé"

#partage de connexion

echo 1 > /proc/sys/net/ipv4/ip_forward

#autorise le reseau a envoye des donnees sur internet

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

echo "Partage de connexion actif"

#masque les machines local

$IPTABLES -A POSTROUTING -t nat -o $EXTERNAL_IF -j MASQUERADE

#liste des modules possible

#ls /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/

#refus de tout

$IPTABLES -P INPUT DROP

$IPTABLES -P OUTPUT DROP

$IPTABLES -P FORWARD DROP

echo "Refus de toutes les connexions"

# DROP des paquets NETBIOS

iptables -A INPUT -i $EXTERNAL_IF -p udp --dport 137:139 -j DROP

iptables -A INPUT -i $EXTERNAL_IF -p tcp --dport 137:139 -j DROP

echo "Netbios actif"$IPTABLES -A tcp_inbound -p TCP -s 0/0 --destination-port 6891:6900 -j ACCEPT

#regles reseau local on accepte tous

# "On accepte le traffic sur 'lo'"

$IPTABLES -A INPUT -i lo -j ACCEPT

$IPTABLES -A OUTPUT -o lo -j ACCEPT

$IPTABLES -A FORWARD -i lo -j ACCEPT

$IPTABLES -A FORWARD -o lo -j ACCEPT

echo "Toutes les connexions internes sont actives"

# "On accepte le traffic sur le réseau local"

# Vous pouvez personaliser cette règle en s'appuyant sur les regles du traffic vers internet

$IPTABLES -A INPUT -i $INTERNAL_IF -j ACCEPT

$IPTABLES -A OUTPUT -o $INTERNAL_IF -j ACCEPT

$IPTABLES -A FORWARD -i $INTERNAL_IF -j ACCEPT

$IPTABLES -A FORWARD -o $INTERNAL_IF -j ACCEPT

echo "Réseau local actif"

#Logguer les packets DROPés

#Logguer les packets au début afin de vérifier que tous fonctionne

#Apres commentez ces lignes car cela prend beaucoup de place

$IPTABLES -N LOG_DROP

$IPTABLES -A LOG_DROP -j LOG --log-prefix "[FIREWALL refus] "

$IPTABLES -A LOG_DROP -j DROP

echo "Prépare les log"

#pour la resolution des dns

$IPTABLES -A INPUT -i $EXTERNAL_IF --protocol udp --source-port 53 -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_IF --protocol udp --destination-port 53 -j ACCEPT

$IPTABLES -A INPUT -i $EXTERNAL_IF --protocol tcp --source-port 53 -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_IF --protocol tcp --destination-port 53 -j ACCEPT

echo "DNS accordé"

#pour accepter de sufer sur le web

$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --sport www -m state --state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --dport www -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

echo "Surf possible"

#pour le serveur web sur le routeur

$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --sport www -m state --state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --dport www -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

echo "Serveur WEB accordé"

#Pour serveur pop3

$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --dport pop-3 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

echo "Réception de mail"

#pour seveur smtp

#$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --sport smtp -m state --state ESTABLISHED,RELATED -j ACCEPT

#pour l'envoi de mail

$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --dport smtp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

echo "Envoi de mail"

#on accepte les requete ftp entrantes

$IPTABLES -t filter -A INPUT -p tcp --source-port ftp -j ACCEPT

$IPTABLES -t filter -A INPUT -p tcp --destination-port ftp -j ACCEPT

echo "Ftp entrant ok"

#msn transfert de fichier

$IPTABLES -A INPUT -p TCP --sport 6891:6900 -j ACCEPT

$IPTABLES -A OUTPUT -p tcp --dport 6891:6900 -j ACCEPT

#msn communication

#$IPTABLES -A INPUT -p tcp --sport 1863 -j ACCEPT

$IPTABLES -A INPUT -i $EXTERNAL_IF --protocol tcp --sport 1863 -m state --state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_IF --protocol tcp --dport 1863 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

echo "Msn accorde"

#limite du ping

$IPTABLES -A INPUT -p icmp -m state --state RELATED,ESTABLISHED -j ACCEPT

$IPTABLES -A INPUT -p icmp -m state --state NEW -m limit --limit 10/min -j ACCEPT

echo "ping ok"

#reseau donkey udp:4672 tcp:4662

#on accept sur les port entrants par défault d'eMULE

$IPTABLES -A INPUT -p tcp --dport 4662 -j ACCEPT

$IPTABLES -A INPUT -p tcp --dport 34037 -j ACCEPT

$IPTABLES -A INPUT -p tcp --dport 34038 -j ACCEPT

echo "Emule ouverture du port entrant 4662 "

$IPTABLES -A INPUT -p udp --dport 4672 -j ACCEPT

echo "Emule ouverture du port entrant 4672 "

# on accepte les sorties pour emule

$IPTABLES -A INPUT -p tcp --sport 4662 -j ACCEPT

echo "Emule ouverture du port sortant 4662 "

$IPTABLES -A INPUT -p udp --sport 4672 -j ACCEPT

echo "Emule ouverture du port sortant 4672 "

# On accepte de le laisser sortir du firewall et on accpete les connexions entrantes que l'on a initiées $IPTABLES -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT

$IPTABLES -A INPUT -m state --state ESTABLISHED -j ACCEPT

echo "connexion ouverte ok"

#accord ssh

$IPTABLES -t filter -A INPUT -i $INTERNAL_IF -s 0.0.0.0/0 -d 192.168.0.2 -p tcp --dport 22 -j ACCEPT

echo "ssh accorde"

#pour rediriger vers un serveur web si besoin sur le reseau local

#iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.0.3:80

# Décommentez la ligne suivante pour que le serveur CUPS éventuel

# soit joignable de l'extérieur

#$IPTABLES -A INPUT -p tcp --sport 631 -j ACCEPT

# Décommentez les deux lignes suivantes pour que le serveur Samba éventuel

# soit joignable de l'extérieur

#$IPTABLES -A INPUT -p tcp --dport 139 -j ACCEPT

#$IPTABLES -A INPUT -p udp --dport 139 -j ACCEPT

# Décommentez la ligne suivante pour que des clients puissent se connecter

# à l'ordinateur par XDMCP)

#$IPTABLES -A INPUT -p ucp --dport 177 -j ACCEPT

# Décommentez la ligne suivante pour que l'odinateur puisse se connecter

# par XDMCP à une machine distante)

#$IPTABLES -A INPUT -p tcp --dport 6001 -j ACCEPT

# Décommentez la ligne suivante pour que le serveur CVS éventuel

# soit joignable de l'extérieur via le mécanisme de "pserver"

# (si les utilisateurs accèdent au serveur CVS exclusivement via SSH,

# seule la ligne concernant le serveur SSH doit être décommentée)

#$IPTABLES -A INPUT -p tcp --dport 2401 -j ACCEPT

# Décommentez la ligne suivante pour pouvoir reçevoir des flux VideoLAN

# (ce sont des flux UDP entrants sur le port 1234)

#$IPTABLES -A INPUT -p udp --dport 1234 -j ACCEPT

# Décommentez la ligne suivante pour pouvoir reçevoir des annonces SAP

# (ce sont des annonces de session multicast)

#$IPTABLES -A INPUT -p udp -d 224.2.127.254 --dport 9875 -j ACCEPT

# Décommentez les 3 lignes suivantes pour pouvoir utiliser GnomeMeeting

#$IPTABLES -A INPUT -p tcp --dport 30000:33000 -j ACCEPT

#$IPTABLES -A INPUT -p tcp --dport 1720 -j ACCEPT

#$IPTABLES -A INPUT -p udp --dport 5000:5006 -j ACCEPT

#on log tout

$IPTABLES -A FORWARD -j LOG_DROP

$IPTABLES -A INPUT -j LOG_DROP

$IPTABLES -A OUTPUT -j LOG_DROP

echo "firewall actif"

echo "log dans /var/log/messages"

```

Détection d'intrusion provenant du réseau

Les outils de détection d'intrusions provenant du réseau scrutent le trafic sur un segment de réseau et utilisent cette information comme source de données. Spécifiquement, les paquets du réseau sont examinés et ils sont vérifiés pour voir s'ils correspondent à une certaine signature.

Snort est un renifleur flexible de paquets ou un logueur qui détecte les attaques selon un dictionnaire de signature d'attaques. Il détecte une variété d'attaques et de sondes, tels que des débordements de capacité, les scans dissimulés de ports, les attaques CGI, les sondes SMB, et bien d'autres. Snort dispose également d'une capacité d'alerte en temps réel. Vous pouvez utiliser snort pour un certain nombre d'hôtes de votre réseau ainsi que pour votre propre hôte. C'est un outil qui peut être installé sur n'importe quel routeur pour garder un ½il sur le réseau. 

Installation :

```

# emerge snort

```

Pour la configuration voir ce thread : https://forums.gentoo.org/viewtopic-t-399801.html

Sécurisations des accès réseau

Beaucoup de fonctionnalités du noyau peuvent être modifiées en cours de fonctionnement en envoyant quelque chose (via la commande echo) dans le système de fichiers /proc ou en utilisant sysctl. En entrant sysctl -A, vous pouvez voir ce que vous pouvez configurer et quelles sont les options, elles peuvent être modifiées en exécutant /sbin/sysctl -w variable=valeur 

Par exemple :

```

net/ipv4/icmp_echo_ignore_broadcasts = 1

```

C'est un « émulateur Windows » parce que ça agit comme Windows sur les ping de broadcast si celui-ci est positionné à 1. C'est-à-dire que les requêtes ICMP_ECHO envoyées à l'adresse broadcast seront ignorées. Sinon, cela ne fait rien.

Si vous voulez empêcher votre système de répondre aux requêtes d'echo ICMP, activez cette option de configuration :

```

net/ipv4/icmp_echo_ignore_all = 1

```

Pour enregistrer les paquets avec des adresses impossibles (à cause de routes erronées) sur votre réseau, utilisez :

```

/proc/sys/net/ipv4/conf/all/log_martians = 1

```

Configurer syncookies

Elle protège votre système contre le syn packet flooding mais viole les standards définis (RFCs).

```

net/ipv4/tcp_syncookies = 1

```

Outils antivirus

Clamav est un antivirus libre, pur installer le fronted voir ici : https://bugs.gentoo.org/show_bug.cgi?id=98976

Donc après cela le système est déjà un peu plus sécurisé  :Wink: 

----------

## sireyessire

quelques remarques:

pour les rootkits il y a aussi rkhunter qui est un équivalent de chrootkit.

pour le firewall, moi je conseille l'excellent firehol qui génére à partir de scripts bash les règles iptables en fonction de la configuration demandé dans le fichier de conf, très facile à mettre en oeuvre.

mentionnons aussi l'excellent fail2ban qui banne les hôtes qui font trop de tentatives ssh pendant un laps de temps via iptables.

et j'en oublie surement d'autres encore  :Wink: 

----------

## TGL

Décidément bouleetbill, c'est la forme ! Merci à toi  :Wink: 

Et histoire de faire un commentaire utile, une lecture sur le sujet que je recommande chaudement à ceux qui l'auraient ratée : Manuel de la sécurité pour Gentoo

----------

## Mickael

Merci à toi Bouleetbil,

je poste uniquement pour "compléter" un peu tes explications : en effet, je suis sur que sous Linux, nous ne sommes pas tous issu d'une formation à vocation informatique. Donc, rootkit et compagnie ça parle pas beaucoup, et on se pert très vite sur ces notions de ports, sécurité, et autres..... (Ca arrive) Pour les nuls, comme moi, un lien sur les rootkits sur Wikipedia (on en parlera jamais assez, soit dit en passant) pour comprendre, un peu plus.  :Wink: 

Merci encore, je vais continuer à déchiffrer, et rendre mon portable beaucoup plus sûr, et là y'a du boulot.   :Rolling Eyes: 

----------

## letoff

Très sympa ce post. J'en profite pour donner également quelques petits conseils que je pense utiles.

Comme indiqué plus haut par sireyessire,  fail2ban  est un script python dont je ne pourrais plus me passer: il scan les tentatives d'accès ssh (mais aussi Apache) et bloque l'IP pendant un temps définit au bout d'un nombre de tentatives paramétrable. En plus il est maintenant dans portage. A mon avis ça évite d'avoir à changer le port de ssh. Il existe également la possibilité fort utile de compiler openssh avec le flag skey qui ouvre les voies de l'opie c'est à dire les mots de passe jetables. Indispensable quand on doit accéder à un serveur depuis des environnements non sécurisés avec d'éventuels keylogger.   :Evil or Very Mad: 

D'autre part, nombre de tentatives d'intrusion via Apache/php tentent de récupérer un soft et de l'exécuter dans /tmp. Il est donc impératif d'avoir cette partition en noexec nodev et nosuid.

Certains rootkits tentent également de se servir de la possibilité de charger un module:  il peut donc aussi être utile de désactiver cette possibilité (sur un serveur évidémment) en recompilant son kernel avec tous les modules en dur et CONFIG_MODULES=n

Quand à rkhunter et chkrootkit il est souhaitable de les mettre dans un crontab en exécution journalière avec un rapport pour root (d'office avec rkhunter il me semble).

Enfin il ne faut pas oublier de vérifier régulièrement que son système n'a aucune faille: glsa-check est fait pour ça. Je me suis fait le petit alias suivant:

```
alias secure='glsa-check --list|grep '\''\[N'\'''
```

Voilà, c'était mes 0.02

----------

## bouleetbil

Je me doutais qu'un post sur la sécurité attirerait du monde   :Very Happy: 

Ce qui est sympa c'est de voir les logiciels utilisés par les autres.

Pour le firewall sur mon portable j'utilise firestarter très simple à utiliser et suffit amplement.

----------

