sécuriser son serveur : les bases

Bonjour,

J’installe une debian chez moi qui fera office de serveur, donc ouverte sur internet.
Et j’aimerais la sécuriser au mieux.

La première chose à faire :

Dans mon cas, j’ai :

  • un compte root
  • un compte utilisateur normal, qu’on va nommé toto…

Il me faut un accès depuis l’extérieur, j’ai choisi SSH (OpenSSH qu’est-ce que vous en pensez ? C’est quoi le mieux ?)
A priori, le paquet ssh-server me suffit vu que je n’utiliserais pas cette machine pour me connecter à une machine distante ?

Mais pour sécuriser, d’après ce que j’ai recherché sur le net, j’aurais aussi besoin de :

  • iptables (c’est le parefeu c’est ca ? j’ai entendu parlé aussi de netfiler, c’est la même chose, j’ai du mal à faire la part des choses entre les 2 ?)
  • fail2ban (pour bannir des IP en cas de bruteforce (trop grand nombre d’échecs lors de l’authentification par SSH ?), ca utilise iptables il me semble ?)

Avant d’aller plus loin et d’installer apache, serveur ftp et tout le reste, je pense que le mieux c’est déjà de configurer ces 3 outils afin d’avoir une debian sécurisée et accessible depuis l’extérieur par un shell sécurisé, c’est la base non ? Vous en avez d’autres ?

J’aurais aimé lister un peu les configurations qu’il y a à faire sur chacun de ses outils grâce à vos expériences, voilà ce que j’ai déjà pu trouvé :
SSH :

  • Changer le port d’écoute (Port) (on peut mettre n’importe quoi ? Certains sont réservés ?)
  • Interdire de se loguer directement en root (PermitRootLogin no)
  • Protocol 2 (J’ai lu sur internet qu’il fallait mettre le protocol sur 2, quelqu’un sait pourquoi ? Qu’est-ce que c’est exactement ?)
  • AllowUsers toto tata autre_login (on restreint aux seuls utilisateurs qui ont le droit de se connecter)
  • X11Forwarding no
  • Histoire des clés ? comment ca marche ? C’est par défaut ? Les clés se génèrent automatiquement ? Ou on peut faire une configuration plus fine ?

Fichier de configuration : /etc/ssh/sshd_config
Logs : /var/log/auth.log
(les tentatives de connexions sont inscrites dans le fichier de log)

iptables :

  • Réinitialiser les règles iptables :

sudo iptables -F sudo iptables -X

  • Bloquer tout le trafic entrant par défaut :

sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP

  • Bloquer tout le trafic sortant par défaut :
  • Autoriser le trafic sur l’interface loopback :

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

  • Ne pas casser les connexions etablies

sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Et après, c’est selon ce dont j’ai besoin, par exemple, ouvrir le port 80 pour le serveur HTTP :
(dans les 2 sens ?)
o Autoriser les connexions sur le port 80

sudo iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT sudo iptables -A OUPUT -i eth0 -p tcp --dport 80 -j ACCEPT

fail2ban :
Il suffit de modifier dans le fichier de configuration comme ca nous intéresse…
Fichier de configuration : /etc/fail2ban/jail.conf
Logs : /var/log/fail2ban.log
(pour voir les IP bannis par Fail2Ban)

Merci de vos avis :slightly_smiling:

++

Bon je ne repondrais qu’à ce que je connais :

iptables te permet de commander netfilter.

Pour ssh :

  • tu peux mettre n’importe quel port a priori, tant qu’il n’est pas utilisé pour autre chose par ton serveur (comme le port 80 par exemple, qui servira à apache)

  • le protocole 2, c’est la deuxième version de ssh, qui est plus sécurisée (après je ne connais pas précisement les differences)

  • les autres options c’est bon

  • pour l’histoire des clés :
    http://www.andesi.org/reseau:installation-et-utilisation-de-ssh

Pour obliger l’utilisation des clés, il faut mettre :
PasswordAuthentification no
dans ton /etc/ssh/sshd_config
Ca interdira l’authentification simplement avec mot de passe.
Il faudra que tu crées tes clés avant, sinon il faudra que tu les copies dans authorized_keys par un autre moyen…

Ok pour tes règles iptables à part :
sudo iptables -A OUPUT -i eth0 -p tcp --dport 80 -j ACCEPT
Tu peux normalement la supprimer, la connexion étant établie par l’extérieur.
Et il te faudra faire une règle pour ssh

Pour plus d’info sur netfilter/iptables :
http://olivieraj.free.fr/fr/linux/information/firewall/
http://pagesperso-orange.fr/arsace/iptables-tutorial-1.2.2/book1.html

Salut,

je me suis fait un petit serveur sous debian chez moi comme tu projettes de faire :stuck_out_tongue:
Si ça peut t’aider pour iptables voilà comment j’ai fait :
J’ai mis un script qui configure des règles iptables dans le dossier “/etc/network/if-pre-up.d/” (se lance avant le lancement de chaque interface réseau) (créé grâce à une page de ce site : formation-debian.via.ecp.fr/), le voici, il peut t’aider pour une configuration de base :

#!/bin/sh
# /etc/network/if-pre-up.d/iptables-start
# règles filtrage iptables
# inspiré de Alexis de Lattre (http://formation-debian.via.ecp.fr/)

# tout mettre à zéro
iptables -F
iptables -t nat -F

# politiques par défaut
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT

# exceptions connexions entrantes
iptables -A INPUT -i lo -j ACCEPT # interface loopback
iptables -A INPUT -p icmp -j ACCEPT # accepter ping
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # accepter connexions entrantes si connexions déjà établie

iptables -A INPUT -p tcp --dport 20 -j ACCEPT # ftp
iptables -A INPUT -p tcp --dport 21 -j ACCEPT # ftp
iptables -A INPUT -p tcp --dport 36000:36100 -j ACCEPT # ftp passif
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # ssh
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # web
iptables -A INPUT -p tcp --dport 631 -s 192.168.1.0/24 -j ACCEPT # cups (local seulement)
iptables -A INPUT -p udp --dport 631 -s 192.168.1.0/24 -j ACCEPT # cups (local seulement)
iptables -A INPUT -p tcp --dport 139 -s 192.168.1.0/24 -j ACCEPT # samba (local seulement)
iptables -A INPUT -p udp --dport 139 -s 192.168.1.0/24 -j ACCEPT # samba (local seulement)
iptables -A INPUT -p tcp --dport 37060:37200 -j ACCEPT # torrentflux
iptables -A INPUT -p udp --dport 37060:37200 -j ACCEPT # torrentflux

Je suis pas sûre, car il à bloquer en sortit. Mais bon je pense que tu peux virer le blocage en sortie car pour le serveur que tu veux faire tu en as pas besoin. Cela allègera ta config et le temps de réponse de ton firewall meme si je doute que ca change quelque chose au temps de réponse vu le nombre de règles que tu as :wink:
Par contre cette ligne là :

Elle sert à rien car tu ne sers pas de passerelle. Tu as qu’une interface.
Il faut savoir qu’une fois que tu as tester ton firewall, tu peux le tester avec des logiciels pour voir s’il bloque bien ce que tu veux etc …

Vas tu te connecter toujours avec la meme IP à ton serveur debian ?

Non, je me connecte depuis une box et j’ai une IP dynamique donc je me connecterai pas toujours depuis la même adresse IP…
Mais lorsque j’ai installé le paquet ssh, apparemment, dans les dépendances, il y a openssh qui s’est installé aussi…

Tu parles de logiciels spéciaux qui permettent de faire un rapport sur ce qu’il en est ?
Ou tu parles de tester avec toutes les applis que j’utilise, ssh, apache, etc…

Donc en fait, quand t’allumes l’ordi et que les interfaces réseaux démarrent, ca se réinitialise a chaque fois ?

Les ports vont de combien à combien ?

Quelqu’un sait c’est quoi les 4 tables dans iptables :
filter
nat
mangle
raw

Dans les pages de man, j’ai pas trop compris à quoi servaient les 3 dernières… la premiere étant la plus importante apparement ? pour les logiciels de base ?

Quelqu’un sait quand utiliser TCP plutôt qu’UDP ? Je sais qu’un c’est mode connecté (et donc principal intérêt : la détection des erreurs) et l’autre mode non connecté… mais pour quelle applie choisir l’un plutôt que l’autre ?

Sinon, ben j’ai essayé un peu de configurer iptables et j’avais des problèmes pour aptitude et ping…
Quelqu’un sait ce qu’il faut absoluement pour l’un et l’autre… ?
Apparemment, pour ping, ce serait :

iptables -t filter -A INPUT -p icmp -j ACCEPT iptables -t filter -A OUTPUT -p icmp -j ACCEPT

mais pour aptitude ? autoriser sur port 80 en sortie ?

Pour SSH, il faut ouvrir le port en entrée ET en sortie ? Ou juste en entrée ca suffit ?

Merci à vous
++

Les ports vont de 1 à 56535 : la liste des ports et les protocoles qui les utilisent par défaut sont disponibles sur le site de IANA : http://www.iana.org/assignments/port-numbers

La table filter est celle qui nous interesse, les tables nat et mangle sont utilisées pour faire du partage de connexion, si par exemple tu veux que ta machine fasse routeur. Les liens que je t’ai donné plus haut t’en diront plus.

Les connexions http, ftp, ssh se font toujours en TCP. Le protocole UDP ne permet pas de vérifier l’intégrité des données envoyées, il est utilisé pour la VOiP et le streaming (qui doivent apporter un flux continu de données), pour les requetes DNS (la vérification prendrait plus de temps que l’envoi des données).
Pour les détails, tu peux chercher TCP et UDP sur wikipedia. Tu peux aussi regarder ce site : http://www.frameip.com/

Pour aptitude et autres connexions établies par ton serveur, j’ai trouvé l’erreur ! Remplaces :
sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
par :
sudo iptables -A OUTPUT -m state --state ! INVALID -j ACCEPT
Pour accepter toutes les connexions non invalides vers l’extérieur.
La règle INPUT est bonne, car elle permet de répondre aux connexions établies par ta machine, sans authoriser les connexions extérieures (les autres règles pour ca)
Donc avec cette règle, tu n’a besoin que d’ouvrir la connexion ssh en entrée, vu que tu autorise les sorties.

Et effectivement, tu n’utilises pas la règle FORWARD si tu ne fais pas de partage de connexion, mais autant la laisser à DROP (dans la sécurité il vaut mieux être restrictif au maximum, pour ne pas dire parano)

Pour tester ton serveur, tu peux utiliser nmap et ethereal (entre autres) qui te permettent de surveiller les connexions et faire des tests d’intrusions.

[quote=“italiasky”]Il me faut un accès depuis l’extérieur, j’ai choisi SSH (OpenSSH qu’est-ce que vous en pensez ? C’est quoi le mieux ?)
A priori, le paquet ssh-server me suffit vu que je n’utiliserais pas cette machine pour me connecter à une machine distante ?[/quote]

Openssh est parfait. C’est la version libre d’ssh. Couramment utilisé en entreprise. Tkt.

[quote=“italiasky”]Mais pour sécuriser, d’après ce que j’ai recherché sur le net, j’aurais aussi besoin de :

  • iptables (c’est le parefeu c’est ca ? j’ai entendu parlé aussi de netfiler, c’est la même chose, j’ai du mal à faire la part des choses entre les 2 ?)[/quote]

En même temps, Netfilter c’est le nom du parefeu et Iptables, la commandes que tu utilises quand tu paramètres Netfilter… Hop, comme ça tu n’auras plus de pb :slightly_smiling:

Netfilter fait ça aussi. :slightly_smiling:
Pour ce qui est d’ssh, le principe, c’est ça. Tu as compris. Sache toutefois que le fait de changer le port 22 n’empêchera pas un hacker de venir renifler ton port, justement. Le seul avantage, c’est que tu limiteras les attaques menées par les robots. Le numéro de port doit seulement être supérieur à 1024, pour être sûr qu’il ne soit pas déjà utilisé.

De même, les mots de passes balèze c’est bien pour empêcher les attaques par dictionnaire, genre Hydra.

Au passage, si tu as besoin de lister les règles Netfilter que tu as paramétré avec la commandes Iptables : tu fais “iptables -L”.

“Et après, c’est selon ce dont j’ai besoin, par exemple, ouvrir le port 80 pour le serveur HTTP :
(dans les 2 sens ?)”

Un utilisateur fait une requête. Le serveur y réponds. Donc…
Par contre, tu dois pouvoir, là aussi, rediriger le requêtes http sur le port 8080, par exemple. C’est très classique, mais bon… why not.

Pour ce qui est de netfilter, je ne suis pas spécialiste. Cela dit : c’est une bonne initiative que de le bosser. C’est un super outil. N’hésite pas à approfondir le sujet. C’est bon à prendre.

N’oublie pas de fermer les ports inutilement ouverts aussi. Tu les verras avec un netstat -nltp.

Si tu fais du ftp, veille à utiliser une configuration avec user_list. Tu peux aussi virtualiser tes users, si tu veux, et leurs donner des droits individuels (ce que tu peux faire sans passer par la virtualisation des utilisateurs, cela dit). Tu veux configurer ton serveur en mode passif ou en mode actif? En mode passif, garde à l’esprit que tu vas ouvrir un range de ports éphèmères. Fais en sorte dque l’étendue de port ne soit pas inutilement large… c’est autant de trous de sécurité. Le mieux reste encore le mode actif. Et avec VSFTPD, par exemple, tu peux utiliser le paquetage ssl pour sécuriser tes données.

Chris

[quote=“kna”]Les ports vont de 1 à 56535 : la liste des ports et les protocoles qui les utilisent par défaut sont disponibles sur le site de IANA : http://www.iana.org/assignments/port-numbers
[/quote]

Tu as du faire une faute de frappe, le nombre de port c’est 65535 :wink:.

Je te parle de logiciel : ftester : http://dev.inversepath.com/trac/ftester

Pour la config de ton firewall regarde celle de mick74, elle est simple et adaptée au serveur comme le tien. Serveur personnel sans etre une passerelle ni un routeur. Pour des serveurs comme ça pas besoin d’etre parano. En entrée tu ouvres juste les ports utilisés et en sortie tu ouvres tous. Si tu lances le minimum de service que ceux utiles. Tu sécurises bien tes services (http,ssh,ftp) et tu les gardes à jour et c’est bon.

Si tu veux tester a fond la sécuriter de ton serveur, je te conseille d’essayer la distribution backtrack.
http://www.remote-exploit.org/backtrack.html
Elle contient tous les outils de pentesting necessaire.

[quote=“italiasky”]

Donc en fait, quand t’allumes l’ordi et que les interfaces réseaux démarrent, ca se réinitialise a chaque fois ?[/quote]

Oui (les règles iptables ne perdurent pas après un redémarrage il faut donc un script pour les lancer à chaque démarrage).