首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Go 企业级堡垒机:把 SSH 关进审计笼子

Go 企业级堡垒机:把 SSH 关进审计笼子

原创
作者头像
用户12778042
发布2026-09-21 16:06:43
发布2026-09-21 16:06:43
660
举报

一、堡垒机到底在管什么

堡垒机不是防火墙,也不是 VPN。 它是运维人员登录服务器的唯一入口,核心就四件事:

  • 统一入口:所有 SSH 先连堡垒机,不直连生产机
  • 权限控制:谁能连哪台机、能跑什么命令
  • 会话审计:谁在什么时候干了什么,全程留痕
  • 录像回放:出问题能倒查,能复现

用 Go 做堡垒机,优势很直接: 标准库生态好、并发强、单二进制部署,适合内网环境。

二、最小闭环:一个能审计的 SSH 服务器

下面代码只做一件事: 监听 SSH,认证通过后,先记命令日志,再执行

代码语言:javascript
复制
package main

import (
    "fmt"
    "golang.org/x/crypto/ssh"
    "log"
    "net"
    "os/exec"
)

func main() {
    config := &ssh.ServerConfig{
        PasswordCallback: func(c ssh.ConnMetadata, p []byte) (*ssh.Permissions, error) {
            if c.User() == "admin" && string(p) == "secret" {
                return nil, nil
            }
            return nil, fmt.Errorf("denied")
        },
    }
    key, _ := ssh.ParsePrivateKey([]byte(hostKey))
    config.AddHostKey(key)

    ln, _ := net.Listen("tcp", ":2222")
    for {
        conn, _ := ln.Accept()
        go handle(conn, config)
    }
}

func handle(nConn net.Conn, config *ssh.ServerConfig) {
    sshConn, chans, reqs, _ := ssh.NewServerConn(nConn, config)
    defer sshConn.Close()
    go ssh.DiscardRequests(reqs)

    for ch := range chans {
        if ch.ChannelType() != "session" {
            ch.Reject(ssh.UnknownChannelType, "unknown")
            continue
        }
        ch, reqs, _ := ch.Accept()
        go func() {
            for req := range reqs {
                if req.Type == "exec" {
                    cmd := string(req.Payload[4:])
                    log.Printf("AUDIT user=%s cmd=%s", sshConn.User(), cmd)
                    out, _ := exec.Command("sh", "-c", cmd).CombinedOutput()
                    ch.Write(out)
                    ch.SendRequest("exit-status", false, ssh.Marshal(struct{ Status uint32 }{0}))
                    ch.Close()
                }
            }
        }()
    }
}

这段代码只验证核心: SSH 接入 → 认证 → 命令审计 → 执行。

企业级要做的,是把 exec.Command 换成代理转发到后端主机,并把输入输出写入录像文件。

三、企业级还要补什么

少量代码能跑通 Demo,但生产环境必须加:

  • 认证:LDAP / SSO / MFA,别用硬编码密码
  • 授权:RBAC,按用户、主机、命令三维控制
  • 代理:跳板到多台后端,不本地执行
  • 录像:记录终端输入输出,支持回放
  • 命令过滤:危险命令拦截、二次确认
  • 高可用:多节点、会话同步、故障转移
  • 安全:密钥管理、防绕过、操作水印

四、结论

Go 写企业级堡垒机,骨架可以很小: SSH 服务器 + 审计钩子 + 代理转发。

少量代码就能验证闭环, 但真正决定能不能上生产的,是认证、授权、录像和工程约束。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、堡垒机到底在管什么
  • 二、最小闭环:一个能审计的 SSH 服务器
  • 三、企业级还要补什么
  • 四、结论
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档