Я использую Golang в качестве SFTP-сервера для своего приложения, и я хотел бы изолировать своих клиентов с другим корневым каталогом.
Это приложение позволяет подключаться к нескольким клиентам, но я хотел бы обслуживать пользовательский корневой каталог для каждого клиента(для лучшей изоляции).
В golang я пытался раскошелиться на процесс, но это не представляется возможным: Форкать процесс go
Я пробовал syscall.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()
}
}
}
Используемые библиотеки:
- golang.org / x / crypto / ssh
- github.com/ pkg / sftp