40 votes

Pouvez-vous spécifier git-Shell dans .ssh/authorized_keys pour restreindre l'accès aux seules commandes git via ssh ?

J'aimerais pouvoir utiliser une clé ssh pour l'authentification, tout en limitant les commandes qui peuvent être exécutées via le tunnel ssh.

Avec Subversion, j'ai réalisé cela en utilisant un fichier .ssh/authorized_keys comme :

command="/usr/local/bin/svnserve -t --tunnel-user matt -r /path/to/repository",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAABIetc...

J'ai essayé de le faire avec "/usr/bin/git-Shell" dans la commande, mais j'obtiens juste le vieux message funky fatal: What do you think I am? A shell? message d'erreur.

41voto

sophana Points 511

Je pourrais utiliser avec succès git-Shell directement dans le fichier authorizedKeys sans utiliser un Shell supplémentaire.

La clé est d'ajouter \" autour de la variable env.

Testé dans rhel6 openssh-server-5.3p1-70.el6.x86_64 :

no-port-forwarding,no-agent-forwarding,command="git-shell -c \"$SSH_ORIGINAL_COMMAND\"" ssh-dss AAAA...

33voto

tgandrews Points 2487

Ce qui suit fonctionne pour moi.

En ~/.ssh/authorized_keys :

command="./gitserve",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB…

Dans le ~/gitserve script :

#!/bin/sh
exec git-shell -c "$SSH_ORIGINAL_COMMAND"

Notez que si vous mettez gitserve ailleurs que dans le répertoire d'origine, vous devrez ajuster l'adresse de l'utilisateur. command="./gitserve" dans authorized_keys .

5voto

dschwen Points 51

Grawity La solution de l'auteur peut être facilement modifiée pour fonctionner en remplaçant la ligne

        exec $SSH_ORIGINAL_COMMAND

avec la ligne

        git-shell -c "$SSH_ORIGINAL_COMMAND"

Les guillemets prennent en charge les problèmes signalés ci-dessus, et remplacer exec par git-Shell semble un peu plus sûr.

4voto

James Mertz Points 390

git-shell est conçu pour être utilisé comme un Shell de connexion, de sorte qu'il recevrait -c "originalcommand" comme arguments. Cela ne se produit pas avec les "commandes forcées" dans OpenSSH ; à la place, la fonction commande forcée est passé au Shell configuré.

Ce que vous pouvez faire est d'écrire un script qui vérifie $SSH_ORIGINAL_COMMAND et l'exécute. Exemple bash :

#!/bin/bash

SSH_ORIGINAL_COMMAND=${SSH_ORIGINAL_COMMAND/#git /git-}

case $SSH_ORIGINAL_COMMAND in
    "git-receive-pack"*|"git-upload-pack"*|"git-upload-archive"*)
        eval exec $SSH_ORIGINAL_COMMAND
        ;;
    *)
        echo "Go away." >&2
        exit 1
        ;;
esac

2voto

Felix Points 506

Pour être complet, et puisque la question originale ne spécifiait pas que le même compte devait être utilisable pour des choses non git, la réponse évidente est d'utiliser git-shell tel qu'il a été conçu pour être utilisé : définissez-le comme le login Shell (c'est-à-dire avec usermod en /etc/passwd ) pour cet utilisateur ssh.

Si vous disposez d'un compte utilisateur unique que vous souhaitez utiliser de deux manières :

  • lors de la connexion avec l'authentification par clé, à utiliser uniquement pour git
  • lors d'une connexion avec authentification par mot de passe, ou en utilisant une clé privée différente, fournir un Shell complet.

...alors les autres réponses de ce fil s'appliquent. Mais si vous pouvez vous permettre d'allouer un utilisateur séparé à git, alors définir son Shell sur git-shell est le moyen le plus simple de le restreindre, et il est légèrement plus sûr car il ne nécessite pas de Shell Shell supplémentaires.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X