106 votes

Comment empêcher les utilisateurs de SSH à un ensemble prédéfini de commandes après la connexion?

C'est une idée pour un titre. Nos employés ont accès à certaines commandes sur un serveur linux, mais pas tous. Ils doivent par exemple avoir la possibilité d'accéder à un fichier journal (less logfile), ou de lancer des commandes différentes (shutdown.sh / run.sh).

Informations d'arrière-plan:

Tous les employés de l'accès au serveur avec le même nom d'utilisateur: Notre produit fonctionne avec "normale", les autorisations de l'utilisateur, pas de "installation" est nécessaire. Il suffit de dézipper dans votre utilisateur dir et de l'exécuter. Nous gérer plusieurs serveurs où notre application est "installé". Sur chaque machine il y a un utilisateur johndoe. Nos employés ont parfois besoin d'accéder à l'application sur la ligne de commande d'accès et vérifiez les fichiers journaux ou de redémarrage de l'application à la main. Seulement certaines personnes doivent avoir le plein accès aux lignes de commande.

Nous sommes à l'aide de ppk l'authentification sur le serveur.

Ce serait formidable si employee1 ne peut accéder au fichier journal et employee2 pouvez aussi le faire X, etc...

Solution: Comme solution, je vais utiliser l' command option comme indiqué dans la accepté de répondre. Je vais faire mon propre petit script shell qui sera le seul fichier qui peut être exécuté pour certains employés. Le script va offrir plusieurs commandes qui peuvent être exécutées, mais pas d'autres. Je vais utiliser les paramètres suivants, en authorized_keys partir comme indiqué ici:

command="/bin/myscript.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty
ssh-dss AAAAB3....o9M9qz4xqGCqGXoJw= user@host

C'est assez de sécurité pour nous. Merci la communauté!

76voto

HD. Points 1307

Vous pouvez également limiter les clés valides, les commandes (dans le fichier authorized_keys).

I. e. l'utilisateur ne serait pas vous connecter via ssh, puis de disposer d'un ensemble limité de commandes, mais plutôt ne serait autorisé à exécuter ces commandes via ssh (par exemple, "ssh somehost bin/showlogfile")

37voto

Kaz Points 18072

ssh suit l' rsh tradition en utilisant le shell de l'utilisateur du programme à partir du fichier de mot de passe pour exécuter des commandes.

Cela signifie que nous pouvons résoudre ce sans impliquer ssh configuration en aucune façon.

Si vous ne voulez pas que l'utilisateur puisse avoir accès au shell, il suffit ensuite de remplacer que de l'utilisateur du shell avec un script. Si vous regardez en /etc/passwd vous verrez que il y a un champ qui permet d'assigner une commande shell interprète à chaque utilisateur. Le script est utilisé en tant que shell, à la fois pour leur connexion interactive ssh user@host ainsi que pour les commandes ssh user@host command arg ....

Ici est un exemple. J'ai créé un utilisateur foo dont la carapace est un script. Le script affiche le message my arguments are: , suivi de ses arguments (chacun sur une ligne distincte dans les crochets) et se termine. Dans le journal au cas où, il n'y a pas d'arguments. Voici ce qui arrive:

webserver:~# ssh foo@localhost
foo@localhost's password:
Linux webserver [ snip ]
[ snip ]
my arguments are:
Connection to localhost closed.

Si l'utilisateur tente d'exécuter une commande, il ressemble à ceci:

webserver:~# ssh foo@localhost cat /etc/passwd
foo@localhost's password:
my arguments are:
<-c>
<cat /etc/passwd>

Notre "shell", reçoit un -c style invocation, avec l'ensemble de la commande comme un argument, de la même façon qu' /bin/sh recevraient.

Donc, comme vous pouvez le voir, ce que nous pouvons faire maintenant, c'est de développer le script, de sorte qu'il reconnaît le cas lorsqu'il a été appelé avec un -c d'argument, et analyse ensuite la chaîne (dire par pattern matching). Ces chaînes sont autorisées peuvent être transmis à la véritable coquille par récursivement en invoquant /bin/bash -c <string>. Le rejeter cas pouvez imprimer un message d'erreur et terminer (y compris le cas lors de l' -c est manquant).

Vous devez faire attention à la façon dont vous écrivez cela. Je recommande d'écrire seul point positif qui correspond à autoriser uniquement les choses très spécifiques, et de rejeter tout le reste.

Remarque: si vous root, vous pouvez toujours vous connecter à ce compte en remplaçant la coque dans l' su de commande, à l'instar de ce su -s /bin/bash foo. (Remplacer le shell de choix.) Non-root ne peut pas faire cela.

Voici un exemple de script: restreindre l'utilisateur à l'aide d' ssh pour git l'accès aux dépôts en vertu de l' /git.

#!/bin/bash

if [ $# -ne 2 ] || [ "$1" != "-c" ] ; then
  echo interactive login not permitted
  exit 1
fi

case "$2" in
  "git-upload-pack '/git/"* | "git-receive-pack '/git/"* )
     ;; # continue execution
  * )
     echo that command is not allowed
     exit 1
     ;;
esac

/bin/bash -c "$2"

Bien sûr, nous sommes confiants que ces Git programmes de git-upload-pack et git-receive-pack n'ont pas de trous ou d'échapper à des trappes qui va permettre aux utilisateurs d'accéder au système.

C'est inhérent à ce genre de restriction. L'utilisateur est authentifié d'exécuter du code dans un certain domaine de la sécurité, et nous sommes kludging dans une restriction à la limite de domaine vers un sous-domaine. Par exemple, si vous permettre à un utilisateur d'exécuter l' vim commande sur un fichier pour le modifier, l'utilisateur peut simplement obtenir un shell avec :!sh[Enter].

16voto

Vinko Vrsalovic Points 116138

Ce que vous cherchez est appelé Shell Restreint. Bash fournit un mode dans lequel les utilisateurs peuvent exécuter uniquement les commandes présentes dans leurs répertoires d'origine (et ils ne peuvent pas passer à d'autres répertoires), qui pourrait être assez bon pour vous.

J'ai trouvé ce fil de discussion pour être très illustratif, si un peu daté.

4voto

Chuah Points 81

Vous devez acquérir `rssh", le shell restreint

Vous pouvez suivre la restriction guides mentionnés ci-dessus, ils sont tous assez explicites, et simple à suivre. Comprendre les termes de "prison chroot", et comment mettre en œuvre efficacement sshd/terminal configurations, et ainsi de suite.

Étant donné que la plupart de vos utilisateurs d'accéder à vos terminaux via ssh, vous devriez certainement regarder dans sshd_conifg, le démon SSH dans le fichier de configuration de l'application de certaines restrictions via SSH. Soyez prudent, cependant. Bien comprendre ce que vous essayez de mettre en œuvre, pour les ramifications de configurations incorrectes sont probablement plutôt désastreuse.

-2voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X