用 Jenkins 通过 SSH 自动部署 Docker 服务,同时确保服务器安全
在现代 DevOps 流程中,自动化部署是必不可少的环节。很多团队会用 Jenkins + Docker Compose 来完成应用的持续交付。然而,如果不注意安全,很容易给服务器带来风险。本文就来讲讲如何 让 Jenkins 自动部署 Docker 服务,同时保证服务器安全。
一、问题背景
很多团队的部署方式是:
Markup 全选
ssh root@server
cd /opt/myapp
docker compose pull
docker compose up -d这种方式有几个问题:
每次发版都需要手动 SSH 登录服务器,效率低。
直接使用 root 用户风险极高。
无自动化回滚、审计和权限控制。
因此,我们希望:
Jenkins 自动拉取镜像并部署
不使用 root 登录
限制 Jenkins 只能执行安全的命令
二、最佳实践步骤
1. 创建专用部署用户
不要用 root 用户,在服务器上创建一个专门用于部署的用户,例如 deploy:
Markup 全选
sudo adduser deploy
sudo passwd deploy然后给它最小权限,只允许管理 Docker:
Markup 全选
sudo visudo
# 添加:
deploy ALL=(ALL) NOPASSWD: /usr/local/bin/docker, /usr/local/bin/docker-compose这样,即使 Jenkins 被攻破,也不会获得 root 权限。
2. 使用 SSH Key 认证
密码登录容易被破解,应使用 SSH Key:
在 Jenkins 服务器生成 Key:
Markup 全选ssh-keygen -t ed25519 -C "jenkins-deploy"将公钥加入服务器的
deploy用户:Markup 全选mkdir -p /home/deploy/.ssh chmod 700 /home/deploy/.ssh echo "PUBLIC_KEY_CONTENT" >> /home/deploy/.ssh/authorized_keys chmod 600 /home/deploy/.ssh/authorized_keys chown -R deploy:deploy /home/deploy/.ssh- 禁止密码登录和 root 登录:
编辑
/etc/ssh/sshd_config:Markup 全选PasswordAuthentication no PermitRootLogin no重启 SSH:
Markup 全选sudo systemctl restart sshd
3. 限制 Jenkins 执行命令
为保证安全,不要让 Jenkins 登录后随意执行命令。可以写一个白名单脚本 /usr/local/bin/deploy.sh:
Markup 全选
#!/bin/bash
cd /opt/myapp
docker compose pull
docker compose up -d然后在 sudoers 中允许 Jenkins 执行:
Markup 全选
deploy ALL=(ALL) NOPASSWD: /usr/local/bin/deploy.sh4. 在 Jenkins 中配置 SSH Key
- Jenkins → Credentials → SSH Username with private key
- 在 Pipeline 中使用:Markup 全选
pipeline { agent any stages { stage('Deploy') { steps { sshagent(['deploy-key-id']) { sh "ssh deploy@server '/usr/local/bin/deploy.sh'" } } } } }这样 Jenkins 就可以自动部署 Docker 服务,无需手动 SSH 登录。
5. 可选安全增强
- 限制 IP 白名单:只允许 Jenkins 服务器访问 SSH
- 开启登录审计:/var/log/auth.log 或 /var/log/secure
- 使用 Fail2ban 防暴力破解
- Docker 容器内部尽量不使用 root
- 定期更换 SSH Key
三、总结
通过上面的配置,你可以实现:
Jenkins 自动拉取镜像并部署 Docker 服务
不使用 root,部署用户权限最小化
限制可执行命令,防止被滥用
自动化安全可控,支持回滚与审计
这种方式既提高了部署效率,也大幅降低了服务器被入侵的风险,是生产环境推荐的做法。
版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
post 张国生


