PAM 服务模块使用 pam_get_item(3PAM) 和 pam_set_item(3PAM) 与应用程序进行通信。要相互进行通信,服务模块需要使用 pam_get_data(3PAM) 和 pam_set_data(3PAM)。如果同一项目的服务模块需要交换数据,则应建立该项目的唯一数据名称。然后,服务模块即可通过 pam_get_data() 和 pam_set_data() 函数共享此数据。
服务模块必须返回以下三类 PAM 返回码之一:
如果模块在所请求的策略中做出了明确决定,则返回 PAM_SUCCESS。
如果模块未做出策略决定,则返回 PAM_IGNORE。
如果模块参与的决定导致失败,则返回 PAM_error。error 可以是常规错误代码或特定于服务模块类型的代码。错误不能是其他服务模块类型的错误代码。有关错误代码,请参见特定的 pam_sm_module-type 手册页。
如果服务模块执行多个函数,则应将这些函数分成单独的模块。使用此方法,系统管理员可对策略配置进行更为精细的控制。
应该为任何新的服务模块提供手册页。手册页应该包括以下各项:
模块接受的参数。
模块实现的所有函数。
标志对算法的影响。
任何所需的 PAM 项。
特定于此模块的错误返回信息。
服务模块必须支持 PAM_SILENT 标志,以防止显示消息。建议使用 debug 参数将调试信息记录到 syslog 中。请将 syslog(3C) 与 LOG_AUTH 和 LOG_DEBUG 结合使用来记录调试。其他消息应发送到具有 LOG_AUTH 和相应优先级的 syslog()。决不能使用 openlog(3C)、closelog(3C) 和 setlogmask(3C),因为这些函数会干扰应用程序设置。