【问题标题】:Linux PAM module in JavaJava中的Linux PAM模块
【发布时间】:2011-03-09 20:32:05
【问题描述】:

我确实有一个用 Java 编写的自定义身份验证机制。我想知道在不重写 C 代码的情况下实现 Linux PAM 模块的最佳方法是什么?

我知道this list of available PAM modules,但它们都与 Java 无关。

还有JPam,但它做了相反的事情:它允许获取要在 Java 应用程序中使用的用户/组信息,而我需要使用现有的 Java 代码来验证 Linux 中的用户(例如通过 SSH)。

欢迎提出任何建议。

【问题讨论】:

    标签: java linux authentication pam


    【解决方案1】:

    你有没有想过使用pam_exec?

    它允许您为 PAM 运行脚本。

    例如您将以下内容添加到您的 PAM 配置中:

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

    这是一个简单的脚本,它可以输出所有的变量,但您也可以轻松地启动一个 Java 程序,传入所需的变量。

    根据脚本是否成功或错误输出来控制授权是否成功。

    反映所有变量的示例脚本:

    #!/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 $?
    

    【讨论】:

      【解决方案2】:

      你可以试试:

      • 使用 GCJ 将 Java 程序编译为本机代码
      • 编写嵌入 JVM 并加载 Java 代码的胶水 C 程序

      但这些想法似乎都不理想。

      【讨论】:

      • 第二个选项(胶水 C 应用程序)始终是“B 计划”。我相信它应该很容易编写,比如说一个 web 服务客户端,它的服务器端是用 Java 完成的,不是吗?
      【解决方案3】:

      编写一个 C 包装器来与 PAM 交互,并在实现中使用 JNI 调用 JVM 实例。

      当人们仍然希望交付真正在 JAR 中运行程序的“exe”时,JVM 启动包装器非常流行。您需要了解 JNI 通常不做的事情,即从二进制可执行文件调用 JVM;不幸的是,大多数 JNI 指令都专注于从 Java 调用 C 代码。

      可以在here 中找到如何从 C 代码创建 JVM 的一个很好的示例。将 C 代码模块转换为 PAM 共享对象库需要一些工作,但不会太难。

      最后,不要忘记 JNI 的大部分操作都使用并返回 Java 类型。这意味着您必须先读取“C”数据类型(可能是 char*)并创建 Java 字符串,然后才能将它们传递到您的 JVM。反过来,从 Java 接收信息并将其传递回 PAM 库也是如此。

      祝你好运!

      【讨论】:

      • 谢谢。忘了提到我的身份验证会进行数据库查找并涉及很多其他 JAR。看起来用 JNI 处理会很痛苦......
      • 您只需要使用不到 100 行的 C 代码来调用 JVM。一旦在 C 程序中运行了 JVM,就可以以非常正常的方式依赖类加载等。它可能没有你想的那么糟糕!
      • 我记得在 2003 年左右试图将 Java 和 PHP4 结合起来时经历了巨大的痛苦。这是为了通过“PHP 中的 Java 支持”对 Java API 进行一些简单的 PHP 调用。我知道这是不同的情况,但我发誓我再也不会走同样的路了。正如我对另一个答案的评论,我宁愿编写一个 C webservice 客户端或类似的东西来实现这一点。但无论如何,非常感谢您 - 您的建议和链接可能对查看此主题的其他人有用。
      • 好吧,祝你的图书馆好运。顺便说一句,现在我们有一个用 Java 实现的 PHP 解释器。我知道,对于不同的问题,一个解决方案为时已晚,但也许它会让你微笑。
      【解决方案4】:

      您实际上可以让 Java 与 C 存根对话,该存根又连接到 PAM 回调。阅读 JNI(Java 本机接口)。大多数情况下,JNI 用于将 C 暴露给 Java,但实际上您可以反过来做。您可能还想研究 GNU CNI,因为它实际上更方便使用。 Wikipedia JNI page上列出了很多资源

      【讨论】:

        【解决方案5】:

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

        它进行用户身份验证并与 Tomcat 的 jaas 领域一起使用,但不返回组/角色信息,因此没有基于角色的 Web 身份验证。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-19
          • 1970-01-01
          相关资源
          最近更新 更多