首页 > 解决方案 > 在 golang 中用于多个 SFTP 客户端的 Chroot

问题描述

我使用 Golang 作为我的应用程序的 SFTP 服务器,我想用不同的根目录隔离我的客户端。

此应用程序允许多个客户端连接,但我想为每个客户端提供自定义根目录(以便更好地隔离)。

在 golang 中,我尝试分叉该进程,但似乎不可能:Fork a go process

我尝试syscall.Chroot了一个 goroutine,但是所有的二进制文件都被 chroot 了……与此同时,这阻止了其他客户端使用该服务,因为二进制文件被当前用户 chroot。

如果您对我的问题有可能的解决方案,我将很高兴阅读您的内容。

func main() {
    if listener, err := net.Listen("tcp", fmt.Sprintf("0.0.0.0:%d", sshServer.Port)); err == nil {
        for {
           if nConn, err := listener.Accept(); err == nil {
                // ...
                if sshConn, chans, reqs, err := ssh.NewServerConn(nConn, &sshServer.Config); err == nil {
                    // ...
                    // Accept all channels
                    go handleChannels(chans)
                }
            }
        }
    }
}
...
func handleChannels(chans <-chan ssh.NewChannel) {
    // Service the incoming Channel channel.
    for newChannel := range chans {
        // ...
        if err := syscall.Chroot(chrootPath); err != nil {
            panic(err)
        }

        if err := os.Chdir("/"); err != nil {
            panic(err)
        }

        channel, requests, errChannel := newChannel.Accept()
        if err := server.Serve(); err == io.EOF {
            server.Close()
        }
    }
}

使用的库:

标签: gosshsftpchrootisolation

解决方案


推荐阅读