tar*_*rka 7 linux ssh authentication openssh
我有一组服务器(Debian/Ubuntu),我需要为其创建自定义 ssh 身份验证机制。
我找到了几个“相同”的例子,供Duo和Authy参考。他们使用自己的 API 进行身份验证,但将 ssh 身份验证过程委托给单独的应用程序的想法是我试图实现的。
理想情况下,我想用 C++ 编写身份验证程序,但如果需要,我很乐意编写它的脚本。
use*_*686 11
如果你只是想实现自己的方式来检查输入的密码,那么编写一个 PAM 模块。它是一个简单的 .so 库,其中包含一个pam_sm_authenticate()函数。(还可以提供授权、修改密码等功能)
从这样的东西开始(在 C 中),使用-shared将其编译为 .so 库,复制到 /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,
};
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参阅Linux-PAM 模块编写者指南以及各种其他来源。
[在弄乱 sshd 的配置之前,您可以使用pamtester在本地验证模块。]
但是请注意, pam_sm_authenticate()仅在类似密码的登录时被调用——在 SSH 中,这意味着要么是 thepassword要么kbd-interactiveauth 方法。不需要检查 SSH 密钥对或 Kerberos 票证——前者是 sshd 内部的,后者由 libkrb5 完成。
(另请注意,PAM 有一个单独的授权阶段,用于检查用户是否被允许使用系统。无论使用何种身份验证方法,SSH 服务器始终咨询 PAM 以获得授权。为此,请pam_sm_acct_mgmt()在您的模块中实现。)