![允许非 root 用户创建 TUN/TAP 接口](https://linux22.com/image/219567/%E5%85%81%E8%AE%B8%E9%9D%9E%20root%20%E7%94%A8%E6%88%B7%E5%88%9B%E5%BB%BA%20TUN%2FTAP%20%E6%8E%A5%E5%8F%A3.png)
我遇到过这样的情况:我需要允许非 root 用户创建 TUN/TAP 接口。我知道这需要 CAP_NET_ADMIN 功能。
曾经有过其他问题关于这一点,但答案似乎集中在向 a 授予 CAP_NET_ADMIN 能力文件/程序,而不是给用户。就我而言,我需要将能力分配给用户,因此他们可以使用他们认为合适的任何工具来创建接口(即不限于用于创建它们的特定文件/程序)。
这在 Linux 中可能吗?具体来说,我使用的是 Ubuntu 22.04。
对于上下文,这样做的原因是我正在通过进行系统调用的自定义程序创建 TUN 接口,并且我需要它在调试时工作。由于每次运行调试器时它都会构建一个新的二进制文件,因此切换到 root 并将功能分配给二进制文件,然后切换回调试二进制文件是不可行的。
答案1
您可以通过包装器上的某些文件功能来使用环境功能集 ( wrapper.c
):
#include <stdlib.h>
#include <stdio.h>
#include <sys/capability.h>
#include <unistd.h>
#define SHELL "/bin/bash"
char *const args[] = { SHELL, NULL };
int main(int argc, char **argv) {
cap_iab_t iab = cap_iab_get_proc();
if (cap_iab_set_vector(iab, CAP_IAB_AMB, CAP_SYS_ADMIN, CAP_SET)) {
perror("not able to raise bit");
exit(1);
}
if (cap_iab_set_proc(iab)) {
perror("unable to set iab bit");
exit(1);
}
execv(SHELL, args);
perror("execv failed");
exit(1);
}
如果$USERWANTED
是您希望能够执行此操作的用户的用户名:
$ gcc -o wrapper wrapper.c -lcap
$ sudo chown $USERWANTED wrapper
$ sudo chmod go-wx wrapper
$ sudo setcap "cap_sys_admin,cap_setpcap=pe" wrapper
$USERWANTED
由于该行,只能执行该二进制文件chmod
。当他们这样做时,wrapper
程序会添加 Ambient 功能并运行 shell。它及其子级具有以下CAP_SYS_ADMIN
能力:
$ sudo -u $USERWANTED
$ exec ./wrapper
$ capsh --print|grep Current
Current: cap_sys_admin=eip
Current IAB: ^cap_sys_admin
您可能仍然发现调试程序很困难。这是因为使用功能运行的程序只能由也具有这些功能的程序进行调试。