使用ZTM防护未修复的OpenSSH漏洞

程序员有二十年 2024-08-06 10:12:44

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:7777Aug 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.jsonA permit file is saved to /home/admin/permit.jsonTo 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.json3. 在主机 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 meshesNAME JOINED AS USER HUBS STATUShub-x agent-x root 172.31.8.122:443 Connected

查看接入到 Mesh 网络中的 Endpoint[5],名字中的 local 表示当前的 Endpoint。

ztm get endpointsNAME USER IP PORT STATUSagent-x (local) root 172.31.8.122 56680 Online4. 在主机 A 上注册 Agent 到 Hub-X

将 X 主机上的 permit 文件拷贝到 A 主机上,然后加入 hub-X,如下:

ztm join hub-x --as agent-a --permit permit-x.jsonztm get meshesNAME JOINED AS USER HUBS STATUShub-x agent-a root 172.31.8.122:443 Connectedztm get endpointsNAME USER IP PORT STATUSagent-x root 172.31.8.122 56680 Onlineagent-a (local) root 172.31.0.137 34476 Online5. 配置隧道 X-A 用于从 X 访问 A 的 SSH 服务

接下来我们创建一条 ZTM Tunnel[6],隧道入口在 X 主机的 10233 端口,出口对接 A 主机的 22 端口。

ztm tunnel open in tcp/sshd --listen 10233ztm 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@localhost6. 关闭主机 A 的开放 SSH 服务

最后一步,我们将 A 主机上的 sshd 服务监听地址改为 127.0.0.1,这样只有通过 ZTM Tunnel 才能访问 A 主机的 SSH 服务。

sudo vi /etc/ssh/sshd_config sudo systemctl restart sshdsudo grep Listen /etc/ssh/sshd_configListenAddress 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.137ssh: 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

0 阅读:7

程序员有二十年

简介:感谢大家的关注