堡垒机不是防火墙,也不是 VPN。 它是运维人员登录服务器的唯一入口,核心就四件事:
用 Go 做堡垒机,优势很直接: 标准库生态好、并发强、单二进制部署,适合内网环境。
下面代码只做一件事: 监听 SSH,认证通过后,先记命令日志,再执行。
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,但生产环境必须加:
Go 写企业级堡垒机,骨架可以很小: SSH 服务器 + 审计钩子 + 代理转发。
少量代码就能验证闭环, 但真正决定能不能上生产的,是认证、授权、录像和工程约束。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。