在 CI/CD 流程中SSH 密钥的安全使用取决于具体场景是用于拉取代码仓库还是用于登录远程服务器部署。最稳妥的做法是将私钥存进平台的加密变量Secrets配合专用密钥限制权限严禁硬编码。先说结论区分“仓库访问”与“服务器部署”两种场景私钥存入 CI/CD 平台 Secrets公钥配置到对应目标端。场景判断拉取代码用 Git 平台 Deploy Key部署服务器用服务器 SSH 密钥。核心操作生成独立密钥对私钥加密存储流水线动态加载。安全底线私钥权限 600目录 700禁止日志打印定期轮换。场景区分仓库访问 vs 服务器部署配置前必须明确密钥用途两者配置位置完全不同场景 A拉取私有代码仓库用途CI/CD 流水线需要克隆私有仓库或子模块。配置位置Git 平台GitHub/GitLab的 Deploy Keys 设置。权限通常只读若需推送需开启写权限有限制。场景 B部署到远程服务器用途流水线构建完成后通过 SSH 登录生产/测试服务器执行脚本。配置位置目标服务器的~/.ssh/authorized_keys。权限仅限特定用户登录建议配合 sudo 限制命令。第一步生成专用密钥不要使用默认的id_rsa生成专门用于 CI/CD 的密钥。Ed25519 算法比传统 RSA 更安全高效。ssh-keygen -t ed25519 -C ci-deploy-key -f ~/.ssh/id_ed25519_deploy生成后得到两个文件id_ed25519_deploy私钥和id_ed25519_deploy.pub公钥。第二步配置公钥分场景场景 AGit 平台 Deploy KeyGitHub进入仓库 Settings Deploy keys Add deploy key粘贴公钥内容。若需推送代码勾选 Allow write access。GitLab进入 Settings Repository Deploy Keys粘贴公钥。注意部署密钥触发的 Pipeline 权限可能受限。场景 B远程服务器登录将公钥内容追加到目标服务器对应用户的~/.ssh/authorized_keys文件中cat id_ed25519_deploy.pub | ssh userremote_host mkdir -p ~/.ssh cat ~/.ssh/authorized_keys第三步CI/CD 配置示例1. GitHub Actions 配置在仓库 Settings Secrets and variables Actions 中新建 Secret名为SSH_PRIVATE_KEY内容为私钥文件全文。name: Deploy via SSH on: [push] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - name: Setup SSH uses: webfactory/ssh-agentv0.5.3 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} - name: Verify Connection run: ssh -o StrictHostKeyCheckingno userremote_host echo Connected2. GitLab CI 配置在 Settings CI/CD Variables 中新建变量SSH_PRIVATE_KEY类型 File 或 Variable建议 masked。before_script: - eval $(ssh-agent -s) - echo $SSH_PRIVATE_KEY | tr -d \r | ssh-add - - mkdir -p ~/.ssh - chmod 700 ~/.ssh # 注意生产环境建议预先已知主机指纹避免中间人攻击 - ssh-keyscan -H remote_host ~/.ssh/known_hosts script: - ssh userremote_host cd /var/www git pull第四步验证与排查验证方法在流水线中添加测试步骤确认免密连接成功且无密码提示。仓库访问ssh -T gitgithub.com或git ls-remote gitgitlab.com:namespace/repo.git服务器部署ssh -i ~/.ssh/id_ed25519_deploy userremote_host echo ok常见错误排查Permission denied (publickey)检查私钥权限是否为 600chmod 600 key目录是否为 700。Known hosts 验证失败首次连接未知主机可能被拒绝需提前扫描或关闭严格检查StrictHostKeyCheckingno仅限内网。换行符错误存入 Secrets 时私钥换行符可能丢失脚本中建议使用tr -d \r处理。密钥泄露风险确保 CI/CD 平台开启了变量屏蔽Masked切勿在脚本中echo私钥内容。安全最佳实践最小权限原则Deploy Key 默认只读仅必要时开启写权限。服务器密钥建议限制authorized_keys命令选项如command...。密钥轮换建议每 6-12 个月轮换一次密钥旧密钥失效前更新 CI/CD 变量。避免中间人攻击生产环境尽量避免使用StrictHostKeyCheckingno建议将已知主机指纹硬编码到仓库或配置中。来源 https://www.zjcp.cc/ask/11199.html