增强 SSH 安全性的一些技巧

通常需要修改 SSH 服务器的配置文件/etc/ssh/sshd_conf 来增强其安全性,然后重启 SSH 服务器使之生效。

###1. 更改默认端口

SSH 的默认监听 22 端口,将其修改为大于 1024 的端口号,有助于提高 SSH 安全性,因为一些端口扫描工具不会扫描大于 1024 的端口。

1
2
# Port 22
Port 4096

###2. 只允许 SSH protocol 2

SSH 协议有两个版本,然而版本 1 存在一些安全隐患,包括中间人攻击注入攻击

1
2
# Protocol 2,1
Protocol 2

###3. 只允许指定用户通过 SSH 登录

首先,应该禁止 root 用户通过 SSH 登录系统,需要 root 权限时使用 sudosu命令来获取;然后,指定允许登录的用户。

1
2
3
# PermitRootLogin yes
PermitRootLogin no
AllowUsers john alice bob

###4. 使用 DSA 公钥授权

DSA 公钥授权方式,由于不需要用户名和密码,可以避免字典攻击(dictionary attacks)。
首先,在 client 端用命令ssh-keygen -t dsa 生成私钥-公钥对, Private Key: ~/.ssh/id_dsa, Public Key: ~/.ssh/id_dsa.pub。
然后用ssh-copy-id -p port user@hostname 将公钥复制到 SSH Server。
配置 SSH server 使用DSA 授权,同时取消用户名密码授权:

1
2
3
4
PasswordAuthentication no
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys

###5. 用 TCP wrappers 限定可连接的主机

当只运行指定网络内的主机登录时,可以用 TCP wrappers 进行过滤。需编辑 /etc/hosts.deny/etc/hosts.allow

1
2
# echo "sshd: ALL" >> /etc/hosts.deny
# echo "sshd: 192.168.1.0/24 192.168.5.123" >> /etc/hosts.allow

###6. 用 iptables 限制 SSH 访问

可以与 TCP wrappers 同时使用。例如,只允许特定主机访问 SSH 服务并禁止其他主机访问:

1
2
# iptables -A INPUT -p tcp -m state --state NEW --source 193.180.177.13 --dport 22 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP

###7. SSH time-lock tricks

还可以使用不同的 iptables 参数,来实现特定时间内对 SSH 的访问控制,比如 /second, /minute, /hour/day

例1. 实现输入错误密码后锁定 1 分钟,此后每分钟内只允许尝试 1 次:

1
2
# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT
# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -j DROP

例2. 实现只允许 192.168.1.101 主机连接 SSH 服务,连续 3 次登录错误后,每分钟只允许尝试 1 次:

1
2
# iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 3 -j ACCEPT
# iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -j DROP

本文参考:https://www.linux.com/learn/tutorials/305769-advanced-ssh-security-tips-and-tricks