我检查 /var/log/secure 我有这些日志:
Jul 9 13:02:56 localhost sshd[30624]: Invalid user admin from 223.196.172.1 port 37566
Jul 9 13:02:57 localhost sshd[30624]: Connection closed by invalid user admin 223.196.172.1 port 37566 [preauth]
Jul 9 13:03:05 localhost sshd[30626]: Invalid user admin from 223.196.174.150 port 61445
Jul 9 13:03:05 localhost sshd[30626]: Connection closed by invalid user admin 223.196.174.150 port 61445 [preauth]
Jul 9 13:03:16 localhost sshd[30628]: Invalid user admin from 223.196.169.37 port 62329
Jul 9 13:03:24 localhost sshd[30628]: Connection closed by invalid user admin 223.196.169.37 port 62329 [preauth]
Jul 9 13:03:29 localhost sshd[30630]: Invalid user admin from 223.196.169.37 port 64099
Jul 9 13:03:30 localhost sshd[30630]: Connection closed by invalid user admin 223.196.169.37 port 64099 [preauth]
Jul 9 13:03:45 localhost sshd[30632]: Invalid user admin from 223.196.174.150 port 22816
Jul 9 13:03:46 localhost sshd[30632]: Connection closed by invalid user admin 223.196.174.150 port 22816 [preauth]
Jul 9 13:06:17 localhost sshd[30637]: Invalid user admin from 223.196.168.33 port 33176
Jul 9 13:06:17 localhost sshd[30637]: Connection closed by invalid user admin 223.196.168.33 port 33176 [preauth]
Jul 9 13:07:09 localhost sshd[30639]: Invalid user admin from 223.196.173.152 port 61780
Jul 9 13:07:25 localhost sshd[30641]: Invalid user admin from 223.196.168.33 port 54200
Jul 9 13:07:26 localhost sshd[30641]: Connection closed by invalid user admin 223.196.168.33 port 54200 [preauth]
...
似乎有人试图通过 SSH 登录。我禁用 root 用户登录并启用公钥/私钥登录,但这是 DDoS 攻击吗?它是否使用 RAM/CPU?
我应该怎么办?
这只是人们扫描易受攻击的服务器的正常 Internet 背景噪音。
您可以添加一个 iptables 规则来限制传入连接的速率(例如四分钟内四次)以进行简单修复(但如果您打开太多连接或有人伪造源自您地址的 SYN 数据包,这也会将您锁定):
正确的解决方案是使用像fail2ban这样的工具来解析失败登录的日志文件并根据需要创建防火墙规则——需要做更多的工作来设置,但它需要建立连接和触发失败的身份验证,所以它会不像简单的方法那样对伪造的连接尝试或成功登录做出反应。
正如@Simon Richter 提到的那样,这只是互联网背景噪音,您不必担心。您必须确保的几件事是:
更改端口将使问题消失,但它是通过默默无闻的安全性,它可以创造安全的错觉,而没有提供任何东西。
以下是围绕 SSH 的其他一些建议,以及对主流“最佳实践”论点的反驳。
你在印度吗?列出的所有这些 IP 地址都在块中:
根据 WHOIS 数据库分配给
一个短期的解决方案是
223.196.160.0/19
在防火墙处阻止整个区块,但这是对 IP 地址进行微观管理,并且是一场艰苦的战斗。相反,您可以拒绝所有 ssh,除了您知道受信任的源 IP。只需注意不要将自己锁定在自己的主机之外。如果您没有静态 IP,则可以允许阻止,或者可能查看在主机上运行 VPN 服务器。
或者,如果您不需要允许来自 Internet 的 SSH 连接,只需拒绝它们并仅在需要时重新启用。
这是我编写的一个简单脚本,用于阻止所有未经授权的登录我的开发服务器的尝试。
如果您将脚本设置为每分钟通过 cron 运行一次,它将显着减少日志中的噪音并阻止违规 IP,让它们在被阻止之前只有 1 分钟的时间尝试暴力破解。
将您的 IP 和您访问服务器的任何其他 IP 插入防火墙是一个好主意
iptables -I INPUT -s xxx.xx.xxx.xx -j ACCEPT
将生成所有被禁止 IP 的日志。
1.改变你的
sshd
监听端口听起来很简单,将您的端口从默认值更改为公共 IP 上
22
的自定义值(例如2200
)可以将端口扫描次数从每天数千次减少到几十次。有关教程,请参见此处。话虽如此,虽然这确实减少了端口扫描的烦恼,但它并不能提供真正的安全性。“默默无闻的安全”是一个神话,仅此而已。
2.使用公钥登录,禁用密码登录
机器人可能会猜对密码,但他们永远不会猜对私钥。只要您使用现代算法并且不会意外泄漏您的密钥。有关教程,请参见此处。
请注意,这确实意味着您将无法再从任何随机机器登录,除非您随身携带密钥(您需要通过其他方式保护密钥)。
3.使用fail2ban
如果他们失败了 5 次,禁止他们在一天之内再次尝试。这将向他们展示。对蛮力尝试非常有效。有关教程,请参见此处。
不利的一面是,如果有一天你的手指颤抖(喝醉了什么的,我不知道),你可能会把自己锁在外面。
4.预先禁止已知滥用的IP列表
像AbuseIPDB这样的来源维护着可通过 API 访问的大量已知恶意 IP。您需要一个 API 密钥才能使用它,但您可以轻松注册一个免费帐户。拉出列表并使用诸如
iptables
批量禁止那些已知 IP 之类的方法。设置一个 cron 作业以定期将其自动化以获得最佳效果。这是我编写(并且我个人使用)的一个非常简单的脚本来做到这一点。随意将其用作参考,但不要在生产中使用它。以我个人的经验,这种方法与方法 3 一样有效(如果不是更有效的话)。
就我个人而言,我使用了上面列出的所有 4 种方法,而且我的 VPS 在我的安全日志中最多可能会收到一两次恶意登录尝试,在糟糕的一个月里。
iptables
这是via方法#4的拦截历史:正如其他答案所提到的,您不必担心太多,但如果您确实想添加另一层安全性,您可以尝试使用端口敲门。
这个想法是保持 ssh 端口关闭,并且只向 ips 打开它,这些 ips 之前执行特定的操作序列,例如:
可以在这里获得更多详细信息:https ://www.rapid7.com/blog/post/2017/10/04/how-to-secure-ssh-server-using-port-knocking-on-ubuntu-linux/