ProGit2项目指南:搭建Git服务器全流程解析
progit2 Pro Git 2nd Edition 项目地址: https://gitcode.com/gh_mirrors/pr/progit2
前言
在团队协作开发中,搭建私有Git服务器是常见的需求。本文将基于ProGit2项目中的最佳实践,详细介绍如何从零开始搭建一个安全可靠的Git服务器。我们将使用SSH协议作为通信基础,通过Linux系统环境演示完整的搭建过程。
环境准备
在开始前,请确保你拥有:
- 一台运行标准Linux发行版(如Ubuntu)的服务器
- 管理员权限(sudo)
- 需要接入的开发者的SSH公钥
创建Git专用账户
首先我们需要创建一个专门用于Git操作的系统账户,这能提高安全性并便于管理:
$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
这里创建了git用户,并设置了正确的目录权限:
.ssh
目录设置为700(仅所有者可读写执行)authorized_keys
文件设置为600(仅所有者可读写)
添加开发者公钥
将开发者的SSH公钥添加到授权文件中:
$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys
每个公钥通常以"ssh-rsa"开头,包含一段长字符串和最后的标识信息。添加后,这些开发者就能通过SSH访问服务器了。
初始化裸仓库
Git服务器通常使用裸仓库(bare repository),这种仓库不包含工作目录,专门用于共享:
$ cd /srv/git
$ mkdir project.git
$ cd project.git
$ git init --bare
裸仓库的目录名通常以.git
结尾,这是约定俗成的做法。--bare
参数告诉Git不要创建工作目录。
开发者使用流程
开发者可以将本地项目推送到这个服务器:
# 在开发者机器上
$ cd myproject
$ git init
$ git add .
$ git commit -m 'Initial commit'
$ git remote add origin git@gitserver:/srv/git/project.git
$ git push origin master
其他开发者可以克隆这个仓库:
$ git clone git@gitserver:/srv/git/project.git
安全加固
默认情况下,git用户拥有完整的shell访问权限,这存在安全隐患。我们可以限制为仅允许Git操作:
- 首先确保git-shell可用:
$ which git-shell # 确认路径
$ sudo -e /etc/shells # 将git-shell路径添加到此文件
- 修改git用户的默认shell:
$ sudo chsh git -s $(which git-shell)
现在尝试直接登录会被拒绝:
$ ssh git@gitserver
fatal: Interactive git shell is not enabled.
高级安全配置
我们可以进一步限制SSH功能,在authorized_keys
文件中为每个公钥添加限制选项:
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3...
这些选项将:
- 禁止端口转发
- 禁止X11转发
- 禁止认证代理转发
- 禁止分配伪终端
自定义Git Shell
你还可以在git用户的主目录下创建git-shell-commands
目录,实现更精细的控制:
- 创建自定义目录:
$ mkdir /home/git/git-shell-commands
- 可以在这里添加:
- 允许执行的命令白名单
- 自定义欢迎信息
- 其他访问控制脚本
总结
通过以上步骤,我们建立了一个安全可靠的Git服务器环境。关键点包括:
- 使用专用git账户
- 正确设置SSH密钥和权限
- 使用裸仓库存储项目
- 限制shell访问增强安全性
- 可选的高级安全配置
这种方案适合中小型团队使用,既保证了易用性又提供了基本的安全保障。对于更大规模的团队,可以考虑使用Gitosis或Gitolite等工具进行更精细的权限管理。
progit2 Pro Git 2nd Edition 项目地址: https://gitcode.com/gh_mirrors/pr/progit2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考