Sadece git komutlarına ssh ile erişimi kısıtlamak için .ssh / yetkili_keys içinde git-shell belirtebilir misiniz?


37

Kimlik doğrulama için bir ssh anahtarı kullanabilmek istiyorum, ancak yine de ssh tüneli üzerinde çalıştırılabilecek komutları kısıtla.

Subversion ile bunu gibi bir .ssh / yetkili_keys dosyası kullanarak başardım:

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

Bunu komutta "/ usr / bin / git-shell" ile denedim, ama sadece korkak eski fatal: What do you think I am? A shell?hata mesajını alıyorum.

Yanıtlar:


30

Aşağıdaki benim için çalışıyor.

İçinde ~/.ssh/authorized_keys:

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

In ~/gitservesenaryo:

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

Ana gitservedizinden başka bir yere koyarsanız , command="./gitserve"parametresini ayarlamak zorunda kalacağınızı unutmayın authorized_keys.


Bingo! Bu, başarmayı umduğum gibi oldu! Teşekkürler.
Matt Connolly


1
@Tim Bu aslında aynı çözümdür, ancak ~ / gitserve betiğimin içeriğini perl kullanarak yetkili anahtarlara sıkıştırır. Şahsen ben ayrı bir senaryoda tutmayı tercih ederim.
Neil Mayhew

1
Anlıyorum, sadece referans olarak ekledim.
Tim,

Kullanıcının bu yapılandırmada hangi kabuğu ayarlaması gerekiyor? /bin/bash?
M-Pixel

33

Ek bir komut dosyası kullanmadan, git-shell'i doğrudan yetkiliKeys dosyasında başarıyla kullanabilirim.

Anahtar \"env değişkeninin çevresine eklemektir .

Rhel6 openssh-server-5.3p1-70.el6.x86_64 ile test edilmiştir:

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


2
Şahsen, tam yolunu verirdim git-shell, ama bu sadece paranoya olabilir.
Ulrich Schwarz

Kimse erişimi olan dizini kısıtlamanın bir yolunu buldu mu? Git-shell'i çalıştırmadan önce bir dizine cd girebildiğimi öğrendim, ancak git-shell ".." ve mutlak yollara izin veriyor.
yokto

5

Grawity'nin çözümü, hat değiştirilerek kolayca çalışmak üzere değiştirilebilir

        exec $SSH_ORIGINAL_COMMAND

çizgi ile

        git-shell -c "$SSH_ORIGINAL_COMMAND"

Alıntılar yukarıda belirtilen sorunlara dikkat ediyor ve exec'i git-shell ile değiştirmek biraz daha güvenli görünüyor.


4

git-shell-c "originalcommand"argüman olarak alacağı şekilde bir giriş kabuğu olarak kullanılmak üzere tasarlanmıştır . Bu OpenSSH’deki “zorunlu komutlar” la olmaz; bunun yerine, zorla kumanda yapılandırılmış bir kabuk geçirilir.

Yapabileceğiniz şey, $SSH_ORIGINAL_COMMANDonu kontrol eden ve çalıştıran bir senaryo yazmak . Bash örneği :

#!/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) komutların öyle git <cmd>olmadığını söylüyor git-<cmd>?
Grawity

Hmm ... Bu değişikliği koştuğumda gördüklerime göre yaptım. Hem bir bash betiği hem de bir yakut betiği ile, "git-alma-pack" komutunu komut olarak gördüm. (Alıntı man git-shell1.7.3.4) ' den alıntı : Şu anda, sadece dört komutun çağrılmasına izin verilir, git-alma-paketi git-upload-pack ve git-upload-archive gerekli bir argümanla veya cvs sunucusu (git çağırmak için) -cvsserver).
Matt Connolly

biçimlendirme yorumlarda çalışmaz :(
Matt Connolly

1
Bu benim için işe yaramıyor, çünkü git istemcim (1.7.5.4) repo adını tek tırnaklar halinde gönderiyor, muhtemelen tüm komut satırının bir kabuk tarafından yorumlanmasını bekliyor. $ SSH_ORIGINAL_COMMAND komutu daha sonra tek tırnak işaretlerini git-alma-pack vs.'ye aktarır, bu nedenle depoyu bulamaz.
Neil Mayhew

Çözüm için teşekkürler, Grawity, ama benim için işe yaramıyor, Neil Mayhew tarafından bildirildiği gibi aynı sebepten ... git 1.7.x sürümüm de repo ismini tek tırnaklar içinde göndererek sonuçta ortaya çıkmasına neden $SSH_ORIGINAL_COMMANDoldu. geçersiz ve git-shelldışarı
patlamaya


1

Tamlık için ve asıl soru aynı hesabın gitmeyen şeyler için kullanılabilir olması gerektiğini belirtmediğinden, açık cevap, kullanılmak git-shellüzere tasarlandığı şekilde kullanmaktır: oturum açma kabuğu olarak ayarlayın (yani usermod, in /etc/passwd) bu ssh kullanıcısı için.

İki yolu kullanmak istediğiniz tek bir kullanıcı hesabınız varsa:

  • Anahtar doğrulama ile bağlanırken, sadece git için kullanın.
  • şifre doğrulama ile bağlanırken veya farklı bir özel anahtar kullanırken, tam bir kabuk

... o zaman bu konudaki diğer cevaplar geçerli. Ancak git'e ayrı bir kullanıcı atamayı göze alabiliyorsanız, kabuğunu git-shellsınırlandırmanın en basit yolu budur ve ilave kabuk komut dosyaları gerektirmediğinden biraz daha güvenlidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.