tl;dr версия: если вы хотите реализовать свой собственный способ проверки введенного пароля, напишите модуль PAM, который имеет pam_sm_authenticate() функция, скомпилировать его как, и добавить его к серверу /etc/pam.d/sshd
.
посмотреть Linux-Pam Module руководство писателя а также другие источники. Начните с чего-то вроде этого:
#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 = {
"pam_foobar",
pam_sm_authenticate,
NULL,
NULL,
NULL,
NULL,
NULL,
};
[можно использовать pamtester чтобы проверить модуль локально, прежде чем связываться с конфигурацией sshd.]
" попытка ответить на "реальный" вопрос " версия: это зависит от того, что вы на самом деле подразумеваете под "пользовательским механизмом аутентификации".
обычно слово "механизм" используется протоколами, такими как SASL или GSSAPI для описания всего "диалога" между клиентом и сервером - использует ли он пароль или пару ключей; хэшируется ли пароль, шифруется или отправляется в простом виде; доказывает ли механизм только идентичность клиента, или также сервера; и так далее. В SSH то же самое называют "методом аутентификации".
уровень аутентификации SSH имеет несколько методов аутентификации "верхнего уровня". Наиболее распространенные из них password
(который только отправляет необработанный пароль на сервер),public-key
(который использует ваш SSH id_rsa
ключей подписать запрос с сервера), и gssapi-with-mic
(который вызывает в second уровень аутентификации-GSSAPI – и почти всегда присылает Kerberos билет).
эти методы реализуются непосредственно в OpenSSH и вам придется изменять ее исходный код (клиент и сервер) для реализации с нуля. Однако некоторые из них можно расширить, так как они уже обращаются во внешние библиотеки:
С password
метод, клиент отправляет необработанный пароль, а сервер вызывает библиотеку PAM для его проверки. PAM затем использует модули, такие как pam_unix
(проверьте для /etc/passwd С + /и т. д./тень), pam_radius
(проверка на сервере RADIUS) и так далее. Они настраиваются через /etc/pam.d
.
С gssapi-with-mic
метод, как клиент, так и сервер вызывают библиотеку GSSAPI, которая обычно имеет Kerberos в качестве встроенного механизма GSSAPI и позволяет добавлять пользовательские; в Linux это настраивается через либо /etc/gss/mech
или /etc/gssapi_mech.conf
файлы.
иерархии есть, в основном:
- соединение SSH (sshd)
password
метод-один простой запрос пароля
- проверьте полученный пароль на /etc / shadow
- проверьте полученный пароль на KDC Kerberos ("поддельный Kerberos")
- дает полученный пароль PAM (libpam), который затем вызывает настроенный стек модулей:
pam_unix
для проверки на /etc / shadow
pam_radius
для RADIUS
pam_krb5
"липовых" Керберос
pam_opie
для одноразовых паролей
- etc.
publickey
метод - отправить вызов, пусть клиент подпишет его ключом пользователя
keyboard-interactive
метод-любое количество вопросов-ответов
- взаимодействие с PAM
- такие же модули PAM как выше, но могут иметь многократную цепь подсказки
- взаимодействовать с bsdauth
- etc.
gssapi-with-mic
метод-вызов библиотеки GSSAPI; переключение сообщений между библиотекой и клиентом
- Kerberos (99,9% времени) - проверка билета, отправленного клиентом
- NTLM, SPKM3, GSS-BrowserID и т. д. (редко, но возможно)
hostbased
способ – отправлять вызов, клиент подписывать с host key