Git
章節 ▾ 第二版

4.4 伺服器上的 Git - 設定伺服器

設定伺服器

讓我們逐步說明如何在伺服器端設定 SSH 存取。在這個範例中,您將使用 authorized_keys 方法驗證您的使用者。我們也假設您正在執行標準的 Linux 發行版,例如 Ubuntu。

注意

這裡描述的許多內容都可以使用 ssh-copy-id 命令自動完成,而不是手動複製和安裝公鑰。

首先,您建立一個 git 使用者帳戶和該使用者的 .ssh 目錄。

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

接下來,您需要將一些開發人員 SSH 公開金鑰新增至 git 使用者的 authorized_keys 檔案中。假設您有一些信任的公開金鑰,並且已將它們儲存到暫存檔案中。同樣,公開金鑰看起來像這樣

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

您只需將它們附加到 git 使用者在其 .ssh 目錄中的 authorized_keys 檔案中

$ 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

現在,您可以透過執行 git init 並帶有 --bare 選項來為他們設定一個空的儲存庫,這會在沒有工作目錄的情況下初始化儲存庫

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

然後,John、Josie 或 Jessica 可以透過將其新增為遠端並推送分支來將其專案的第一個版本推送至該儲存庫。請注意,每次您想要新增專案時,必須有人 shell 連線到機器並建立一個裸儲存庫。讓我們使用 gitserver 作為您設定 git 使用者和儲存庫的伺服器的主機名稱。如果您在內部執行它,並且您設定了 gitserver 的 DNS 指向該伺服器,那麼您幾乎可以按原樣使用這些命令(假設 myproject 是現有的專案,其中包含檔案)

# on John's computer
$ cd myproject
$ git init
$ git add .
$ git commit -m 'Initial commit'
$ git remote add origin git@gitserver:/srv/git/project.git
$ git push origin master

此時,其他人可以輕鬆地將其複製下來並將變更推回。

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

使用這種方法,您可以快速建立一個可供少數開發人員使用的讀寫 Git 伺服器。

您應該注意,目前所有這些使用者也可以登入伺服器並以 git 使用者的身分取得 shell。如果您想要限制此行為,則必須在 /etc/passwd 檔案中將 shell 變更為其他 shell。

您可以使用 Git 隨附的有限 shell 工具 git-shell,輕鬆地將 git 使用者帳戶限制為僅執行與 Git 相關的活動。如果您將此設定為 git 使用者帳戶的登入 shell,則該帳戶將無法對您的伺服器進行正常的 shell 存取。若要使用此功能,請為該帳戶的登入 shell 指定 git-shell,而不是 bashcsh。若要這樣做,您必須先將 git-shell 命令的完整路徑名稱新增到 /etc/shells 中(如果它還不在那裡的話)。

$ cat /etc/shells   # see if git-shell is already in there. If not...
$ which git-shell   # make sure git-shell is installed on your system.
$ sudo -e /etc/shells  # and add the path to git-shell from last command

現在,您可以使用 chsh <使用者名稱> -s <shell> 來編輯使用者的 shell。

$ sudo chsh git -s $(which git-shell)

現在,git 使用者仍然可以使用 SSH 連線來推送和提取 Git 儲存庫,但無法 shell 到機器上。如果您嘗試這樣做,您會看到像這樣的登入拒絕訊息:

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

此時,使用者仍然能夠使用 SSH 連接埠轉送來存取 Git 伺服器可以存取的任何主機。如果您想要防止這種情況,您可以編輯 authorized_keys 檔案,並在您想要限制的每個金鑰前加上以下選項:

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty

結果應如下所示:

$ cat ~/.ssh/authorized_keys
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4LojG6rs6h
PB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4kYjh6541N
YsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9EzSdfd8AcC
IicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myivO7TCUSBd
LQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPqdAv8JggJ
ICUvax2T9va5 gsg-keypair

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDEwENNMomTboYI+LJieaAY16qiXiH3wuvENhBG...

現在,Git 網路命令仍然可以正常運作,但使用者將無法取得 shell。如輸出所述,您也可以在 git 使用者的家目錄中設定一個目錄,以自訂 git-shell 命令。例如,您可以限制伺服器將接受的 Git 命令,或者您可以自訂使用者嘗試以這種方式 SSH 連線時所看到的訊息。執行 git help shell 以取得有關自訂 shell 的更多資訊。

scroll-to-top