Git
Chapters ▾ 2nd Edition

4.4 Git na serwerze - Konfigurowanie serwera

Konfigurowanie serwera

Spróbujmy prześledzić proces ustawienia dostępu SSH po stronie serwera. Aby tego dokonać, użyjesz metody wykorzystującej authorized_keys do uwierzytelnienia Twoich użytkowników. Zakładamy również, że pracujesz na standardowej dystrybucji linuksowej (np. Ubuntu). Pierwszym krokiem będzie utworzenie użytkownika git i lokalizacji .ssh dla tegoż użytkownika.

$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

Następnie potrzebujesz dodać klucz SSH programisty do pliku authorized_keys dla tego użytkownika. Załóżmy ze otrzymałeś kilka kluczy mailem i zapisałeś je w pliku tymczasowym. Klucze publiczne wyglądać będą podobnie do tego:

$ cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair

Po prostu dopisujesz je do pliku authorized_keys użytkownika git, który znajduje się w katalogu .ssh:

$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys

Od tego momentu możesz ustawić puste repozytorium poprzez komendę git init z opcją --bare, która zainicjuje repozytorium bez ścieżki roboczej:

$ cd /opt/git
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /opt/git/project.git/

Teraz John, Josie lub Jessica ma możliwość wykonania wypchnięcia pierwszej wersji projektu do repozytorium poprzez dodanie go jako zdalny (remote) oraz wysłanie całej gałęzi projektu. Aby tego dokonać należy połączyć się poprzez powłokę z maszyną i utworzyć nowe repozytorium za każdym razem kiedy chcemy dodać projekt. Użyjmy gitserver jako nazwę serwera, na którym ustawisz użytkownika git oraz repozytorium. Jeżeli odpalasz je lokalnie i ustawiasz DNS jako gitserver do połączenia z tym serwerem, wtedy będziesz mógł użyć poniższych komend:

# na komputerze Johna
$ cd myproject
$ git init
$ git add .
$ git commit -m 'initial commit'
$ git remote add origin git@gitserver:/opt/git/project.git
$ git push origin master

W tym momencie użytkownicy mogą klonować projekt i wysyłać zmiany w prosty sposób:

$ git clone git@gitserver:/opt/git/project.git
$ cd project
$ vim README
$ git commit -am 'fix for the README file'
$ git push origin master

Używając powyższej metody możesz łatwo utworzyć serwer Git (odczyt/zapis) dla niewielkiej grupy użytkowników.

Powinieneś pamiętać, że w tym momencie wszyscy dodani użytkownicy mogą również zalogować się na serwer i uzyskać dostęp do powłoki jako użytkownik git. Jeśli chcesz to ograniczyć, będziesz musiał zmienić w pliku passwd powłokę na coś innego.

Jako dodatkowy środek ostrożności możesz zastrzec dostęp do komend dla danego użytkownika git poprzez narzędzie git-shell, które dostępne jest wraz z Git. Jeżeli ustawisz je jako powłokę po zalogowaniu Twojego użytkownika git, to użytkownik ten nie będzie miał pełnego dostępu do Twojego serwera. Aby tego użyć, podaj git-shell zamiast bash lub csh jako powłokę po zalogowaniu Twojego użytkownika. Aby to zrobić, musisz najpierw dodać git-shell do /etc/shells (o ile jeszcze go tam nie ma):

$ cat /etc/shells   # sprawdź czy `git-shell` już tam jest. Jeśli nie...
$ which git-shell   # upewnij się, że git-shell jest zainstalowane na serwerze
$ sudo vim /etc/shells  # oraz dodaj ścieżkę do git-shell uzyskaną z poprzedniego polecenia

Teraz możesz edytować powłokę dla użytkownika używając chsh <nazwa_użytkownika>:

$ sudo chsh git  # oraz podaj ścieżkę do git-shell, zwykle jest to: /usr/bin/git-shell

Teraz użytkownik git może użyć połączenia SSH tylko do wysłania i odebrania repozytorium Git, nie możne natomiast uzyskać dostępu do powłoki serwera. Serwer odpowie odmową zalogowania, podobną do poniższej:

$ ssh git@gitserver
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to gitserver closed.

Teraz komendy sieciowe Git nadal będą działać poprawnie, ale użytkownicy nie będą w stanie uzyskać dostępu do powłoki. Jak możemy wyczytać z wyjściowego komunikatu, możesz również ustawić katalog w katalogu domowym użytkownika git, który dostosowuje nieco komendę git-shell. Na przykład, możesz ograniczyć komendy Git, które serwer będzie akceptował, lub możesz dostosować komunikat, który użytkownicy zobaczą, jeśli spróbują się zalogować w ten sposób. Uruchom git help shell aby uzyskać więcej informacji na temat dostosowywania powłoki.

scroll-to-top