部署运维-Debian 搭建私有 Git 仓库:SSH 认证与权限隔离

文章目录

本文介绍如何在 Debian 系统上通过原生 SSH 与 Git 裸仓库(Bare Repository)快速搭建轻量、安全、支持多人提交的私有 Git 服务器,并完成权限隔离与 SSH 免密认证配置。


1. 服务端环境准备

root 或具备 sudo 权限的用户登录 Debian 服务器。

1.1 安装 Git

1
2
sudo apt update
sudo apt install -y git

1.2 创建专用的 git 用户

为了环境安全与权限隔离,避免直接使用 root 账户托管代码仓库:

1
sudo adduser --disabled-password --gecos "" git

2. 配置 SSH 公钥认证

Git 客户端主要通过 SSH 协议与公钥认证进行安全通信。

2.1 初始化 git 用户的 SSH 目录

1
2
3
4
sudo -u git mkdir -p /home/git/.ssh
sudo -u git chmod 700 /home/git/.ssh
sudo -u git touch /home/git/.ssh/authorized_keys
sudo -u git chmod 600 /home/git/.ssh/authorized_keys

2.2 导入客户端公钥

本地开发机上获取 SSH 公钥(通常为 ~/.ssh/id_ed25519.pub~/.ssh/id_rsa.pub):

1
2
3
# 本地终端执行(若尚未生成 SSH Key 可先生成)
ssh-keygen -t ed25519 -C "your_email@example.com"
cat ~/.ssh/id_ed25519.pub

将打印出的公钥内容追加到服务器的 /home/git/.ssh/authorized_keys 文件中:

1
2
# 在服务器端执行(替换其中的公钥字符串)
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... user@local" | sudo tee -a /home/git/.ssh/authorized_keys

3. 创建远程裸仓库(Bare Repository)

作为中央远程仓库,必须创建为裸仓库(不包含工作区文件树,仅维护版本历史、分支引用与对象数据库)。

3.1 创建集中存放仓库的目录

1
2
sudo mkdir -p /srv/git
sudo chown -R git:git /srv/git

3.2 初始化目标仓库(例如 my-project.git

1
sudo -u git git init --bare /srv/git/my-project.git

4. 限制 git 用户的 Shell 权限(安全加固)

默认情况下,git 用户如果能登录交互式 Shell 会带来不必要的系统安全风险。可将其登录 Shell 替换为 git-shell,限制其仅能执行 Git 相关操作(如 git-receive-packgit-upload-pack)。

4.1 检查并切换 Shell

1
2
3
4
5
which git-shell
# 输出通常为 /usr/bin/git-shell

# 修改 git 用户的登录 Shell
sudo chsh -s $(which git-shell) git

安全效果验证:修改后,若客户端尝试直接 ssh git@your_server_ip 登录交互式终端,连接将被拒绝并提示: fatal: Interactive git shell is not enabled. 但此时 Git 的 clonepushpull 均可正常通信。


5. 本地客户端连接与提交测试

在本地开发机上测试连接并推送代码。

5.1 场景 A:已有本地 Git 项目推送到远程

1
2
3
4
5
6
7
8
9
10
11
12
13
cd /path/to/local/project

# 1. 初始化并提交本地文件
git init
git add .
git commit -m "Initial commit"

# 2. 添加远程仓库源(替换 your_server_ip 为服务器公网 IP 或域名)
git remote add origin git@your_server_ip:/srv/git/my-project.git

# 3. 推送主分支
git branch -M main
git push -u origin main

5.2 场景 B:克隆空仓库到本地

1
2
3
4
5
6
git clone git@your_server_ip:/srv/git/my-project.git
cd my-project
echo "# My Project" > README.md
git add README.md
git commit -m "docs: add readme"
git push origin main

6. 常见问题排查与进阶技巧

6.1 自定义 SSH 端口处理

若服务器的 SSH 守护进程运行在非标准端口(如 2222),可以在本地 ~/.ssh/config 中配置别名:

1
2
3
4
5
Host my-debian-vps
HostName your_server_ip
Port 2222
User git
IdentityFile ~/.ssh/id_ed25519
配置后,远程仓库地址可简化为:
1
git remote add origin my-debian-vps:/srv/git/my-project.git

6.2 权限错误(Permission denied)

若推送时出现权限报错,请确保裸仓库所有权归属于 git 用户:

1
sudo chown -R git:git /srv/git/my-project.git

6.3 自动化部署(Git Hooks)

若希望在本地 git push 后自动将代码部署到 Web 目录,可在裸仓库中配置 post-receive 钩子:

1
sudo -u git nano /srv/git/my-project.git/hooks/post-receive
填入脚本内容:
1
2
3
4
5
#!/bin/bash
TARGET_DIR="/var/www/my-project"
GIT_DIR="/srv/git/my-project.git"

git --work-tree=$TARGET_DIR --git-dir=$GIT_DIR checkout -f main
赋予执行权限:
1
sudo chmod +x /srv/git/my-project.git/hooks/post-receive

本文作者:Berg Zha

本文链接:https://junglemanpro.com/posts/1566474a/

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

关于

我是谁
一个热爱底层渲染的人
与我交流
bergzha@gmail.com
ESC 关闭 | 导航 | Enter 打开
输入关键词开始搜索