Golang Go语言中程序进程权限的问题

发布于 1周前 作者 vueper 来自 Go语言

因为我的软件需要创建虚拟网卡, 软件就需要 root 权限运行。 有个需求可以读取 macosx 的剪贴板, 这个时候坑就来了, 发现 macosx 的剪贴板做了用户隔离的,root 用户读取不到普通用户的剪贴板。 这就形成了一个死局。哈哈, 这个坑是苹果出来的。

  1. 我想知道能不能够实现一个 go 程序,能够隔离出运行的权限。 把某一段代码的权限降级成 user 用户, 而创建网卡的程序为 root 用户?
  2. 有 Macosx 在 root 用户无法获取剪贴板, 大家有什么好的方案吗? 

刚才我已经给 https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard 仓库的 2 位开发者发邮件了,不知道能不能获得他们的帮助。 哎,哎,哎。

MacOSX- pasteboard readme 文件。

  
The pasteboard service in Mac OS X is registered in a "bootstrap
namespace" (see Apple’s [TN2083][9]). The namespaces exist in
a hierarchy: “higher” namespaces include access to “lower”
namespaces. A process in a lower namespace can not access higher
namespaces. So, all process can access the lowest, “root” bootstrap
namespace, but only processes in a higher namespace can access that
namespace. Processes created as a part of a Mac OS X login session
are automatically included in the user’s “per-user” bootstrap
namespace. The pasteboard service is only available to processes in
the per-user bootstrap namespace.

Golang Go语言中程序进程权限的问题

更多关于Golang Go语言中程序进程权限的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

22 回复

那就分开多个进程呗,这种事情在 Windows 上也很常见,很多程序都用一个带 UAC 盾牌的 xxxHelper.exe 处理特权操作,主程序无需 UAC 。Linux 也可以用一些 cap /euid 等机制提权,也可以在特权操作完成后调用 setuid 主动降权。

更多关于Golang Go语言中程序进程权限的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


一般来说都是起一个有 root 权限的 daemon ,主进程在普通用户下面跑


两位大佬, 没太懂具体怎么操作, 有没有这方便的资料, 因为我也是临时安排处理问题, 以前没这方面经验的。

#3 就是需要 root 权限的那部分离出来单独做一个程序,然后主程序调用。

创建网卡用另外一个程序吧,感觉主要问题不是 root 获取不到剪贴板,而是为什么你的程序要用 root 运行。

因为创建网卡需要 root

创建网卡我用的是 golang 呀, 不是普通命令

所以把这部分拆开就好了噻,主程序就不用 root 权限了。像很多 vpn 程序,也就安装网卡的时候请求 root ,有网卡就不会要求 root 了。

。。。你就不能写成俩程序,都可以是 GO 写的啊,命令行调用另一个程序执行不就完了嘛

Unix 系统不是有 seteuid 吗?确定是无效的?





我们用的这个库, 创建一张虚拟网卡, 然后在虚拟网卡上面做数据转发处理。 主要是获取 ifce 对象进行读写监听流量。

启动一个 goroutine ,然后 runtime.LockOSThread ,然后 setuid ,这样不会影响主进程的 uid ,或者简单点开一个子命令

开两个进程,rpc 或者其他方式通信

什么时候 Unix-like 切换权限变成这么大难题了?

sudo: 我是假的?
chmod +x: 我可能被忽视了

ifce, err := water.New(water.Config{
DeviceType: water.TAP,
})
if err != nil {
log.Fatal(err)
}
var frame ethernet.Frame
n, err := ifce.Read([]byte(frame))
if err != nil {
log.Fatal(err)
}

这里的 ifce 对象我们用来接收数据, 但是 water.New 需要 root 权限创建。 所以你们说的子命令我个人感觉完全不行。 大佬说的 lockOsThread 我还没有测试过, 我看看行不行。

<br>user@debian:/tmp$ cat test.c<br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;unistd.h&gt;<br><br>int main(void)<br>{<br> system("id");<br> setuid(1000);<br> setgid(1000);<br> system("id");<br><br>}<br>user@debian:/tmp$ sudo ./test<br>uid=0(root) gid=0(root) groups=0(root)<br>uid=1000(user) gid=0(root) groups=0(root)<br>
MAC 同理

你这个说的设置 uid 是指的是设置 root 的 uid 吗

set 成你想读取的用户的 uid 啊

macosx 上面不行的呀

在Golang(Go语言)中处理程序进程权限是一个涉及操作系统底层接口的重要话题。Go语言提供了多种方法来控制和操作进程权限,通常通过标准库中的osos/exec以及syscall等包来实现。

  1. 文件权限:使用os.Chmod函数可以改变文件的权限。这涉及到Unix风格的权限模式(如rwxr-xr–),可以用来限制文件的读写执行权限。

  2. 进程权限提升:在Unix-like系统中,如果需要以更高权限运行程序(如root权限),通常会通过setuid系统调用实现。在Go中,这可以通过syscall.Setuid直接调用,但这种方式需要非常谨慎,因为它可能带来严重的安全风险。

  3. 执行外部命令的权限:使用os/exec包运行外部命令时,可以通过Cmd.SetuidCmd.Setgid方法设置命令执行时的用户ID和组ID,从而控制其权限。

  4. 权限验证:在程序内部,通过合理的权限验证机制(如基于角色的访问控制RBAC)来确保只有授权用户或进程能执行特定操作。

处理进程权限时,务必注意安全性和合规性。不当的权限管理可能导致数据泄露、系统崩溃或其他安全风险。在实际开发中,应尽量避免直接操作底层系统调用,而是使用更高层次的库和框架提供的权限管理功能。同时,定期进行安全审计和测试,确保系统的稳健性。

回到顶部