Pour permettre l’accès à la gateway depuis Internet avec un maximum de sécurité, j’ai configuré le serveur OpenSSH (fournit dans basesys) et PF pour :
- N’autoriser l’accès que par clé publique
- Empêcher les attaques par force brute sur le serveur
La configuration d’OpenSSH peut se faire de deux façon :
- On désactive l’authentification par mot de passe et l’utilisation de PAM pour que la méthode keyboard-ineractive ne laisse rien passer
- On désactive l’authentification par mot de passe et le challenge/respone pour garder l’utilisation de PAM
J’ai choisi la 2ème méthode qui permet de garder la fonctionnalité de
pam_nologin (seul root peut se logguer si /etc/nologin
existe, en
modifiant /etc/ssh/sshd_config
:
PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePam yes
Ainsi, l’authentification par mot de passe est totalement désactivée.
Pour empêcher les attaques par force brute sur le serveur, on configure PF de cette façon :
- Il faut une table pour enregistrer les IP à bannir
- On utilise l’option
max-src-conn-rate
sur la règle qui ouvre le port de SSH : pas plus de deux connexions dans un intervalle de dix secondes par IP. - On ajoute une règle pour bloquer les IP présentes de la table
Les règles PF, à placer dans /etc/pf.conf
:
table <ssh_bans> persist
# allow ssh on the external interface, limit to connections in ten seconds
pass in on $ext_if inet proto tcp to ($ext_if) port ssh \\
keep state (max-src-conn-rate 2/10, overload <ssh_bans> flush)
# reject banned ip from connectiong to ssh port
block return in on $ext_if inet proto tcp from <ssh_bans> to ($ext_if) port ssh
Pour surveiller, on utilise les options de manipulation des tables de
pfctl
:
# pfctl -t ssh_bans -T show
# pfctl -t ssh_bans -T add X.Y.Z.T
# pfctl -t ssh_bans -T delete X.Y.Z.T
Enfin, un petit thread qui explique à quoi sert le challenge/response et la méthode keyboard-interactive : http://groups.google.com/group/comp.security.ssh/browse_thread/thread/c483316ac6abcb74.