服务器 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 远程登录按需选择)