Ouvrez le pare-feu automatiquement à toute personne ayant réussi à se connecter via SSH

6

J'ai un serveur qui exécute quelques services. Cependant, pour des raisons de sécurité, j'ai configuré le serveur de sorte que rien, sauf pour SSH, ne soit accessible de l'extérieur.

Ce que je voudrais plutôt faire, cependant, est de laisser le serveur autoriser l'accès à tous ses services à toute personne ayant réussi à se connecter via SSH (et une fois que cette personne s'est déconnectée, fermez à nouveau tous les ports, à l'exception du port SSH. qui devrait rester ouvert).

Y a-t-il un moyen de faire cela?

J'utilise Arch Linux sur le serveur et ufwpour gérer le pare-feu.

houbysoft
la source
Je suggèrerais de déplacer cette question sur stack Overflow, car elle nécessitera un script. Aussi, envisagez d'utiliser portknocking.org pour plus de sécurité
Lizz
@Lizz: frapper au port semble être une bonne idée. Je suis ouvert à le déplacer (je ne peux pas le faire sans un mod cependant).
Houbysoft

Réponses:

1

Vous pouvez insérer des commandes ~/.bashrc. Tout ce qui s’y trouve est exécuté chaque fois qu’un utilisateur se connecte.

Pour que vos commandes ne s'exécutent que lors de la connexion via ssh (et non lors d'une connexion physique), vous pouvez tester la présence de la SSH_CONNECTIONvariable d'environnement.

Bart Koopman
la source
Oui, mais j’en ai aussi besoin pour refermer les ports lorsque l’utilisateur se déconnecte. Je ne peux pas simplement le mettre ~/.bash_logoutparce que ça ne s'appelle pas si la connexion meurt après coup.
Houbysoft
0

J'ai écrit une solution pour cela. Ce n'est pas parfait et les améliorations sont les bienvenues. En particulier, je pense que cela ~/.bash_logoutne sera pas appelé si la connexion est arrêtée, mais je veux que le pare-feu se ferme lui aussi.

Dans tous les cas, commencez par configurer le sudoersfichier afin que votre utilisateur puisse exécuter le ufwbinaire sans entrer de mot de passe.

Puis dans ~/.bashrc:

ip=`echo $SSH_CONNECTION | cut -d " " -f 1`
echo "=> Opening the firewall for $ip..."
sudo ufw allow from $ip
echo "=> Done."

Dans ~/.bash_logout:

ip=`echo $SSH_CONNECTION | cut -d " " -f 1`
echo "=> Closing the firewall for $ip..."
sudo ufw delete allow from $ip
echo "=> Bye."

Encore une fois, cependant, cela ne fera que refermer les ports si vous terminez correctement votre session. Si quelqu'un sait comment la fermer à chaque fois que la connexion se ferme / meurt / peu importe, modifiez cette réponse avec votre solution.

houbysoft
la source
Vous pouvez écrire un script exécuté par un travail cron qui supprimera les adresses IP obsolètes du pare-feu. Configurez-le pour qu'il s'exécute toutes les cinq ou dix minutes, puis, si une connexion est perdue, l'autorisation pour cette adresse IP sera supprimée dans un délai de 5 ou 10 minutes. Il y a un problème avec votre script (et ma suggestion aussi). Que se passe-t-il si l'utilisateur se connecte avec deux connexions SSH (par exemple, pour avoir deux fenêtres ouvertes) ou si deux utilisateurs se connectent depuis la même adresse IP (c'est-à-dire depuis un NAT)? En vérité, la meilleure solution serait de mettre en place un véritable VPN.
Moshe Katz
@MosheKatz: dans ces cas, vous devrez simplement fermer les deux sessions en même temps, mais oui, ce n'est pas parfait. J'ai pensé à cron, mais comment vérifieriez-vous les adresses IP périmées? Est-il possible de demander au démon ssh si quelqu'un est connecté?
Houbysoft
Vous pouvez utiliser who --ipspour voir qui est actuellement connecté. Vous aurez besoin d'une liste d'adresses IP que vous avez autorisées (vous pourrez peut-être l'obtenir ufw, ou vous pourrez simplement la conserver vous-même à l'aide des scripts de connexion et de déconnexion). Ensuite, comparez la liste que vous avez avec la sortie whoet supprimez les IP du pare-feu (et de la liste) qui ne figurent pas dans la whosortie.
Moshe Katz
@MosheKatz: who --ipsme donne unrecognized option '--ips'. Je peux faire juste whomais cela retourne une longue chaîne contenant le nom de domaine, pas l'adresse IP. Il doit y avoir un moyen plus facile d'obtenir les adresses IP directement?
Houbysoft
Exécuter man whopour voir les options que vous avez. Vous semblez avoir une version différente de la mienne.
Moshe Katz