2012-11-10 11 views
9

Jestem ciekawy, jak działają programy takie jak Gitolite - w szczególności, w jaki sposób wchodzą one w interakcje z protokołem SSH, aby zapewnić dostosowane do potrzeb środowisko. Czy ktoś może podać przykład, w jaki sposób mogę osiągnąć coś podobnego do tego i gdzie mogę dowiedzieć się więcej na ten temat?Jak działają programy takie jak gitolite?

→ ssh [email protected] 
PTY allocation request failed on channel 0 
Hi <username>! You've successfully authenticated, but GitHub does not provide shell access. 
Connection to github.com closed. 

Pytanie dodatkowe: moim podstawowym językiem jest JavaScript. Czy można osiągnąć to, co chcę z NodeJS?

+2

gitolite jest open source, można dowiedzieć się, jak to działa, czytając kod/dokumentację. – tpg2114

+0

Przeczytałem kod i z tego, co mogę zebrać, jest skrypt perl. Nie znam perla, więc liczyłem na to, że ktoś da mi szybki przykład, by wyprodukować to, co mam powyżej. – user1813844

+0

http://stackoverflow.com/questions/5180981/ssh-client-for-node-js – Peter

Odpowiedz

24

gitolite sam w sobie jest warstwą authorization, która nie potrzebuje ssh.
Należy tylko znać , który wywołuje go, aby upoważnić tę osobę do wykonywania poleceń git.

SSH jest używany do uwierzytelniania (ale można użyć HTTP Apache do uwierzytelniania, jak również, na przykład)

Sposób gitolite jest wywoływana przez ssh jest to opisane w „Gitolite and ssh” i wykorzystuje mechanizm ssh forced command:

http://oreilly.com/catalog/sshtdg/chapter/ssh_0802.gif

~/.ssh/authorized_keys (na gitolite serwerem ssh) wygląda następująco:

command="[path]/gitolite-shell sitaram",[more options] ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA18S2t... 
command="[path]/gitolite-shell usertwo",[more options] ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEArXtCT... 

Najpierw dowiaduje się, który z kluczy publicznych w tym pliku jest zgodny z logowaniem przychodzącym. Po znalezieniu dopasowania, uruchomi polecenie podane w tej linii; np., jeśli się zalogowałem, uruchomiłoby się [path]/gitolite-shell sitaram.
Pierwszą rzeczą, na którą należy zwrócić uwagę, jest to, że tacy użytkownicy nie otrzymują "dostępu do powłoki", co jest dobre!

(polecenie zmuszony = no powłoka interaktywna sesja: będzie dostarczać tylko ograniczony shell, wykonując tylko jeden scenariusz, zawsze takie same)

Przed uruchomieniem polecenia, jednak sshd ustawia zmienną środowiskową o nazwie SSH_ORIGINAL_COMMAND, która zawiera rzeczywistą komendę git wysłaną przez twoją stację roboczą.
To jest polecenie, które zostanie uruchomione, jeśli nie masz części command= w pliku kluczy autoryzowanych.

Kiedy gitolite-shell przejmuje kontrolę, to wygląda na pierwszy argument ("sitaram", "usertwo", etc), aby określić, kim jesteś. Następnie sprawdza zmienną SSH_ORIGINAL_COMMAND, aby dowiedzieć się, do którego repozytorium chcesz uzyskać dostęp i czy czytasz lub piszesz.

Teraz, gdy ma on użytkownika, repozytorium i żądany dostęp (odczyt/zapis), gitolite sprawdza swój plik konfiguracyjny i zezwala lub odrzuca żądanie.

Fakt, że authorized_keys wywołuje skrypt perla (gitolite-shell) dlatego Gitolite jest napisany w języku Perl.
Może to równie dobrze wywołać program javascript.


Jeśli twój ssh na GitHubie bez żadnego polecenia, otrzymasz wiadomość powitalną, taką jak Twoja wzmianka w pytaniu.
Gitolite wyświetla podobny komunikat, jak wyszczególniono w print_version() function of the info command script:

sub print_version { 
    chomp(my $hn = `hostname -s 2>/dev/null || hostname`); 
    my $gv = substr(`git --version`, 12); 
    $ENV{GL_USER} or _die "GL_USER not set"; 
    print "hello $ENV{GL_USER}, this is " . ($ENV{USER} || "httpd") . "\@$hn running gitolite3 " . version() . " on git $gv\n"; 
} 

Wiadomość wygląda następująco:

hello admin, this is [email protected] running gitolite3 v3.0-12-ge0ed141 on git 1.7.3.4 

late 2013 Gitolite documentation zawiera teraz ten schemat, który podsumowuje wszystkie kawałki:

ssh and Gitolite

+0

Więc tylko z ciekawości, jak strona taka jak GitHub może wykorzystywać te techniki? Wydaje się niepraktyczne utrzymywanie pliku 'authorized_keys' dla użytkownika' git' zawierającego klucze publiczne wszystkich osób oraz obsługę zmian w tym pliku (usuwanie kluczy i innych)? – user1813844

+0

@ user1813844 GitHub? Ale GitHub z całą pewnością * nie * używa gitolitu. ma własne zarządzanie kluczami ssh. To nie jest bardziej lub mniej praktyczne niż zarządzanie kluczem ssh, jak sądzę, w Gitolite. – VonC

+0

Czy mają też własną wersję SSHD? Próbuję dowiedzieć się, jak mogli zbudować swój system za pomocą standardowych istniejących technologii. – user1813844

0

Podstawowe kroki są:

  1. Sprawdź klucz publiczny osoby próbującej się zalogować
  2. mapie klucza publicznego do listy kontroli dostępu

Innymi słowy, dla nich rzeczy do pracy, musisz dostać klucze publiczne od użytkowników, a następnie wygenerować listę (plik, bazę danych, cokolwiek), która paruje klucz do użytkownika i uprawnienia.

+0

Bardziej interesuje mnie mechanika korzystania z protokołu SSH. – user1813844

+0

http://stackoverflow.com/questions/402615/how-to-restrict-ssh-users-to-a-predefined-set-of-commands-after-login Następnie ułóż pytania bardziej przejrzyste. Spojrzałem na komentarz u góry źródła gitolite i napisałem "skrypt wywołany z ~/.ssh/authorized_keys", więc szukałem sposobu wywołania skryptu z pliku authorized_keys i znalazłem to pytanie. – tpg2114

+0

Nie próbuję tu trollować. Ale nie jestem skłonny do wchodzenia w tonę szczegółów, aby odpowiedzieć na pytanie, gdy nie wygląda na to, że wiele wysiłku poszło na samodzielne ustalenie tego. – tpg2114

5

Zauważ, że sshd wykonuje liniowy skan pliku ~/.ssh/authorized_keys. Kiedy pojawi się około 3000 kluczy, ludzie, których klucze pojawiają się później w pliku, zaczynają zauważać opóźnienie - zaczyna to być więcej niż opóźnienie sieci :-)

To jest jeden z powodów, dla których github ma własną poprawioną wersję z sshd. Mają zbyt wielu użytkowników, aby móc nimi zarządzać za pomocą zwykłego sshd!