ssh

package
v0.0.9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 17, 2026 License: MIT Imports: 6 Imported by: 0

README

SSH 代理

通过 WebSocket 隧道实现 SSH 协议代理,支持在浏览器中使用 Web Terminal 或本地 SSH 客户端连接远程服务器。

技术方案

xterm.js + WebSocket + Go SSH客户端,实现浏览器端SSH终端。

graph LR
    A[Web Terminal<br>xterm.js] -->|WebSocket| B[Go代理]
    B -->|SSH协议| C[Linux Server]
    B -->|实时审计| D[命令解析]
    B -->|会话录制| E[asciicast文件]
    D --> F[(审计数据库)]
    E --> G[对象存储]

代理流程

sequenceDiagram
    participant Client as SSH客户端/Web Terminal
    participant GoProxy as Go WebSocket代理
    participant SSHServer as 目标SSH服务器

    Client->>GoProxy: 1. 建立WebSocket连接 (携带认证信息)
    GoProxy->>GoProxy: 2. 验证用户权限
    GoProxy->>SSHServer: 3. 建立SSH连接 (端口22)
    SSHServer-->>GoProxy: 4. SSH握手完成
    GoProxy-->>Client: 5. WebSocket连接确认
    
    loop SSH会话
        Client->>GoProxy: 6. 发送命令/输入 (通过WebSocket)
        GoProxy->>SSHServer: 7. 转发SSH数据包
        SSHServer->>GoProxy: 8. 返回执行结果/输出
        GoProxy->>GoProxy: 9. 记录审计日志
        GoProxy->>Client: 10. 转发数据 (通过WebSocket)
    end
    
    Client->>GoProxy: 11. 关闭连接
    GoProxy->>SSHServer: 12. 断开SSH连接

审计方案

审计架构
flowchart TB
    subgraph Input[数据采集]
        A1[连接事件]
        A2[终端I/O流]
        A3[命令识别]
    end
    
    subgraph Analysis[实时分析]
        B1[命令解析<br>回车键检测]
        B2[风险评估<br>规则匹配]
        B3[会话录制<br>asciicast格式]
    end
    
    subgraph Storage[分层存储]
        C1[(MySQL<br>连接/命令)]
        C2[(ClickHouse<br>历史分析)]
        C3[S3/OSS<br>会话录制]
    end
    
    subgraph Action[处置动作]
        D1[阻断<br>高危命令]
        D2[告警<br>异常行为]
        D3[记录<br>正常操作]
    end
    
    A1 & A2 & A3 --> B1 & B2 & B3
    B2 --> D1 & D2 & D3
    B1 & B2 --> C1
    B1 --> C2
    B3 --> C3
命令解析方案
stateDiagram-v2
    [*] --> 等待输入
    等待输入 --> 缓冲命令: 接收字符
    缓冲命令 --> 缓冲命令: 继续输入
    缓冲命令 --> 命令完成: 检测到\n或\r
    命令完成 --> 风险检测
    风险检测 --> 阻断: critical级别
    风险检测 --> 告警: high/medium
    风险检测 --> 记录: low级别
    阻断 --> [*]
    告警 --> 执行命令
    记录 --> 执行命令
    执行命令 --> 等待输入
高危命令清单
mindmap
  root((高危命令))
    系统管理
      rm -rf /
      mkfs
      dd if=/dev/zero
      fdisk /dev/sda
    权限提升
      sudo su
      sudo -i
      sudo bash
    用户管理
      useradd
      usermod -aG sudo
      passwd root
    网络操作
      iptables -F
      nc -l
      wget *.sh
    文件传输
      scp
      rsync
      sftp
    进程管理
      kill -9 1
      pkill -9
      systemctl stop
审计数据模型
erDiagram
    SSH_CONNECTION ||--o{ SSH_COMMAND : executes
    SSH_CONNECTION ||--|| SESSION_RECORDING : has
    SSH_COMMAND ||--o{ RISK_EVENT : triggers
    
    SSH_CONNECTION {
        string session_id PK
        string user_id
        string target_host
        datetime connect_time
        datetime disconnect_time
        int64 duration
    }
    
    SSH_COMMAND {
        string session_id FK
        int sequence
        string command
        datetime timestamp
        int exec_time
        string risk_level
    }
    
    SESSION_RECORDING {
        string session_id FK
        string record_path
        string format
        int64 file_size
    }
    
    RISK_EVENT {
        string session_id FK
        string command
        string action
        datetime timestamp
    }
会话录制方案
flowchart LR
    A[SSH I/O流] --> B[录制引擎]
    B --> C{录制格式}
    C -->|asciicast v2| D[JSON Lines<br>易于解析]
    C -->|ttyrec| E[二进制<br>节省空间]
    D & E --> F[压缩存储<br>gzip/zstd]
    F --> G[对象存储]
    G --> H[回放系统<br>asciinema player]

asciicast 格式优势

  • JSON 行存储,易于解析和索引
  • 支持浏览器端直接回放 (asciinema-player)
  • 支持搜索定位到特定时间点
  • 可提取命令序列用于审计分析

安全增强

mindmap
  root((SSH安全))
    认证加固
      双因子认证
      密钥管理
      会话Token
    权限控制
      主机白名单
      命令白名单
      时间窗口限制
    会话管理
      空闲超时
      并发限制
      强制断开
    审计追踪
      实时录制
      命令审计
      水印追踪

Documentation

Index

Constants

View Source
const (
	AppName = "proxy_ssh"
)

Variables

This section is empty.

Functions

This section is empty.

Types

type AuditEventGenerator

type AuditEventGenerator struct {
	// contains filtered or unexported fields
}

AuditEventGenerator SSH 审计事件生成器

func NewAuditEventGenerator

func NewAuditEventGenerator(sessionID, username, userID string) *AuditEventGenerator

NewAuditEventGenerator 创建 SSH 审计事件生成器

func (*AuditEventGenerator) GenerateCommandEvent

func (g *AuditEventGenerator) GenerateCommandEvent(
	ctx context.Context,
	command string,
	result string,
	riskLevel proxy.RiskLevel,
	blocked bool,
) *audit.OperationEvent

GenerateCommandEvent 生成命令执行事件

func (*AuditEventGenerator) GenerateFileTransferEvent

func (g *AuditEventGenerator) GenerateFileTransferEvent(
	ctx context.Context,
	filename string,
	direction string,
	size int64,
) *audit.OperationEvent

GenerateFileTransferEvent 生成文件传输事件

func (*AuditEventGenerator) GenerateLoginEvent

func (g *AuditEventGenerator) GenerateLoginEvent(
	ctx context.Context,
	host string,
	port int,
	success bool,
) *audit.OperationEvent

GenerateLoginEvent 生成登录事件

type AuditService

type AuditService interface {
	// RecordCommandEvent 记录命令执行事件
	RecordCommandEvent(ctx context.Context, event *audit.OperationEvent) error

	// RecordLoginEvent 记录登录事件
	RecordLoginEvent(ctx context.Context, event *audit.OperationEvent) error

	// RecordFileTransferEvent 记录文件传输事件
	RecordFileTransferEvent(ctx context.Context, event *audit.OperationEvent) error

	// GetEventGenerator 获取事件生成器
	GetEventGenerator(sessionID, username, userID string) *AuditEventGenerator
}

AuditService SSH 审计服务接口

type DefaultAuditService

type DefaultAuditService struct {
	// contains filtered or unexported fields
}

DefaultAuditService SSH 审计服务默认实现

func NewDefaultAuditService

func NewDefaultAuditService() *DefaultAuditService

NewDefaultAuditService 创建 SSH 审计服务

func (*DefaultAuditService) GetEventGenerator

func (s *DefaultAuditService) GetEventGenerator(sessionID, username, userID string) *AuditEventGenerator

GetEventGenerator 获取事件生成器

func (*DefaultAuditService) RecordCommandEvent

func (s *DefaultAuditService) RecordCommandEvent(ctx context.Context, event *audit.OperationEvent) error

RecordCommandEvent 记录命令执行事件

func (*DefaultAuditService) RecordFileTransferEvent

func (s *DefaultAuditService) RecordFileTransferEvent(ctx context.Context, event *audit.OperationEvent) error

RecordFileTransferEvent 记录文件传输事件

func (*DefaultAuditService) RecordLoginEvent

func (s *DefaultAuditService) RecordLoginEvent(ctx context.Context, event *audit.OperationEvent) error

RecordLoginEvent 记录登录事件

type Service

type Service interface {
	// 处理 SSH WebSocket 代理
	HandleWebSocketProxy(ctx context.Context, conn *proxy.Connection, wsConn proxy.WebSocketConn) error
}

Service SSH 代理服务接口

func GetService

func GetService() Service

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL