2010-06-29 4 views
3

J'ai un mécanisme d'authentification personnalisé qui est écrit en Java. Je me demandais quelle serait la meilleure façon d'implémenter un module PAM Linux sans réécrire le code en C?Module PAM Linux en Java

Je suis au courant de this list of available PAM modules mais aucun d'entre eux sont liés à Java. Il ya aussi JPam mais il fait l'inverse: il permet d'utiliser les informations utilisateur/groupe dans l'application Java alors que j'ai besoin d'utiliser le code Java existant pour authentifier les utilisateurs sous Linux (par exemple via SSH).

Toutes les suggestions sont les bienvenues.

Répondre

2

Vous pouvez essayer:

  • compiler votre programme Java en utilisant GCJ code natif
  • écrire colle programme C qui intègre JVM et charge votre code Java

mais aucune de ces idées semblent idéal.

+0

Deuxième option (application de colle C) est toujours le "Plan B". Je crois qu'il devrait être plutôt facile d'écrire, disons un client webservice, dont le côté serveur est fait en Java, n'est-ce pas? – mindas

1

Ecrivez un wrapper C pour s'interfacer avec PAM et dans l'implémentation, utilisez JNI pour appeler une instance de la JVM.

Les enveloppes de lancement de JVM étaient très populaires lorsque les gens voulaient encore livrer des «exe» qui exécutaient réellement des programmes dans les JAR. Vous voudrez regarder dans ce qui n'est pas normalement fait avec JNI, appelant une JVM à partir d'un exécutable binaire; de façon inattendue, la plupart des instructions JNI se concentrent sur l'appel du code C depuis Java.

Un bon exemple de création d'une JVM à partir du code C peut être trouvé here. Transformer le module de code C en une bibliothèque d'objets partagés PAM nécessitera un peu de travail, mais il ne sera probablement pas trop difficile. Enfin, n'oubliez pas que JNI utilise et renvoie des types Java pour la plupart de ses opérations. Cela signifie que vous devrez lire les types de données "C" (probablement char *) et créer des chaînes Java avant de les transmettre dans votre JVM. Il en va de même à l'inverse pour recevoir des informations de Java et les renvoyer aux bibliothèques PAM.

Bonne chance!

+0

Merci. J'ai oublié de mentionner que mon authentification fait une recherche dans la base de données et implique un bon groupe d'autres JARs. Il semble que ce sera difficile à gérer avec JNI ... – mindas

+0

Vous utiliserez seulement moins de 100 lignes de C pour invoquer une JVM. Une fois que vous avez une JVM en cours d'exécution dans votre programme C, vous pouvez compter sur le chargement des classes, etc., d'une manière assez normale. Cela pourrait ne pas être aussi mauvais que vous le pensez! –

+0

Je me souviens d'avoir ressenti de grandes souffrances en 2003 en essayant d'épouser Java et PHP4. C'était pour faire quelques appels PHP simples à Java API via "Java support en PHP". Je sais que c'est une situation différente ici mais je me suis juré de ne plus jamais suivre le même chemin. Comme je l'ai commenté sur l'autre réponse, je préfèrerais coder un client webservice C ou quelque chose de similaire pour y parvenir. Mais merci beaucoup de toute façon - votre suggestion et lien pourrait être utile pour quelqu'un d'autre qui regarde ce sujet. – mindas

0

Vous pouvez réellement obtenir Java pour parler à un bouchon C qui se connecte à tour de rôle aux rappels PAM. Lire sur JNI (Java Native Interface). La plupart du temps, JNI est utilisé pour exposer C à Java, mais vous pouvez le faire dans l'autre sens. Vous pouvez également étudier GNU CNI car il est plus pratique à utiliser. Il y a beaucoup de ressources énumérées à la Wikipedia JNI page

0

http://jaas-pam.sourceforge.net/

Il fait l'authentification des utilisateurs et travaille avec le domaine de jaas de Tomcat, mais retourne pas d'info groupe/rôle, donc pas auth Web basée sur les rôles.

2

Avez-vous pensé à utiliser pam_exec?

Il vous permet d'exécuter un script pour PAM.

par exemple.Vous ajoutez quelque chose comme ce qui suit à votre configuration PAM:

auth sufficient pam_exec.so expose_authtok /usr/local/bin/myscript-example 

est ici un script simple qui fait écho à tous les vars, mais vous pourriez aussi avoir facilement le coup d'envoi d'un programme Java, en passant les vars nécessaires

.

Selon que le script réussit ou que les erreurs se produisent, vous devez contrôler si l'authentification a réussi ou non.

Exemple de script pour refléter tous les vars:

#!/bin/sh 
read password 
echo "User: $PAM_USER" 
echo "Ruser: $PAM_RUSER" 
echo "Rhost: $PAM_RHOST" 
echo "Service: $PAM_SERVICE" 
echo "TTY: $PAM_TTY" 
echo "Password : $password" 
exit $? 
Questions connexes