Permettre à l'utilisateur de configurer un tunnel SSH, mais rien d'autre

StackOverflow https://stackoverflow.com/questions/8021

  •  08-06-2019
  •  | 
  •  

Question

J'aimerais permettre à un utilisateur de configurer un tunnel SSH à une machine sur un port particulier (disons, 5000), mais je veux limiter l'application de cet utilisateur autant que possible.(Authentification sera public/privé paire de clés).

Je sais que j'ai besoin de modifier pertinentes ~/.ssh/authorized_keys, mais je ne suis pas sûr exactement ce que le contenu d' (autres que la clé publique).

Était-ce utile?

La solution

Sur Ubuntu 11.10, j'ai trouvé que je pouvais le bloc de commandes ssh, envoyé avec et sans l'option-T, et de bloquer scp copie, tout en permettant la redirection de port pour aller à travers.

Plus précisément, j'ai un redis-server sur "somehost" lié à localhost:6379 que je souhaite partager en toute sécurité via les tunnels ssh à d'autres hôtes qui ont un keyfile et ssh, avec:

$ ssh -i keyfile.rsa -T -N -L 16379:localhost:6379 someuser@somehost

Ce sera la cause de la redis-le serveur "localhost" port 6379 sur "somehost" apparaissent localement sur l'ordinateur hôte de l'exécution de la commande ssh, réadressé à "localhost" port 16379.

Sur la télécommande "somehost" Voici ce que j'ai utilisé pour authorized_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 non-pty voyages plus ssh tentatives qui veulent ouvrir un terminal.

Le permitopen explique quels sont les ports peuvent être transférées, dans ce cas, le port 6379 le redis-server port je voulais avant.

La commande="/bin/echo do-not-send-commandes de" l'écho de retour "do-not-send-commandes" si quelqu'un ou quelque chose ne réussit pas à envoyer des commandes à l'ordinateur hôte via ssh -T ou autrement.

À partir d'un récent Ubuntu man sshd, authorized_keys / commande est décrite comme suit:

command="commande" Spécifie que la commande est exécutée à chaque fois que cette touche est utilisée pour l'authentification.La commande fournie par l'utilisateur (le cas échéant) est ignoré.

Les tentatives d'utilisation de scp sécurisé des fichiers de la copie échoue également avec un écho de "do-not-send-commandes" j'ai trouvé sftp échoue également avec cette configuration.

Je pense que le shell restreint suggestion, faite dans certaines réponses précédentes, est également une bonne idée.Aussi, je suis d'accord que tout détaillé ici pourrait être déterminée à partir de la lecture de "l'homme sshd" et la recherche qui y est pour "authorized_keys"

Autres conseils

Vous aurez probablement souhaitez définir le shell de l'utilisateur à le shell restreint.Unset la variable de CHEMIN d'accès de l'utilisateur ~/.bashrc ou ~/.bash_profile, et ils ne seront pas en mesure d'exécuter toutes les commandes.Plus tard, si vous décidez que vous voulez pour permettre à l'utilisateur(s) à exécuter un ensemble limité de commandes, comme less ou tail par exemple, vous pouvez copier le permis de commandes à un répertoire séparé (comme /home/restricted-commands) et de mettre à jour le CHEMIN pour pointer vers ce répertoire.

En outre authorized_keys option comme le no-X11-forwarding, en fait il y a exactement un que vous demandez:permitopen="host:port".En utilisant cette option, l'utilisateur ne peut configurer un tunnel à l'hôte et le port spécifiés.

Pour les détails du fichier AUTHORIZED_KEYS format reportez-vous à l'homme sshd.

Ma solution est de fournir à l'utilisateur qui ne peut être tunneling, sans un shell interactif, pour le mettre en shell /etc/passwd pour /usr/bin/tunnel_shell.

Il suffit de créer le fichier exécutable /usr/bin/tunnel_shell avec un boucle infinie.

#!/bin/bash
trap '' 2 20 24
clear
echo -e "\r\n\033[32mSSH tunnel started, shell disabled by the system administrator\r\n"
while [ true ] ; do
sleep 1000
done
exit 0

Entièrement expliquée ici: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/

Je suis capable de mettre en place le fichier authorized_keys avec la clé publique de journal dans.Ce que je ne suis pas sûr à propos de l'ajout d'informations dont j'ai besoin pour restreindre ce qui compte est autorisé à le faire.Par exemple, je sais que je peux mettre des commandes telles que:

no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding

Vous voulez une ligne dans votre fichier authorized_keys qui ressemble à ceci.

permitopen="host.domain.tld:443",no-pty,no-agent-forwarding,no-X11-forwardi
ng,command="/bin/noshell.sh" ssh-rsa AAAAB3NzaC.......wCUw== zoredache 

Si vous voulez faire autoriser l'accès uniquement pour une commande spécifique-comme svn -- vous pouvez également spécifier à la commande dans les clés autorisées fichier:

command="svnserve -t",no-port-forwarding,no-pty,no-agent-forwarding,no-X11-forwarding [KEY TYPE] [KEY] [KEY COMMENT]

À partir de http://svn.apache.org/repos/asf/subversion/trunk/notes/ssh-tricks

Ici vous avez un beau post que j'ai trouvé utile:http://www.ab-weblog.com/en/creating-a-restricted-ssh-user-for-ssh-tunneling-only/

L'idée est la suivante:(le nouveau nom d'utilisateur restreint comme "sshtunnel")

useradd sshtunnel -m -d /home/sshtunnel -s /bin/rbash
passwd sshtunnel

Notez que nous utilisons rbash (restricted-bash) pour restreindre ce que l'utilisateur peut faire:l'utilisateur ne peut pas cd (change directory) et ne peut pas définir les variables d'environnement.

Ensuite, nous allons éditer le CHEMIN d'accès utilisateur env variable dans /home/sshtunnel/.profile pour rien - un truc qui va faire bash trouve pas les commandes à exécuter:

PATH=""

Enfin nous interdire à l'utilisateur de modifier les fichiers en définissant les autorisations suivantes:

chmod 555 /home/sshtunnel/
cd /home/sshtunnel/
chmod 444 .bash_logout .bashrc .profile

J'ai fait un programme en C qui ressemble à ceci:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
void sig_handler(int signo)
{
    if (signo == SIGHUP)
        exit(0);
}

int main()
{
    signal(SIGINT, &sig_handler);
    signal(SIGTSTP, &sig_handler);

    printf("OK\n");
    while(1)
        sleep(1);
    exit(0);
}

J'ai défini l'utilisateur restreint shell pour ce programme.

Je ne pense pas que l'accès restreint utilisateur peut exécuter quoi que ce soit, même si elles ne ssh server command, parce que les commandes sont exécutées à l'aide de la coque et cette coquille ne pas exécuter quoi que ce soit.

Voir ce post sur l'authentification des clés publiques.

Les deux principales choses que vous devez retenir sont:

  1. Assurez-vous que vous chmod 700 ~/.ssh
  2. Ajouter la clé publique bloc autorisés-clés

Vous allez générer une clé sur l'ordinateur de l'utilisateur via n'importe quel client ssh ils sont utilisant.pUTTY par exemple a un utilitaire pour faire cette chose exacte.Il va générer une clé privée et publique.

Le contenu du fichier de clé publique générée sera placé dans le fichier authorized_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 diffère légèrement en fonction du client utilisé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top