防止云主机 SSH 暴力破解与端口扫描
在当前的互联网环境中,针对 SSH 端口的自动化扫描和暴力破解攻击非常普遍。攻击者会利用扫描工具寻找开放 SSH 端口的主机,并尝试通过字典或穷举方式破解登录凭证。因此,加强云主机或 VPS 的 SSH 安全至关重要。
基础安全建议
- 使用强密码或密钥:为 SSH 账户设置高强度、复杂的密码,或更推荐使用 SSH 密钥对进行免密登录,并禁用密码登录。
- 修改默认端口:将 SSH 默认的 22 端口修改为其他非标准端口,可减少自动化扫描的暴露风险。
- 启用防火墙:利用云平台防火墙或系统防火墙(如 iptables、firewalld)限制 SSH 端口的访问来源 IP。
- 禁用 Root 登录:在 SSH 配置中(
/etc/ssh/sshd_config)设置PermitRootLogin no,禁止直接使用 root 账户登录。
国内主流云服务商通常提供基础的安全组/防火墙功能,但用户仍需根据自身情况加固系统。
使用 DenyHosts 自动屏蔽攻击 IP
DenyHosts 是一个用 Python 编写的安全工具,它会监控系统认证日志(如 /var/log/secure),自动将进行多次失败 SSH 登录尝试的 IP 地址加入 /etc/hosts.deny 文件,从而实现自动屏蔽。
安装方法
方法一:通过 LNMP 一键安装包(若已安装)
LNMP 安装包的 tools 目录下提供了便捷脚本:
cd /root/lnmp1.x/tools # 请将 x 替换为实际版本号
./denyhosts.sh
该脚本会自动完成安装和配置,无需手动干预。同一目录下也提供了 ./fail2ban.sh 用于安装 Fail2ban 工具。
方法二:手动安装
1. 下载源码包(项目已迁移,旧官网可能无法访问,建议从 GitHub 等可信源获取):
wget https://github.com/denyhosts/denyhosts/archive/refs/tags/v3.1.tar.gz
tar -zxvf v3.1.tar.gz
cd denyhosts-3.1
2. 安装前可清空旧日志并重启日志服务(可选):
echo "" > /var/log/secure && systemctl restart rsyslog
3. 执行安装(确保系统已安装 Python):
python setup.py install
默认安装目录为 /usr/share/denyhosts/。
配置与启动
1. 进入安装目录并复制配置文件:
cd /usr/share/denyhosts/
cp denyhosts.cfg-dist denyhosts.cfg
cp daemon-control-dist daemon-control
2. 启动 DenyHosts:
chown root daemon-control
chmod 700 daemon-control
./daemon-control start
3. 设置开机自启(Systemd 系统推荐):
# 创建 systemd 服务文件(以 CentOS 7+/Ubuntu 16.04+ 为例)
echo -e '[Unit]nDescription=DenyHosts SSH Security MonitornAfter=network.targetnn[Service]nType=forkingnExecStart=/usr/share/denyhosts/daemon-control startnExecStop=/usr/share/denyhosts/daemon-control stopnRestart=on-failurenn[Install]nWantedBy=multi-user.target' > /etc/systemd/system/denyhosts.service
systemctl daemon-reload
systemctl enable denyhosts
systemctl start denyhosts
对于使用 SysVinit 的旧系统,可将启动命令加入 /etc/rc.local:
echo "/usr/share/denyhosts/daemon-control start" >> /etc/rc.local
chmod +x /etc/rc.local
关键配置说明
配置文件 /usr/share/denyhosts/denyhosts.cfg 中部分重要参数:
SECURE_LOG = /var/log/secure # SSH 认证日志路径,不同系统可能不同
HOSTS_DENY = /etc/hosts.deny # 屏蔽 IP 写入的文件
PURGE_DENY = 5m # 屏蔽 IP 的保留时间(如 5分钟、5小时、5天)
BLOCK_SERVICE = sshd # 屏蔽的服务,可设为 ALL
DENY_THRESHOLD_INVALID = 5 # 无效用户登录失败次数阈值
DENY_THRESHOLD_VALID = 10 # 有效用户(非root)登录失败次数阈值
DENY_THRESHOLD_ROOT = 5 # root 用户登录失败次数阈值
HOSTNAME_LOOKUP = NO # 是否进行反向域名解析,建议设为 NO 以减少延迟
DAEMON_LOG = /var/log/denyhosts # DenyHosts 自身日志路径
管理白名单与解封 IP
- 添加白名单:将可信 IP 加入白名单文件,防止被误封。
echo "your_trusted_ip" >> /usr/share/denyhosts/allowed-hosts systemctl restart denyhosts # 或 /etc/init.d/denyhosts restart - 解封 IP:如果 IP 已被屏蔽,需手动从
/etc/hosts.deny和 DenyHosts 的工作目录中删除该 IP 记录,或使用社区提供的解封脚本(注意脚本来源安全)。
替代方案:Fail2ban
Fail2ban 是一款功能更强大的入侵防护框架,不仅支持 SSH,还可防护 HTTP、FTP 等多种服务。其原理类似,通过监控日志匹配失败模式,并调用防火墙规则(如 iptables)进行屏蔽。配置更为灵活,是当前更主流的推荐工具。
总结
安全是一个持续的过程。除了部署 DenyHosts 或 Fail2ban 外,请务必:
- 设置高强度密码或使用 SSH 密钥。
- 定期更新系统和软件包。
- 限制 SSH 访问来源(通过防火墙)。
- 定期检查日志(
/var/log/secure、/var/log/denyhosts)和屏蔽列表。 - 建立定期数据备份机制。
没有任何单一措施能提供绝对安全,采用多层防御策略才能有效提升云主机的安全性。