跳转到内容
搜索 RunEntLinux 文档

仅搜索 RunEntLinux 通用文档,各发行版文档使用各自的搜索入口。

    浏览当前文档目录

    SSH 安全配置

    SSH 是 Linux 服务器远程管理的主要方式,也是攻击者最常尝试突破的入口。本文将系统性地介绍 SSH 安全加固的各项措施,从密钥认证到 Fail2Ban 防暴力破解,帮助你构建安全可靠的远程访问环境。

    密钥认证比密码认证更安全且更方便。配置完成后,应完全禁用密码登录。

    Terminal window
    ssh-keygen -t ed25519 -C "[email protected]"

    按提示操作,建议设置密钥密码短语(passphrase)以增加安全层:

    Generating public/private ed25519 key pair.
    Enter file in which to save the key (/home/user/.ssh/id_ed25519): 回车
    Enter passphrase (empty for no passphrase): 输入密码短语
    Enter same passphrase again: 再次输入
    Terminal window
    ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip

    或者手动复制:

    Terminal window
    cat ~/.ssh/id_ed25519.pub | ssh user@server_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
    Terminal window
    ssh user@server_ip

    如果不再提示输入密码(或只需输入密钥密码短语),说明密钥认证已生效。

    SSH 服务的主配置文件位于 /etc/ssh/sshd_config。每次修改后需要重启 sshd 服务。

    Terminal window
    sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
    Terminal window
    sudo vi /etc/ssh/sshd_config

    找到或添加:

    PermitRootLogin no

    确认密钥登录正常后,禁用密码认证:

    PasswordAuthentication no

    同时禁用其他不安全的认证方式:

    ChallengeResponseAuthentication no
    KbdInteractiveAuthentication no

    将 SSH 端口从默认的 22 改为其他端口,可以大幅减少自动化扫描攻击:

    Port 2222

    更改端口后需要调整 SELinux 和防火墙:

    Terminal window
    # 允许 SELinux 使用新端口
    sudo semanage port -a -t ssh_port_t -p tcp 2222
    # 防火墙放行新端口
    sudo firewall-cmd --permanent --add-port=2222/tcp
    sudo firewall-cmd --permanent --remove-service=ssh
    sudo firewall-cmd --reload

    只允许指定用户通过 SSH 登录:

    AllowUsers admin deploy

    也可以限制来源 IP:

    类似地,可以使用 AllowGroups 按组授权:

    AllowGroups sshusers
    Terminal window
    # 创建组并添加用户
    sudo groupadd sshusers
    sudo usermod -aG sshusers admin
    sudo usermod -aG sshusers deploy
    Terminal window
    # 禁用空密码登录
    PermitEmptyPasswords no
    # 设置最大认证尝试次数
    MaxAuthTries 3
    # 设置登录超时时间(秒)
    LoginGraceTime 30
    # 禁用 X11 转发(如不需要图形界面)
    X11Forwarding no
    # 指定支持的密钥交换算法(移除弱算法)
    KexAlgorithms curve25519-sha256,[email protected]
    # 指定支持的加密算法
    # 指定支持的 MAC 算法
    # 设置客户端活动检测间隔
    ClientAliveInterval 300
    ClientAliveCountMax 2
    # 显示上次登录信息
    PrintLastLog yes

    检查配置语法:

    Terminal window
    sudo sshd -t

    如果无输出表示语法正确,重启服务:

    Terminal window
    sudo systemctl restart sshd

    以下是一份推荐的完整安全配置:

    Terminal window
    # /etc/ssh/sshd_config 安全配置
    Port 2222
    # 认证设置
    PermitRootLogin no
    PasswordAuthentication no
    PermitEmptyPasswords no
    ChallengeResponseAuthentication no
    KbdInteractiveAuthentication no
    PubkeyAuthentication yes
    AuthorizedKeysFile .ssh/authorized_keys
    # 用户控制
    AllowUsers admin deploy
    MaxAuthTries 3
    LoginGraceTime 30
    # 安全增强
    X11Forwarding no
    AllowTcpForwarding no
    AllowAgentForwarding no
    # 会话管理
    ClientAliveInterval 300
    ClientAliveCountMax 2
    # 日志
    LogLevel VERBOSE
    # 算法
    KexAlgorithms curve25519-sha256,[email protected]

    Fail2Ban 监控日志文件,自动封禁多次认证失败的 IP 地址,是防暴力破解的利器。

    Terminal window
    sudo dnf install epel-release -y
    sudo dnf install fail2ban -y
    Terminal window
    sudo systemctl enable --now fail2ban

    不要直接修改 /etc/fail2ban/jail.conf,应创建本地覆盖配置:

    Terminal window
    sudo vi /etc/fail2ban/jail.local

    添加如下配置:

    [DEFAULT]
    # 封禁时间(秒),-1 为永久封禁
    bantime = 3600
    # 检测时间窗口(秒)
    findtime = 600
    # 最大失败次数
    maxretry = 3
    # 封禁动作(使用 firewalld)
    banaction = firewallcmd-rich-rules
    banaction_allports = firewallcmd-rich-rules
    # 通知邮箱(可选)
    destemail = [email protected]
    action = %(action_mwl)s
    [sshd]
    enabled = true
    port = 2222
    logpath = /var/log/secure
    backend = systemd
    maxretry = 3
    bantime = 3600
    Terminal window
    sudo systemctl restart fail2ban
    Terminal window
    # 查看总体状态
    sudo fail2ban-client status
    # 查看 SSH jail 详情
    sudo fail2ban-client status sshd

    输出示例:

    Status for the jail: sshd
    |- Filter
    | |- Currently failed: 2
    | |- Total failed: 15
    | `- File list: /var/log/secure
    `- Actions
    |- Currently banned: 1
    |- Total banned: 3
    `- Banned IP list: 203.0.113.50
    Terminal window
    # 手动解封 IP
    sudo fail2ban-client set sshd unbanip 203.0.113.50
    # 手动封禁 IP
    sudo fail2ban-client set sshd banip 203.0.113.100
    # 查看所有封禁的 IP
    sudo fail2ban-client banned
    1. 生成并部署 SSH 密钥:

      Terminal window
      # 客户端执行
      ssh-keygen -t ed25519 -C "admin key"
      ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@server_ip
    2. 验证密钥登录正常后,加固 sshd 配置:

      Terminal window
      # 服务端执行
      sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
      sudo tee /etc/ssh/sshd_config.d/hardening.conf <<'EOF'
      Port 2222
      PermitRootLogin no
      PasswordAuthentication no
      PermitEmptyPasswords no
      ChallengeResponseAuthentication no
      MaxAuthTries 3
      LoginGraceTime 30
      AllowUsers admin
      X11Forwarding no
      ClientAliveInterval 300
      ClientAliveCountMax 2
      LogLevel VERBOSE
      EOF
    3. 调整 SELinux 和防火墙:

      Terminal window
      sudo semanage port -a -t ssh_port_t -p tcp 2222
      sudo firewall-cmd --permanent --add-port=2222/tcp
      sudo firewall-cmd --reload
    4. 检查配置并重启 SSH:

      Terminal window
      sudo sshd -t
      sudo systemctl restart sshd
    5. 用新端口测试连接(保持旧会话不关闭):

      Terminal window
      # 新终端执行
      ssh -p 2222 admin@server_ip
    6. 确认新端口正常后,关闭旧端口:

      Terminal window
      sudo firewall-cmd --permanent --remove-service=ssh
      sudo firewall-cmd --reload
    7. 安装配置 Fail2Ban:

      Terminal window
      sudo dnf install epel-release fail2ban -y
      sudo tee /etc/fail2ban/jail.local <<'EOF'
      [DEFAULT]
      bantime = 3600
      findtime = 600
      maxretry = 3
      banaction = firewallcmd-rich-rules
      [sshd]
      enabled = true
      port = 2222
      backend = systemd
      EOF
      sudo systemctl enable --now fail2ban
      sudo fail2ban-client status sshd

    完成以上步骤后,SSH 服务将具备多层防护:密钥认证、非标准端口、用户白名单以及自动封禁暴力破解 IP。这些措施叠加使用可以显著提升服务器的安全性。