我的应用程序需要以无根用户的身份运行,但需要切换到其他用户以执行一些命令。
我试着:
但是,如果以无根的形式运行它,它就不能工作。
/opt/jdk1.8/jre/bin/java -Djava.library.path=../jni HelloJNI
The real user ID is: 1000
The effective user ID is :1000 <= which expected is 0
setuid: Operation not permitted但是,如果runner是root的话就能工作了。
The real user ID is: 0
The effective user ID is :0
pid=1002The real user ID is: 0
The effective user ID is :1002这里有什么不对劲吗?
更新
将JNI部件修改为可执行的c
void show_ids (void)
{
printf ("The real user ID is: %d\n", getuid());
printf ("The effective user ID is :%d\n", geteuid());
}
int main(void)
{
show_ids();
if (seteuid (1002) < 0) {
perror ("setuid");
exit (EXIT_FAILURE);
}
show_ids();
return (0);
}将其构建为root并运行chmod u+s。
-rwsr-xr-x 1 root root 8814 Aug 9 11:44 a.out*以普通用户的身份运行并工作。
./a.out
The real user ID is: 1000
The effective user ID is :0
The real user ID is: 1000
The effective user ID is :1002发布于 2018-08-09 07:36:02
JNI没有为您工作的原因是,seteuid进程的有效用户id不是0(根用户)。
显然,您试图通过在本机库上设置"setuid“位来生成有效的用户id。那不管用。类似地,将JAR文件(或类文件)作为setuid无法工作。setuid位仅在可执行文件上有意义;即操作系统本身知道如何执行的文件。
那么我们如何为Java程序实现"setuid行为“呢?
/usr/bin/java标记为setuid为root。--不要这样做!--如果这样做的话,您运行的每个程序都将作为根用户运行。那就不好了。解决方案是用本机代码编写自定义JVM启动程序,编译并链接它,并使启动程序可执行setuid。请注意,发射器必须非常小心地写出来,以对抗颠覆它的人。例如:
实际上,以特权用户的身份运行Java应用程序可能更安全.根本不依赖"setuid root“。
https://stackoverflow.com/questions/51757591
复制相似问题