CentOS搭建Git服務器及權限管理


聲明:本教程,僅作為配置的記錄,細節不展開,需要您有一點linux的命令基礎,僅作為配置參考。

1. 系統環境

系統: Linux:CentOS 7.2 64位

由於CentOS已經內置了OpenSSH,如果您的系統沒有,請自行安裝。

查看ssh版本

$ ssh -V  # 輸出以下表示沒問題,可以繼續。 版本可能不一致,能用即可。 OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 11 Feb 2013 

避免系統環境和其他的不一致,請核對您系統的版本,其他發行版請對應修改。

2. 安裝git

建議以下操作都切換到root

# 請確保您切換到了root賬戶 $ su root $ yum install -y git  # 驗證是否安裝成功 $ git --version # 輸出如下內容表示成功: git version x.x.x.x 

3. 添加git的管理的賬戶和設置密碼

設置專門管理git的賬號非必須,但是建議這么操作。

# 添加git賬戶 $ adduser git  # 修改git的密碼 $ passwd git # 然后兩次輸入git的密碼確認后。  # 查看git是否安裝成功 $ cd /home && ls -al # 如果已經有了git,那么表示成,參考如下: drwxr-xr-x. 5 root root 4096 Apr 4 15:03 . dr-xr-xr-x. 19 root root 4096 Apr 4 15:05 .. drwx------ 10 git git 4096 Apr 4 00:26 git  # 默認還給我們分配一個名字叫git的組。 

4. git的權限管理

git倉庫的權限管理,我們可以手動進行管理和配置,也可以通過其他輔助工具。如果小團隊的話,直接通過ssh公鑰進行管理即可,如果大點的團隊,最好用gitolite 或者 gitosis,兩者都差不多,一個是Perl開發,一個是Python開發。

以下我分別介紹手動管理權限和使用gitolite管理的方式,注意兩者不兼容,不能混用。

5. git的手動權限管理

經過以上步驟,其實服務器的基本已經配置好,但是需要設置權限和配置遠程訪問git倉庫的方式。我們只介紹ssh的方式,https不做介紹。

5.1 配置服務端的ssh訪問

切換到git賬號,並創建ssh的默認目錄和校驗公鑰的配置文件

# 1.切換到git賬號 $ su git # 2.進入 git賬戶的主目錄 $ cd /home/git  # 3.創建.ssh的配置,如果此文件夾已經存在請忽略此步。 $ mkdir .ssh  # 4. 進入剛創建的.ssh目錄並創建authorized_keys文件,此文件存放客戶端遠程訪問的 ssh的公鑰。 $ cd /home/git/.ssh $ touch authorized_keys  # 5. 設置權限,此步驟不能省略,而且權限值也不要改,不然會報錯。 $ chmod 700 /home/git/.ssh/ $ chmod 600 /home/git/.ssh/authorized_keys 

此時,服務端的配置基本完成。接下需要把客戶端的公鑰拷貝到authorized_keys文件中。

5.2 配置客戶端的ssh私鑰並上傳服務器

以下是客戶端創建ssh私鑰和拷貝的過程,如果您有私鑰越過創建私鑰的過程。

請用您的客戶端進入終端(如果只有一台電腦,可以用不同的賬號模擬不同客戶端)

第一步: 創建客戶端的ssh私鑰和公鑰

檢查是否已經擁有ssh公鑰和私鑰:進入用戶的主目錄。

用戶主目錄:
Windows系統:C:\Users\用戶名
Linux系統:/home/用戶名
Mac系統:/Users/用戶名

然后查看是否有.ssh文件夾,此文件夾下是否有如下幾個文件。

# 用戶主目錄的.ssh文件夾下 .ssh ├── id_rsa └── id_rsa.pub # 我們要用的私鑰 

如果沒有,那么用ssh-keygen創建ssh的私鑰。

$ ssh-keygen -t rsa  # 接下來,三個回車默認即可。 

創建私鑰成功后,在查看用戶目錄是否有意加有了公鑰文件id_rsa.pub

第二步: 拷貝私鑰到git的服務器

如何把客戶端的文件拷貝到服務器端,我建議用scp命令進行拷貝。

以下以mac系統為例:

# 首先進入我的用戶主目錄的.ssh目錄下,注意用戶名xxx替換成自己的 $ cd /Users/xxx/.ssh  # 以下命令是:把本地的id_rsa.pub文件拷貝到 aicoder.com服務器,登錄aicoder.com服務的賬號是git。 # 冒號后面默認就是git賬號的主目錄,最后文件被保存成laoma.pub # 注意:把域名換成你自己的或者ip,最后的文件名可以自己定,后面還有用。 $ scp ./id_rsa.pub git@aicoder.com:.ssh/laoma.pub 

5.3 服務器端添加客戶端的SSH公鑰

切換到服務器端,把剛才上傳的laoma.pub文件的內容添加到 authorized_keys中,就可以允許客戶端ssh訪問了。

# 切換到git賬戶 $ su git $ cd /home/git/.ssh  $ ls -al # 查看一下.ssh目錄是否有authorized_keys和laoma.pub文件 # . # |-- authorized_keys # `-- laoma.pub  # 如果有,那么進行下面的把laoma.pub文件中的內容添加到authorized_keys中. $ cat laoma.pub >> authorized_keys  # >> 是在文件后面追加的意思,主要如果用其他編輯器,每個ssh的pub要單獨一行,建議用cat命令方便簡單。 

到此為止,您配置的客戶端應該可以ssh的方式直接用git賬號登錄服務器。(當然不安全,后面可以控制)

# 在客戶端用ssh測試連接遠程服務器,請將域名aicoder.com換成你的ip地址或者域名 $ ssh git@aicoder.com  # 第一次連接有警告,輸入yes繼續即可。如果可以連接上,那么恭喜你的ssh配置已經可以了。 

5.4 服務器端創建測試git倉庫

進入服務器的終端。

# 切換到git賬號 $ su git # 進入git賬號的用戶主目錄。
$ cd /home/git # 在用戶主目錄下創建 test.git倉庫的文件夾
$ mkdir test.git && cd test.git # 在test.git目錄下初始化git倉庫
$ git init --bare # 輸出如下內容,表示成功 Initialized empty Git repository in /home/git/test.git/

git init --bare 是在當前目錄創建一個裸倉庫,也就是說沒有工作區的文件,直接把git倉庫隱藏的文件放在當前目錄下,此目錄僅用於存儲倉庫的歷史版本等數據。

此時,客戶端就可以進行clone或者remote add此倉庫了。

5.5 客戶端測試連接git遠程倉庫

客戶端,可以新建一個文件夾,初始化一個倉庫,然后跟遠程服務器上的空倉庫建立連接。

# 以下shell代碼,純手寫沒有驗證,如果有錯誤請自行糾正。 $ mkdir demos && cd demos $ git init $ touch a.txt $ echo 'aicoder.com' >> a.txt
$ git add . $ git commit -m 'the first commit'
# 把當前倉庫跟遠程倉庫添映射 $ git remote add origin git@aicoder.com:test.git
# 把當前倉庫push到遠程倉庫。 $ git push -u origin master

到此為止,我們就可以盡情的享用git私服了,但是!但是!但是!客戶端可以直接ssh登錄啊,這是bug,也是不安全的隱患,且看下面怎么禁用git賬號的shell登錄。

5.6 禁止客戶端shell登錄

因為前面我們添加了客戶端的ssh的公鑰到遠程服務器,所以客戶端可以直接通過shell遠程登錄服務器,這不安全,也不是我們想要的。且看下面如何禁用shell登錄:

第一步:
給 /home/git 下面創建git-shell-commands目錄,並把目錄的擁有者設置為git賬戶。可以直接用git賬號登錄服務器終端操作。

$ su git $ mkdir /home/git/git-shell-commands 

此文件夾是git-shell用到的目錄,需要我們手動創建,不然報錯:fatal: Interactive git shell is not enabled. hint: ~/git-shell-commands should exist and have read and execute access.

第二步:修改/etc/passwd文件,修改

$ vim /etc/passwd  # 可以通過 vim的正則搜索快速定位到這行, 命名模式下 :/git:x  # 找到這句, 注意1000可能是別的數字 git:x:1000:1000::/home/git:/bin/bash
# 改為: git:x:1000:1000::/home/git:/bin/git-shell # 最好不要直接改,可以先復制一行,然后注釋掉一行,修改一行,保留原始的,這就是經驗!!! # vim快捷鍵: 命令模式下:yy復制行, p 粘貼 0光標到行首 $到行尾 x刪除一個字符 i進入插入模式 # 修改完后退出保存: esc進入命令模式, 輸入::wq! 保存退出。

好了,此時我們就不用擔心客戶端通過shell登錄,只允許使用git-shell進行管理git的倉庫。

如果有其他小伙伴要連接git服務器,僅需要把他的公鑰也添加到authorized_keys即可。

7. git的自動權限管理:gitolite(不要跟上面的步驟混做!!!)

如果團隊大點的,我們可以用gitolite管理,而且使用很方便。

7.1 gitolite的安裝和配置

以下配置此承接第5,如果第6步您已經操作,請注意第二步的說明。

第一步:添加gitolite依賴的perl的包

$ yum install 'perl(Data::Dumper)' 

第二步:清空服務器端配置的ssh的公鑰

確保:~/.ssh/authorized_keys文件是空的,或者不存在。如果已經存在,建議你把他改名即可,比如:authorized_keys.bak

第三步:上傳管理員的客戶端的ssh公鑰到服務器

把你管理員電腦的ssh的id_rsa.pub文件拷貝到服務器的: $HOME/YourName.pub

YourName可以自定義,最好根據不同伙伴的名字命名。

參考:

# mac客戶端 $ scp /Users/fly/.ssh/id_rsa.pub git@aicoder.com:malun.pub 

第四步:安裝配置gitolite

用git賬號登錄,並執行如下命令。

# 切換到git賬號 $ su git
# 進入git主目錄 $ cd /home/git
# 下載gitolite的倉庫 $ git clone https://github.com/sitaramc/gitolite
# 創建bin文件夾,必須!!! $ mkdir -p $HOME/bin # 用下載下來的倉庫中的insall執行安裝操作,指向的目錄就是上一命令行創建的目錄 $ ./gitolite二進制/install -to $HOME/bin # 把上傳到服務器的 管理員的公鑰setup到gitolite中,注意:YourName.pub改成你自己的文件名。 $ ~/bin/gitolite setup -pk ~/YourName.pub # 此時安裝配完成后,查看git主目錄 $ ls /home/git drwxr-xr-x 7 git git 4096 Apr 3 23:50 bin # 我們創建的存放gitolite二進制 drwxrwxr-x 6 git git 4096 Apr 3 23:40 gitolite drwx------ 6 git git 4096 Apr 3 23:52 .gitolite -rw------- 1 git git 7130 Apr 3 23:52 .gitolite.rc -rw------- 1 git git 398 Apr 3 23:39 malun.pub # 管理員的公鑰 drwxrw---- 3 git git 4096 Apr 3 23:40 .pki -rw------- 1 git git 19 Apr 4 00:26 projects.list # 倉庫列表(gitolite自動創建) drwx------ 5 git git 4096 Apr 4 00:26 repositories # 存放所有倉庫文件夾 drwx------ 2 git git 4096 Apr 4 15:50 .ssh # repositories目錄下已經有了兩個git倉庫了。 # . # |-- gitolite-admin.git # 管理配置權限的倉庫 # `-- testing.git # 測試倉庫

好了,到此位置,管理員就可以直接把默認的遠程管理的倉庫gitolite-admin直接clone到本地進行管理git服務了。

第五步:管理員在本地管理和配置服務器端的倉庫

下載服務器端的遠程管理倉庫

# 下載遠程管理倉庫, 請把aicoder.com換成你自己服務器的域名或者ip $ git clone git@aicoder.com:gitolite-admin $ cd gitolite-admin # 目錄結構如下: # . # ├── conf # 配置文件夾 # │ └── gitolite.conf # 配置權限的文件 # └── keydir # 客戶端的公鑰文件夾,所有伙伴的公鑰要放到此目錄下 # └── malun.pub 

7.2 gitolite的權限配置

  • 添加其他開發的小伙伴

    把小伙伴的公鑰發給管理員。管理員添加到gitolite-admin倉庫的keydir目錄下,注意文件名字格式為username.pub,username就是配置權限時的用戶名。

  • 配置用戶對倉庫的讀寫權限

    直接修改conf文件夾下的,gitolite.conf文件。簡單解釋下幾個用法:

    • repo代表倉庫的意思,如果新添加一個repo,代表服務端新建一個空倉庫,倉庫push到服務端后會自動創建。
    • RW 代表可讀可寫
    • @all 代表所有人。
    • master和 dev代表分支

    參考:

    @admin = malun @om = malun bcd repo gitolite-admin RW+ = malun repo testing RW+ = @all repo om RW+ = @admin RW+ master = @admin RW+ dev = @om 
  • 應用修改到服務器端

做好配置后,由管理員把修改push到服務器端,會自動處理。

$ git add conf
$ git add keydir
$ git commit -m "added foo, gave access to alice, bob, carol" $ git push 

此時登錄服務端,查看/home/git/repositories/目錄下是否增加了對應的倉庫了呢?

總結

其實配置這些並不繁瑣,但是需要你有一定的linux的經驗,當然你也可以選擇使用GitLab或者Github

最后希望能幫到你。


參考:

  1. git服務器搭建及gitolite權限管理
    1.Centos搭建Git服務器和Gitolite權限設置
    1.Linux 使用 Gitolite 架設 Git Server

aicoder.com 是老馬親自帶的線下全棧實習

老馬免費視頻教程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM