6

У меня есть коллекция серверов (Debian/Ubuntu), для которых мне нужно создать собственный механизм аутентификации ssh.

Я нашел пару примеров «тот же самый» для ссылок с Duo и Authy. Они используют свой собственный API для выполнения аутентификации, но я пытаюсь реализовать идею делегирования процесса аутентификации ssh отдельному приложению.

В идеале я хотел бы написать программу аутентификации на C++, но я рад написать ее, если это то, что нужно.

1 ответ1

9

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 - отправьте запрос, попросите клиента подписать его ключом хоста

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .