Puoi specificare git-shell in .ssh / authorized_keys per limitare l'accesso ai soli comandi git tramite ssh?


37

Mi piacerebbe essere in grado di utilizzare una chiave SSH per l'autenticazione, ma limitare comunque i comandi che possono essere eseguiti sul tunnel SSH.

Con Subversion, ho ottenuto questo risultato utilizzando un file .ssh / authorized_keys come:

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...

Ho provato questo con "/ usr / bin / git-shell" nel comando, ma ho appena ricevuto il vecchio fatal: What do you think I am? A shell?messaggio di errore funky .

Risposte:


30

Quanto segue funziona per me.

In ~/.ssh/authorized_keys:

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

Nella ~/gitservesceneggiatura:

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

Nota che se metti in un gitserveposto diverso dalla home directory, dovrai regolare il command="./gitserve"parametro in authorized_keys.


Bingo! Funziona proprio come quello che speravo di ottenere! Grazie.
Matt Connolly,

In questo post correlato su SO stackoverflow.com/questions/5871652/… fanno riferimento a un'altra soluzione qui: joey.kitenet.net/blog/entry/locking_down_ssh_authorized_keys
Tim

1
@Tim Questa è essenzialmente la stessa soluzione, ma comprime il contenuto del mio script ~ / gitserve in chiavi autorizzate usando perl. Personalmente, preferisco tenerlo in una sceneggiatura separata.
Neil Mayhew,

1
Capisco, l'ho semplicemente aggiunto come riferimento.
Tim

Su quale shell hai impostato l'utente in questa configurazione? /bin/bash?
M-Pixel

33

Ho potuto usare con successo git-shell direttamente nel file authorizedKeys senza usare uno script aggiuntivo.

La chiave è aggiungere \"attorno alla variabile env.

Testato in 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...

+1 è la risposta corretta, vedi svnweb.freebsd.org/base/head/crypto/openssh/…
Tino

2
Personalmente, darei il percorso completo per git-shell, ma potrebbe essere solo paranoia.
Ulrich Schwarz,

Qualcuno ha trovato un modo per limitare la directory a cui ha accesso? Ho scoperto che posso eseguire il cd in una directory prima di eseguire git-shell, ma git-shell permette ".." e percorsi assoluti.
yokto

5

La soluzione di Grawity può essere facilmente modificata per funzionare sostituendo la linea

        exec $SSH_ORIGINAL_COMMAND

con la linea

        git-shell -c "$SSH_ORIGINAL_COMMAND"

Le virgolette si occupano dei problemi sopra riportati e la sostituzione di exec con git-shell sembra un po 'più sicura.


4

git-shellè progettato per essere utilizzato come shell di login, in modo che possa ricevere -c "originalcommand"come argomenti. Questo non accade con i "comandi forzati" in OpenSSH; invece, il comando forzato viene passato alla shell configurata.

Quello che puoi fare è scrivere uno script che lo controlla $SSH_ORIGINAL_COMMANDe lo esegue. Esempio in 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

@Matt: git-shell (1) dice che i comandi sono git <cmd>, no git-<cmd>?
Grawity il

Hmm ... ho apportato quel cambiamento in base a quello che ho visto quando l'ho eseguito. Con sia uno script bash che uno script ruby, ho visto "git-receive-pack" come comando. Citazione dal mio man git-shell(git 1.7.3.4): attualmente, solo quattro comandi possono essere chiamati, git-receive-pack git-upload-pack e git-upload-archive con un singolo argomento richiesto o server cvs (per invocare git -cvsserver).
Matt Connolly,

la formattazione non funziona nei commenti :(
Matt Connolly il

1
Questo non funziona per me, perché il mio client git (1.7.5.4) invia il nome del repository tra virgolette singole, presumibilmente perché si aspetta che l'intera riga di comando venga interpretata da una shell. Exec $ SSH_ORIGINAL_COMMAND quindi passa le virgolette singole su git-rece-pack ecc. Che quindi non trova il repository.
Neil Mayhew,

Grazie per la soluzione, grawity, ma non funziona per me, per la stessa ragione che è stato segnalato da Neil Mayhew ... la mia versione 1.7.x di git manda anche il nome di pronti contro termine tra virgolette singole, in ultima analisi, la causa del $SSH_ORIGINAL_COMMANDdi essere non valido, e causa il git-shell
fallimento


1

Per completezza, e poiché la domanda originale non specificava che lo stesso account doveva essere utilizzabile per cose non git, la risposta ovvia è usare git-shellcome è stato progettato per essere usato: impostalo come shell di login (cioè con usermod, in /etc/passwd) per quell'utente ssh.

Se si dispone di un account utente singolo che si desidera utilizzare in due modi:

  • quando ci si collega con l'autenticazione con chiave, usare solo per git
  • quando ci si connette con l'autenticazione con password o si utilizza una chiave privata diversa, fornire una shell completa

... quindi si applicano le altre risposte in questa discussione. Ma se puoi permetterti di allocare un utente separato su git, impostare la sua shell su git-shellè il modo più semplice per limitarlo ed è leggermente più sicuro in quanto non richiede script di shell aggiuntivi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.