2 基于SSH协议搭建Git服务器
2.1 将裸仓库放置在服务器上
在创建Git
服务器时,一般会使用一个裸仓库。这个裸仓库有两种方式:一种是在服务器指定目录下使用Git
命令初始化一个裸仓库,另一种是基于已有的仓库导出成一个新的裸仓库。
先来看第一种方式,这种方式的主要步骤是访问服务器、跳转到指定的文件夹、初始化裸仓库
- 使用
ssh
方式访问服务器:ssh <server_user>@<server_ip>
,例如:ssh jiaoxn@10.10.10.13
,然后根据提示输入对应的密码 - 跳转到指定的文件夹:
cd <folder_path>
,例如:cd /home/jiaoxn/git_project.git
,这里需要注意的是,裸仓库的目录名的结尾都是.git
,这是Git
的范例 - 初始化裸仓库:
git init --bare
,其中--bare
选项会创建新的裸仓库,如果再添加--share
选项,Git
会自动像拥有通过SSH
访问服务器的用户的写权限
接下来看看第二种方式,首先基于现有仓库导出一个新的裸仓库,然后将导出的裸仓库拷贝至服务器上
- 基于现有仓库导出新的裸仓库有2种方式:
- 使用
Git
命令:git clone --bare <git_project_path> <new_git_project_path>
,例如:git clone /Git学习笔记/git_learn_note_202102 /my_project.git
- 使用
Linux
命令:cp -Rf <git_project_path>/.git <new_git_project_path>
,例如:cp -Rf Git学习笔记/git_learn_note_202102/.git /my_project.git
- 这2种方式是有区别的,一个是目录结构上的区别,另一个是配置文件上的区别,通常来讲,建议使用第一种方式
- 使用
- 将裸仓库拷贝到服务器:
scp -r <new_git_project_path> <server_user>@<server_ip:/<target_folder_path>
,例如:scp -r vue-next-new.git jiaoxn@10.10.10.13:/home/jiaoxn
在服务器上配置裸仓库后,其他用户均可以使用SSH
协议来克隆这个仓库:
$ git clone <server_user>@<server_ip>:<target_folder_path>
如果这些用户通过SSH
登录服务器时,拥对该仓库所在的文件路径的写权限,那么这些用户也会拥有像仓库中推送数据的权限。
整个逻辑还是相对简单的,完成上述配置后,我们就拥有了可以和其他团队成员开展合作的Git
服务器。需要指出的是,上述操作并没有涉及到任何的用户访问控制,Git
仓库的安全性极低。
2.2 小型团队配置
如果开发团队只有几个人,那么上述配置可以满足咱们对于Git
最基本的需求。但是,如果想给Git
仓库添加一些用户管理,例如:允许一部分成员只有读的权限,而另外的一部分成员有写的权限,那么这种情况就会复杂很多,这种情况一般通过服务器所在的操作系统的文件系统权限来实现。
在做用户管理之前,需要为访问仓库的用户设置服务器账号,实现团队成员访问权限有几种方式:
- 一种是为每个团队成员都创建能够访问服务器的账号,这种方式简单,但需要重复
adduser
命令,比较繁琐 - 一种是只在服务器上创建
git
账号,然后将所有拥有写权限的用户的公钥添加到该用户的~/.ssh/authorized_keys
文件中,这样每个用户可通过git
账号访问服务器,对于推送到服务器上的每个提交信息中的提交作者信息不会受到影响 - 另一种是把
SSH
服务器的身份验证方式替换为LDAP
服务器或者其他类似的身份验证服务
接下来的几个小节围绕第二种方式来展开描述。
3 生成个人公钥
大多数Git
服务器使用SSH
公钥方式来对用户进行身份验证。那么SSH
公钥怎么得来的呢?
SSH
密钥分为私钥和公钥,私钥保存在本地,不可对外泄露,公钥保存在对应的服务器上。SSH
密钥默认保存在~/.ssh
目录下,私钥和公钥是成对出现的。其中,一个名字类似id_dsa
或者id_rsa
,这个文件就是私钥;另一个是与之对应的.pub
文件,这个文件就是公钥。
SSH
密钥可以通过ssh-keygen
程序来创建,对于MacOS
系统或者Linux
系统该程序由SSH
软件包来提供,Windows
系统有Git for Windows
提供。
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jiaoxn/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/jiaoxn/.ssh/id_rsa
Your public key has been saved in /home/jiaoxn/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:VTwsvF+Mpr58z01E3mIjK6QuSqKi64l9H2q4Y+Bmv+4 jiaoxn@jiaoxn
The key's randomart image is:
+---[RSA 3072]----+
| . o. |
| o.+ |
| .o + .|
| .. o oo.|
| S .+..+ +|
|. o. .+ + |
|..... . ... . .|
|o*=oo..o ..... o |
|@=*E+o... oo .o .|
+----[SHA256]-----+
首先,程序会询问SSH
密钥保存在哪个位置,一般使用默认配置即可;然后,程序询问两遍口令,如果不想每次使用时都输入密码,该配置项可留空,直接回车跳过。
拿到个人公钥后,可以把.pub
公钥文件发送给git
用户,由他来配置到对应的文件中。
4 设置服务器
以Ubuntu
系统来演示如何在服务器上追加用户的公钥。
- 首先,创建
git
用户,并在其目录下创建.ssh
目录,然后在.ssh
目录下创建authorized_keys
$ sudo adduser git
$ su - git
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
- 将用户的公钥追加到
authorized_keys
文件,保持在git
用户,不要切换到root
用户
$ cat <*.pub_file_path> >> ~/.ssh/authorized_keys
-
在服务器使用第2章介绍的方法创建裸仓库
-
每次创建新项目时,需要有人以
SSH
方式登录该服务器并创建一个新的裸仓库
$ cd my_project
$ git init --bare
$ git add .
$ git commit -m "初始化仓库"
$ git remote add origin git@<server_ip>:<target_folder_path>
$ git push origin master
- 其他配置了公钥的成员可轻松地克隆仓库,并把做出的更改推送到服务器上
按照现在的配置,可以为团队配置并运行了一个可读写的Git
服务器。但是,需要注意的是,配置公钥的这些用户,都可以通过git
这个账户登录服务器并获取shell
访问权限,这就意味着,这些用户可以对服务器做出破坏性的修改。
Git
提供了git-shell
的工具,该工具提供了有限制的shell
访问,通过该工具可以限制git
用户只能执行git
相关的操作。这个配置操作配置起来也很简单,具体来说,需要把git
用户登录时使用的shell
配置为git-shell
,那么使用git
登录后只能操作Git
相关的内容。具体操作如下:
- 将
git-shell
添加到/etc/shells
文件中
$ cat /etc/shells # 查看文件中是否包含了git-shell
$ which git-shell # 查找git-shell的安装路径
$ sudo vi /etc/shells # 编辑文件,将git-shell的安装路径添加到文件末尾
- 使用
chsh <username>
命令来给git
用户配置shell
$ chsh git # 在交互式窗口中输入git-shell的地址,一般是/user/bin/git-shell
-
在
git
用户的home
目录下可以建立一个新的目录,用来自定义git-shell
,比如,限制服务器可以接受的Git
命令,又或者自定义用户在尝试SSH
登录时提示的内容 -
此时如果
git
用户尝试登录,则会提示错误
接下来2天将会分享如何配置服务器使用Git
协议和HTTP
协议服务,以及如何在Linux
服务器中部署GitLab
。