传统的 CI/CD 自动部署方案通常依赖 SSH 密钥:GitHub Actions 持有服务器私钥,构建完成后通过 SSH 登录服务器执行部署命令。
这种方案存在明显的安全隐患:
核心思路是将部署权限最小化:GitHub Actions 不再持有服务器访问权限,而是通过 HTTP 请求通知服务器拉取最新镜像。
GitHub Actions → HTTP POST → Webhook 服务 → 执行预定义的部署脚本| 传统 SSH | Webhook |
|---|---|
| 拥有 shell 权限 | 仅能触发预设脚本 |
| 密钥泄露 = 服务器沦陷 | 密钥泄露 = 最多触发一次合法部署 |
| 可执行任意命令 | 无法执行任意命令 |
#!/usr/bin/env python3
import http.server, subprocess, os
SECRET = os.environ.get('WEBHOOK_SECRET')
class Handler(http.server.BaseHTTPRequestHandler):
def do_POST(self):
if self.path != f'/deploy/{SECRET}':
self.send_response(403)
self.end_headers()
return
subprocess.Popen(['/opt/deploy.sh'])
self.send_response(200)
self.end_headers()
http.server.HTTPServer(('0.0.0.0', 9000), Handler).serve_forever()#!/bin/bash
docker compose pull && docker compose up -d && docker image prune -fdeploy:
needs: build
steps:
- run: curl -X POST "${{ secrets.DEPLOY_WEBHOOK_URL }}"安全的本质是权限最小化。当自动化流程只需要"触发部署"这一个能力时,就不应该授予"完整服务器访问"权限。Webhook 方案正是这一原则的实践:用最小的权限完成必要的任务。
适用场景:Docker 容器化部署、GitHub Actions / GitLab CI / Jenkins 等 CI/CD 平台
加载评论中...