我正在使用需要setcap
但找不到的安装脚本。什么包里有它?libcap2
已经安装。
我想将 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
到有效集。
这工作正常,但我想知道是否有一种方法可以在不为解释器二进制文件设置任何大写的情况下实现相同的目标。虽然这不是一个大问题(其他用户帐户没有上限,因此即使在解释器二进制文件上设置了位也无法使用它),但有点烦人,因为每次解释器运行时我都必须重新设置标志更新。
我想在 NATed 时短暂接受连接以进行开发,因此我尝试这样做:
$ ssh ubuntu@example.org -R 80:localhost:80
Run Code Online (Sandbox Code Playgroud)
当我试图绑定一个低的端口时失败了:
Warning: remote port forwarding failed for listen port 80
Run Code Online (Sandbox Code Playgroud)
所以我发现我可以setcap 'cap_net_bind_service=+ep' /my/application
允许它监听低于 1024 的端口。所以我在我的 suders crontab 中有这个:
@reboot setcap 'cap_net_bind_service=+ep' /usr/sbin/sshd
Run Code Online (Sandbox Code Playgroud)
但它仍然不让我绑定端口 80。我做错了什么?我只是打算使用 nginx 代理到 8080 或 iptables 或其他东西,但我仍然很好奇为什么我尝试做的事情不起作用。
我想让 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)
如何设置多个功能?
使用setcap
为二进制文件提供额外权限应该将新权限写入某处,存储或内存中,它存储在哪里?
lsof
原样使用不起作用,因为该过程消失得太快。
我试图授予 java 可执行文件在 Linux 上打开 1024 以下端口的权利。这是设置
/home/test/java
包含 Oracle Server JRE 7.0.25 这是 getcap 返回的内容
[test@centos6 java]$ pwd
/home/test/java
[test@centos6 java]$ getcap bin/java
bin/java = cap_net_bind_service+ep
[test@centos6 java]$ getcap jre/bin/java
jre/bin/java = cap_net_bind_service+ep
Run Code Online (Sandbox Code Playgroud)
尝试执行 java 会出现以下错误。
[test@centos6 java]$ bin/java
bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
[test@centos6 java]$ jre/bin/java
jre/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
当二进制文件被 …
我正在使用systemd单元文件以非 root 身份启动网络服务器。
listen tcp :80: bind: permission denied
即使我已经跑了,我也得到了
setcap cap_net_bind_service=+ep
Run Code Online (Sandbox Code Playgroud)
在可执行文件上。
在互联网上的一个示例单元文件中,我发现
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
Run Code Online (Sandbox Code Playgroud)
在单元文件中使用。所以我尝试了一下,突然应用程序可以绑定端口 80。
这告诉我什么?setcap
是否旧/已弃用/被忽略?一般只能通过systemd还是通过 Linux?
我试图了解 Linux 功能如何传递给一个已被exec()
另一个进程使用的进程。从我读过的内容来看,为了在 exec 之后保留功能,它必须在可继承集中。但是,我不确定该集合是如何填充的。
我的目标是能够以通常需要 root 的普通用户身份运行程序。它需要的功能是cap_dac_override
可以读取私有文件。我不想给它任何其他功能。
这是我的包装器:
#include <unistd.h>
int main(int argc, char *argv[]) {
return execl("/usr/bin/net", "net", "ads", "dns", "register", "-P", NULL);
}
Run Code Online (Sandbox Code Playgroud)
当我在生成的可执行文件上设置 setuid 权限时,这会起作用:
~ $ sudo chown root: ./registerdns
~ $ sudo chmod u+s ./registerdns
~ $ ./registerdns
Successfully registered hostname with DNS
Run Code Online (Sandbox Code Playgroud)
不过,我想使用功能而不是 setuid。我试过cap_dac_override
在包装器上设置功能:
~ $ sudo setcap cap_dac_override=eip ./registerdns
~ $ ./registerdns
Failed to open /var/lib/samba/private/secrets.tdb
ERROR: Unable to open secrets database
Run Code Online (Sandbox Code Playgroud)
我还尝试cap_dac_override
在net …
我从这里了解到有两种方法可以控制特权活动:setuid
和capability
。
但是当我在我的机器上玩时ping
,它似乎可以绕过这两种机制。
首先,确认我的机器/usr/bin/ping
有cap_net_raw
能力并且它使用SOCK_RAW
:
$ ll /usr/bin/ping
-rwxr-xr-x 1 root root 72K Jan 31 2020 /usr/bin/ping
$ getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep
$ strace -e socket ping <some-ip>
socket(AF_NETLINK, SOCK_RAW|SOCK_CLOEXEC, NETLINK_ROUTE) = 5
Run Code Online (Sandbox Code Playgroud)
复制二进制文件会删除该功能,但它仍然有效:
$ cp /usr/bin/ping ~
$ ll ~/ping
-rwxr-xr-x 1 user user 72K Nov 4 16:54 /home/user/ping
$ getcap ~/ping
[empty result]
$ ~/ping <some-ip>
[it works]
Run Code Online (Sandbox Code Playgroud)
我正在使用Ubuntu 20.04
和5.4.0-52-generic
。