Privilèges fourchettes avec Java

J’écris un programme de serveur en Java qui permettra aux utilisateurs de soumettre des travaux en utilisant DRMAA. Bien que le processus serveur principal s’exécute en tant que root , tout ce qu’il fait est d’authentifier l’utilisateur, puis de démarrer un autre programme Java qui s’exécute en tant qu’utilisateur et de faire le travail afin de respecter le principe de minimisation des privilèges. Au départ, je faisais cela avec Runtime.exec() et sudo (exemple ci-dessous), qui fonctionnent bien jusqu’à ce que le processus soit désamorcé, et que sudo se fâche car il ne possède pas de terminal.

 Ssortingng[] command = {"sudo", "-i", "-u", username, java, theOtherJavaProgram}; Runtime.getRuntime().exec(command, null, getHomeDirectory(username)); 

Quelle est la meilleure façon de faire ce modèle de privilèges fork et drop en Java lors de l’exécution en tant que démon? Y a-t-il un moyen? Dois-je diviser le C et apprendre à créer des JVM avec JNI?

Vous pouvez utiliser su(1) au lieu de sudo(8) . su(1) est beaucoup moins impliqué et ne voudra probablement pas le terminal lui-même. (Bien sûr, si votre configuration PAM nécessite une entrée de terminal pour su(1) , cela pourrait ne pas fonctionner correctement non plus.)

Il est probablement plus facile de simplement utiliser JNI pour supprimer des privilèges.

Voici celui que j’ai assommé plus tôt:

UID.java

 public class UID { public static native int setuid(int uid); static { System.loadLibrary("uid"); } } 

unix_uid.c

 #include  #include  #include  #include "UID.h" JNIEXPORT jint JNICALL Java_UID_setuid(JNIEnv * jnienv, jclass j, jint uid) { return((jint)setuid((uid_t)uid)); } 

UID.h est une machine générée à partir de UID.class utilisant javah .

Si vous voulez seulement lancer un processus non root en tant que root , alors su sera suffisant. Il ne vous demandera pas de mot de passe lorsque vous passez de la root à un autre utilisateur, il ne devrait donc pas nécessiter de terminal.