我正在用Java编写一个服务器程序,允许用户使用DRMAA提交作业。虽然主服务器进程以root
运行,但它只是对用户进行身份验证,然后启动另一个以该用户身份运行的Java程序,并实际完成工作以符合最小化权限的原则。最初,我使用Runtime.exec()
和sudo
(下面的示例)执行此操作,该工作正常,直到进程被重新监控,此时sudo
因为没有终端而感到沮丧。
String[] command = {"sudo", "-i", "-u", username, java, theOtherJavaProgram};
Runtime.getRuntime().exec(command, null, getHomeDirectory(username));
作为守护程序运行时,在Java中执行此分支特权模式的最佳方法是什么?有办法吗?我是否必须打破C并学习如何使用JNI创建JVM?
答案 0 :(得分:6)
使用JNI删除权限可能更容易。
这是我之前被淘汰的那个:
UID.java
public class UID {
public static native int setuid(int uid);
static {
System.loadLibrary("uid");
}
}
unix_uid.c
#include <sys/types.h>
#include <unistd.h>
#include <jni.h>
#include "UID.h"
JNIEXPORT jint JNICALL
Java_UID_setuid(JNIEnv * jnienv, jclass j, jint uid)
{
return((jint)setuid((uid_t)uid));
}
UID.h
是使用UID.class
从javah
生成的机器。
答案 1 :(得分:1)
您可以使用su(1)
代替sudo(8)
。 su(1)
涉及的内容少得多,可能不会想要终端本身。 (当然,如果您的PAM配置需要su(1)
的终端输入,那么这可能也无法正常工作。)
答案 2 :(得分:0)
如果仅想要以root
开始非root
流程,那么su
就足够了。将从 root
转到另一个用户时,它不会要求输入密码,因此不需要终端。