tl; dr version: если вы хотите реализовать свой собственный способ проверки введенного пароля, напишите модуль PAM с функцией pam_sm_authenticate() , скомпилируйте его как и добавьте его в /etc/pam.d/sshd
сервера.
См. Руководство по написанию модулей Linux-PAM, а также другие источники. Начните с чего-то вроде этого:
#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
(который вызывает вторую аутентификацию слой - GSSAPI - и почти всегда отправляет билет Kerberos ).
Эти методы аутентификации реализованы непосредственно в OpenSSH, и вам придется редактировать его исходный код (как клиентский, так и серверный), чтобы реализовать его с нуля. Тем не менее, некоторые из них можно расширить, так как они уже вызывают внешние библиотеки:
При использовании метода password
клиент отправляет необработанный пароль, а сервер вызывает библиотеку PAM для его проверки. Затем PAM использует такие модули, как pam_unix
(проверка по /etc /passwd + /etc /shadow), 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
- проверить полученный пароль на Kerberos KDC ("поддельный Kerberos")
- передать полученный пароль PAM (libpam), который затем вызывает настроенный стек модулей:
pam_unix
для проверки на /etc /shadow
pam_radius
для RADIUS
pam_krb5
для "поддельного" Kerberos
pam_opie
для одноразовых паролей
- и т.п.
- Метод
publickey
- отправить запрос, чтобы клиент подписал его ключом пользователя
keyboard-interactive
метод клавиатуры - любое количество вопросов-ответов
- взаимодействовать с PAM
- те же модули PAM, что и выше, но могут иметь несколько запросов
- взаимодействовать с bsdauth
- и т.п.
gssapi-with-mic
- вызвать библиотеку GSSAPI; перемешивать сообщения между библиотекой и клиентом
- Kerberos (99,9% времени) - проверьте билет, отправленный клиентом
- NTLM, SPKM3, GSS-BrowserID и т.д. (Редко, но возможно)
- метод на основе
hostbased
- отправьте запрос, попросите клиента подписать его ключом хоста