我正在 Debian Gnu/Linux 上试验功能。
我已将 /bin/ping 复制到我当前的工作目录。正如预期的那样,它不起作用,它最初是 setuid root。
然后,我通过执行 来为我的 ping 提供最小的功能(不是 root)sudo /sbin/setcap cap_net_raw=ep ./ping,并且我的 ping 可以正常工作。
然后sudo /sbin/setcap -r ./ping撤销那个能力。它现在没有按预期工作。
我现在尝试使用capsh.
capsh 没有权限,所以我需要以 root 身份运行它,然后删除 root 并因此删除所有其他权限。
我想我也需要secure-keep-caps,这在 中没有记录capsh,但在能力手册中。我从/usr/include/linux/securebits.h. 它们看起来是正确的,因为输出--print显示这些位是正确的。
我已经摆弄了几个小时,到目前为止我有这个。
sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"
但是ping有错误ping: icmp open socket: Operation not permitted,这是当它没有能力,会发生什么。也--print说明了Current: =p cap_net_raw+i,这还不够我们需要e。 …
我有一个程序,我想在不关闭实际网络的情况下在离线模式下进行测试。该程序仍需要连接到本地套接字,包括 unix 域套接字和环回。它还需要侦听环回并对其他应用程序可见。
但是尝试连接到远程机器应该会失败。
我想有一个工具,它的工作原理是strace/ unshare/ sudo,只是运行在互联网(和LAN)隐蔽和一切仍在工作的命令:
$ offline my-program-to-test
Run Code Online (Sandbox Code Playgroud)
这个问题暗示了答案:阻止进程的网络访问?
那里有一些建议,例如以另一个用户身份运行然后操作 iptables,或unshare -n. 但在这两种情况下,我都不知道让 unix 域套接字和环回与主系统共享的咒语 - 该问题的答案只告诉我如何取消共享整个网络。
我正在测试的程序仍然需要连接到我的 X 服务器和 dbus,甚至能够监听来自系统上其他应用程序的环回连接。
理想情况下,我想避免创建 chroot 或用户或 VM 等,因为它变得和拔掉网线一样烦人。即问题的重点是我怎样才能使它像sudo.
我希望该过程能够 100% 正常运行,除非指定非本地地址的网络调用会失败。理想情况下,保持相同的 uid、相同的 homedir、相同的密码、相同的所有内容,除了...离线。
我正在使用 Fedora 18,因此不可移植的 Linux 答案很好(甚至是预期的)。
我什至很高兴通过编写 C 程序来解决这个问题,如果涉及到的话,那么涉及编写 C 的答案就很好。我只是不知道 C 程序需要进行哪些系统调用才能在保留本地网络的同时撤销外部网络访问。
任何试图支持“离线模式”的开发人员都可能会喜欢这个实用程序!
一个答案到Linux的:允许用户收听低于1024的端口指定给使用一个可执行附加的权限setcap,使得程序可以结合端口<1024:
setcap 'cap_net_bind_service=+ep' /path/to/program
Run Code Online (Sandbox Code Playgroud)
撤消这些权限的正确方法是什么?
我想将 wpa_supplicant 和openvpn设置为以非 root 用户身份运行,就像推荐的用于wireshark 的设置一样。我找不到有关+eip此示例中含义的任何文档 :
sudo setcap cap_net_raw,cap_net_admin,cap_dac_override+eip /usr/bin/dumpcap
Run Code Online (Sandbox Code Playgroud) 现在我cap_net_bind_service MY_USERNAME在 /etc/security/capability.conf 中使用。
现在我只需要设置cap_net_bind_service+i我最喜欢的脚本语言的解释器,就可以通过 libcap[-ng]添加CAP_NET_BIND_SERVICE到有效集。
这工作正常,但我想知道是否有一种方法可以在不为解释器二进制文件设置任何大写的情况下实现相同的目标。虽然这不是一个大问题(其他用户帐户没有上限,因此即使在解释器二进制文件上设置了位也无法使用它),但有点烦人,因为每次解释器运行时我都必须重新设置标志更新。
我想让 node.js 能够侦听端口 80,并关闭计算机。最初我按顺序尝试了这两个命令:
setcap cap_net_bind_service=+ep /usr/bin/nodejs
setcap cap_sys_boot=+ep /usr/bin/nodejs
Run Code Online (Sandbox Code Playgroud)
然后我的应用程序无法绑定到端口 80。我检查了 getcap:
# getcap /usr/bin/nodejs
/usr/bin/nodejs = cap_sys_boot+ep
Run Code Online (Sandbox Code Playgroud)
如果我再次为 cap_net_bind_service 运行 setcap:
# getcap /usr/bin/nodejs
/usr/bin/nodejs = cap_net_bind_service+ep
Run Code Online (Sandbox Code Playgroud)
我在手册页http://linux.die.net/man/8/setcap 中没有看到关于设置多个功能的任何内容,并在绝望中尝试了一些东西:
# setcap cap_net_bind_service=+ep /usr/bin/nodejs cap_sys_boot=+ep /usr/bin/nodejs
# getcap /usr/bin/nodejs
/usr/bin/nodejs = cap_sys_boot+ep
# setcap cap_net_bind_service=+ep cap_sys_boot=+ep /usr/bin/nodejs
Failed to set capabilities on file `cap_sys_boot=+ep' (No such file or directory)
Run Code Online (Sandbox Code Playgroud)
如何设置多个功能?
我想以一种无法创建或打开任何要写入的文件的方式在 Linux 上运行命令。它应该仍然能够正常读取文件(因此空的 chroot 不是一个选项),并且仍然能够写入已经打开的文件(尤其是 stdout)。
如果仍然可以将文件写入某些目录(即当前目录),则可以加分。
我正在寻找一个进程本地的解决方案,即不涉及为整个系统配置 AppArmor 或 SELinux 之类的东西,也不涉及 root 权限。不过,这可能涉及安装他们的内核模块。
我正在研究功能,如果有创建文件的功能,这些功能会很好也很容易。ulimit 是另一种方便的方法,如果它涵盖了这个用例。
使用setcap为二进制文件提供额外权限应该将新权限写入某处,存储或内存中,它存储在哪里?
lsof原样使用不起作用,因为该过程消失得太快。
据我所知,ping需要创建一个原始套接字(需要 root 访问权限或cap_net_raw功能)。
根据我的理解,最近几年的趋势是删除setuid二进制文件并用功能替换它们。
但是,当我查看pingFedora 32上的二进制文件时,它看起来没有任何内容:
$ ls -la $(which ping)
-rwxr-xr-x. 1 root root 82960 May 18 10:26 /usr/bin/ping
$ sudo getcap -v $(which ping)
/usr/bin/ping
$
Run Code Online (Sandbox Code Playgroud)
ping 是否需要在 Fedora 上打开原始套接字?还是有另一种方法可以授予它打开原始套接字的权限?
root@macine:~# getcap ./some_bin
./some_bin =ep
Run Code Online (Sandbox Code Playgroud)
“ep”是什么意思?这个二进制文件的功能是什么?
capabilities ×10
linux ×5
setcap ×4
security ×2
apparmor ×1
executable ×1
lxc ×1
namespace ×1
networking ×1
scripting ×1
selinux ×1
setuid ×1