处于公网的服务器,好比在海上游泳,水底下大白鲨虎视眈眈,
伺机上攻,一口吞下。
一般我们都要使用远程登录。
不害怕,就来明文, FTP,用着还行。虽然速度没那么理想。
也可以使用 SCP,RSYNC 加密传输。
可是,都用 SSL 了,为什么不用 SSH 登录操作呢?
于是,SSH 服务也就打开了。
默认root 是不允许访问的。可是系统管理员太懒了,sudo 敲来敲去,
文件权限翻来覆去,烦人不烦人。于是
PermitRootLogin yes
好了,每次登录服务器都要输
ssh -p 22 root@romte_host
还要输入密码,太凌乱了。
于是,个人电脑上
ssh-keygen -t rsa
创建公钥私钥,使用
ssh-copy-id -p 22 root@remote_host,
把公钥拷贝到远程主机。
这下方便多了,再次使用
ssh -p 22 root@romte_host
登录,不用输!密!码!
瞬间清洁了不少。
服务器上好多旧系统的任务,
不能全部重写吧。
万一改错哪个地方,
不是得卷铺盖滚回寨子里去?
所以,端口 22 坚决不改。
有时候,登到服务器,
systemctl status sshd
看到服务无间断运行了128天,心里无比高兴。
可是列出来的几行红色字体,
总是那么烦人,不过应该没事儿,应该没事儿。
学习了一些 systemd 的知识,
知道这老兄有个二进制日志工具 journalctl。
尝试着打印一下日志:
journalctl --unit="sshd" --since="-1 day"
这筛选条件,是不是高端多了,
特别是那个 “-1 day”,
有没有一种敲代码的感觉。
乌泱泱一大片,间隔 1-2 秒,
就有一条类似
Failed password for user root ……
红色字体,分外扎眼。
好像我的服务被攻击了。
于是拼命在网上搜索关键词找答案,
有了下面这样的筛选项,
让我看到攻击源来自哪里。
journalctl --unit="sshd" --since="-30 minutes"
接着管道符,筛选字段。
注意,journalctl 不提供 grep 相似的正则选项,
非不能也,不为也。
awk '/Failed/{print $(NF-3)}'
倒数第三个字段就是那个试图攻击服务器的IP。
接着管道符,排序,筛选统计。
sort | uniq -c
注意,一定是先排序,后统计去重,
不能反过来,无效的哦。
接着管道符,筛选出来明显输错次数多的IP记录。
awk '{if($1 >= 3){print$2;}}'
于是,我们通过上述几条命令,
成功筛选出了,在过去30分钟内,
至少输错过3次密码的 IP 列表。
此处应有掌声。bravo!
找到不正常 IP 之后,
该把这些不法分子关进小黑屋了。
直接生效的,iptables 把丫的封了。
iptables -I INPUT -s 8.8.8.8 -j DROP
连骨头渣都没留,
甭管什么请求,你这儿来的,我一概不收。
当时加,当时就生效了,
那孙子再没来烦过我。
还有一个不是当时生效的法子,
写入 /etc/hosts.deny,
可是得
systemctl restart sshd
麻烦,不能起到即时防护的作用。
有闲工夫的,可以试试。
简单加一条
sshd:8.8.8.8
就搞定了。
够了吗?
上面的是最好的解决方案吗?
显然不是。
那什么才是更好的: