Autoriser uniquement des utilisateurs spécifiques à se connecter via ssh sur un port et d'autres à se connecter via un autre port

13

J'ai le cas d'utilisation suivant:

  • Besoin d'autoriser les utilisateurs à se connecter à partir d'un réseau sécurisé et fiable
  • puis autoriser un couple (seulement deux) utilisateurs mobiles à se connecter à distance sur une machine Linux Centos.

Je peux faire tourner sshd sur différents ports, par exemple:

  • de l'intérieur, il est correct de le faire fonctionner sur 22 car je ne veux pas les faire se connecter sur d'autres ports (gâche le script).
  • Pour les utilisateurs mobiles externes, je vais exécuter le sshd sur un port différent, par exemple le port X (sécurité accrue - c'est une configuration de type petit bureau).

Pour plus de sécurité, j'espérais configurer sshd pour n'autoriser l'accès qu'à certains utilisateurs particuliers sur le port X (puis configurer certaines alertes afin que nous puissions savoir quand les utilisateurs se connectent via le port X).

Cependant, je ne trouve aucune configuration comme celle-ci dans la documentation sshd. S'il n'y a pas de solution comme celle-ci, est-il au moins possible de déclencher un script shell à exécuter chaque fois que quelqu'un termine la connexion sshd sur le port X? Je regardais la documentation d'iptables pour voir si cela pouvait déclencher une alerte lorsque la connexion sshd était là mais ne pouvait rien trouver.

Apports appréciés

doon
la source

Réponses:

12

L'exécution SSHsur un autre port ne compte plus comme sécurité. Cela ajoute seulement un peu d'obscurité et une étape supplémentaire de complexité pour vos utilisateurs. Il ajoute zéro obstacle pour les personnes qui cherchent à briser votre réseau, qui utilisent des scanners de ports automatisés et ne se soucient pas du port sur lequel il fonctionne.

Si vous souhaitez renforcer la sécurité sur un système qui autorise la SSH entrante basée sur Internet à distance, contrôlez vos utilisateurs dans le sshd_config@Anthon indiqué, puis implémentez également la sécurité directement dans PAM.

Créez deux groupes luserset rusers. Ajoutez les utilisateurs mobiles distants au rusersgroupe. Utilisez le module PAM pam_succeed_if.so pour autoriser l'accès à ces utilisateurs. Ajoutez des lignes à votre configuration pam pour ssh:

account     sufficient  pam_succeed_if.so user ingroup lusers
account     sufficient  pam_succeed_if.so user ingroup rusers

Certains modules pam_succeed_if.so peuvent vous obliger à utiliser une syntaxe légèrement différente, comme group = lusers.

Ensuite, non seulement sshdlimite les utilisateurs qui peuvent se connecter, mais en cas de bogue sshd, vous avez toujours la protection offerte par les restrictions basées sur PAM.

Une étape supplémentaire pour les utilisateurs distants consiste à forcer l'utilisation de ssh_keys avec des phrases secrètes. Ainsi, les utilisateurs locaux peuvent se connecter avec des clés ou des mots de passe, mais les utilisateurs distants doivent avoir une clé, et si vous créez les clés pour eux, vous pouvez vous assurer que la clé a une phrase de passe associée. Limitant ainsi l'accès aux emplacements qui possèdent réellement la clé SSH et la phrase secrète. Et limiter les vecteurs d'attaque potentiels si le mot de passe d'un utilisateur est compomisé.

Dans sshd_config:

changer 2 paramètres:

ChallengeResponseAuthentication yes

et

PasswordAuthentication yes

à:

ChallengeResponseAuthentication no

et

PasswordAuthentication no

Ainsi, la valeur par défaut est de n'autoriser désormais que l'authentification par clé. Ensuite, pour les utilisateurs locaux, vous pouvez utiliser le matchparamètre de configuration pour modifier la valeur par défaut pour les utilisateurs locaux. En supposant que votre réseau privé local est 192.168.1.0/24, ajoutez à sshd_config:

Match Address 192.168.1.0/24
PasswordAuthentication yes

Désormais, les utilisateurs locaux peuvent se connecter avec des mots de passe ou des clés, et les utilisateurs distants seront obligés d'utiliser des clés. A vous de créer les clés avec des mots de passe.

Comme avantage supplémentaire, vous n'avez qu'à gérer un seul sshd_configet vous n'avez qu'à exécuter ssh sur un seul port, ce qui facilite votre propre gestion.


modifier 2017-01-21 - Limiter l'utilisation des authorized_keysfichiers.

Si vous voulez vous assurer que les utilisateurs ne peuvent pas simplement générer eux-mêmes une clé ssh et l'utiliser avec un authorized_keysfichier pour se connecter, vous pouvez contrôler qu'en définissant un emplacement spécifique pour sshd, il recherchera les clés autorisées.

Dans /etc/ssh/sshd_config, changez:

AuthorizedKeysFile  %h/ssh/authorized_keys

à quelque chose comme:

AuthorizedKeysFile  /etc/.ssh/authorized_keys/%u

Le fait de pointer vers un répertoire contrôlé sur lequel les utilisateurs ne sont pas autorisés à écrire signifie qu'ils ne peuvent pas générer leur propre clé et l'utiliser pour contourner les règles que vous avez mises en place.

Tim Kennedy
la source
2
Je ne vois pas comment votre réponse distingue les utilisateurs distants des utilisateurs locaux. Si une personne du lusersgroupe, mais pas du rusersgroupe, génère une paire de clés et la met à jour ~/.ssh/authorized_keys, elle pourra se connecter à distance.
Richard Hansen
8

Vous pouvez ajouter quelque chose comme ceci à votre /etc/ssh/sshd_config:

AllowUsers mobileuser1 mobileuser2 *@10.0.0.0/8

Ce qui précède suppose que les utilisateurs distants autorisés sont nommés mobileuser1et mobileuser2, et que votre réseau de confiance est 10.0.0.0 avec le masque de sous-réseau 255.0.0.0.

Cela permet aux deux utilisateurs mobiles de se connecter de n'importe où et à tout le monde de se connecter à partir du réseau de confiance. Tout utilisateur qui ne correspond à aucun de ces modèles (comme la fooconnexion d'un utilisateur à distance) se verra refuser l'accès.

Richard Hansen
la source
C'est le morceau qui me manquait dans ma réponse. Je pense que si nous combinions votre réponse avec la mienne, c'est une solution assez robuste.
Tim Kennedy
2

Vous pouvez le faire en démarrant deux démons ssh et deux sshd_configfichiers. Copiez votre fichier existant (par exemple depuis /etc/ssh/sshd_config /etc/ssh/sshd_alt_configet dans la configuration de configuration alternative (à partir de la manpage pour sshd_config:

Port

Specifies the port number that sshd(8) listens on.  The default
is 22.  Multiple options of this type are permitted.  See also
ListenAddress

AllowUsers

This keyword can be followed by a list of user name patterns,
separated by spaces.  If specified, login is allowed only for
user names that match one of the patterns.  Only user names are
valid; a numerical user ID is not recognized.  By default, login
is allowed for all users.  If the pattern takes the form
USER@HOST then USER and HOST are separately checked, restricting
logins to particular users from particular hosts.  The
allow/deny directives are processed in the following order:
DenyUsers, AllowUsers, DenyGroups, and finally AllowGroups.

Vous voudrez probablement avoir le journal ssh alternatif dans un fichier différent, et par exemple suivre ce qui est écrit dans ce fichier pour remarquer les tentatives de connexion aberrantes.

Anthon
la source