Chroot для нескольких клиентов SFTP в golang

Я использую Golang в качестве SFTP-сервера для своего приложения и хотел бы изолировать своих клиентов с другим корневым каталогом.

Это приложение позволяет подключать несколько клиентов, но я хотел бы обслуживать пользовательский корневой каталог для каждого клиента (для лучшей изоляции).

В golang я попытался разветвить процесс, но это не представляется возможным: Fork процесс запуска

Я пробовал syscall.Chroot в goroutine, но весь бинарный файл был chrooted... В то же время это не позволяет другим клиентам использовать службу, поскольку бинарный файл chrooted текущим пользователем.

Если у вас есть возможное решение моей проблемы, я был бы очень рад вас прочитать.

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()
        }
    }
}

Используемые библиотеки:

  • golang.org/x/crypto/ssh
  • github.com/pkg/sftp

person Sebastien D.    schedule 05.06.2018    source источник
comment
Включите соответствующий код в текст вопроса.   -  person Adrian    schedule 05.06.2018
comment
Вы не можете разветвить или chroot основной процесс, поэтому у вас есть возможность запускать sftp-сервер в подпроцессе.   -  person JimB    schedule 05.06.2018
comment
Как запустить sftp в подпроцессе и запустить ssh-сервер в основном процессе? Протокол sftp использует канал ssh. Я попытался перенаправить ssh-канал в подпроцессе, и он не работает нормально.   -  person Sebastien D.    schedule 06.06.2018