如何在 Ubuntu 22.04 上搭建 Endlessh 蜜罐
作者 Reuben Tier
导言
查看认证日志时,你可能会看到来自不同 IP 地址的几次失败的登录尝试。这些失败的登录尝试通常来自于僵尸网络的一个节点,他会用默认的凭证扫描整个网络上有漏洞的服务器。虽然大多数人都会有一个安全的密码或 SSH 密钥来防止攻击者登录他们的服务器,但依然有些服务器会受到这种扫描的影响。虽然你可能无法阻止这些攻击,但你可以用 蜜罐 (tarpit,一种用来延缓入站连接的服务程序)来减缓它们的进攻。 在本教程中,你将安装和配置 Endlessh 蜜罐,它将向任何试图登录的用户缓慢地发送一个无限长的 SSH banner。你还将配置 SSH 服务,使其在不同的端口上运行,这将使你的认证日志更易读。 完成本教程后,你将能够在一个非标准的端口上连接到你的服务器,而任何扫描你的服务器的 bot 只会浪费时间敲打一扇永远不会打开的门。
前期准备
要完成本教程,你将需要以下条件:
- 一台有 sudo 非 root 用户的 Ubuntu 服务器,一个防火墙,以及至少 1 GB 的内存。
- 在你的服务器上安装 Git。
第1步 - 将 SSH 转移到一个非标准的端口
在这一步,你将把 SSH 移到一个非标准的端口,以便为 Endlessh 腾出一个端口。因为僵尸网络的资源不是无穷无尽的,它们通常只扫描默认的 SSH 端口(22
)。通过将你的 SSH 转移到一个非标准的端口,你就可以将 bot 困在 Endlessh 蜜罐里。
首先,用以下命令备份你服务器上的 SSH 配置文件:
$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
如果有些东西没法正常运行,或者你决定把 SSH 移回默认端口,可以用这个文件来恢复原来的设置。
使用 nano
或你喜欢的文本编辑器打开 SSH 配置文件 /etc/ssh/sshd_config
:
$ sudo nano /etc/ssh/sshd_config
请找到 #Port 22
这一行。移除 #
来取消这一行的注释,然后将端口改为你服务器上的一个未使用的端口。
/etc/ssh/sshd_config
...
Port 2222
...
未使用的端口的一个常见例子是 2222
。你可以选择你想用于经常性 SSH 连接的任何端口。保存并关闭该文件。
如果你的服务器正在使用防火墙(如 ufw
),你将需要允许流量来到新的端口:
$ sudo ufw allow 2222/tcp
接下来,重新启动 SSH 服务:
$ sudo systemctl restart sshd
在一个单独的终端会话中,尝试使用新的端口连接到你的服务器:
$ ssh sammy@your_server_ip -p 2222
警告:除非你确认可以在新的端口上使用 SSH,否则不要关闭活动的 SSH 会话。否则如果你不能通过新的端口连接,你有可能因为关闭会话而失去对服务器的访问。如果你不能在一个单独的终端会话中连接到你的服务器,可以通过运行以下命令恢复你的原始 SSH 设置:
$ sudo cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
$ sudo systemctl restart sshd
如果你遇到进一步的问题,请检查 sshd
是否重启成功,并查看你的防火墙设置,确保 2222
端口接受 tcp 流量。
一旦你确认可以对 2222
端口进行新的连接,就可以安全地关闭你原来的终端。将来连接到你的服务器时,你将总是需要指定新的端口,像这样:
$ ssh sammy@your_server_ip -p 2222
你已经成功地将 SSH 转移到一个非标准端口,现在是时候设置 Endlessh 了。
第2步 - 安装 Endlessh
Endlessh 没有官方软件包,所以你将克隆仓库来手动构建它。你将使用 Git 来克隆仓库、build-essential
包(用于编译项目)和 libc6-dev
包。
使用 apt 软件包管理器安装所需的软件包:
$ sudo apt install build-essential libc6-dev
在提示时用 y
确认安装。
然后从 GitHub 克隆 Endlessh 仓库到你的主目录:
$ git clone https://github.com/do-community/endlessh
移动到项目目录,使用 make
命令编译 Endlessh:
$ cd endlessh
$ make
现在你可以用以下命令启动 Endlessh:
$ sudo ./endlessh -v -p 22
为了测试 Endlessh 是否在工作,你可以尝试用 -v
verbose 标志对 22
号端口进行 SSH 连接,这将显示被传输的无限长的 banner。在一个新的终端窗口中,用以下任一命令建立一个 SSH 连接到 22
号端口:
$ ssh sammy@your_server_ip -v
$ ssh sammy@your_server_ip -p 22 -v
当你的新 SSH 会话试图连接到 22
号端口时,你会看到连接终端每 10 秒出现一串随机字符,直到会话关闭,就像下面:
Output
debug1: kex_exchange_identification: banner line 0: NvnHF>]&W4p+tg*"+
debug1: kex_exchange_identification: banner line 1: n<
debug1: kex_exchange_identification: banner line 2: @/O5c0/;>1b{qd(M,vK
debug1: kex_exchange_identification: banner line 3: i+ OZ
debug1: kex_exchange_identification: banner line 4: yn
debug1: kex_exchange_identification: banner line 5: T[V\\[HUg
一旦你通过尝试用新会话连接确认了它是有效的,就可以关闭新的终端,并在原来的终端会话中使用 Ctrl+C
停止 Endlessh。
在这一步中,你从源代码中下载并构建了 Endlessh。接下来,你将配置它并将它部署为一个服务,以便让它在注销后和重启服务器时持续存在。
第3步 - 配置Endlessh
在这一步中,你将把 Endlessh 设置为一个服务,在你的会话结束后和系统重启时,它将持续存在。
把编译好的二进制文件移到 /usr/local/bin
目录中:
$ sudo mv ./endlessh /usr/local/bin/
如果有提示,请输入密码。
将项目中的服务文件复制到 /etc/systemd/system
目录中:
$ sudo cp util/endlessh.service /etc/systemd/system/
你需要稍微修改服务文件,以便在 1024
以下的端口运行 Endlessh。用 nano
或你喜欢的文本编辑器打开服务文件:
$ sudo nano /etc/systemd/system/endlessh.service
找到关于在 1024
以下端口运行 Endlessh 的部分。
用以下方法更新该文件:删除AmbientCapabilities=CAP_NET_BIND_SERVICE
一行开头的 #
,并在 PrivateUsers=true
一行开头添加 #
,像这样:
/etc/systemd/system/endlessh.service
...
## If you want Endlessh to bind on ports < 1024
## 1) run:
## setcap 'cap_net_bind_service=+ep' /usr/local/bin/endlessh
## 2) uncomment following line
AmbientCapabilities=CAP_NET_BIND_SERVICE
## 3) comment following line
#PrivateUsers=true
...
保存并退出该文件。
接下来,你将允许 Endlessh 在低于 1024
的端口(也被称为互联网域的特权端口)上运行。用 setcap
命令为 Endlessh 二进制文件设置这一功能:
$ sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/endlessh
你需要为 Endlessh 定义一个配置文件,告诉它要使用哪个端口。创建并打开一个名为 /etc/endlessh/config
的配置文件:
$ sudo mkdir /etc/endlessh
$ sudo nano /etc/endlessh/config
在配置文件中,定义要使用的端口为 22
:
/etc/endlessh/config
Port 22
保存并关闭该文件。
现在你可以持续启动 Endlessh 服务了:
$ sudo systemctl --now enable endlessh
加入 --now enable
将使服务在重启服务器后持续存在。
可以使用 systemctl status
命令检查服务是否成功启动:
$ sudo systemctl status endlessh
如果启动成功,你会看到这样的输出:
Output
● endlessh.service - Endlessh SSH Tarpit
Loaded: loaded (/etc/systemd/system/endlessh.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2022-04-22 11:20:39 UTC; 1 months 11 days ago
Docs: man:endlessh(1)
Main PID: 34007 (endlessh)
Tasks: 1 (limit: 1081)
Memory: 380.0K
CGroup: /system.slice/endlessh.service
└─34007 /usr/local/bin/endlessh
如果它正在运行,你可以尝试在一个新的终端会话中连接到 22
端口:
$ ssh sammy@your_server_ip
由于你的蜜罐正在运行,新的终端会话将无法连接,并将永久运行,直到在连接的终端上用 Ctrl+C
手动停止。
如果你想停止该服务的运行,可以使用下面的命令:
$ sudo systemctl --now disable endlessh
停止服务后,你可以使用第1步警告中的 SSH 恢复说明来恢复原来的服务器配置。你可以用 sudo systemctl --now enable endlessh
来重新启用服务,而不需要再次设置,但要确保这样做时 SSH 没有在 22
端口运行。
结语
现在,你已经成功安装和配置了Endlessh,帮助清理了你的认证日志,并已准备好应对 SSH bot,让它们空手而归。