答案1
如果您只想实现自己的检查输入密码的方法,那么请编写一个 PAM 模块。它是一个简单的 .so 库,其中包含验证 pam_sm_authenticate()功能。(还可提供授权,密码修改等功能)
从类似这样的内容开始(用 C 语言),使用 将其编译为 .so 库-shared
,复制到 /lib/security/pam_foobar.so,最后将其添加到服务器的 PAM 配置(/etc/pam.d/sshd)——可能替换标准 pam_unix 模块。
#define PAM_SM_AUTH
#include <security/pam_modules.h>
#include <security/pam_appl.h>
int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char *argv[]) {
return PAM_SUCCESS;
}
struct pam_module pam_foobar_modstruct = {
.name = "pam_foobar",
.pam_sm_authenticate = pam_sm_authenticate,
.pam_sm_setcred = NULL,
.pam_sm_acct_mgmt = NULL,
.pam_sm_open_session = NULL,
.pam_sm_close_session = NULL,
.pam_sm_chauthtok = NULL,
};
有关详细信息,请参阅Linux-PAM 模块编写者指南也其他各种来源。
[您可以使用测试仪在修改 sshd 的配置之前,在本地验证模块。
但请注意,pam_sm_authenticate()仅在类似密码的登录时调用– 在 SSH 中,这意味着password
或kbd-interactive
auth 方法。它不用于检查 SSH 密钥对或 Kerberos 票证 – 前者是 sshd 内部的,后者由 libkrb5 完成。
(另请注意,PAM 有一个单独的授权检查用户是否被允许使用系统的阶段。无论使用何种身份验证方法,SSH 服务器始终会咨询 PAM 进行授权。为此,请pam_sm_acct_mgmt()
在模块中实现。