Réponses:
Oui, utilisez simplement /bin/false
comme shell et demandez à l'utilisateur de démarrer le processus de tunneling SSH sans exécuter de commande à distance (c'est-à-dire l' -N
indicateur pour OpenSSH):
ssh -N -L 1234:target-host:5678 ssh-host
/bin/false
shell, vous n'aurez pas accès au shell, car chaque session de connexion se terminera immédiatement.
Dans le fichier .ssh / authorized_keys de l'utilisateur, mettez quelque chose comme ceci:
permitopen="192.168.1.10:3306",permitopen="10.0.0.16:80",no-pty ssh-rsa AAAAB3N...
Donc, fondamentalement, vous les contrôles seraient en face de la clé publique ssh de l'utilisateur séparés par un espace. Dans l'exemple, les connexions utilisant la clé publique spécifique seront autorisées à effectuer la redirection de port SSH uniquement vers le serveur MySQL de 192.168.1.10 et le serveur Web de 10.0.0.16, et ne recevront pas de shell (no-pty). Vous posez spécifiquement des questions sur l'option "no-pty", mais les autres peuvent également être utiles si l'utilisateur est uniquement censé tunneler vers des serveurs spécifiques.
Consultez la page de manuel de sshd pour plus d'options pour le fichier authorized_keys .
Notez que l'expérience de l'utilisateur peut sembler un peu étrange: quand ils ssh dedans, il semblera que la session est suspendue (car ils n'obtiennent pas de pty). C'est bon. Si l'utilisateur a spécifié la redirection de port avec, par exemple, "-L3306: 192.168.1.10: 3306", la redirection de port sera toujours en vigueur.
Dans tous les cas, essayez-le.
no-pty
n'empêche pas l'accès au shell, il ne donne tout simplement pas de pty au shell. Il n'affiche pas l'invite (c'est-à-dire "semble se bloquer"), mais vous pouvez toujours donner des commandes très bien. Vous avez besoin de l' command="..."
option .ssh/authorized_keys
si vous souhaitez restreindre l'accès au shell à partir de là.
Donnez à l'utilisateur un shell qui ne lui permet que de se déconnecter, comme /bin/press_to_exit.sh
#! / bin / bash read -n 1 -p "Appuyez sur n'importe quelle touche pour quitter"
De cette façon, il peut rester connecté aussi longtemps qu'il le souhaite, avec des tunnels actifs, mais n'exécuter aucune commande. Ctrl-c
ferme la connexion.
Attribuez un shell qui ne permet pas à l'utilisateur de se connecter.
par exemple
#!/bin/sh
echo "No interactive login available."
sleep 60
exit 0
les empêcherait d'obtenir une invite du shell et leur donnerait un délai d'expiration de 60 secondes - s'il n'y a pas de connexion active pendant 60 secondes, il se fermerait et les déconnecterait ainsi complètement (augmentez le nombre en fonction des besoins).
Ils ne peuvent pas non plus exécuter une commande à distance, car ce shell ne les autorisera pas.
logout
" sur un script normal.
/sbin/nologin
, que vous pouvez personnaliser avec un message convivial dans /etc/nologin.txt
.
Ma solution est de fournir à l'utilisateur qui ne peut tunneler, sans shell interactif , de définir ce shell dans / etc / passwd sur / usr / bin / tunnel_shell .
Créez simplement le fichier exécutable / usr / bin / tunnel_shell avec une boucle infinie .
Utilisez également l' option AllowGroups
et Match Group
.
Entièrement expliqué ici: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/
-N
, il a accès au shell. Cela ne résout vraiment pas le problème et est dangereux.