简单的PAM示例

时间:2011-05-24 04:56:12

标签: c linux pam

我想使用PAM开发一个身份验证模块,但是我无法让一个简单的示例工作。

对于初学者,我想做一个简单的SSH登录系统,如果用户输入用户名backdoor,那么用户将在没有密码的情况下登录(就像在TRON Legacy中一样)。

我尝试使用this guide作为模板,但我无法让它工作。到目前为止,这是我的代码:

PAM_EXTERN int pam_sm_setcred( pam_handle_t *pamh, int flags, int argc, const char **argv ) {
    return PAM_SUCCESS ;
}

PAM_EXTERN int pam_sm_authenticate( pam_handle_t *pamh, int flags,int argc, const char **argv ) {
    int retval;

    printf("I'm here");

    const char* pUsername;
    retval = pam_get_user(pamh, &pUsername, "Username: ");
    if (retval != PAM_SUCCESS) {
        return retval;
    }

    if (strcmp(pUsername, "backdoor") != 0) {
        return PAM_AUTH_ERR;
    }
    return PAM_SUCCESS;
}

当我使用名称backdoor登录时,我获得了许可被拒绝。我尝试过创建用户帐户,但仍然会提示输入密码。

当我使用有效用户登录时,我看到“我在这里”打印输出。有没有更好的方法来调试这样的东西,或者它主要是试验和错误?

编辑:

我在@include common-auth:

之后将其添加到我的/etc/pam.d/sshd

auth sufficient mypam.so

这是在其他两个.so文件之后,但我很确定它每次都会被执行。

我没有修改过pam.conf(那里没有任何东西)。我认为从SSH开始是最容易的,因为我不必每次都注销。

编辑:

我终于开始工作了。结果如下:

https://github.com/beatgammit/simple-pam

它是开源的,所以如果您有兴趣,请看一下!

1 个答案:

答案 0 :(得分:3)

首先,如果先前所需的模块发生故障,则足够的仍然会失败。既然你说你已经将足够的行放在common-auth的包含之下,那么你可能会看到失败,因为common-auth中的某些必需模块已经拒绝访问。另外,你已经让sshd挡路了。

我会把所有这些东西都拿走,所以你知道你的测试真的是对你的pam模块的测试,而不是与其他事情的进一步互动。我将从一个简单的测试程序开始,例如here,其中/etc/pam.d/check_user列出了您的模块,而不是pam_unix。