香港服务器SSH安全完全指南:密钥管理 + 多用户权限 + 跳板机配置最佳实践
SSH 是服务器管理的命脉,也是攻击者最热衷的目标。每天有数以万计的自动化脚本扫描互联网上的 SSH 端口,尝试弱密码和常见用户名。一旦 SSH 被入侵,服务器上所有数据和业务都面临风险。本文建立一套企业级 SSH 安全基线,从密钥管理到多用户权限分离,系统性地消除 SSH 安全隐患。
一、SSH 攻击手段与防御策略
| 攻击类型 | 危险程度 | 防御手段 |
|---|---|---|
| 暴力破解密码 | 高(自动化工具) | 禁用密码登录,仅允许密钥 |
| 弱密钥/小密钥 | 中 | 使用 Ed25519 密钥(最新最强) |
| 密钥文件泄露 | 极高 | 密钥设置 passphrase,权限 600 |
| 中间人攻击 | 中 | 首次连接验证服务器指纹 |
| 内部人员越权 | 高 | 多用户权限分离,sudo 细粒度控制 |
| 会话劫持 | 中 | 连接超时设置,使用 SSH 复用 |
二、生成 Ed25519 密钥对(推荐)
<code"># Ed25519 密钥优点:比 RSA-4096 更短但安全性更高,签名速度快 20 倍 # 在你的本地机器(Mac/Linux/Windows WSL)生成 # 生成密钥对 ssh-keygen -t ed25519 -C "deploy@yourdomain.com" -f ~/.ssh/hk_server_ed25519 # 按提示输入 passphrase(强烈建议设置,即使密钥文件泄露也需要 passphrase) # 生成两个文件: # ~/.ssh/hk_server_ed25519 (私钥,严格保密,不要上传任何地方) # ~/.ssh/hk_server_ed25519.pub (公钥,可以公开,放到服务器上) # 查看公钥内容(需要复制到服务器) cat ~/.ssh/hk_server_ed25519.pub # 设置私钥权限(必须是 600) chmod 600 ~/.ssh/hk_server_ed25519 # 添加到 SSH Agent(这样不需要每次输入 passphrase) ssh-add ~/.ssh/hk_server_ed25519
三、配置 ~/.ssh/config(本地 SSH 客户端)
<code"># ~/.ssh/config(大幅简化 SSH 操作)
# 香港服务器1(主服务器)
Host hk-web
HostName 服务器IP
Port 2222
User deploy
IdentityFile ~/.ssh/hk_server_ed25519
ServerAliveInterval 60
ServerAliveCountMax 3
# 香港服务器2(数据库服务器,通过服务器1跳板访问)
Host hk-db
HostName 10.0.0.2 # 内网 IP
Port 22
User deploy
IdentityFile ~/.ssh/hk_server_ed25519
ProxyJump hk-web # 通过 hk-web 跳板
# 配置完成后,连接命令简化为:
ssh hk-web
ssh hk-db # 自动通过 hk-web 跳板,无需额外设置四、服务器端 SSH 配置加固
<code"># /etc/ssh/sshd_config 完整安全配置 # ── 基础安全 ── Port 2222 # 修改默认端口(降低扫描噪音) Protocol 2 # 只允许 SSH2 协议 PermitRootLogin no # 禁止 root 直接 SSH 登录 MaxAuthTries 3 # 最多尝试3次 MaxSessions 10 # 每个连接最多10个会话 LoginGraceTime 30 # 认证超时30秒 # ── 认证方式 ── PubkeyAuthentication yes # 允许密钥认证 AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication no # 禁用密码认证(最关键的配置!) ChallengeResponseAuthentication no UsePAM yes # ── 加密算法(仅允许强加密)── KexAlgorithms curve25519-sha256,diffie-hellman-group-exchange-sha256 Ciphers aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes128-gcm@openssh.com MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com # ── 功能限制 ── X11Forwarding no # 禁用 X11 转发 AllowAgentForwarding yes # 允许 Agent 转发(跳板机需要) AllowTcpForwarding yes # 允许 TCP 转发(内网穿透需要) PermitEmptyPasswords no # ── 超时设置 ── ClientAliveInterval 300 # 5分钟无活动发送心跳 ClientAliveCountMax 2 # 心跳失败2次后断开(10分钟空闲断连) # ── 用户白名单(只允许指定用户 SSH 登录)── AllowUsers deploy admin # 仅这两个用户可以 SSH # ── 日志 ── LogLevel VERBOSE # 记录详细日志(包括密钥指纹) # 重启 SSH(注意:改端口后先不要关闭当前会话!) sshd -t # 测试配置语法 systemctl reload sshd
五、多用户权限管理
<code"># 场景:公司有研发团队 + 运维团队,权限不同 # ── 创建用户组 ── groupadd devops # 运维组(完整权限) groupadd developers # 研发组(有限权限) groupadd readonly # 只读组(仅查看日志) # ── 创建用户 ── # 运维工程师:有 sudo 权限 useradd -m -s /bin/bash -G devops,sudo alice passwd -l alice # 锁定密码(只允许密钥登录) # 开发工程师:可以重启应用服务,不能修改系统 useradd -m -s /bin/bash -G developers bob passwd -l bob # 只读用户:只能查看日志 useradd -m -s /bin/bash -G readonly charlie passwd -l charlie # ── 为每个用户分发 SSH 公钥 ── mkdir -p /home/alice/.ssh echo "ssh-ed25519 AAAA...alice的公钥..." > /home/alice/.ssh/authorized_keys chown -R alice:alice /home/alice/.ssh chmod 700 /home/alice/.ssh chmod 600 /home/alice/.ssh/authorized_keys
六、sudo 细粒度权限控制
<code"># /etc/sudoers.d/devops(运维组:完整 sudo) %devops ALL=(ALL:ALL) ALL # /etc/sudoers.d/developers(研发组:只能重启特定服务) %developers ALL=(ALL) NOPASSWD: /bin/systemctl restart myapp %developers ALL=(ALL) NOPASSWD: /bin/systemctl status myapp %developers ALL=(ALL) NOPASSWD: /usr/bin/docker ps %developers ALL=(ALL) NOPASSWD: /usr/bin/docker logs * # /etc/sudoers.d/readonly(只读组:只能查看日志) %readonly ALL=(ALL) NOPASSWD: /bin/cat /var/log/nginx/access.log %readonly ALL=(ALL) NOPASSWD: /bin/tail -f /var/log/nginx/*.log %readonly ALL=(ALL) NOPASSWD: /bin/journalctl -u myapp -f # 验证配置 visudo -c -f /etc/sudoers.d/developers
七、跳板机(Bastion Host)配置
<code"> 安全架构: 外部 → 跳板机(香港VPS 1,暴露公网 SSH 端口) 跳板机 → 内部服务器(数据库、Redis,不暴露公网 SSH) 优势: 1. 内部服务器 SSH 端口完全不对外暴露 2. 所有 SSH 访问都经过跳板机审计 3. 一旦需要撤销员工访问,只需从跳板机删除其公钥
<code"># 跳板机配置(sshd_config 特殊设置)
# 跳板机本身只做转发,不允许在上面运行业务
# 允许 Agent 转发(这样员工的私钥可以透明地用于访问内部服务器)
AllowAgentForwarding yes
# 限制跳板机用户的 Shell(不允许在跳板机上执行命令,只能转发)
# /etc/ssh/sshd_config
Match User alice
ForceCommand /usr/bin/sudo -u alice -- "$SSH_ORIGINAL_COMMAND"
# 或者完全禁止 shell:
# ForceCommand /bin/false
AllowAgentForwarding yes
AllowTcpForwarding yes
X11Forwarding no<code"># 内部服务器(数据库等)配置 # UFW 只允许跳板机 IP 的 SSH 连接 ufw allow from 跳板机内网IP to any port 22 # 或者更精确的限制: # /etc/hosts.allow # sshd: 10.0.0.1 # 只允许跳板机连接
八、SSH 会话审计(记录所有操作)
<code"># 安装 bash 审计(记录所有命令) apt install -y auditd # 配置记录 SSH 会话中的命令 cat >> /etc/bash.bashrc << 'EOF' # 记录所有 bash 命令到 syslog export PROMPT_COMMAND='logger -p local6.info "[$$] $(whoami)@$(hostname): $(history 1 | sed "s/ *[0-9]* *//") | $(pwd)"' EOF # 查看操作记录 grep "local6" /var/log/syslog | tail -50 # 更完整的方案:安装 tlog 或 asciinema 记录完整终端会话 apt install -y tlog
九、SSH 密钥轮换流程
<code"># 员工离职或密钥可能泄露时的处理流程
# 1. 从服务器删除该用户的公钥
sed -i '/alice@yourdomain.com/d' /home/alice/.ssh/authorized_keys
# 2. 锁定用户账号(禁止登录但保留数据)
usermod -L alice
# 3. 查看是否有残留的该用户进程
ps -u alice
# 4. 检查 crontab
crontab -l -u alice
# 5. 检查 authorized_keys 是否还有其他服务器需要处理
# 如果公钥已分发到多台服务器,需要 Ansible 批量处理:
ansible all -m lineinfile \
-a "path=/home/alice/.ssh/authorized_keys \
line='alice@yourdomain.com' \
state=absent" \
--become十、总结
SSH 安全的核心四步:禁用密码登录 → 使用 Ed25519 密钥 → 修改默认端口 + Fail2ban → 最小权限原则(sudo 按需授权)。这四步完成后,99% 的 SSH 自动化攻击都会失效。多用户环境下通过 sudo 细粒度控制确保每个角色只能操作自己职责范围内的资源,即使某个账号被入侵,爆炸半径也被有效限制。