Utilisez un binaire wrapper
Pour ce cas d'utilisation particulier (voir la note importante ci-dessous), une possibilité est de créer un utilisateur (par exemple support-ssh
) spécifiquement pour ces connexions SSH sortantes, puis d'installer un petit binaire wrapper qui s'exécute /usr/bin/ssh
.
- Ne copiez pas + chmod le
ssh
binaire lui-même, car vous ne vous souviendrez pas de le recopier à chaque fois que vous appliquez des mises à jour de sécurité.
- Et ne l'utilisez pas en
root
tant qu'utilisateur plus privilégié, pour des raisons en lesquelles j'ai confiance sont évidentes.
Il s'agit d'une alternative fonctionnellement équivalente à l'utilisation sudo
pour élever les privilèges à ceux du support-ssh
compte avec les compromis suivants:
- C'est plus petit et plus léger que
sudo
, donc il y a moins de risques d'erreur de configuration qui s'ouvre plus que vous ne le pensiez.
- Il est de votre responsabilité de le coder correctement - ne le faites que si vous êtes extrêmement prudent et (idéalement) avez une expérience du codage critique pour la sécurité.
- Il peut être personnalisé pour être plus spécifique que
sudo
(mais plus vous écrivez de code, plus vous devez auditer pour la sécurité).
Le binaire wrapper doit être défini HOME
sur le support-ssh
répertoire personnel de l' utilisateur, de sorte que ssh
la ssh_config
clé privée et appropriée sera récupérée . Mais l'utilisateur invoquant ne devrait pas être autorisé à lire ~support-ssh/.ssh/
ou à lire son contenu.
L'emballage peut être aussi simple que:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
setenv("HOME", "/home/support-ssh", 1);
/* allow only a single, non-option argument */
if (argc!=2 || *argv[1]=='-') {
fprintf(stderr, "Usage: %s <hostname>", argv[0]);
exit(EXIT_FAILURE);
}
execv("/usr/bin/ssh", argv);
return EXIT_FAILURE;
}
Vous voudrez peut-être être plus restrictif et vérifier que l'argument se argv[1]
trouve dans un ensemble de noms d'hôtes autorisés. Ou moins restrictif et autorisez (un sous-ensemble de) les arguments d'option. Vous pouvez remplacer complètement les variables d'environnement (mais garder les importants tels que TERM
, LC_*
, etc.); notez cela LD_LIBRARY_PATH
et LD_PRELOAD
sont particulièrement dangereux.
Un programme wrapper similaire pourrait être fourni scp
si nécessaire.
Une note sur l'applicabilité
Cette réponse répond aux circonstances spécifiques de la question, où les utilisateurs sont contractuellement obligés de suivre les procédures, et il y a des sanctions (par exemple, licenciement) pour les violer. Cela suppose que vous souhaitiez empêcher les employés de copier des clés privées avec désinvolture, plutôt que d'empêcher un attaquant déterminé d'obtenir un accès non autorisé.
Je suis d'avis que la sécurité est obtenue à la fois par des moyens de défense techniques et non techniques, et que l'équilibre obtenu ici ou en utilisant sudo
est approprié à la situation présentée.