在使用 GitHub Action 自动部署网站的过程中,很多人会将主账号的 SSH Key 添加到 CI/CD 流程中。这种方式虽然简单,但存在一定的风险 —— 一旦泄露,整个服务器的权限就可能被掌握。
本文将介绍一种更合理的做法:为 GitHub Action 单独创建一个部署用户,只赋予其必要的最小权限,并将部署目录与主账号分离。
场景设定
假设我们在一台 Debian 系统的服务器上:
- 主账号为
weichen
,负责维护和管理网站; - 新建一个账号
github
,专门用于 GitHub Action 自动部署; - 最终部署文件存放在
/home/weichen/public-site/
目录中。
1. 创建部署用户
首先,为自动部署创建一个独立的系统用户:
sudo adduser github
整个部署过程将以 github
用户的身份执行,避免给主用户开放权限。
配置 docker 组权限
# 查看当前用户的用户组
groups
# 创建 docker 用户组 (如果没有的话)
sudo groupadd docker
# 添加当前用户到 docker 用户组
sudo gpasswd -a $USER docker
# 刷新
newgrp docker
2. 配置 SSH 公钥登录
为了让 GitHub Action 能通过 SSH 登录服务器,需要为 github
用户配置 SSH 公钥。
在本地生成一对密钥:
ssh-keygen -t rsa -b 4096 -C "GitHub Action Deploy Key"
生成的文件包括:
id_rsa
(私钥)— 用于 GitHub Action;id_rsa.pub
(公钥)— 添加到服务器。
在服务器上配置 github
用户的 SSH 公钥:
sudo mkdir -p /home/github/.ssh
sudo nano /home/github/.ssh/authorized_keys
将 id_rsa.pub
内容粘贴进去后,设置权限:
sudo chown -R github:github /home/github/.ssh
sudo chmod 700 /home/github/.ssh
sudo chmod 600 /home/github/.ssh/authorized_keys
3. 配置部署目录权限
默认情况下,/home/weichen/
是不对其他用户开放的,因此我们需要为部署过程开放一个专用目录,并设置权限。
创建部署目录:
sudo mkdir -p /home/weichen/public-site
sudo chown weichen:weichen /home/weichen/public-site
将 github
用户加入 weichen
的用户组:
sudo usermod -aG weichen github
这一步的目的是赋予 github
用户对部署目录的组访问权限。
设置目录权限:
sudo chmod 2775 /home/weichen/public-site
说明:
7
表示weichen
拥有读、写、执行权限;7
表示所属组成员也拥有读、写、执行权限;5
表示其他用户只有读、执行权限;- 最前面的
2
是 SGID 标志,确保该目录下新建的文件和目录继承weichen
用户组。
这样一来,github
用户就可以在该目录下写入文件,而不会破坏原有的属主设置。
验证权限设置
完成权限配置后,建议进行以下验证步骤:
- 验证用户组关系:
# 检查 github 用户是否已加入 weichen 组
groups github
- 验证目录权限:
# 检查部署目录的权限设置
ls -la /home/weichen/public-site
# 应该看到类似输出:
# drwxrwsr-x 2 weichen weichen 4096 Mar 28 10:00 public-site
- 测试部署用户的写入权限:
# 切换到 github 用户
sudo su - github
# 尝试在部署目录创建测试文件
touch /home/weichen/public-site/test.txt
# 检查创建的文件权限
ls -l /home/weichen/public-site/test.txt
# 应该看到文件属于正确的用户组
# 清理测试文件
rm /home/weichen/public-site/test.txt
如果以上任何步骤出现 “Permission denied” 错误,请检查:
- 目录权限是否正确设置(2775)
- github 用户是否成功加入 weichen 组
- 是否所有父目录都有适当的执行权限
4. GitHub Action 配置示例
在你的 GitHub 仓库中,将私钥 id_rsa
添加为一个 Secret(例如命名为 DEPLOY_KEY
),然后使用如下方式部署:
- name: Deploy to Server
run: |
echo "${{ secrets.DEPLOY_KEY }}" > deploy_key
chmod 600 deploy_key
rsync -avz -e "ssh -i deploy_key -o StrictHostKeyChecking=no" ./dist/ github@your-server-ip:/home/weichen/public-site/
推荐使用 rsync
进行部署,它能智能同步增量文件,速度快且安全。
5. 可选增强:限制 SSH 权限
如果你想进一步限制 github
用户的 SSH 权限(比如禁止登录 shell,只允许执行某些命令),可以在 authorized_keys
文件中前面加上限制参数:
command="rsync --server --daemon ." ssh-rsa AAAAB3Nza...
也可以使用 ForceCommand
、Match User
等方式在 sshd_config
中做更高级配置(适合重度运维用户)。
总结
- 不要把主用户的 SSH Key 直接暴露给 GitHub;
- 为自动部署单独创建用户
github
,将权限隔离; - 通过组权限与 SGID 确保部署目录可写但受控;
- 最小权限原则,是部署系统安全的基石。
希望这篇指南对你的自动部署系统更加稳健、清晰、安全有所帮助!