2024 年 7 月,OpenSSH 被曝出 CVE-2024-6387[1] (Security Regression) 安全漏洞。如果无法及时修复该漏洞,或者担心修复可能带来其他负面影响,可以使用 ZTM[2] 来快速保护受影响的主机,并提供不间断的安全 SSH 访问。这种方案适用于各种漏洞场景,当没有足够时间修复或者担心修复带来其他负面影响时,都可以用这种方法来快速屏蔽风险,并维持服务不中断。
假设我们有一台受该 CVE 影响的主机 A,下面演示如何使用 ZTM 在不升级 SSH 服务的情况下提供安全访问。方案思路是:在主机 A 上运行 ZTM Agent,在另一台安全的主机 X 上运行 ZTM Hub;A 上的 ZTM Agent 连接到 X-Hub,建立 X-A 隧道用于从 X 通过隧道访问 A 的 SSH 服务;最后关闭 A 上 SSH 服务的公开访问,使其仅监听在 127.0.0.1:22 端口。这样实施后,管理员可以从 X 和 Y 主机通过 ZTM 隧道访问 A 主机的 SSH 服务,其他任何方式都无法访问 A 主机的 SSH 服务,且任何扫描和暴力破解手段都无法影响 A 主机。
1. 在主机 A 上安装 ZTM Agent
从 ZTM Release页面[3] 下载合适版本的 ZTM。例如在这个例子中,下载 generic_linux-x86_64 版本(https://github.com/flomesh-io/ztm/releases/download/v0.1.0/ztm-aio-v0.1.0-generic_linux-x86_64.tar.gz)。下载后解压,并将 ZTM 可执行文件拷贝到/usr/local/bin/。
运行 ztm start agent
启动 Agent。需要用 sudo
执行这个命令,因为 ztm 会注册到系统服务上,然后启动 Agent。
sudo ztm start agent
检查 Agent 是否成功启动。
sudo systemctl status ztm-agent
● ztm-agent.service - ztm agent service
Loaded: loaded (/etc/systemd/system/ztm-agent.service; disabled; preset: enabled)
Active: active (running) since Thu 2024-08-01 13:04:40 UTC; 1min 15s ago
Main PID: 630 (ztm)
Tasks: 6 (limit: 1137)
Memory: 100.0M
CPU: 261ms
CGroup: /system.slice/ztm-agent.service
├─630 /usr/local/bin/ztm run agent --data /root/.ztm --listen 127.0.0.1:7777
└─633 /usr/local/bin/ztm --pipy repo://ztm/agent --args --data /root/.ztm --listen 127.0.0.1:7777
Aug 01 13:04:40 ip-172-31-0-137 systemd[1]: Started ztm-agent.service - ztm agent service.
2. 在主机 X 上安装 ZTM Hub
ZTM 的可执行文件是 all-in-one 的,也就是 Hub 和 Agent 是同一个二进制文件,通过不同的启动参数来运行不同的功能。所以安装过程和在 A 主机上安装 Agent 类似,只是在启动时,除了启动 Agent,还需要启动 Hub。详细 ZTM Hub 的使用,可以参考 CLI 文档[4]。
sudo ztm start hub --names 172.31.8.122:443 --listen 0.0.0.0:443 --permit permit.json
A permit file is saved to /home/admin/permit.json
To join the mesh on an endpoint:
1. Send the file 'permit.json' to the endpoint
2. Execute the following command on the endpoint:
ztm join my-mesh --as my-first-ep --permit permit.json
3. 在主机 X 上注册 Agent 到 Hub-X
需要注意的是,我们在 X 主机上也会启动 ZTM Agent。
sudo ztm start agent
并且我们在 X 主机上,将 Agent 注册到 Hub 上。
ztm join hub-x --as agent-x --permit permit.json
查看 Agent 接入的 Mesh 网络。
ztm get meshes
NAME JOINED AS USER HUBS STATUS
hub-x agent-x root 172.31.8.122:443 Connected
查看接入到 Mesh 网络中的 Endpoint[5],名字中的 local
表示当前的 Endpoint。
ztm get endpoints
NAME USER IP PORT STATUS
agent-x (local) root 172.31.8.122 56680 Online
4. 在主机 A 上注册 Agent 到 Hub-X
将 X 主机上的 permit 文件拷贝到 A 主机上,然后加入 hub-X,如下:
ztm join hub-x --as agent-a --permit permit-x.json
ztm get meshes
NAME JOINED AS USER HUBS STATUS
hub-x agent-a root 172.31.8.122:443 Connected
ztm get endpoints
NAME USER IP PORT STATUS
agent-x root 172.31.8.122 56680 Online
agent-a (local) root 172.31.0.137 34476 Online
5. 配置隧道 X-A 用于从 X 访问 A 的 SSH 服务
接下来我们创建一条 ZTM Tunnel[6],隧道入口在 X 主机的 10233 端口,出口对接 A 主机的 22 端口。
ztm tunnel open in tcp/sshd --listen 10233
ztm ep agent-a tunnel open out tcp/sshd --target 127.0.0.1:22
接下来在 X 主机上访问 localhost:10233
,会被 ZTM Tunnel 转发到 A 主机的 SSH 服务:
ssh -i .ssh/key.em -p 10233 admin@localhost
6. 关闭主机 A 的开放 SSH 服务
最后一步,我们将 A 主机上的 sshd 服务监听地址改为 127.0.0.1
,这样只有通过 ZTM Tunnel 才能访问 A 主机的 SSH 服务。
sudo vi /etc/ssh/sshd_config
sudo systemctl restart sshd
sudo grep Listen /etc/ssh/sshd_config
ListenAddress 127.0.0.1
#ListenAddress ::
检查 sshd 的运行状态,可以看到它现在监听在 127.0.0.1:22
。
sudo systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; preset: enabled)
Active: active (running) since Thu 2024-08-01 13:50:16 UTC; 41s ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 757 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 758 (sshd
)
Tasks: 1 (limit: 1137)
Memory: 1.4M
CPU: 22ms
CGroup: /system.slice/ssh.service
└─758 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
Aug 01 13:50:16 ip-172-31-0-137 systemd[1]: Starting ssh.service - OpenBSD Secure Shell server...
Aug 01 13:50:16 ip-172-31-0-137 sshd[758]: Server listening on 127.0.0.1 port 22.
Aug 01 13:50:16 ip-172-31-0-137 systemd[1]: Started ssh.service - OpenBSD Secure Shell server.
在 X 主机上验证,可以看到只有通过 ZTM Tunnel 才能访问 A 主机的 SSH 服务,而直接通过 A 主机的 IP 是无法访问的。。
ssh -i .ssh/key.em admin@172.31.0.137
ssh: connect to host 172.31.0.137 port 22: Connection refused
关于 ZTM
ZTM https://github.com/flomesh-io/ztm 是开源的去中心化网络基础设施软件。它基于 HTTP/2 隧道构建,可以在任何类型的 IP 网络上运行,例如 LAN、容器化网络和互联网等。
为什么选择 ZTM
ZTM 通过提供一系列核心功能,为构建去中心化应用程序奠定了基础,包括:
•内网穿透,跨 Internet 网关和防火墙的网络连接•TLS 加密的通信通道•基于证书的身份验证和访问控制•去中心化的应用程序发布和部署•分散式文件发现和数据共享
ZTM 可用于各种场景,从连接家庭和工作场所的 2 节点个人网络,到连接全球办公室和分支机构的 10000 节点企业网络。
ZTM 可以多种设备上运行,支持 CPU 架构:x86、ARM、MIPS、RISC-V、LoongArch 等,以及操作系统:Linux、Windows、macOS、FreeBSD、Android 等。
关于 Flomesh
Flomesh(易衡科技)成立于 2018 年,自主研发并开源了高性能可编程代理 Pipy(https://github.com/flomesh-io/pipy)。以 Pipy 为基础,Flomesh 研发了软件负载均衡、服务网格两款软件产品。为工信部认证的可信云产品、可信开源项目。
Flomesh 核心竞争力来自完全自研的核心组件 Pipy,该组件高性能、高可靠、低延迟、可编程、可扩展、低依赖,采用 C++ 开发,内置自研的 JS 引擎,支持使用 JS 脚本做扩展开发。支持包括 x86、arm、龙芯、海光等硬件 CPU 架构;支持 Linux、FreeBSD、macOS、Windows、OpenWrt 等多种核心的操作系统。
Flomesh 成立以来,以技术为根基、以客户为导向,产品被应用在头部股份制商业银行总行、大型保险公司、运营商总部以及研究院等众多客户和多个场景。
加入 Flomesh 社区
添加小 P 成为好友,参与社区互动,享受丰富互动并获取独家周边礼品!
引用链接
[1]
CVE-2024-6387: https://ubuntu.com/security/CVE-2024-6387[2]
ZTM: https://github.com/flomesh-io/ztm[3]
ZTM Release页面: https://github.com/flomesh-io/ztm/releases[4]
CLI 文档: https://github.com/flomesh-io/ztm/blob/main/docs/CLI_zh.md[5]
Endpoint: https://github.com/flomesh-io/ztm/blob/main/docs/Architecture-Concepts.md#endpoint[6]
ZTM Tunnel: https://github.com/flomesh-io/ztm/blob/main/docs/ZT-App.md#zt-tunnel