香港服务器SSH安全完全指南:密钥管理 + 多用户权限 + 跳板机配置最佳实践

香港服务器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 细粒度控制确保每个角色只能操作自己职责范围内的资源,即使某个账号被入侵,爆炸半径也被有效限制。

Telegram