跳转到内容

SSH 安全配置

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

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

Terminal window
ssh-keygen -t ed25519 -C "your_email@example.com"

按提示操作,建议设置密钥密码短语(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:

AllowUsers admin@192.168.1.0/24 deploy@10.0.0.0/8

类似地,可以使用 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,curve25519-sha256@libssh.org
# 指定支持的加密算法
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
# 指定支持的 MAC 算法
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
# 设置客户端活动检测间隔
ClientAliveInterval 300
ClientAliveCountMax 2
# 显示上次登录信息
PrintLastLog yes
# 使用 SSH 协议 2(现代系统默认)
Protocol 2

检查配置语法:

Terminal window
sudo sshd -t

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

Terminal window
sudo systemctl restart sshd

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

Terminal window
# /etc/ssh/sshd_config 安全配置
Port 2222
Protocol 2
# 认证设置
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,curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com

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 = admin@example.com
sender = fail2ban@example.com
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。这些措施叠加使用可以显著提升服务器的安全性。