Skip to main content

如何在 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,让它们空手而归。