如何在 C 程序中通过 PAM 查询 sssd?

How can I query sssd via PAM in a C program?

我正在使用一个小型 C 程序尝试 PAM 身份验证:

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

int main()
{
    pam_handle_t* pamh;
    struct pam_conv pamc;

    pamc.conv = &misc_conv;
    pamc.appdata_ptr = NULL;
    pam_start("su", getenv("USER"), &pamc, &pamh);
    if (pam_authenticate(pamh, 0) != PAM_SUCCESS) {
        fprintf(stderr, "Auth failed!\n");
    } else {
        fprintf(stderr, "Auth succeeded!\n");
    }
    pam_end(pamh, 0);
    return 0;
}

两种用户可以访问我的系统,一种是在本地影子数据库中创建的,另一种是遍历配置的 sssd 进程到 authenticate with LDAP against a remote active directory.

我已经配置 sssd 以插入 PAM,我可以通过系统上的一些日志和 sssd 的调试输出来确认这一点,但上面的程序只能工作对于本地用户。需要根据 sss 进行身份验证的用户从 pam_authenticate 获得 PAM_AUTH_ERROR 返回,无论他们是否输入了正确的凭据。

我肯定遗漏了一些明显的东西。如何在 C 程序中通过 PAM 访问 sss

根据

pam_start("su", getenv("USER"), &pamc, &pamh);
          ^^^^

您正在使用 su PAM 服务。

在典型的默认配置中,su PAM 堆栈可能未配置为使用 pam_sss 响应程序。

可能的解决方案:

  • 如果使用 su 适合您的应用程序,请更新 /etc/pam.d/su 以使用 pam_sss

  • 使用已配置为使用 pam_sss 的不同 PAM 服务; login 例如。

  • /etc/pam.d/<service-name>

  • 中为您的应用程序创建专用的 PAM 服务