通常需要修改 SSH 服务器的配置文件/etc/ssh/sshd_conf
来增强其安全性,然后重启 SSH 服务器使之生效。
###1. 更改默认端口
SSH 的默认监听 22 端口,将其修改为大于 1024 的端口号,有助于提高 SSH 安全性,因为一些端口扫描工具不会扫描大于 1024 的端口。
1 | # Port 22 |
###2. 只允许 SSH protocol 2
SSH 协议有两个版本,然而版本 1 存在一些安全隐患,包括中间人攻击和注入攻击。
1 | # Protocol 2,1 |
###3. 只允许指定用户通过 SSH 登录
首先,应该禁止 root 用户通过 SSH 登录系统,需要 root 权限时使用 sudo
或 su
命令来获取;然后,指定允许登录的用户。
1 | # PermitRootLogin yes |
###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 | PasswordAuthentication no |
###5. 用 TCP wrappers 限定可连接的主机
当只运行指定网络内的主机登录时,可以用 TCP wrappers 进行过滤。需编辑 /etc/hosts.deny
和 /etc/hosts.allow
。
1 | # echo "sshd: ALL" >> /etc/hosts.deny |
###6. 用 iptables 限制 SSH 访问
可以与 TCP wrappers 同时使用。例如,只允许特定主机访问 SSH 服务并禁止其他主机访问:
1 | # iptables -A INPUT -p tcp -m state --state NEW --source 193.180.177.13 --dport 22 -j ACCEPT |
###7. SSH time-lock tricks
还可以使用不同的 iptables 参数,来实现特定时间内对 SSH 的访问控制,比如 /second
, /minute
, /hour
或 /day
。
例1. 实现输入错误密码后锁定 1 分钟,此后每分钟内只允许尝试 1 次:
1 | # iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT |
例2. 实现只允许 192.168.1.101 主机连接 SSH 服务,连续 3 次登录错误后,每分钟只允许尝试 1 次:
1 | # 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 |
本文参考:https://www.linux.com/learn/tutorials/305769-advanced-ssh-security-tips-and-tricks