Installation 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équencesshd
et bannit l’adresse IP au delà de 6 tentatives.</li> -
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
</ul>
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
où 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”.
</div>