为什么pam_sm_authenticate在ssh登录时被调用了两次?

why pam_sm_authenticate is called twice when ssh login?

我正在尝试制作 PAM 模块来验证用户和密码,并在发生注销时得到一个陷阱,但我不明白为什么 pam_sm_authenticate 被调用两次?
我已经建立了自己的 pam_hook.so ,编译它:

 gcc -fPIC -Wall -shared -lpam -o pam_hook.so pam_hook.c  

我已经实现了这个功能:

PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv);
PAM_EXTERN int pam_sm_setcred(pam_handle_t *pamh, int flags, int argc, const char **argv);
PAM_EXTERN int pam_sm_chauthtok(pam_handle_t    *pamh,const int flags,int argc,const char **argv);
PAM_EXTERN int pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, int argc, const char **argv);
PAM_EXTERN int pam_sm_open_session(pam_handle_t *pamh, int flags, int argc, const char **argv);
PAM_EXTERN int pam_sm_close_session(pam_handle_t *pamh, int flags, int argc, const char **argv);

我已将每次进入此功能的记录打印到文件中。 sshd 用户登录时函数的调用顺序:

function :  pam_sm_authenticate 
function :  pam_sm_setcred 
function :  pam_sm_open_session  
function :  pam_sm_setcred 
function :  pam_sm_authenticate 

并在 sshd 注销上:

function :  pam_sm_close_session  
function :  pam_sm_setcred 

我不明白为什么 pam_sm_authenticate 它被调用了两次, 我的 /etc/pamd.d/sshd:

# cat /etc/pam.d/sshd
 session     optional       /path_to/pam_hook.so
 auth        requisite       /path_to/pam_hook.so

刚遇到这个问题,我花了一些时间才找到原因。 在我的例子中,我使用 pam_sm_authenticate() 中的自定义对话来询问用户第二个密码。 我的模块调用了两次,但第一次我的对话没有提示给用户,虽然成功了 return 值。响应为空,所以我的模块验证失败。

通过 openssh 代码我发现如果 PasswordAuthentication 设置为 yes,sshd 将使用“盲”方法进行对话。 您的提示将被忽略,响应将是用户之前提供的密码。我的密码是空的,所以我的模块得到空响应。

讨厌这种未记录的魔法..