|
|
|
|
@ -24,6 +24,7 @@ import ( |
|
|
|
|
"os/user" |
|
|
|
|
"path/filepath" |
|
|
|
|
"runtime" |
|
|
|
|
"strconv" |
|
|
|
|
"strings" |
|
|
|
|
"syscall" |
|
|
|
|
|
|
|
|
|
@ -93,6 +94,8 @@ func (ss *sshSession) newIncubatorCommand() *exec.Cmd { |
|
|
|
|
"be-child", |
|
|
|
|
"ssh", |
|
|
|
|
"--uid=" + lu.Uid, |
|
|
|
|
"--gid=" + lu.Gid, |
|
|
|
|
"--groups=" + strings.Join(ss.conn.userGroupIDs, ","), |
|
|
|
|
"--local-user=" + lu.Username, |
|
|
|
|
"--remote-user=" + remoteUser, |
|
|
|
|
"--remote-ip=" + ci.src.IP().String(), |
|
|
|
|
@ -141,6 +144,8 @@ func beIncubator(args []string) error { |
|
|
|
|
var ( |
|
|
|
|
flags = flag.NewFlagSet("", flag.ExitOnError) |
|
|
|
|
uid = flags.Uint64("uid", 0, "the uid of local-user") |
|
|
|
|
gid = flags.Int("gid", 0, "the gid of local-user") |
|
|
|
|
groups = flags.String("groups", "", "comma-separated list of gids of local-user") |
|
|
|
|
localUser = flags.String("local-user", "", "the user to run as") |
|
|
|
|
remoteUser = flags.String("remote-user", "", "the remote user/tags") |
|
|
|
|
remoteIP = flags.String("remote-ip", "", "the remote Tailscale IP") |
|
|
|
|
@ -171,6 +176,23 @@ func beIncubator(args []string) error { |
|
|
|
|
if err == nil && sessionCloser != nil { |
|
|
|
|
defer sessionCloser() |
|
|
|
|
} |
|
|
|
|
var groupIDs []int |
|
|
|
|
for _, g := range strings.Split(*groups, ",") { |
|
|
|
|
gid, err := strconv.ParseInt(g, 10, 32) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
groupIDs = append(groupIDs, int(gid)) |
|
|
|
|
} |
|
|
|
|
if err := syscall.Setgroups(groupIDs); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
if egid := os.Getegid(); egid != *gid { |
|
|
|
|
if err := syscall.Setgid(int(*gid)); err != nil { |
|
|
|
|
logf(err.Error()) |
|
|
|
|
os.Exit(1) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if euid != *uid { |
|
|
|
|
// Switch users if required before starting the desired process.
|
|
|
|
|
if err := syscall.Setuid(int(*uid)); err != nil { |
|
|
|
|
|