SSH安全最佳实践

AI 生成

SSH安全配置最佳实践

SSH (Secure Shell) 是系统管理员远程管理服务器的主要工具,也是服务器最容易受到攻击的入口之一。本文将详细介绍如何加固 SSH 服务,提高服务器安全性。

1. 基本安全配置

1.1 更改默认端口

默认的 22 端口是黑客首先尝试的目标,更改为非标准端口可以减少被扫描的概率。

编辑 /etc/ssh/sshd_config 文件:

1
2
# 默认为 Port 22
Port 2222 # 更改为非标准端口

1.2 禁用 root 登录

禁止直接使用 root 账户登录系统,降低系统被入侵的风险。

1
2
# 禁止root直接登录
PermitRootLogin no

1.3 限制登录用户

只允许特定用户通过 SSH 登录系统:

1
2
3
4
5
# 指定允许登录的用户
AllowUsers user1 user2 admin

# 或指定允许登录的用户组
AllowGroups ssh-users wheel

1.4 禁用密码认证

使用密钥认证替代密码认证,提高安全性:

1
2
3
4
5
6
7
8
# 启用公钥认证
PubkeyAuthentication yes

# 禁用密码认证
PasswordAuthentication no

# 禁用空密码
PermitEmptyPasswords no

1.5 配置超时设置

设置会话超时,减少未活动会话的安全风险:

1
2
3
4
5
6
7
8
# 认证超时时间(秒)
LoginGraceTime 60

# 客户端无响应超时断开时间(秒)
ClientAliveInterval 300

# 客户端无响应最大次数
ClientAliveCountMax 0

2. 高级安全配置

2.1 强化加密算法

只允许使用强加密算法,提高连接安全性:

1
2
3
4
5
6
7
8
# 指定密钥交换算法
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256

# 指定加密算法
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr

# 指定MAC算法
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256

2.2 限制 SSH 版本

只允许使用 SSH 协议版本 2,禁用不安全的版本 1:

1
2
# 只使用SSH协议版本2
Protocol 2

2.3 禁用 X11 转发

除非必要,禁用 X11 转发功能:

1
X11Forwarding no

2.4 禁用 TCP 端口转发

如不需要端口转发功能,建议禁用:

1
AllowTcpForwarding no

2.5 禁用 Agent 转发

如不需要 SSH 代理转发功能,建议禁用:

1
AllowAgentForwarding no

2.6 禁用 GSSAPI 认证

如不使用 Kerberos 认证,建议禁用 GSSAPI:

1
GSSAPIAuthentication no

2.7 使用 chroot 环境

对特定用户使用 chroot 限制其访问范围:

1
2
3
4
5
# 开启chroot功能
ChrootDirectory /path/to/chroot/%u

# 允许在chroot环境内使用SFTP
ForceCommand internal-sftp

3. 使用密钥认证

3.1 生成密钥对

在本地计算机上生成 SSH 密钥对:

1
2
3
4
5
# 推荐使用Ed25519算法 (更安全,密钥更短)
ssh-keygen -t ed25519 -C "your_email@example.com"

# 或使用RSA算法 (兼容性更好,使用4096位)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

3.2 上传公钥到服务器

方法一:使用 ssh-copy-id 工具

1
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip -p 2222

方法二:手动上传

1
2
3
4
5
6
7
8
# 先确保服务器上的 .ssh 目录存在
ssh user@server_ip -p 2222 "mkdir -p ~/.ssh"

# 上传公钥
cat ~/.ssh/id_ed25519.pub | ssh user@server_ip -p 2222 "cat >> ~/.ssh/authorized_keys"

# 设置正确的权限
ssh user@server_ip -p 2222 "chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys"

3.3 测试密钥登录

在配置完成后,确保密钥登录可用再禁用密码登录:

1
ssh -i ~/.ssh/id_ed25519 user@server_ip -p 2222

4. 使用 SSH 配置文件

4.1 创建客户端配置文件

在本地创建 ~/.ssh/config 文件,简化 SSH 连接:

1
2
3
4
5
6
7
8
Host myserver
HostName server_ip_or_domain
Port 2222
User username
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
ServerAliveInterval 60
ServerAliveCountMax 120

使用时只需:

1
ssh myserver

4.2 服务器多因素认证

结合 Google Authenticator 实现双因素认证:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 安装Google Authenticator
apt install libpam-google-authenticator # Debian/Ubuntu
yum install google-authenticator # CentOS/RHEL

# 为用户配置
google-authenticator

# 编辑PAM配置 /etc/pam.d/sshd
auth required pam_google_authenticator.so

# 修改SSH配置
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

5. 防火墙配置

5.1 使用 UFW (Ubuntu/Debian)

1
2
3
4
5
6
7
8
# 安装UFW
apt update && apt install ufw

# 允许SSH端口
ufw allow 2222/tcp

# 启用UFW
ufw enable

5.2 使用 firewalld (CentOS/RHEL)

1
2
3
4
5
6
7
8
9
10
# 安装firewalld
yum install firewalld

# 启动服务
systemctl start firewalld
systemctl enable firewalld

# 允许SSH端口
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --reload

5.3 使用 iptables

1
2
3
4
5
# 允许SSH端口
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT

# 保存规则
iptables-save > /etc/iptables.rules

6. 监控与日志审计

6.1 查看 SSH 日志

1
2
3
4
5
6
# 查看SSH登录日志
journalctl -u sshd

# 或
tail -f /var/log/auth.log # Debian/Ubuntu
tail -f /var/log/secure # CentOS/RHEL

6.2 使用 Fail2Ban

Fail2Ban 可以监控登录失败次数,并自动封禁 IP 地址:

1
2
3
4
5
6
7
8
9
10
11
12
# 安装Fail2Ban
apt install fail2ban # Debian/Ubuntu
yum install fail2ban # CentOS/RHEL

# 创建配置文件 /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600

6.3 设置登录通知

配置 SSH 在用户登录时发送邮件通知:

1
2
3
4
5
6
7
8
9
# 安装mailutils
apt install mailutils # Debian/Ubuntu

# 创建脚本 /etc/profile.d/ssh-login-alert.sh
echo 'ALERT="$(hostname) - $(date): SSH Login from $(who | head -1) $(w -i | grep -v USER | grep -v tty) $(ps -p $$ -o cmd --no-headers)"
echo "$ALERT" | mail -s "SSH Login: $(hostname)" your-email@example.com' > /etc/profile.d/ssh-login-alert.sh

# 设置执行权限
chmod +x /etc/profile.d/ssh-login-alert.sh

7. 常见问题与排查

7.1 登录缓慢

如果 SSH 登录速度慢,可能原因:

  1. DNS 解析慢:禁用 DNS 解析

    1
    UseDNS no
  2. GSSAPI 认证:禁用 GSSAPI

    1
    GSSAPIAuthentication no

7.2 密钥认证失败

常见原因与解决方法:

  1. 权限问题

    1
    2
    3
    # 服务器上
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  2. SELinux 限制

    1
    2
    3
    4
    5
    # 查看SELinux上下文
    ls -Z ~/.ssh/authorized_keys

    # 修复上下文
    restorecon -r ~/.ssh
  3. 确认密钥格式正确

    1
    2
    # 密钥格式应为:
    ssh-rsa AAAAB3N.... user@host

7.3 防火墙阻止

确认防火墙允许 SSH 端口:

1
2
3
4
# 检查防火墙状态
ufw status # Ubuntu
firewall-cmd --list-all # CentOS/RHEL
iptables -L # 通用

8. SSH 工具与扩展

8.1 WinSCP 与 PuTTY 配置

Windows 用户可以通过配置 PuTTY 和 WinSCP 使用密钥认证:

  1. 使用 PuTTYgen 转换密钥格式
  2. 在 PuTTY/WinSCP 连接设置中配置私钥

8.2 使用 SSH 隧道

创建端口转发隧道:

1
2
3
4
5
6
7
8
# 本地端口转发
ssh -L 8080:internal_server:80 user@server

# 远程端口转发
ssh -R 8080:localhost:80 user@server

# 动态端口转发 (SOCKS代理)
ssh -D 1080 user@server

8.3 免密码使用 sudo

允许特定用户或组使用 sudo 而无需输入密码:

1
2
3
4
5
# 编辑sudoers文件
visudo

# 添加规则
username ALL=(ALL) NOPASSWD: ALL

总结

适当配置 SSH 安全设置对于服务器安全至关重要。通过本文介绍的最佳实践,你可以显著提高 SSH 服务的安全性,降低被攻击的风险。记住,安全是一个持续的过程,定期更新系统和审查安全策略同样重要。

参考资源