mirror of https://github.com/tailscale/tailscale/
ipn, ipnserver: only require sudo on Linux for mutable CLI actions
This partially revertspull/1138/headd6e9fb1df0
, which modified the permissions on the tailscaled Unix socket and thus required "sudo tailscale" even for "tailscale status". Instead, open the permissions back up (on Linux only) but have the server look at the peer creds and only permit read-only actions unless you're root. In the future we'll also have a group that can do mutable actions. On OpenBSD and FreeBSD, the permissions on the socket remain locked down to 0600 fromd6e9fb1df0
. Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
parent
a45665426b
commit
5611f290eb
@ -0,0 +1,49 @@
|
|||||||
|
// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build linux
|
||||||
|
|
||||||
|
package ipnserver
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
|
"tailscale.com/types/logger"
|
||||||
|
)
|
||||||
|
|
||||||
|
func isReadonlyConn(c net.Conn, logf logger.Logf) (ro bool) {
|
||||||
|
ro = true // conservative default for naked returns below
|
||||||
|
uc, ok := c.(*net.UnixConn)
|
||||||
|
if !ok {
|
||||||
|
logf("unexpected connection type %T", c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
raw, err := uc.SyscallConn()
|
||||||
|
if err != nil {
|
||||||
|
logf("SyscallConn: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var cred *unix.Ucred
|
||||||
|
cerr := raw.Control(func(fd uintptr) {
|
||||||
|
cred, err = unix.GetsockoptUcred(int(fd),
|
||||||
|
unix.SOL_SOCKET,
|
||||||
|
unix.SO_PEERCRED)
|
||||||
|
})
|
||||||
|
if cerr != nil {
|
||||||
|
logf("raw.Control: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
logf("raw.Control: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if cred.Uid == 0 {
|
||||||
|
// root is not read-only.
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
logf("non-root connection from %v (read-only)", cred.Uid)
|
||||||
|
return true
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build !linux
|
||||||
|
|
||||||
|
package ipnserver
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
|
||||||
|
"tailscale.com/types/logger"
|
||||||
|
)
|
||||||
|
|
||||||
|
func isReadonlyConn(c net.Conn, logf logger.Logf) bool {
|
||||||
|
// Windows doesn't need/use this mechanism, at least yet. It
|
||||||
|
// has a different last-user-wins auth model.
|
||||||
|
|
||||||
|
// And on Darwin, we're not using it yet, as the Darwin
|
||||||
|
// tailscaled port isn't yet done, and unix.Ucred and
|
||||||
|
// unix.GetsockoptUcred aren't in x/sys/unix.
|
||||||
|
|
||||||
|
// TODO(bradfitz): OpenBSD and FreeBSD should implement this too.
|
||||||
|
// But their x/sys/unix package is different than Linux, so
|
||||||
|
// I didn't include it for now.
|
||||||
|
return false
|
||||||
|
}
|
Loading…
Reference in New Issue