在我的开发盒上有这个限制是非常烦人的,因为除了我之外不会有任何用户.
我知道标准的解决方法,但它们都没有完全符合我的要求:
是否有一些简单的sysctl变量允许非root进程绑定到Linux上的"特权"端口(端口小于1024),或者我只是运气不好?
编辑:在某些情况下,您可以使用功能来执行此操作.
如果我在特权模式下运行容器,它是否具有所有内核功能,还是需要单独添加它们?
似乎支持Linux内核中的细粒度功能,它允许为进程授予权限,例如,在不授予进程root权限的情况下打开原始套接字或提高线程优先级.
但是,如果有办法授予每个用户的能力,我想知道的是什么.也就是说,允许非root和非suid进程获取这些功能.
我用来LD_LIBRARY_PATH为应用程序设置某个用户库的路径.但是如果我在这个应用程序上设置功能
sudo setcap CAP_NET_BIND_SERVICE=eip myapplication
Run Code Online (Sandbox Code Playgroud)
然后LD_LIBRARY_PATH似乎被忽略了.当我启动程序时,Linux抱怨它无法找到某个共享库.
我猜这里有一些保护措施,以防止具有扩展权限的应用程序被劫持.有解决方法吗?
Linux功能(libcap.so)库是否可用于Android?如果没有,我该怎么编译呢?
我想使用sys/capabilities.h与NDK一起提供的与功能相关的API .但是当我尝试调用函数时cap_get_proc(),我得到"未定义的引用"错误.
我正在使用Linux POSIX mqueue实现,我遇到了问题.对于当前内核,最大邮件大小为1MB,但我需要没有限制.
man mq_overview如果流程具有特权(一个具有CAP_SYS_RESOURCE能力的流程),它就没有限制.我认为root执行的进程已经获得特权,但我仍然收到"消息太长"错误(我的消息有2MB).
如何CAP_SYS_RESOURCE为流程添加功能?
我正在尝试编写一个守护进程,它将使用setuid位以root身份启动,但随后会快速恢复为运行该进程的用户.但是,守护程序需要保留将新线程设置为"实时"优先级的能力.我用来设置优先级的代码如下(一旦创建就在一个线程中运行):
struct sched_param sched_param;
memset(&sched_param, 0, sizeof(sched_param));
sched_param.sched_priority = 90;
if(-1 == sched_setscheduler(0, SCHED_FIFO, &sched_param)) {
// If we get here, we have an error, for example "Operation not permitted"
}
Run Code Online (Sandbox Code Playgroud)
但是,我遇到问题的部分是设置uid,同时保留进行上述调用的能力sched_setscheduler.
我有一些代码在我的应用程序的主线程中运行接近启动:
if (getgid() != getegid() || getuid() != geteuid()) {
cap_value_t cap_values[] = {CAP_SYS_NICE};
cap_t caps;
caps = cap_get_proc();
cap_set_flag(caps, CAP_PERMITTED, 1, cap_values, CAP_SET);
cap_set_proc(caps);
prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
cap_free(caps);
setegid(getgid());
seteuid(getuid());
}
Run Code Online (Sandbox Code Playgroud)
问题是在运行此代码后,我sched_setscheduler在上面的评论中提到了"不允许操作" .我究竟做错了什么?
TL; DR:为什么cap_net_raw,cap_net_admin功能只能在/usr/bin(或/usr/sbin)中工作,而不能在其他地方工作?这可以在某个地方配置吗?
我在使用Ubuntu 14.04中的libpcap为我的C程序分配功能时遇到了问题.即使在使用setcap(8)和使用它来分配功能之后getcap(8),我仍然会收到权限错误.似乎功能仅适用于\usr\bin朋友中的可执行文件.
我的程序test.c如下:
#include <stdio.h>
#include <pcap.h>
int main(int argc, char **argv) {
if (argc != 2) {
printf("Specify interface \n");
return -1;
}
char errbuf[PCAP_ERRBUF_SIZE];
struct pcap* pcap = pcap_open_live(argv[1], BUFSIZ, 1, 0, errbuf);
if (pcap == NULL) {
printf("%s\n", errbuf);
return -1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并编译
gcc test.c -lpcap
Run Code Online (Sandbox Code Playgroud)
生成a.out可执行文 我设置了功能:
sudo setcap cap_net_raw,cap_net_admin=eip ./a.out
Run Code Online (Sandbox Code Playgroud)
并检查它是否正确: …
如何制作一个设置文件POSIX功能的RPM?如果我尝试以非root用户身份进行操作,那么当我的makefile的安装挂钩尝试运行时,我会收到错误,但如果我不运行,将如何 复制这些功能?似乎没有任何方法可以在RPM spec文件中设置功能.rpmbuildsetcapsetcaprpmbuild
我处在一个困难的境地,我不知道一个进程需要工作的Linux功能.什么是最好的方法,或任何方式找出所需的上限?
我现在唯一能想到的就是使用capsh并放弃进程上的所有上限.然后该过程失败,我开始添加大写(通过删除--drop = CAP_XZY),直到它工作.
有更好的建议吗?