一般情况下,暴露在公网的22端口是比较危险的,通常会遭到各路黑客的暴力破解。/var/log/会积累起上百M乃至若干G的登录失败的控制文件。如果恰巧设置的密码过于简单或者黑客的运气够好,则会导致服务器的控制权易手乃至遭受到更大的损失……

弱口令被暴力破解了,还被挂了出来……
弱口令被暴力破解了,还被挂了出来……

通常来说,可以通过采用fail2ban或者类似的工具来阻止单个ip的暴力破解,也可以采用换个ssh端口的形式来避开扫描。

之前用过fail2ban,但曾经发生过由于密码过于复杂多次输入错误最后竟然把自己ip封掉的事故,进而留下了心理阴影。于是便不再采用fail2ban这种方法,并尝试采用更换端口的方式来规避端口扫描与暴力破解。结果并不顺利,首先换到了2222端口,结果没清静几天,又发现被扫描到然后暴力破解,感觉端口号是不是还不够大,于是又换了一个10000+的端口号,结果还是很快被找到了。于是自己拿nmap扫描了一下

$ nmap 192.168.0.1
Starting Nmap 7.80 ( https://nmap.org ) at 2021-03-09 20:03 CST
Nmap scan report for 192.168.0.1
Host is up (0.16s latency).
Not shown: 996 filtered ports
PORT      STATE  SERVICE
80/tcp    open   http
443/tcp   open   https
1723/tcp  closed pptp
2222/tcp  open   EtherNetIP-1

Nmap done: 1 IP address (1 host up) scanned in 16.75 seconds

2222端口很醒目啊,然后再看看这个端口后面是个啥?

sudo nmap -A 192.168.0.1 -p 2222
PORT      STATE SERVICE VERSION
2222/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running (JUST GUESSING): Linux 4.X|2.6.X|3.X (92%)
OS CPE: cpe:/o:linux:linux_kernel:4.0 cpe:/o:linux:linux_kernel:2.6.32 cpe:/o:linux:linux_kernel:3.10
Aggressive OS guesses: Linux 4.0 (92%), Linux 2.6.32 (92%), Linux 2.6.32 or 3.10 (92%), Linux 4.4 (90%), Linux 2.6.32 - 2.6.35 (88%), Linux 2.6.32 - 2.6.39 (87%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 22 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

很明显啊,就是一个sshd啊,这就解释了为什么单纯更换ssh端口效果不好的原因。如果扫描ip端的人稍微注意一点,或者所采用的工具稍微高级复杂一点,就可以发现这样的小手段……

既然已经发现了原因,就可以用一些手段来应对。"兵者,诡道也",既然ssh端口可以被很容易扫描到,那就不如整一个假的sshd来糊弄一下,让其监听一大段的端口范围,然后把真正的sshd端口混入其中,起到欺骗与混淆的作用。

于是搜了一下,找到了ssh-honeypot这个用C写成的工具,可以伪装成一个sshd。这个实际上是一个低交互的ssh蜜罐不能用来登录,无论输入什么样子的密码都会记录下来并拒绝登录。

下载安装很容易,按照readme上的说明即可

git clone https://github.com/droberson/ssh-honeypot.git
cd ssh-honeypot
make install
systemctl enable --now ssh-honeypot

同时注意到了issue里面有人提到这个会fork过多的进程,导致资源用尽的问题,于是就调整了一下systemd的控制文件,加上了进程数量的限制与异常退出后自动重启。将/etc/systemd/system/ssh-honeypot.service改成了这个样子:

[Unit]
Description=Fake sshd that logs ip addresses, usernames, and passwords.
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
ExecStart=/usr/local/bin/ssh-honeypot -p 2222 -r /etc/ssh-honeypot/ssh-honeypot.rsa -u nobody -l /var/log/ssh-honeypot.log -f /var/run/ssh-honeypot.pid -d
TasksMax=8
Restart=always

[Install]
WantedBy=multi-user.target

然后sudo systemctl daemon-reload systemctl start ssh-honeypot.service就好了

现在是仅仅监听2222端口,可以通过iptables转发的方式多监听一点端口,已达到混淆的目的

sudo  iptables -t nat -A PREROUTING -p tcp --dport 11000:12000 -j REDIRECT --to-ports 2222
sudo  iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-ports 2222

这样以来就可以把22端口与11000-12000端口全都监听上了。然后再到服务商的控制面板上的防火墙中的相关端口打开,这样就可以了。

一般的爆破脚本会直接攻击暴露出来的22端口,稍高级的工具也会浪费很长时间在端口扫描上且不一定找得到正确的端口……

现在已经这样安排一周多了,看起来还是有用的……