Step-by-step Ubuntu server configuration: SecurityInstallation pas à pas d’un serveur Ubuntu 10.04 : Sécurité

Le deuxième post concerne la sécurisation du serveur : installation d’un parefeu, des règles de banissement des adresses IP ainsi que de la configuration de la connexion SSH par clé publique/privée.

Denyhosts

Denyhosts est un utilitaire qui permet de bloquer automatiquement les tentatives de connexion provenant d’adresses IP après des échecs de connexion. Connecté au serveur en root via ssh, l’installation de denyhosts s’effectue par

apt-get install denyhosts

et denyhosts est configuré par l’édition du fichier /etc/denyhosts.conf. Le fichier est très bien commenté et la configuration de denyhosts est donc aisée. Quelques exemples de paramètres pouvant être modifiés :

  • BLOCK_SERVICE=ALL permet de bloquer tout type de tentatives de connexion (contrairement à BLOCK_SERVICE=sshd qui ne bloque que les connexions ssh) ;
  • DENY_THRESHOLD_INVALID= permet de régler le seuil du nombre de tentatives de connexions avec un login incorrect avant le banissement de l’IP;
  • DENY_THRESHOLD_VALID= permet de régler le seuil du nombre de tentatives de connexion avec un login correct mais un mot de passe incorrect avant le banissement de l’IP;
  • DENY_THRESHOLD_ROOT= permet de régler le seuil du nombre de tentatives de connexion avec le login root et un mot de passe incorrect avant le banissement de l’IP;
  • SYSLOG_REPORT=YES permet d’inclure les échecs de connexion dans les log systèmes.

Diminuer les seuils par défaut revient donc à augmenter la sécurité du serveur. Si vous-même utilisez une connexion internet avec une IP fixe pour accéder au serveur, l’ajout de cette IP dans /etc/hosts.allow évitera le banissement de votre propre IP pour cause d’erreurs répétées de mot de passe. Insérer simplement la ligne

ALL: xx.xxx.xx.xxx

où xx.xxx.xx.xxx est votre IP. Mais attention ! Ceci introduit évidemment une faille de sécurité : toute personne utilisant votre IP pourra faire des tentatives de connexion répétées sur le serveur.

Plus d’informations : Documentation ubuntu francophone sur denyhosts.

Parefeu shorewall

Shorewall est un logiciel utilisé sous serveur linux en routeur/parefeu. L’installation se fait par connexion ssh en root en tapant

apt-get install shorewall

Des exemples de configuration pour un serveur unique (“one interface”) sont disponibles dans le répertoire

/usr/share/doc/shorewall/examples/one-interface. Copiez ces fichiers dans le répertoire de configuration de shorewall par

cp /usr/share/doc/shorewall/examples/one-interface/*
		/etc/shorewall/.

On commence ensuite par éditer le fichier policy qui définit les règles entre le pare-feu (noté $FW) et l’extérieur (noté net ; les interfaces sont définies dans le fichier interface).
Par exemple, la configuration

$FW		net		ACCEPT
net		$all	DROP			info
all		all		REJECT		info

accepte tous les flux du pare-feu vers l’extérieur et rejette tous les flux de l’extérieur vers le pare-feu.

On peut ensuite définir quelques exceptions en éditant le fichier rules ; par exemple, pour accepter les connexions ssh de l’extérieur vers le pare-feu (ce qui est préférable si vous souhaitez pouvoir continuer à vous connecter à votre serveur, il faut ajouter la ligne

SSH(ACCEPT)     net             $FW

http://www.shorewall.net/ports.htm (en anglais) explique comment définir diverses règles. Il peut, par exemple, être utile d’autoriser les requêtes HTTP si vous souhaitez installer un serveur apache.

Ensuite, éditez le fichier /etc/default/shorewall et ajouter la ligne "startup=1" pour rendre shorewall actif au démarrage. Enfin, démarrez shorewall par

shorewall start

fail2ban

fail2ban est un utilitaire qui lit les logs des serveurs (ssh, apache…) et recherche les erreurs d’authentification répétées pour bannir l’adresse IP responsable de celles-ci. fail2ban s’installe à partir d’une connexion ssh en root par :

apt-get install fail2ban

La configuration se fait via le fichier /etc/fail2ban/jail.conf. Quelques paramètres :

  • dans ignoreip, il peut être utile d’ajouter l’adresse IP fixe de la maison si vous en avez une ;
  • les règles sont activées par la syntaxe suivante :
    [ssh]
    enabled = true
    port    = ssh
    filter  = sshd
    logpath  = /var/log/auth.log
    maxretry = 6

    qui scanne le fichier /var/log/auth.log pour trouver des erreurs de connexion ssh en recherchant la séquence sshd et bannit l’adresse IP au delà de 6 tentatives.

  • l’exemple suivant permet de bannir les requêtes DFind w00tw00t sur le serveur apache :
    [apache-w00tw00t]
    enabled = true
    filter = apache-w00tw00t
    action = iptables[name=Apache-w00tw00t,port=80,protocol=tcp]
    logpath = /var/log/apache2/access*.log
    maxretry = 1

Pour rendre cette dernière règle active, il faut définir le filtre en créant le fichier /etc/fail2ban/filter.d/apache-w00tw00t.conf contenant

[Definition]
failregex = ^-.*"GET \/w00tw00t\.at\.ISC\.SANS\.DFind\:\).*".*
ignoreregex =
On relance fail2ban pour actualiser les paramètres
fail2ban-client reload

et on peut vérifier l’état de fail2ban par :

fail2ban-client status

Connexion SSH

La première étape consiste à éditer le fichier /etc/ssh/ssh_config pour prévenir la déconnexion après une grande période d’inactivité. Cela se fait en ajoutant les lignes :

ServerAliveInterval 15
ServerAliveCountMax 20

Ces paramètres envoient une requête permettant de maintenir l’activité toutes les 15 secondes et la connexion est coupée après 20 tentatives infructueuses de connexion via la liaison ssh.

La deuxième étape consiste à sécurité la connexion ssh en la configurant par utilisation d’un jeu de clés privée/publique plutôt qu’un mot de passe. On commence par générer, sur son ordinateur local, une paire de clé (si on n’en possède pas) par :

ssh-keygen -t dsa

Par défaut, la clé est sauvée dans ~/.ssh
On copie la clé publique (celle dont le nom finit par .pub) dans les clés autorisées par

ssh-copy-id -i ~/.ssh/majoliecle.pub root@IP

majoliecle doit être remplacée par le nom de la clé et IP par l’IP du serveur.

On tente alors la connexion au serveur

ssh-add .ssh/majoliecle.pub
ssh root@IP

(la première ligne sert à charger sur l’ordinateur local la clé privée qui permettra l’authentification par le serveur) ; si le serveur connecte sans demander de mot de passe : c’est gagné ! On peut alors supprimer la possibilité de connexion par mot de passe. Pour cela, on édite le fichier /etc/init.d/sshd_config et on met les options PasswordAuthentification et ChallengeResponseAuthentication à no.

Attention ! La clé privée doit être conservée précieusement et de manière fiable : non seulement elle permet la connexion au serveur mais sa perte interdit l’accès au serveur !

On redémarrer le serveur ssh par :

/etc/init.d/ssh restart

Enfin, on peut ajouter la clé publique sur l’interface manager d’OVH au cas où il serait nécessaire de démarrer en mode “rescue”.