一、SSH密钥对生成与安全管理
1.1 密钥生成技术原理
RSA算法作为非对称加密的典型实现,通过生成一对数学相关的密钥(公钥/私钥)实现安全通信。在自动化部署场景中,私钥用于身份验证,公钥则部署在目标服务器形成信任链。推荐使用4096位密钥长度,相比默认的2048位可提供更高的安全性。
1.2 本地密钥生成实践
在Linux/macOS终端或Git Bash中执行以下命令:
ssh-keygen -t rsa -b 4096 -C "automation-deploy-key"
交互式操作需注意:
- 密钥存储路径:建议使用默认的
~/.ssh/目录 - 密码保护:强烈建议设置 passphrase(可通过
ssh-keygen -p后续修改) - 密钥命名规范:推荐使用
id_rsa_automation等明确用途的命名
生成后文件结构:
~/.ssh/├── id_rsa_automation # 私钥文件(需严格保密)├── id_rsa_automation.pub # 公钥文件└── config # 可选配置文件(用于多密钥管理)
1.3 密钥安全最佳实践
- 文件权限设置:
chmod 600 ~/.ssh/id_rsa_automationchmod 644 ~/.ssh/id_rsa_automation.pub
- 密钥轮换策略:建议每90天更换密钥对
- 多环境隔离:为不同项目生成独立密钥对
二、云服务器端配置
2.1 公钥部署自动化方案
通过SSH管道实现无交互部署:
cat ~/.ssh/id_rsa_automation.pub | \ssh username@server-ip "mkdir -p ~/.ssh && \chmod 700 ~/.ssh && \cat >> ~/.ssh/authorized_keys && \chmod 600 ~/.ssh/authorized_keys"
关键验证点:
~/.ssh目录权限必须为700authorized_keys文件权限必须为600- 服务器SSH服务需配置
PubkeyAuthentication yes
2.2 服务器安全加固
在/etc/ssh/sshd_config中建议配置:
PermitRootLogin noPasswordAuthentication noChallengeResponseAuthentication noUsePAM no
修改后需重启SSH服务:
sudo systemctl restart sshd
2.3 连接测试方法
使用验证命令检查配置:
ssh -i ~/.ssh/id_rsa_automation -v username@server-ip
正常连接应显示:
debug1: Authentication succeeded (publickey).
三、GitHub Secrets加密存储
3.1 密钥存储规范
- 私钥处理:
- 移除所有换行符(
cat id_rsa | tr -d '\n') - 建议添加BEGIN/END标记便于识别
- 移除所有换行符(
- 推荐存储的Secrets:
| Secret名称 | 示例值 | 说明 |
|—————————|————————————-|—————————————|
| DEPLOY_KEY | ——-BEGIN RSA… | 加密后的私钥内容 |
| REMOTE_HOST | 123.45.67.89 | 服务器IP或域名 |
| REMOTE_USER | ubuntu | SSH登录用户名 |
| DEPLOY_PATH | /var/www/project | 项目部署目录 |
3.2 多环境管理策略
对于开发/测试/生产环境:
- 创建不同的Secret集合(如DEV_DEPLOY_KEY)
- 使用Workflow环境变量区分
- 通过矩阵构建实现多环境部署
四、自动化部署Workflow配置
4.1 基础Workflow示例
name: Auto Deployon:push:branches: [ main ]jobs:deploy:runs-on: ubuntu-lateststeps:- name: Checkout Codeuses: actions/checkout@v4- name: Configure SSHrun: |mkdir -p ~/.sshecho "${{ secrets.DEPLOY_KEY }}" > ~/.ssh/id_rsachmod 600 ~/.ssh/id_rsassh-keyscan -H ${{ secrets.REMOTE_HOST }} >> ~/.ssh/known_hosts- name: Execute Deploymentrun: |ssh ${{ secrets.REMOTE_USER }}@${{ secrets.REMOTE_HOST }} << 'EOF'cd ${{ secrets.DEPLOY_PATH }}git pull origin mainnpm install --productionpm2 restart allEOF
4.2 高级配置技巧
- 多步骤部署:
```yaml
-
name: Install Dependencies
run: ssh ${{ env.SSH_CONN }} “cd ${{ env.DEPLOY_PATH }} && npm install” -
name: Migrate Database
run: ssh ${{ env.SSH_CONN }} “cd ${{ env.DEPLOY_PATH }} && npx sequelize db:migrate”
```
-
环境变量复用:
env:SSH_CONN: ${{ secrets.REMOTE_USER }}@${{ secrets.REMOTE_HOST }}TARGET_DIR: ${{ secrets.DEPLOY_PATH }}
-
错误处理机制:
```yaml
- name: Check Deployment
run: |
if ! ssh ${{ env.SSH_CONN }} “test -d ${{ env.TARGET_DIR }}”; thenecho "Deployment failed!"exit 1
fi
```
五、常见问题解决方案
5.1 连接拒绝问题
- 检查防火墙规则(开放22端口)
- 验证SSH服务状态
- 确认用户名/IP正确性
5.2 权限错误排查
- 使用
-v参数获取详细日志 - 检查服务器
/var/log/auth.log - 验证密钥文件权限设置
5.3 Workflow调试技巧
- 使用
actions/upload-artifact保存日志 - 在本地运行器测试(需配置GitHub Runner)
- 分步骤执行逐步排查
六、安全增强建议
- 短期有效凭证:使用GitHub Actions的
ephemeralrunners - 双因素认证:结合SSH证书认证
- 审计日志:集成云服务商的日志服务
- 网络隔离:通过VPC对等连接限制访问源
本方案通过完整的密钥管理流程和自动化配置,实现了从本地开发到云服务器部署的安全通道。实际实施时,建议先在测试环境验证所有步骤,再逐步推广到生产环境。对于大型项目,可考虑结合容器化部署和基础设施即代码(IaC)工具构建更复杂的自动化体系。