Configurare un repository git remoto condiviso senza i privilegi di root (risolto) usando le chiavi ssh per gestire l'accesso per utente?


3

Spiegherò prima la mia configurazione. Sto lavorando su un sistema non autogestito sul quale ho un account senza privilegi di root / elevati. Su questo sistema voglio condividere più repository git con diversi gruppi di persone. Le azioni intraprese per realizzare un repository git condiviso sono le seguenti. Li ho divisi in comandi eseguiti in un terminale bash sul sistema REMOTO e LOCALE. ps: sostituisce qualsiasi variabile circondata dai delimitatori <e> con valori appropriati.

----------- REMOTO (il mio sistema): -----------

bash-4.2> mkdir -p <path>/<to>/project.git
bash-4.2> cd <path>/<to>/project.git
bash-4.2> git init --bare
bash-4.2> ssh-keygen -t rsa -f ~/.ssh/gitkey_rsa -N <password>
bash-4.2> echo "command=\"git-shell -c \\\"\$SSH_ORIGINAL_COMMAND\\\"\",
    no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty \
    $(cat ~/.ssh/gitkey_rsa.pub)" >> ~/.ssh/authorized_keys

Questi comandi eseguono le seguenti operazioni:

  1. crea un repository git
  2. genera una chiave ssh
  3. aggiungi la chiave a authorized_keys con restrizioni anticipate

----------- LOCAL (altri utenti) -----------

bash-4.2> mv <path>/<to>/gitkey_rsa ~/.ssh
bash-4.2> echo -e "Host gitserver\n\
    \tHostName <remote server>\n\
    \tUser <remote user>\n\
    \tIdentityFile ~/.ssh/gitkey_rsa" >> ~/.ssh/config
bash-4.2> git clone gitserver:/home/<remote user>/<path>/<to>/project.git

Questi comandi eseguono le seguenti operazioni:

  1. posizionare la chiave rsa nella directory ~ / .ssh
  2. aggiungi una regola a ~ / .ssh / config specificando il nome host 'gitserver' con chiave
  3. recuperare i contenuti del repository

I comandi utilizzati si basano sulla limitazione dell'accesso solo a git . Usando la chiave riservata, un utente può eseguire solo comandi git. Il problema è che l'utente può anche accedere a tutti i repository git sul sistema remoto. Vorrei limitare l'accesso a un solo repository per chiave ssh. In altre parole, vorrei limitare l'accesso a una cartella, contenente il repository git, attraverso le restrizioni dei tasti ssh.

Le soluzioni che ho trovato finora sono: accedere a determinate directory solo tramite ssh e Limitare l'utente SSH a una cartella . Vogliono che tu installi un (S) server FTP, WebDAV o crei un nuovo utente con privilegi limitati. Questo non è quello che sto cercando, in quanto richiede i privilegi di root. A causa del fatto che i comandi possono essere limitati con le restrizioni dei tasti ssh, non esiste un modo per limitare anche i privilegi di accesso?

Saluti


1
Benvenuto in Stack Exchange. È positivo che tu abbia scoperto come risolvere il tuo problema. Prendi la soluzione che hai trovato e spostala su una risposta , quindi rimuovi la sezione delle risposte dalla tua domanda. (Puoi fare clic su quel piccolo pulsante "modifica" sotto i tag.) Ciò rende entrambi più facili da leggere.
Jonathan Garber,

Hai mai pensato di utilizzare un sistema come Gitolite . Rende la gestione degli utenti e dei repository piuttosto semplice. C'è anche una guida all'installazione che dice che root non è richiesto.
pesante

@heavyd: ho provato Gitolite, proprio ora. È un'opzione praticabile, anche se devi tenere a mente cose come: "La rimozione di un repository non è così semplice..gitolite non eliminerà automaticamente il repository ..". Ci proverò seriamente, se non si presentano altre opzioni :)
gospes

Risposte:


1

Possibile soluzione :

Mentre scrivevo la domanda, mi è venuta in mente una soluzione. Ma mi sembra che ci debba essere una soluzione più semplice e sicura a questo problema. Quello che ho fatto è stato cambiare il valore di 'command' nel file authorized_keys in:

command="~/somescript.sh" 

E 'somescript.sh' contiene:

#!/bin/bash
ALLOW=(
    '/home/<user>/repository1.git'
    '/home/<user>/repository2.git'
)

case $SSH_ORIGINAL_COMMAND in
    "git-receive-pack"*|"git-upload-pack"*|"git-upload-archive"*)
        GITPATH=$(echo $SSH_ORIGINAL_COMMAND | sed -r "s:.*'([^']*)'.*:\1:g")
        ALLOWED="false"
        for ((i=0; i < ${#ALLOW[@]}; i++)); do
            if [ "${ALLOW[$i]}" == "$GITPATH" ]; then
                ALLOWED="true"; break;
            fi
        done

        if [ "$ALLOWED" == "true" ]; then
            eval "git-shell -c \"$SSH_ORIGINAL_COMMAND\""
        else
            echo "[ERROR] ACCESS DENIED" >&2
            exit 1
        fi
        ;;
    *)
        echo "[ERROR] Only git commands are allowed!" >&2
        exit 1
        ;;
esac

Nello script sto sfruttando il fatto che i comandi git clone, git push e git pull producono sul lato REMOTO:

git-upload-pack '<path>/<to>/<repository>', or
git-receive-pack '<path>/<to>/<repository>'

Specifico i repository nella variabile ALLOW a cui è possibile accedere tramite la chiave ssh che utilizza lo script e li confronto semplicemente con il percorso specificato nel comando git emesso (variabile GITPATH). Esiste tuttavia un rischio per la sicurezza, quando più comandi git vengono emessi in una riga. Se il comando contiene almeno una menzione di un repository consentito, esegue l'intero comando. Qualche suggerimento sul miglioramento?

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.