
前言:原生GIT版本服務器指使用Linux內核自帶的GIT軟件來構建版本服務器,而不采用Git-lab、SCM-Manager等非Linux原生系統。本文提供原生GIT安裝、配置、測試和安全性設置。以下實驗針對CentOS 7.9,其他類型的Linux和版本均大同小異。
原生Git默認訪問方式采用SSH協議,而大部分非原生Git工具采用HTTP/HTTPS協議。
(資料圖片)
HTTP/HTTPS協議是目前版本管理公有云(例如:Gitee、GitHub)采用的通用訪問方式。SSH和HTTP/HTTPS相比并不復雜,使用命令行或者圖形界面操作均相同。HTTP/HTTPS的優點是共享方便,就像GitHub一樣,幾萬個用戶拉取版本,但是大多數用戶并不修改。但是,企業內部的版本服務器并不需要太多共享,反而需要嚴格的訪問和權限控制,版本最終應控制到版本管理員手上。
原生git服務器優點有:
首先,原生git服務器內置于Linux內核,不需要安裝,多數管理員都有使用經驗,并且多數操作系統都包含了它及相關的管理工具。
其次,原生git服務器相比HTTP/HTTPS更加安全。不但所有傳輸數據都要經過授權和加密,而且在需要時可以利用Linux操作系統的用戶組和用戶權限來控制訪問和權限,粒度可以細到每個用戶的讀、寫、執行操作。
最后,原生git服務器相比HTTP/HTTPS更高效,在傳輸前也會盡量壓縮數據。HTTP/HTTPS是更高層的應用協議,封裝次數更多,導致延遲多,故障也會相對更多。
執行如下命令安裝工具:
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel #安裝支撐工具curl、openssl、perl等
執行情況如下圖:
依賴關系:
詢問時輸入y:
密鑰提示時輸入y:
執行如下指令安裝git服務器:
yum install git #git一般在CentOS7已經安裝好了,為了保證正確性還是要執行一遍
執行效果如下:
執行如下命令在CentOS中創建git用戶組為git_group(為每個部門、小組新建一個CentOS用戶組):
groupadd git-group #版本管理組groupadd maintain-group #運維組
創建git賬戶(為每個人新建一個CentOS用戶):
useradd git-admin -g git-group #默認版本管理員賬號passwd git-admin #設置默認版本管理員密碼
在本地git使用clone、push、pull操作時,需要輸入CentOS上的用戶名和密碼,這樣做更加安全。但是,某些情況下需要免密,例如頻繁push的版本管理員自身或者某些開發人員,可以執行如下操作:
首先,到windows用戶目錄下,例如c:\user\<用戶名>\.ssh,查找id_rsa和id_rsa.pub文件,如果已經存在,則把id_rsa.pub文件提供給版本管理員。否則,所有人員在windows操作系統中,打開Git Bash,執行ssh-keygen,如下:
ssh-keygen
一直回車:
到默認目錄中查看密鑰文件:
需要免密的人員都需要創建密鑰對,并把公鑰提供給版本管理員。
其次,版本管理員上傳公鑰文件id_rsa.pub到CentOS操作系統,存放位置是對應人員在CentOS上的對應用戶的.ssh目錄中。
如果沒有.ssh目錄,版本管理員執行如下命令:
su git-admin #切換到默認管理員賬戶cd ~ #進入默認管理員的home目錄mkdir .ssh #創建認證目錄cd .ssh #進入認證目錄touch authorized_keys #創建認證密鑰文件
如下圖:
隨后馬上執行如下指令:
chmod 700 /home/git-admin/.ssh/ #修改認證目錄權限chmod 600 /home/git-admin/.ssh/authorized_keys #修改認證密鑰文件權限
如下圖:
把需要免密人員的公鑰上傳到服務器,推薦采用FinalShell的上傳功能,如下圖:
最后,追加對應人員的公鑰到authorized_keys文件中,如下:
cat id_rsa.pub >> authorized_keys #默認公鑰文件名id_rsa.pub。該指令比vim要好。
切換到默認管理員賬戶,創建版本倉庫的根目錄:
su - #切換到root賬戶cd /var #進入可變數據目錄varmkdir repositories #創建版本倉庫根目錄chown git-admin:git-group /var/repositories/ #修改版本倉庫根目錄擁有者chmod 711 /var/repositories/ #修改版本倉庫根目錄權限,擁有者(版本管理員git-admin)有讀、寫、執行權限,管理員組git-group有執行權限,其他組有執行權限
(備注:
chmod 命令可以用來修改用戶對某個文件或文件夾的權限。
Linux 系統中文件的基本權限由 9 個字符組成。r、w、x 分別表示讀、寫、執行權限。第1/2/3個字符針對擁有者,第4/5/6個字符針對擁有者所屬組,第7/8/9個字符針對其他組。
我們可以使用數字來代表各個權限,各個權限與數字的對應關系如下:
r --> 4
w --> 2
x --> 1
例如: rwxrw-r-x,擁有者、所屬組和其他人分別對應的權限值為:
擁有者 = rwx = 4+2+1 = 7
所屬組 = rw- = 4+2+0 = 6
其他組 = r-x = 4+0+1 = 5
所以,此權限對應的權限值就是 765。
)
接下來,我們使用如下指令創建一個倉庫??梢约s定規則:倉庫名稱采用英文,中文會有帶了一些故障,英文單詞之間使用連字符分隔,倉庫名稱后面必須要帶.git。
git init --bare library-manager.git #--bare表示空白倉庫,library-manager是倉庫名稱chown -R git-admin:git-group library-manager.git/ #調整版本倉庫目錄的擁有者,必須加-R參數,表示遞歸子目錄。擁有者是默認版本管理員chmod 760 -R library-manager.git/ #修改目錄權限,擁有者有讀、寫、執行權限,版本管理組git-group有讀、寫權限,其他組沒有權限
(1)創建測試賬戶,然后測試上一步創建的版本倉庫。
例如:使用交付人員fengyonghua的名字來創建CentOS賬戶:
useradd feng-yong-hua #新增測試賬戶:運維人員馮永華,我們可以約定:全拼中間加連字符usermod -a -G maintain-group feng-yong-hua #把fengyonghua加入到運維組passwd feng-yong-hua #設置初始密碼,后續密碼需要版本管理員來幫運維人員馮永華修改,密碼規則可以定為:姓名第一個字母+@+組名的第一個字母+隨機數。
(2)在一臺windows辦公電腦上安裝git和tortoisegit(參見2.2節)之后,啟動git bash,輸入指令:
git clone feng-yong-hua@192.168.183.138:/var/repositories/library-manager.git #克隆版本倉庫library-manager到本地計算機
其中,192.168.183.138是版本服務器的IP地址,可以使用指令:
Ifconfig #查看CentOS服務器的網卡配置
如上圖,第一個網卡ens33是有效的,IP地址為192.168.183.138。
上面的Git clone指令執行結果報錯說不能讀版本服務器上的倉庫,如下圖:
這是因為指定library-manager.git權限時只有git-group組有讀寫權限,而其他組沒有權限,feng-yong-hua是運維組的,所以沒有權限。只需再執行如下指令:
chmod 755-R library-manager.git/ #修改目錄權限,擁有者有讀、寫、執行權限,版本管理組git-group有讀、執行權限,其他組有讀、執行權限
重新在本地執行git clone指令:
上圖表示成功克隆版本服務器上的倉庫library-manager.git到本地。
繼續測試上傳目錄功能,在git bash里面執行如下指令來拷貝所需提交的文件夾到本地倉庫下屬目錄中:
cd library-manager/ #進入本地版本倉庫下屬目錄cp -r /d/mywork/版本管理制度 . #拷貝所需提交的文件夾ll #查看拷貝后的目錄情況
繼續執行如下指令以便于提交該文件夾到本地倉庫中:
cd 版本管理制度/ #進入所需提交的文件夾git init #初始化所需提交的文件夾到本地倉庫git add . #增加所需提交的文件夾的文件到本地倉庫中,即進入暫存區git commit -m "按照集團要求,編寫版本管理制度,已定稿" #提交文件到本地倉庫,并附加變更說明
繼續執行如下指令以便于推送本地倉庫到版本服務器的對應倉庫中:
git remote add origin feng-yong-hua@192.168.183.138:/var/repositories/library-manager.git #新增版本服務器和版本倉庫配置origingit remote -v #查看版本服務器配置git push -u origin master #同步本地版本倉庫到版本服務器的library-manager.git倉庫master基線中
提示寫失敗,解決辦法是在版本服務器上執行如下指令添加其他組的寫權限:
chmod 757-R library-manager.git/ #修改目錄權限,擁有者有讀、寫、執行權限,版本管理組git-group有讀、執行權限,其他組有讀、寫、執行權限
重新在本地執行如下指令:
git push -u origin master #同步本地版本倉庫到版本服務器的library-manager.git倉庫master基線中
從以上測試步驟看,成功上傳“版本管理制度”目錄到版本服務器的library-manager.git倉庫中,測試成功。
不允許git賬戶通過SSH登錄遠程登錄到版本服務器,需要禁用CentOS上git賬戶:git_admin的SSH登錄權限。
先切換到root用戶,再編輯/etc/passwd文件:
找到下面一行,是git_admin的登錄規則:
改為: