Linux ssh: autoriser l'authentification par clé publique sans donner aux utilisateurs des droits de lecture sur la clé privée

14

Les utilisateurs connectés sur mon serveur Linux devraient pouvoir ssh vers une machine distante spécifique avec un compte par défaut. L'authentification sur la machine distante utilise la clé publique, donc sur le serveur la clé privée correspondante est disponible.

Je ne veux pas que les utilisateurs du serveur puissent réellement lire la clé privée. Fondamentalement, le fait qu'ils aient accès au serveur leur donne le droit ssh, et leur suppression du serveur devrait également interdire la connexion à la machine distante.

Comment puis-je autoriser les utilisateurs à ouvrir une connexion ssh sans leur donner accès en lecture à la clé privée?

Mes réflexions jusqu'à présent: évidemment, l'exécutable ssh doit être capable de lire la clé privée, il doit donc s'exécuter sous un autre utilisateur sur le serveur qui en a le droit. Une fois la connexion ssh établie, je peux ensuite la "transmettre" à l'utilisateur afin qu'il puisse saisir des commandes et interagir avec la machine distante.

  • Est-ce une bonne approche?
  • Comment dois-je implémenter le transfert?
  • Comment l'utilisateur peut-il initier la connexion (c'est-à-dire l'exécution du ssh par l'utilisateur qui a des droits de lecture sur la clé)?
  • Y a-t-il une faille de sécurité? - si les utilisateurs peuvent exécuter un ssh en tant qu'autre utilisateur, peuvent-ils alors faire tout ce que l'autre utilisateur pourrait (y compris, lire la clé privée)?
Philipp
la source
Il semble que ce soit un doublon de stackoverflow.com/questions/9286622/protecting-ssh-keys
wenzul
1
Configurer le serveur distant pour accepter les connexions avec cette clé uniquement à partir de l'IP de votre serveur? De cette façon, même s'ils volent la clé, ils ne peuvent rien faire.
@ AndréDaniel pourrait peut-être se connecter à un autre ordinateur complètement indépendant qui est également configuré pour accepter les connexions sans mot de passe du serveur. C'est la seule raison pour laquelle je peux penser à avoir une configuration comme celle-ci; si ce n'est pas ça, je suis plutôt curieux de savoir ce que c'est. (Ce n'est pas vraiment important.)
David Z
@DavidZ Je ne comprends pas vraiment ... la clé ne doit pas être approuvée ailleurs que sur le serveur cible en supposant que l'IP correspond à celui du premier serveur (à l'endroit où les utilisateurs se connectent).
2
Si vous devez le verrouiller de cette manière, je suppose que vous avez pris des mesures pour empêcher les utilisateurs d'ajouter de nouvelles clés publiques au ~/.ssh/authorized_keysfichier?
mpontillo

Réponses:

31

C'est une des raisons qui sudoexiste. Permettez simplement à vos utilisateurs d'exécuter une seule commande avec uniquement les options de ligne de commande pré-autorisées et les contournements les plus évidents sont résolus. par exemple

#/etc/sudoers
%users ALL = (some_uid) NOPASSWD: /usr/bin/ssh -i /home/some_uid/.ssh/remote-host.key username@remotehost

configure pour sudoque tous les membres du groupe userspuissent exécuter la commande ssh en tant qu'utilisateur some_uid sans entrer leur propre mot de passe (ou celui du compte some_uid) lorsqu'ils exécutent:

sudo -u some_uid /usr/bin/ssh -i /home/some_uid/.ssh/remote-host.key username@remotehost

Supprimez l' NOPASSWD:option pour forcer les utilisateurs à saisir leur propre mot de passe avant de se connecter à l'hôte distant.
Peut-être configurer un alias ou un script wrapper pour la commodité de vos utilisateurs, car il sudoest assez difficile d'utiliser les bons arguments.

HBruijn
la source
Fonctionne comme un charme. Cela devrait également être la réponse recommandée pour le double mentionné par wenzul.
Philipp
10

Cela semble être un bon cas d'utilisation pour l'authentification basée sur l'hôte. Il s'agit d'une méthode d'authentification où SSH n'utilise pas la clé d' un utilisateur individuel sur la machine locale (dans ce cas, votre serveur) pour s'authentifier; à la place, il utilise la clé privée de l' hôte , celle stockée dans /etc/ssh/et qui n'est lisible que par root.

Pour configurer cela, vous devrez créer un fichier nommé .shostssur la machine distante, dans le répertoire personnel de l'utilisateur sous lequel vous souhaitez que les gens se connectent (pas dans ~/.ssh). Le fichier doit avoir le contenu

server-hostname +

server-hostnameest le nom de votre serveur et +est un signe plus littéral qui sert de caractère générique signifiant "n'importe quel utilisateur".

Vous devrez également vous assurer que la machine distante peut vérifier la clé d'hôte du serveur, ce qui signifie que la clé d'hôte du serveur doit être répertoriée dans /etc/ssh/ssh_known_hostsou ~/.ssh/known_hostssur la machine distante. Si ce n'est pas déjà le cas, vous pouvez le configurer en vous connectant à la machine distante et en exécutant

ssh-keyscan server-hostname >> /etc/ssh/ssh_known/hosts

Une fois que vous avez configuré ces étapes, vous pouvez supprimer la clé privée sur le serveur entièrement, si vous n'en avez pas besoin pour autre chose. (Et si vous le faites, vous pouvez toujours le configurer pour qu'il ne soit lisible que par rootou quelque chose.)

Vous pouvez également facilement faire des choses comme autoriser ou refuser à certains utilisateurs l'accès à la machine distante. Consultez les pages de manuel de sshet hosts.equivpour plus de détails.

Un problème avec cette configuration est que les utilisateurs qui se connectent à la machine distante peuvent modifier .shosts. Il n'y a rien qu'ils puissent faire qui leur permettrait de se connecter à la machine distante en tant qu'utilisateur différent, mais ils pourraient couper leur accès ou celui des autres à la machine distante. Si c'est un problème, vous pourriez être en mesure d' .shostsécrire uniquement par rootou quelque chose - je ne sais pas si cela fonctionne, mais vous pouvez l'essayer et voir. (D'autres méthodes comme celle avec sudosont sujettes au même risque, car un utilisateur peut toujours supprimer ~/.ssh/authorized_keys.)

David Z
la source
+1; Je pense que cette option offre une bonne flexibilité, au cas où l'utilisateur aurait besoin d'utiliser des fonctionnalités SSH autres que le terminal, telles que la redirection de port, la copie sécurisée, etc. Même un autre client SSH devrait fonctionner. L' sudooption pourrait être meilleure pour un environnement verrouillé, cependant ...
mpontillo