服务器 SSH 加固与最小权限部署账户(步骤与验证)
0) 前提
已可用密钥登录当前服务器(ed25519)
具备 root 权限(首次执行用 root 登录)
1) 备份并加固 SSH 配置
### 备份
sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%s)
### 禁用密码类登录,仅允许密钥
sudo sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/^#\?KbdInteractiveAuthentication.*/KbdInteractiveAuthentication no/' /etc/ssh/sshd_config || true
sudo sed -i 's/^#\?ChallengeResponseAuthentication.*/ChallengeResponseAuthentication no/' /etc/ssh/sshd_config || true
### root 仅允许密钥登录(若后续要彻底禁用 root 远程登录,可改为 PermitRootLogin no)
if grep -q '^PermitRootLogin' /etc/ssh/sshd_config; then
sudo sed -i 's/^PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
else
echo 'PermitRootLogin prohibit-password' | sudo tee -a /etc/ssh/sshd_config
fi
### 锁定 root 密码(无密码登录)
sudo passwd -l root
### 重载 SSH 服务
sudo systemctl reload sshd || sudo service ssh reload
2) 创建最小权限部署用户
# 创建用户并加入 docker 组
sudo useradd -m -s /bin/bash deploy || true
sudo getent group docker >/dev/null || sudo groupadd docker
sudo usermod -aG docker deploy
# 安装公钥(二选一)
# A) 复用 root 的 authorized_keys
sudo install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
sudo cp /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys
sudo chown deploy:deploy /home/deploy/.ssh/authorized_keys
sudo chmod 600 /home/deploy/.ssh/authorized_keys
# B) 或者手动粘贴你的公钥
# sudo install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
# echo 'ssh-ed25519 AAAA... your_key' | sudo tee /home/deploy/.ssh/authorized_keys >/dev/null
# sudo chown deploy:deploy /home/deploy/.ssh/authorized_keys
# sudo chmod 600 /home/deploy/.ssh/authorized_keys
# 配置最小 sudo 权限(仅允许 docker/docker-compose)
echo 'deploy ALL=(root) NOPASSWD:/usr/bin/docker,/usr/local/bin/docker-compose,/usr/bin/docker-compose' \
| sudo tee /etc/sudoers.d/deploy >/dev/null
sudo chmod 440 /etc/sudoers.d/deploy
3) 验证
# 使用密钥登录 deploy
ssh -i ~/.ssh/id_ed25519 deploy@<SERVER_IP> 'whoami; id'
# 验证最小 sudo 权限可用
ssh -i ~/.ssh/id_ed25519 deploy@<SERVER_IP> \
'sudo docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}" || true'
# 可选:验证 root 密码登录已禁用(不要在生产上做危险测试)
# ssh root@<SERVER_IP> # 应拒绝密码,密钥仍可用
4) 可选加强项
# 若后续决定完全禁用 root 远程登录(推荐在确认 deploy 完全可用后执行)
sudo sed -i 's/^PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo systemctl reload sshd || sudo service ssh reload
5) (可选).env 本地文件权限
# 保留 /opt/echoflow/.env 便于 docker-compose 使用,确保权限最小
sudo chmod 600 /opt/echoflow/.env
sudo chown root:root /opt/echoflow/.env
# 若采用“零驻留”,部署成功后清理(下次部署/重启前需先解密再生成)
# sudo shred -u /opt/echoflow/.env || sudo rm -f /opt/echoflow/.env
已完成配置的状态应满足:
- 服务器仅支持密钥登录,root 无法用密码登录
- 日常部署用 deploy 用户,具备 docker/docker-compose 的 NOPASSWD 最小 sudo 权限
简要验证清单:
- 使用 deploy 登录成功
- sudo docker ps 正常
- root 密码登录不可用(保留 root 密钥或彻底禁用 root 远程登录按需选择)