青蛙小白
博客 / 2023/01

运维安全网关技术原理:深入理解堡垒机隧道机制

2023/01/15 · — 字 · 阅读约 — 分钟 ·
目录

企业运维中,堡垒机(Bastion Host)是保障服务器访问安全的核心组件。本文将简单剖析一下某企业级运维安全网关的技术原理,并分享一个实用的跨平台访问方案——如何在 Mac 上通过 Windows 上的堡垒机客户端访问堡垒机资源。

什么是运维安全网关

运维安全网关,也称为堡垒机,是一种集中管理和审计服务器访问的安全系统。它的核心功能包括:

  • 统一身份认证:支持多因子认证(MFA)
  • 访问控制:基于角色的权限管理
  • 会话审计:记录所有操作命令和会话录像
  • 协议支持:SSH、RDP、Telnet、数据库等多种协议
  • 安全隧道:加密传输,隐藏真实服务器地址

传统架构中,运维人员直接连接生产服务器,存在诸多安全隐患:

运维人员 ──────> 生产服务器
    缺乏审计
    权限难控
    账号分散

引入堡垒机后的架构:

运维人员 ──> 堡垒机 ──> 生产服务器
          统一认证
          全程审计
          细粒度授权

客户端架构剖析

市面上主流的堡垒机客户端通常采用隧道代理的架构。以某企业级运维安全网关为例,其客户端安装目录结构非常典型:

C:\Program Files (x86)\Bastion Client\
├── jre/                               # 内置 Java 运行环境
├── locale/                            # 多语言资源
├── logging_conf.d/                    # 日志配置

├── bh_am_pfe_launcher.exe             # 启动器
├── bh_am_pfe_tunnel.exe               # 安全隧道代理
├── bh_am_pfe_webbrowser.exe           # 内嵌浏览器模块
├── bh_local.exe                       # 本地辅助组件
├── bhmp_open.exe                      # Bastion Helper/MP 组件
├── bhmp_oper.exe                      # 运营相关模块
├── bhmp_psm_entry.exe                 # PSM 入口模块
├── bh_player.jar                      # 会话录像播放器

├── AppFill.dll                        # AutoFill / 表单填充库
├── common.dll                         # 公共依赖库
├── dbvis.dll                          # 数据库可视化相关组件
├── FileZilla.dll                      # FTP 功能相关库
├── libiconv2.dll                      # 字符编码转换库
├── msvcp140.dll                       # VC++ 运行库
├── FFFTP.dll                          # FTP 相关组件
├── FlashFXP.dll                       # FlashFXP 工具库
├── OmniClientPlus.exe                 # 远程客户端辅助程序

├── Putty.dll                          # PuTTY 工具库
├── Putty.exe                          # SSH/Telnet 工具
├── Xftp.dll                           # Xftp 工具支持文件
├── Xshell.dll                         # Xshell 工具支持文件
├── Xshell.exe                         # Xshell 终端

├── libmysql.dll                       # MySQL 客户端依赖
├── kingbase8-8.6.0.jar                # Kingbase 数据库依赖
├── kingbase8-8.2.0.jar                # Kingbase 旧版本依赖
├── mysql.dll                          # 数据库连接库

├── SSMS.dll                           # SQL Server Management Studio 依赖
├── SQLDev.dll                         # Oracle SQL Developer 依赖
├── TSQLA.dll                          # T-SQL 相关模块
├── 4DOracle.dll                       # Oracle 相关组件
├── PLSQLDev.dll                       # PL/SQL Developer 依赖

├── unins000.exe                       # 卸载程序
└── unins000.dat                       # 卸载数据

实际上,很多堡垒机厂商只提供 Windows 版客户端,这也是本文后面要解决的问题。

核心组件功能

1. 启动器(Launcher)

bh_am_pfe_launcher.exe 负责:

  • 检查客户端版本更新
  • 加载主程序和隧道模块
  • 管理进程生命周期

2. 隧道代理(Tunnel)

bh_am_pfe_tunnel.exe 是最核心的组件,它实现了 本地端口转发机制

本地工具      本地隧道                堡垒机              目标服务器
(putty)  ──>  127.0.0.1:5339  ──>  加密通道  ──>  192.168.1.100:22

这个设计有几个巧妙之处:

  • 安全隔离:只监听 127.0.0.1(localhost),外部无法直接访问
  • 动态端口:每个会话使用随机端口(如 5339、60012),减少端口冲突
  • 透明代理:SSH/RDP 客户端无需感知堡垒机存在
  • 加密传输:本地到堡垒机的流量全程加密

3. 浏览器模块(WebBrowser)

bh_am_pfe_webbrowser.exe 提供:

  • 内嵌的 Web 控制台
  • HTML5 会话终端
  • 资源选择界面

隧道工作原理详解

让我们通过一个完整的 SSH 连接流程来理解隧道机制:

步骤 1:登录堡垒机

1. 连接企业 VPN
2. 打开浏览器访问堡垒机地址:https://bastion.company.com
3. 输入用户名/密码 + MFA 验证码
4. 进入堡垒机 Web 控制台

步骤 2:选择目标服务器

在 Web 界面中选择要访问的服务器和协议(如 SSH、RDP)。

步骤 3:建立本地隧道

当点击"使用 PuTTY 连接"时,后台发生了这些事情:

sequenceDiagram
    participant User as 用户
    participant Web as Web控制台
    participant Tunnel as 隧道进程
    participant Bastion as 堡垒机
    participant Server as 目标服务器

    User->>Web: 点击"连接"
    Web->>Tunnel: 启动隧道进程
    Tunnel->>Tunnel: 监听 127.0.0.1:5339
    Tunnel->>Bastion: 建立加密连接
    Bastion->>Server: 转发到目标服务器
    Tunnel-->>User: 返回本地端口号
    User->>Tunnel: PuTTY 连接 127.0.0.1:5339
    Tunnel->>Bastion: 转发 SSH 流量
    Bastion->>Server: 转发 SSH 流量

步骤 4:验证隧道端口

可以通过 Windows 命令行查看隧道进程监听的端口:

C:\> netstat -ano | findstr LISTENING | findstr <PID>
TCP    127.0.0.1:5339    0.0.0.0:0    LISTENING    4596

这里:

  • 127.0.0.1:5339 是本地监听地址
  • 4596bh_am_pfe_tunnel.exe 的进程 ID

步骤 5:客户端连接

PuTTY 实际连接的不是目标服务器的真实地址,而是本地隧道端口:

PuTTY 配置:
Host: 127.0.0.1
Port: 5339

所有 SSH 流量会经过:

PuTTY → localhost:5339 → 加密隧道 → 堡垒机 → 解密转发 → 目标服务器

跨平台访问方案:Mac 通过 Windows 访问

既然官方不提供 Mac 客户端,我们可以利用 端口转发 + 隧道暴露 的方式实现跨平台访问。

方案架构

Mac ──> Windows PC ──> 堡垒机 ──> 目标服务器
      (端口转发)    (隧道代理)

核心思路:

  1. Windows 上的堡垒机客户端建立隧道(监听 127.0.0.1:5339
  2. 使用 GOST 将本地端口暴露为网络可访问端口
  3. Mac 通过 SSH 连接 Windows 的转发端口

工具准备

在 Windows 上安装 GOST(Go Simple Tunnel)。

实施步骤

1. 在 Windows 上建立堡垒机连接

正常流程登录堡垒机,选择目标服务器,点击"使用 PuTTY 连接"。

此时查看隧道端口:

C:\> tasklist | findstr bh_am_pfe_tunnel
bh_am_pfe_tunnel.exe    4596

C:\> netstat -ano | findstr 4596
TCP    127.0.0.1:5339    0.0.0.0:0    LISTENING    4596

记住端口号(这里是 5339)。

2. 使用 GOST 暴露端口

在 Windows 上运行:

C:\Tools\gost> gost.exe -L tcp://:33818/127.0.0.1:5339

这条命令的含义:

  • -L tcp://:33818:监听本机所有网卡的 33818 端口
  • /127.0.0.1:5339:转发到本地的 5339 端口

现在端口映射关系是:

0.0.0.0:33818 ──> 127.0.0.1:5339 ──> 堡垒机隧道 ──> 目标服务器

3. 在 Mac 上配置 SSH

假设 Windows 机器的 IP 是 192.168.15.134,在 Mac 上编辑 SSH 配置:

nano ~/.ssh/config

添加以下内容:

Host bastion-via-windows
    HostName 192.168.15.134
    Port 33818
    User root
    # 如果目标服务器 SSH 版本较老,需要启用旧算法
    KexAlgorithms +diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
    HostKeyAlgorithms +ssh-rsa

4. 从 Mac 连接

现在可以直接连接:

ssh bastion-via-windows

完整的连接链路是:

Mac SSH → Windows:33818 → Windows:5339 → 堡垒机 → 目标服务器

SSH 兼容性问题处理

如果遇到以下错误:

Unable to negotiate with 192.168.15.134 port 33818: no matching key exchange method found.
Their offer: diffie-hellman-group14-sha1,diffie-hellman-group1-sha1

这是因为目标服务器使用的是旧版 SSH(如 OpenSSH 8.8 或更早),只支持 SHA1 算法,而新版 macOS 的 OpenSSH 9.9 默认禁用了这些算法。

解决方法是在 SSH 配置中显式启用:

KexAlgorithms +diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
HostKeyAlgorithms +ssh-rsa

或者在命令行临时启用:

ssh -oKexAlgorithms=+diffie-hellman-group14-sha1 \
    -oHostKeyAlgorithms=+ssh-rsa \
    [email protected] -p 33818

调试技巧

使用 -vvv 参数查看详细的连接过程:

ssh -vvv bastion-via-windows

关键日志包括:

debug2: KEX algorithms: diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
debug2: host key algorithms: ssh-rsa,ssh-dss
debug1: kex: algorithm: diffie-hellman-group14-sha1

安全考量

1. 端口暴露风险

127.0.0.1 端口暴露为 0.0.0.0 会带来安全风险:

  • 局域网中其他人可以访问
  • 绕过了堡垒机的客户端控制
  • 相当于建立了一个跳板

使用防火墙规则限制访问:

# 只允许 Mac 的 IP 访问
netsh advfirewall firewall add rule name="GOST Tunnel" dir=in action=allow protocol=TCP localport=33818 remoteip=192.168.15.100

2. 会话审计完整性

即使通过 GOST 转发,堡垒机仍然能够审计所有操作:

  • 会话录像正常记录
  • 命令审计不受影响
  • 访问日志完整

因为所有流量仍然经过堡垒机,只是客户端连接方式发生了变化。

3. 企业合规性

在使用这种方案前,务必确认是否合规:

  1. 获得 IT 部门批准:可能违反公司安全策略
  2. 说明技术方案:解释不会绕过审计
  3. 限制使用场景:仅用于个人开发环境

其他协议支持

这个方案不仅支持 SSH,理论上可以转发所有协议,例如RDP, 数据库(如MySQL), SFTP。

总结

本文深入简单剖析了企业级运维安全网关的技术原理:

  1. 架构设计:原生隧道代理的混合架构
  2. 隧道机制:本地端口转发 + 加密传输
  3. 安全特性:localhost 监听、动态端口、全程审计

针对缺少 Mac 客户端的问题,提供了 GOST 端口转发方案:

  • 技术可行:利用现有 Windows 客户端
  • 审计完整:所有流量仍经过堡垒机
  • 需要授权:可能涉及企业安全策略

本方案适用于:

  • 个人开发环境
  • 临时访问需求
  • Mac 用户的运维场景

但需注意:

  • 遵守企业安全政策
  • 不要在生产环境使用
TAGS # linux
评论