为OSX编写可插入认证模块(PAM)

时间:2014-08-26 21:02:27

标签: macos authentication dylib pam

我正在尝试使用基本的PAM来处理OSX上的屏幕保护程序身份验证。代码非常简单,只需对所有内容返回true(类似于pam_permit)。我希望当用户想要从屏幕保护程序返回他们的帐户时,无论他们输入什么密码,pam_sm_authenticate都会返回true。但是,这不起作用,并且仍然需要从屏幕保护程序返回正确的用户密码。我究竟做错了什么。具体做法是:

/ usr / lib / pam中的所有lib都是.so,但是我用Xcode构建的lib是.bundle或.dylib。我是否需要采取任何额外步骤来让PAM加载这些? (OSX noobie在这里)。

代码:

#define PAM_SM_ACCOUNT
#define PAM_SM_AUTH
#define PAM_SM_PASSWORD
#define PAM_SM_SESSION

#include <security/pam_appl.h>
#include <security/pam_modules.h>

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

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

PAM_EXTERN int pam_sm_acct_mgmt(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) {
    return(PAM_SUCCESS);
}

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_chauthtok(pam_handle_t *pamh, int flags, int argc, const char **argv) {
    return(PAM_SUCCESS);
}

我已尝试将上述内容构建到Xcode中的共享库中,输出为OSXLoginBundle.bundle(或.dylib),并已将此bundle / dylib复制到/ usr / lib / pam中。我已将/etc/pam.d中的屏幕保护程序配置文件更改为

# screensaver: auth account
auth       sufficient     OSXLoginBundle.bundle
account    required       pam_opendirectory.so
account    sufficient     pam_self.so
account    required       pam_group.so no_warn group=admin,wheel fail_safe
account    required       pam_group.so no_warn deny group=admin,wheel ruser fail_safe

1 个答案:

答案 0 :(得分:1)

我认为你的代码正在处理中,你已经检查过了,我认为你误解了pam是如何工作的。

参考pam.conf file(是的,我知道这里没有一个,但我相信这仍然适用于pam.d文件)

  

虽然相同服务和设施的行显示的顺序很重要,但列出各个服务和设施的顺序不是

如果您阅读pam-policies,则说明有4个模块链,每个设施一个(auth,帐户,会话,密码)。

pam-policies文件声明: -

  

当应用程序调用pam_start(3)时,PAM库会加载指定服务的策略并构造四个模块链(每个工具一个。)

作为一个应用程序调用pam可以访问6 authentication functions(基元),它们是根据4个工具分组的,当应用程序(本例中的屏幕保护程序)调用不在“auth”工具下的基元时,它与你的pam模块不匹配,而是与相关链中的模块匹配。

因此,当调用应用程序调用{​​{3}}时,它将引用/etc/pam.d中的屏幕保护程序文件并匹配相关设施,在这种情况下是“帐户”和其中一些模块被标记为“必需”。

如果您要将其政策更改为“可选”,则根据“pam_acct_mgmt”文档,这些模块的结果将被忽略。