使用自定义 SSH 身份验证机制 (OpenSSH)

使用自定义 SSH 身份验证机制 (OpenSSH)

我有一组服务器(Debian/Ubuntu),我需要为其创建自定义 ssh 身份验证机制。

我找到了几个‘差不多’可供参考的例子双人奥西。他们使用自己的 API 进行身份验证,但我想实现的是将 ssh 身份验证过程委托给单独的应用程序。

理想情况下,我希望用 C++ 编写身份验证程序,但如果需要的话,我很乐意编写脚本。

答案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 中,这意味着passwordkbd-interactiveauth 方法。它不用于检查 SSH 密钥对或 Kerberos 票证 – 前者是 sshd 内部的,后者由 libkrb5 完成。

(另请注意,PAM 有一个单独的授权检查用户是否被允许使用系统的阶段。无论使用何种身份验证方法,SSH 服务器始终会咨询 PAM 进行授权。为此,请pam_sm_acct_mgmt()在模块中实现。

相关内容