在哪里放置 PAM 模块?

Where to put a PAM module?

我目前正在尝试测试一个 PAM 模块,这个:http://www.linux-pam.org/Linux-PAM-html/adg-example.html

没有关于放置 .o 文件的位置的指示。

我试着把它放在 /lib/security/usr/lib/security 但它不起作用。

我在编译时没有出错:

$ gcc -fPIC -c check_user.c
$ ld -x --shared -o check_user.so check_user.o

如上所示,我将这些行放在 /etc/pam.d/check_user:

auth       required     pam_unix.so
account    required     pam_unix.so

它似乎不起作用,因为当我尝试使用另一个帐户登录时,我没有收到消息。怎么了?

您链接的文件不是 pam 模块,只是一个使用 pam_unix.so 用 C 语言编写的简短应用程序。你必须编译 运行 check_user.

实际上,您正在浏览 Linux PAM 应用程序开发人员指南,您可能需要查看模块开发指南:http://www.linux-pam.org/Linux-PAM-html/Linux-PAM_MWG.html

如果您需要在登录时启动应用程序(如您的评论中所述)并且您想要使用 pam,您可以在 pam_exec (http://linux.die.net/man/8/pam_exec) 上进行中继。

将此行添加到 /etc/pam。d/login:

session         optional        pam_exec.so /usr/local/bin/my_prog

另请参阅此 post:https://unix.stackexchange.com/questions/122424/execute-a-command-on-user-logon

对于那些想要创建 PAM 模块的人来说,这里有一个很好的例子:https://github.com/beatgammit/simple-pam

就我而言,在我的 PAM 模块中调用以在 login/logout 处执行某些操作的函数是:

PAM_EXTERN int pam_sm_open_session(pam_handle_t *pamh, int  flags,int argc, const char **argv ) {
    printf("Connected\n");
    return PAM_SUCCESS;
}

PAM_EXTERN int pam_sm_close_session(pam_handle_t *pamh, int  flags,int argc, const char **argv ) {
    printf("Disconnected\n");
    return PAM_SUCCESS;
}

README中所示,so文件需要放入/lib/security/