在使用 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 用户就可以在该目录下写入文件,而不会破坏原有的属主设置。

验证权限设置

完成权限配置后,建议进行以下验证步骤:

  1. 验证用户组关系:
# 检查 github 用户是否已加入 weichen 组
groups github
  1. 验证目录权限:
# 检查部署目录的权限设置
ls -la /home/weichen/public-site
# 应该看到类似输出:
# drwxrwsr-x 2 weichen weichen 4096 Mar 28 10:00 public-site
  1. 测试部署用户的写入权限:
# 切换到 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...

也可以使用 ForceCommandMatch User 等方式在 sshd_config 中做更高级配置(适合重度运维用户)。


总结

  • 不要把主用户的 SSH Key 直接暴露给 GitHub;
  • 为自动部署单独创建用户 github,将权限隔离;
  • 通过组权限与 SGID 确保部署目录可写但受控;
  • 最小权限原则,是部署系统安全的基石。

希望这篇指南对你的自动部署系统更加稳健、清晰、安全有所帮助!