Форки и отбрасывать привилегии с Java - PullRequest
3 голосов
/ 28 февраля 2011

Я пишу серверную программу на 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 и научиться создавать JVM с JNI?

Ответы [ 3 ]

6 голосов
/ 28 февраля 2011

Вероятно, проще просто использовать 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 голос
/ 28 февраля 2011

Вы можете использовать su(1) вместо sudo(8). su(1) гораздо менее вовлечен, и, вероятно, не захочет сам терминал. (Конечно, если ваша конфигурация PAM требует ввода терминала для su(1), то это также может не сработать.)

0 голосов
/ 28 февраля 2011

Если вы только хотите запустить не-root процесс как root, тогда будет достаточно su. Он не будет запрашивать пароль при переходе из root к другому пользователю, поэтому ему не нужен терминал.

...