4.4 配置服務(wù)器

2018-02-24 15:22 更新

配置服務(wù)器

我們來看看如何配置服務(wù)器端的 SSH 訪問。本例中,我們將使用 authorized_keys 方法來對用戶進(jìn)行認(rèn)證。同時(shí)我們假設(shè)你使用的操作系統(tǒng)是標(biāo)準(zhǔn)的 Linux 發(fā)行版,比如 Ubuntu。首先,創(chuàng)建一個(gè)操作系統(tǒng)用戶 git,并為其建立一個(gè) .ssh 目錄。

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

接著,我們需要為系統(tǒng)用戶 gitauthorized_keys 文件添加一些開發(fā)者 SSH 公鑰。假設(shè)我們已經(jīng)獲得了若干受信任的公鑰,并將它們保存在臨時(shí)文件中。與前文類似,這些公鑰看起來是這樣的:

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

將這些公鑰加入系統(tǒng)用戶 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

現(xiàn)在我們來為開發(fā)者新建一個(gè)空倉庫??梢越柚鷰?--bare 選項(xiàng)的 git init 命令來做到這一點(diǎn),該命令在初始化倉庫時(shí)不會創(chuàng)建工作目錄:

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

接著,John、Josie 或者 Jessica 中的任意一人可以將他們項(xiàng)目的最初版本推送到這個(gè)倉庫中,他只需將此倉庫設(shè)置為項(xiàng)目的遠(yuǎn)程倉庫并向其推送分支。請注意,每添加一個(gè)新項(xiàng)目,都需要有人登錄服務(wù)器取得 shell,并創(chuàng)建一個(gè)裸倉庫。我們假定這個(gè)設(shè)置了 git 用戶和 Git 倉庫的服務(wù)器使用 gitserver 作為主機(jī)名。同時(shí),假設(shè)該服務(wù)器運(yùn)行在內(nèi)網(wǎng),并且你已在 DNS 配置中將 gitserver 指向此服務(wù)器。那么我們可以運(yùn)行如下命令(假定 myproject 是已有項(xiàng)目且其中已包含文件):

# on John's computer
$ 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

此時(shí),其他開發(fā)者可以克隆此倉庫,并推回各自的改動(dòng),步驟很簡單:

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

通過這種方法,你可以快速搭建一個(gè)具有讀寫權(quán)限、面向多個(gè)開發(fā)者的 Git 服務(wù)器。

需要注意的是,目前所有(獲得授權(quán)的)開發(fā)者用戶都能以系統(tǒng)用戶 git 的身份登錄服務(wù)器從而獲得一個(gè)普通 shell。如果你想對此加以限制,則需要修改 passwd 文件中(git 用戶所對應(yīng))的 shell 值。

借助一個(gè)名為 git-shell 的受限 shell 工具,你可以方便地將用戶 git 的活動(dòng)限制在與 Git 相關(guān)的范圍內(nèi)。該工具隨 Git 軟件包一同提供。如果將 git-shell 設(shè)置為用戶 git 的登錄 shell(login shell),那么用戶 git 便不能獲得此服務(wù)器的普通 shell 訪問權(quán)限。若要使用 git-shell,需要用它替換掉 bash 或 csh,使其成為系統(tǒng)用戶的登錄 shell。為進(jìn)行上述操作,首先你必須確保 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 vim /etc/shells  # and add the path to git-shell from last command

現(xiàn)在你可以使用 chsh <username> 命令修改任一系統(tǒng)用戶的 shell:

$ sudo chsh git  # and enter the path to git-shell, usually: /usr/bin/git-shell

這樣,用戶 git 就只能利用 SSH 連接對 Git 倉庫進(jìn)行推送和拉取操作,而不能登錄機(jī)器并取得普通 shell。如果試圖登錄,你會發(fā)現(xiàn)嘗試被拒絕,像這樣:

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

現(xiàn)在,網(wǎng)絡(luò)相關(guān)的 Git 命令依然能夠正常工作,但是開發(fā)者用戶已經(jīng)無法得到一個(gè)普通 shell 了。正如輸出信息所提示的,你也可以在 git 用戶的家目錄下建立一個(gè)目錄,來對 git-shell 命令進(jìn)行一定程度的自定義。比如,你可以限制掉某些本應(yīng)被服務(wù)器接受的 Git 命令,或者對剛才的 SSH 拒絕登錄信息進(jìn)行自定義,這樣,當(dāng)有開發(fā)者用戶以類似方式嘗試登錄時(shí),便會看到你的信息。要了解更多有關(guān)自定義 shell 的信息,請運(yùn)行 git help shell。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號