原生GIT版本服务器配置和测试

时间:2023-01-14 12:15:08

前言:原生GIT版本服务器指使用Linux内核自带的GIT软件来构建版本服务器,而不采用Git-lab、SCM-Manager等非Linux原生系统。本文提供原生GIT安装、配置、测试和安全性设置。以下实验针对CentOS 7.9,其他类型的Linux和版本均大同小异。


1.原生Git的好处

原生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是更高层的应用协议,封装次数更多,导致延迟多,故障也会相对更多。


2.安装支撑工具

执行如下命令安装工具:

yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel #安装支撑工具curl、openssl、perl等

执行情况如下图:

原生GIT版本服务器配置和测试

依赖关系:

原生GIT版本服务器配置和测试

原生GIT版本服务器配置和测试

询问时输入y:

原生GIT版本服务器配置和测试

密钥提示时输入y:

原生GIT版本服务器配置和测试


3.安装GIT服务器

执行如下指令安装git服务器:

yum install git #git一般在CentOS7已经安装好了,为了保证正确性还是要执行一遍

执行效果如下:

原生GIT版本服务器配置和测试


4.添加GIT组和用户

执行如下命令在CentOS中创建git用户组为git_group(为每个部门、小组新建一个CentOS用户组):

groupadd git-group #版本管理组
groupadd maintain-group #运维组

原生GIT版本服务器配置和测试

创建git账户(为每个人新建一个CentOS用户):

useradd git-admin -g git-group #默认版本管理员账号
passwd git-admin #设置默认版本管理员密码

原生GIT版本服务器配置和测试


5.免密操作

在本地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

原生GIT版本服务器配置和测试

一直回车:

原生GIT版本服务器配置和测试

到默认目录中查看密钥文件:

原生GIT版本服务器配置和测试

需要免密的人员都需要创建密钥对,并把公钥提供给版本管理员。

其次,版本管理员上传公钥文件id_rsa.pub到CentOS操作系统,存放位置是对应人员在CentOS上的对应用户的.ssh目录中。

如果没有.ssh目录,版本管理员执行如下命令:

su git-admin #切换到默认管理员账户
cd ~ #进入默认管理员的home目录
mkdir .ssh #创建认证目录
cd .ssh #进入认证目录
touch authorized_keys #创建认证密钥文件

如下图:

原生GIT版本服务器配置和测试

随后马上执行如下指令:

chmod 700 /home/git-admin/.ssh/ #修改认证目录权限
chmod 600 /home/git-admin/.ssh/authorized_keys #修改认证密钥文件权限

如下图:

原生GIT版本服务器配置和测试

把需要免密人员的公钥上传到服务器,推荐采用FinalShell的上传功能,如下图:

原生GIT版本服务器配置和测试

最后,追加对应人员的公钥到authorized_keys文件中,如下:

cat id_rsa.pub >> authorized_keys #默认公钥文件名id_rsa.pub。该指令比vim要好。

原生GIT版本服务器配置和测试


6.初始化GIT仓库

切换到默认管理员账户,创建版本仓库的根目录:

su -  #切换到root账户
cd /var #进入可变数据目录var
mkdir repositories #创建版本仓库根目录
chown git-admin:git-group /var/repositories/ #修改版本仓库根目录拥有者
chmod 711 /var/repositories/ #修改版本仓库根目录权限,拥有者(版本管理员git-admin)有读、写、执行权限,管理员组git-group有执行权限,其他组有执行权限

原生GIT版本服务器配置和测试

(备注:

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。

接下来,我们使用如下指令创建一个仓库。可以约定规则:仓库名称采用英文,中文会有带了一些故障,英文单词之间使用连字符分隔,仓库名称后面必须要带.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有读、写权限,其他组没有权限

原生GIT版本服务器配置和测试


7.测试版本仓库

(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服务器的网卡配置

原生GIT版本服务器配置和测试

如上图,第一个网卡ens33是有效的,IP地址为192.168.183.138。

上面的Git clone指令执行结果报错说不能读版本服务器上的仓库,如下图:

原生GIT版本服务器配置和测试

这是因为指定library-manager.git权限时只有git-group组有读写权限,而其他组没有权限,feng-yong-hua是运维组的,所以没有权限。只需再执行如下指令:

chmod 755-R library-manager.git/ #修改目录权限,拥有者有读、写、执行权限,版本管理组git-group有读、执行权限,其他组有读、执行权限

原生GIT版本服务器配置和测试

重新在本地执行git clone指令:

原生GIT版本服务器配置和测试

上图表示成功克隆版本服务器上的仓库library-manager.git到本地。

继续测试上传目录功能,在git bash里面执行如下指令来拷贝所需提交的文件夹到本地仓库下属目录中:

cd library-manager/  #进入本地版本仓库下属目录
cp -r /d/mywork/版本管理制度 . #拷贝所需提交的文件夹
ll #查看拷贝后的目录情况

原生GIT版本服务器配置和测试

继续执行如下指令以便于提交该文件夹到本地仓库中:

cd 版本管理制度/  #进入所需提交的文件夹
git init #初始化所需提交的文件夹到本地仓库
git add . #增加所需提交的文件夹的文件到本地仓库中,即进入暂存区
git commit -m "按照集团要求,编写版本管理制度,已定稿" #提交文件到本地仓库,并附加变更说明

原生GIT版本服务器配置和测试

继续执行如下指令以便于推送本地仓库到版本服务器的对应仓库中:

git remote add origin feng-yong-hua@192.168.183.138:/var/repositories/library-manager.git  #新增版本服务器和版本仓库配置origin
git remote -v #查看版本服务器配置
git push -u origin master #同步本地版本仓库到版本服务器的library-manager.git仓库master基线中

原生GIT版本服务器配置和测试

提示写失败,解决办法是在版本服务器上执行如下指令添加其他组的写权限:

chmod 757-R library-manager.git/ #修改目录权限,拥有者有读、写、执行权限,版本管理组git-group有读、执行权限,其他组有读、写、执行权限

重新在本地执行如下指令:

git push -u origin master #同步本地版本仓库到版本服务器的library-manager.git仓库master基线中

原生GIT版本服务器配置和测试

从以上测试步骤看,成功上传“版本管理制度”目录到版本服务器的library-manager.git仓库中,测试成功。


8.安全性设置

不允许git账户通过SSH登录远程登录到版本服务器,需要禁用CentOS上git账户:git_admin的SSH登录权限。

先切换到root用户,再编辑/etc/passwd文件:

原生GIT版本服务器配置和测试

找到下面一行,是git_admin的登录规则:

原生GIT版本服务器配置和测试

改为:

原生GIT版本服务器配置和测试