【问题标题】:PAM authenticate a user in CPAM 在 C 中对用户进行身份验证
【发布时间】:2020-10-03 23:36:30
【问题描述】:

好的,所以我是一个非常糟糕的编码员,我想知道(如标题所示)如何使用 C 使用 PAM 对 Linux 用户进行身份验证。我唯一真正了解的是包括 pam_appl.hpam_misc.h 头文件,我需要将 pam_startpam_end 放在我的代码中的某个位置,仅此而已。那么我将如何实现我想要的呢?

【问题讨论】:

标签: c pam


【解决方案1】:

你需要使用pam_authenticate函数。

使用 PAM 需要比 StackOverflow 平均答案长一点的答案;但是,幸运的是,有一本关于这个主题的完整在线书籍http://www.linux-pam.org/Linux-PAM-html/Linux-PAM_ADG.html

如果你只想得到一个代码sn-p,你可以从这个开始

#include <security/pam_appl.h>
#include <security/pam_misc.h>
#include <stdio.h>

static struct pam_conv conv = {
    misc_conv,
    NULL
};

int main(int argc, char *argv[])
{
    pam_handle_t *pamh=NULL;
    int retval;
    const char *user="nobody";

    if(argc == 2) {
        user = argv[1];
    }

    if(argc > 2) {
        fprintf(stderr, "Usage: check_user [username]\n");
        exit(1);
    }

    retval = pam_start("check_user", user, &conv, &pamh);

    if (retval == PAM_SUCCESS)
        retval = pam_authenticate(pamh, 0);    /* is user really user? */

    if (retval == PAM_SUCCESS)
        retval = pam_acct_mgmt(pamh, 0);       /* permitted access? */

    /* This is where we have been authorized or not. */

    if (retval == PAM_SUCCESS) {
        fprintf(stdout, "Authenticated\n");
    } else {
        fprintf(stdout, "Not Authenticated\n");
    }

    if (pam_end(pamh,retval) != PAM_SUCCESS) {     /* close Linux-PAM */
        pamh = NULL;
        fprintf(stderr, "check_user: failed to release authenticator\n");
        exit(1);
    }

    return ( retval == PAM_SUCCESS ? 0:1 );       /* indicate success */
}

这将适用于正确的 PAM 设置,包括

  You need to add the following (or equivalent) to the
  /etc/pam.d/check_user file:
  # check authorization
  auth       required     pam_unix.so
  account    required     pam_unix.so
 */

如上述书中所述。这段代码sn-p的原始出处可以在http://www.linux-pam.org/Linux-PAM-html/adg-example.html找到

【讨论】:

  • 非常有帮助。但是我想给 PAM 一个现有的密码,而不是通过 PAM 给我的密码提示进行输入。我在书中能找到的最接近的东西是PAM_AUTHTOK,但书中说它被除pam_sm_authenticatepam_sm_chauthtok 之外的所有东西所忽略,除非我很愚蠢,这种情况更有可能发生。
  • PAM 不关心密码的来源。但是,如果您想存储经过身份验证的会话,则 PAM_AUTHTOK 就是您存储的内容。当然,这些会议不会永远持续下去。但是,假设会话没有超时,您从磁盘加载先前保存的会话信息,然后使用 pam_sm_chauthtok 替换当前授权(或缺少授权)。如果您想存储和重用密码短语,那不是授权子系统提供的功能(我认为),事实上,这是一种显然不应该是 pam_authenticate 的功能。
  • 最终到达那里。必须为 pam_conv 制作一个自定义函数,但它有效。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2013-03-11
  • 2012-07-18
  • 2021-06-11
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
相关资源
最近更新 更多