我正在试验Java应用程序的Linux功能.我不想为解释器(JVM)添加功能,所以我尝试编写一个简单的包装器(将调试信息打印到stdout):
#include <stdio.h>
#include <stdlib.h>
#include <sys/capability.h>
#include <unistd.h>
int main(int argc, char *argv[]){
cap_t cap = cap_get_proc();
if (!cap) {
perror("cap_get_proc");
exit(1);
}
printf("%s: running with caps %s\n", argv[0], cap_to_text(cap, NULL));
return execlp("/usr/bin/java", "-server", "-jar", "project.jar", (char *)NULL);
}
Run Code Online (Sandbox Code Playgroud)
这样,我可以看到为此可执行文件设置了功能:
./runner: running with caps = cap_net_bind_service+p
Run Code Online (Sandbox Code Playgroud)
和getcap节目
runner = cap_net_bind_service+ip
Run Code Online (Sandbox Code Playgroud)
我有能力设置为可继承,所以应该没有问题.但是,java仍然不想绑定到特权端口.
我收到此错误:
sun/nio/ch/Net.java:-2:in `bind': java.net.SocketException: Permission denied (NativeException)
Run Code Online (Sandbox Code Playgroud)
有人可以帮我解决这个问题吗?
我正在尝试在ubuntu 10.10上编译以下最小C代码:
#include <sys/capability.h>
void main(void)
{
cap_t cap;
cap = cap_get_proc();
}
Run Code Online (Sandbox Code Playgroud)
用gcc -lcap test.c它给我以下错误:
/tmp/ccCQFyXS.o: In function `main':
test.c:(.text+0x9): undefined reference to `cap_get_proc'
collect2: ld a retourné 1 code d'état d'exécution
Run Code Online (Sandbox Code Playgroud)
我安装了libcap2-dev和libcap2-bin,版本2.21
ls /lib/libcap.*
/lib/libcap.a /lib/libcap.so /lib/libcap.so.2 /lib/libcap.so.2.21
Run Code Online (Sandbox Code Playgroud)
具有相同gcc命令的相同代码在arch和gentoo上成功构建
我该怎么做才能让它在ubuntu上构建?
我想让系统在没有setuid文件“+p”功能的情况下可用,并且通常没有在我设置PR_SET_NO_NEW_PRIVS时禁用的东西。
使用这种方法(init集合PR_SET_NO_NEW_PRIVS和基于文件系统的能力提升不再可能),您无法“重新填充”您的能力,只需要小心不要“泼洒”它们。
如何在execve不“飞溅”任何授予的功能的情况下进行其他处理(例如新程序的文件是否为setcap =ei)?只是“我相信这个新过程就像我相信自己一样”。例如,赋予用户一项能力(并且用户想在他启动的任何程序中行使它)......
我可以永久制作整个文件系统=ei吗?我想让文件系统不干扰该方案,不能授予或撤销功能;通过父->子事物控制一切。
在我的自定义环境拦截库预装它运行一个特殊的实施bind(),connect()等电话.
我看到的问题是,无论何时使用命令显式启用应用程序setcap,执行应用程序都无法预加载拦截器库并调用默认的libc connect().
这是预期的行为吗?如果是,可能是什么原因禁用LD_PRELOAD?
是否有任何调整或方法可用于成功预加载启用功能的库.
容器实际启动后是否可以添加功能(例如:NET_ADMIN)?
我几天前启动了一个容器,并且由其提供的服务正被其他几个在其他服务器上远程运行的进程使用.我需要为它添加一个loopback接口,但不幸的是,我忘了启动容器,--cap-add=NET_ADMIN因此现在无法添加接口.
我正在寻找一个选项,如果有可能以某种方式将此功能提供给此容器.
我正在尝试编写一个需要提升功能的程序(而不是简单地使用 sudo 运行它)。但是,我使用 setcap 设置的所有功能似乎都不会在执行后转移到进程中。跨多个可执行文件并使用不同的功能会发生此问题。
此代码使用 cap_set_file() 为作为 CLA 传递的文件提供 CAP_NET_RAW 功能。(不要问我为什么需要这个。)
#include <stdio.h>
#include <stdlib.h>
#include <sys/prctl.h>
#include <sys/capability.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define handle_error(msg) \
do { printf("%s: %s\n", msg, strerror(errno)); exit(EXIT_FAILURE); } while (0)
void print_cap_buf(cap_t cur) {
char *buf;
buf = cap_to_text(cur, NULL);
printf("%s\n", buf);
cap_free(buf);
}
void get_and_print_cap_buf() {
cap_t cur = cap_get_proc();
print_cap_buf(cur);
cap_free(cur);
}
int main(int argc, char *argv[]) {
cap_t file_cap;
printf("Process capabilities: ");
get_and_print_cap_buf(); // Print the …Run Code Online (Sandbox Code Playgroud) 我在 Docker 容器中运行 Nginx,出于安全原因,我希望尽可能多地删除 Linux 功能。
然后我可以放弃哪些能力?
该镜像类似于此处的标准 Docker Nginx Alpine 镜像:https : //github.com/nginxinc/docker-nginx/blob/0c7611139f2ce7c5a6b1febbfd5b436c8c7d2d53/mainline/alpine/Dockerfile,它以 root 身份启动 Nginx,然后以 root 身份运行工作进程用户'nginx',看:
root@instance-1:/opt/ed# docker-compose exec web bash
bash-4.3# # Now we're inside the container.
bash-4.3# ps aux
PID USER TIME COMMAND
1 root 0:00 /bin/sh -c /etc/nginx/run-envsubst.sh && nginx
10 root 0:00 nginx: master process nginx
11 nginx 0:00 nginx: worker process
12 nginx 0:00 nginx: cache manager process
14 root 0:00 bash
18 root 0:00 ps aux
Run Code Online (Sandbox Code Playgroud)
侦听端口 80 和 …
我在用着Ubuntu 18.04 Desktop。以下是有关我的问题的更多详细信息。
最近,我正在编写一些想要执行此操作的测试代码:当它作为非特权用户运行时,测试代码尝试绑定特权端口(在我的例子中为端口 1)并期望绑定失败。
在我的主机上,我当前的非特权用户有以下capsh --print输出:
Current: =
Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read
Securebits: 00/0x0/1'b0
secure-noroot: no (unlocked)
secure-no-suid-fixup: no (unlocked)
secure-keep-caps: no (unlocked)
uid=1000(ywen)
gid=1000(ywen)
groups=4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare),999(docker),1000(ywen)
Run Code Online (Sandbox Code Playgroud)
因此,当我尝试使用当前非特权用户绑定端口 1 时,我可以得到预期的权限拒绝错误:
Current: =
Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read
Securebits: 00/0x0/1'b0
secure-noroot: no (unlocked)
secure-no-suid-fixup: no (unlocked)
secure-keep-caps: no (unlocked)
uid=1000(ywen)
gid=1000(ywen)
groups=4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare),999(docker),1000(ywen)
Run Code Online (Sandbox Code Playgroud)
因为我的测试代码最终将在 Docker 容器内运行,所以我使用以下命令构建了一个映像Dockerfile:
ARG UBUNTU_VERSION=18.04
FROM ubuntu:${UBUNTU_VERSION}
ARG USER_NAME=ywen
ARG USER_ID=1000
ARG GROUP_ID=1000
RUN apt-get update
# Install the needed packages.
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install …Run Code Online (Sandbox Code Playgroud) 背景:我正在运行一个 docker 容器,它需要加载/删除一个内核模块,该模块使连接到远程服务器的 USB 设备在主机上可用,然后我希望在容器中可用。
\n\xe2\x80\x94-privileged当使用和 绑定安装运行容器时,它可以/lib/modules工作/dev。
现在我想删除特权模式并只允许最少的必要访问。我尝试\xe2\x80\x94-cap-add=all作为开始,但这似乎还不够。还\xe2\x80\x94-privileged允许什么?
我从 ping 二进制文件中删除了 setuid 位,并添加了cap_net_raw+p如下内容:
$ chmod 755 /bin/ping
$ setcap cap_net_raw+p /bin/ping
Run Code Online (Sandbox Code Playgroud)
然后我ping在一个终端中运行并从另一个终端检查正在运行的进程的 /proc/$PID/status :
$ ps aux | grep ping
user 5468 0.0 0.0 14948 1792 pts/20 S+ 11:14 0:00 ping www.google.com
user 5471 0.0 0.0 14224 896 pts/2 S+ 11:14 0:00 grep --color=auto ping
$ cat /proc/5468/status | grep Cap
CapInh: 0000000000000000
CapPrm: 0000000000002000
CapEff: 0000000000000000
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
Run Code Online (Sandbox Code Playgroud)
如果ping当前正在运行,为什么CapEff: 0000000000000000?不应该cap_net_raw也在有效集中吗?/proc/$PID/status 不反映线程的当前状态吗?