Sur Ubuntu 11.10, j'ai découvert que je pouvais bloquer les commandes ssh, envoyées avec et sans -T, et bloquer la copie scp, tout en autorisant le transfert de port.
Plus précisément, j'ai un serveur redis sur "somehost" lié à localhost: 6379 que je souhaite partager en toute sécurité via des tunnels ssh avec d'autres hôtes qui ont un fichier de clés et qui seront ssh avec:
$ ssh -i keyfile.rsa -T -N -L 16379:localhost:6379 someuser@somehost
Cela fera apparaître localement le serveur redis, le port "localhost" 6379 sur "somehost" sur l'hôte exécutant la commande ssh, remappé sur le port "localhost" 16379.
Sur la télécommande "somehost" Voici ce que j'ai utilisé pour authorised_keys:
cat .ssh/authorized_keys (portions redacted)
no-pty,no-X11-forwarding,permitopen="localhost:6379",command="/bin/echo do-not-send-commands" ssh-rsa rsa-public-key-code-goes-here keyuser@keyhost
Le no-pty déclenche la plupart des tentatives ssh qui veulent ouvrir un terminal.
Le permitopen explique quels ports sont autorisés à être transférés, dans ce cas le port 6379 est le port redis-server que je voulais transférer.
La commande = "/ bin / echo do-not-send-commands" fait écho à "do-not-send-commands" si quelqu'un ou quelque chose parvient à envoyer des commandes à l'hôte via ssh -T ou autrement.
À partir d'un Ubuntu récent man sshd
, la commande authorized_keys / command est décrite comme suit:
command = "command" Spécifie que la commande est exécutée chaque fois que cette clé est utilisée pour l'authentification. La commande fournie par l'utilisateur (le cas échéant) est ignorée.
Les tentatives d'utilisation de la copie sécurisée de fichiers scp échoueront également avec un écho de "do-not-send-commands". J'ai trouvé que sftp échoue également avec cette configuration.
Je pense que la suggestion de shell restreint, faite dans certaines réponses précédentes, est également une bonne idée. De plus, je conviens que tout ce qui est détaillé ici pourrait être déterminé en lisant "man sshd" et en y recherchant "authorized_keys"
no-pty
qu'il ne permette pas d'ouvrir la fenêtre interactive, cela ne fait rien pour empêcher l'exécution de la commande, de sorte que l'utilisateur peut modifier leauthorized_keys
fichier s'il a accès avec quelque chose commessh server 'sed -i -e s/no-pty// ~/.ssh/authorized_keys'
.~user/.ssh/authorized_keys
serait propriétaireuser
etuser
gérerait les clés autorisées utilisées pour accéder au compte. SSH est pointilleux sur les autorisations et peut imposer des attentes~/.ssh/
et son contenu. J'ai fait unsudo chown root: .ssh/authorized_keys
et il semble m'avoir empêché de me connecter, mais je sais par expérience passée que l'utilisateur n'a pas à posséder ce fichier -root
peut le gérer si vous préférez.Vous voudrez probablement définir le shell de l'utilisateur sur le shell restreint . Désinitialisez la variable PATH dans le ~ / .bashrc ou le ~ / .bash_profile de l'utilisateur, et ils ne pourront exécuter aucune commande. Plus tard, si vous décidez que vous souhaitez autoriser le ou les utilisateurs à exécuter un ensemble limité de commandes, comme
less
outail
par exemple, vous pouvez copier les commandes autorisées dans un répertoire séparé (tel que/home/restricted-commands
) et mettre à jour le PATH pour qu'il pointe vers ce répertoire.la source
ssh use@host "/bin/bash"
, n'est-ce pas?user@host
rbash est le shell. Voir The Restricted Shell/bin/bash
échoue car elle contient des barres obliques.less
est probablement une mauvaise idée, car à partir de là, vous pouvez échapper à un shell sans restriction avec!/bin/bash
. Voir pen-testing.sans.org/blog/2012/06/06/… pour d'autres exemples. Donc, autoriser des commandes individuelles devrait être fait très, très soigneusement, voire pas du tout.En plus de l'option authorized_keys comme no-X11-forwarding, il y en a exactement une que vous demandez: permitopen = "host: port". En utilisant cette option, l'utilisateur peut uniquement configurer un tunnel vers l'hôte et le port spécifiés.
Pour plus de détails sur le format de fichier AUTHORIZED_KEYS, reportez-vous à man sshd.
la source
no-pty
ne restreint pas non plus l'accès au shell, vous aurez toujours accès au shell, il ne vous montrera tout simplement pas l'invite; Vous pouvez toujours donner des commandes et voir la sortie très bien. Vous avez besoin de l'command="..."
option si vous souhaitez restreindre l'accès au shell à partir de.ssh/authorized_keys
.Ma solution est de fournir à l'utilisateur qui peut uniquement effectuer un tunneling, sans shell interactif , pour 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 .
Complètement expliqué ici: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/
la source
tunnel_shell
, vous devrezshell -> /bin/bash tunnel_shell
bien sûr vous échapper de nouveau vers le shell, mais si vous avez définitunnel_shell
comme shell de l'utilisateur, vous n'aurez que l'/bin/bash tunnel_shell
exécution, sans shell vers lequel échapper , d'aussi loin que je puisse voir. Je l'ai testé et je n'ai pas pu m'échapper avec ctrl-z. Si vous avez fait l' essayer et pourrait échapper, pourriez - vous poster la configuration? De même, si vous connaissez une documentation indiquant que cela devrait fonctionner comme ça, pourriez-vous la publier?Vous voudriez une ligne dans votre fichier allowed_keys qui ressemble à ceci.
la source
Si vous souhaitez autoriser l'accès uniquement pour une commande spécifique - comme svn - vous pouvez également spécifier cette commande dans le fichier de clés autorisées:
De http://svn.apache.org/repos/asf/subversion/trunk/notes/ssh-tricks
la source
Voici un joli article que j'ai trouvé utile: http://www.ab-weblog.com/en/creating-a-restricted-ssh-user-for-ssh-tunneling-only/
L'idée est: (avec le nouveau nom d'utilisateur restreint "sshtunnel")
Notez que nous utilisons rbash (restricted-bash) pour restreindre ce que l'utilisateur peut faire: l'utilisateur ne peut pas cd (changer de répertoire) et ne peut pas définir de variables d'environnement.
Ensuite, nous éditons la variable d'environnement PATH de l'utilisateur en
/home/sshtunnel/.profile
rien - une astuce qui empêchera bash de trouver des commandes à exécuter:Enfin, nous interdisons à l'utilisateur de modifier les fichiers en définissant les autorisations suivantes:
la source
J'ai fait un programme C qui ressemble à ceci:
J'ai défini le shell de l'utilisateur restreint sur ce programme.
Je ne pense pas que l'utilisateur restreint puisse exécuter quoi que ce soit, même s'il le fait
ssh server command
, car les commandes sont exécutées à l'aide du shell, et ce shell n'exécute rien.la source
Voir cet article sur l'authentification des clés publiques .
Les deux choses principales dont vous devez vous souvenir sont:
chmod 700 ~/.ssh
la source
Vous allez générer une clé sur la machine des utilisateurs via le client ssh qu'ils utilisent. pUTTY par exemple a un utilitaire pour faire exactement cette chose. Il générera à la fois une clé privée et une clé publique.
Le contenu du fichier de clé publique généré sera placé dans le fichier allowed_keys.
Ensuite, vous devez vous assurer que le client ssh est configuré pour utiliser la clé privée qui a généré la clé publique. C'est assez simple, mais légèrement différent selon le client utilisé.
la source