Простой пример PAM

Я хочу разработать модуль аутентификации с использованием PAM, но не могу заставить работать простой пример.

Для начала я хотел бы сделать простую систему входа по SSH, где, если пользователь вводит имя пользователя backdoor, он будет входить в систему без пароля (точно так же, как в TRON Legacy).

Я попытался использовать это руководство в качестве шаблона, но не могу заставить его работать. Вот мой код:

PAM_EXTERN int pam_sm_setcred( pam_handle_t *pamh, int flags, int argc, const char **argv ) {
    return PAM_SUCCESS ;
}

PAM_EXTERN int pam_sm_authenticate( pam_handle_t *pamh, int flags,int argc, const char **argv ) {
    int retval;

    printf("I'm here");

    const char* pUsername;
    retval = pam_get_user(pamh, &pUsername, "Username: ");
    if (retval != PAM_SUCCESS) {
        return retval;
    }

    if (strcmp(pUsername, "backdoor") != 0) {
        return PAM_AUTH_ERR;
    }
    return PAM_SUCCESS;
}

Когда я вхожу под именем backdoor, мне отказывают в доступе. Я пытался создать учетную запись пользователя, но мне все еще предлагается ввести пароль.

Когда я вхожу в систему с действительным пользователем, я вижу распечатку «Я здесь». Есть ли лучший способ отладить что-то подобное или это в основном метод проб и ошибок?

РЕДАКТИРОВАТЬ:

Я добавил это в свой /etc/pam.d/sshd после @include common-auth:

auth sufficient mypam.so

Это происходит после двух других файлов .so, но я уверен, что он выполняется каждый раз.

Я не модифицировал pam.conf (там ничего нет). Я решил, что начать с SSH будет проще всего, потому что мне не нужно каждый раз выходить из системы.

РЕДАКТИРОВАТЬ:

Наконец-то я заработал. Вот результат:

https://github.com/beatgammit/simple-pam

Это с открытым исходным кодом, так что если вам интересно, взгляните!


person beatgammit    schedule 24.05.2011    source источник
comment
Спасибо, что рассказали нам о бэкдоре. ;-) Но вы можете сделать это с другим набором правил и конфигурациями, используя существующие модули.   -  person Keith    schedule 24.05.2011
comment
Да, но это не моя конечная цель. В конечном итоге я хочу создать систему аутентификации на основе HTTP, но я полагаю, что мне нужно сначала настроить что-то простое, на чем можно будет основываться.   -  person beatgammit    schedule 24.05.2011
comment
Ну, вы также можете сделать это таким же образом. Но мне любопытно, что вы имеете в виду под этим. Интерфейс системы HTTP-аутентификации или серверная часть?   -  person Keith    schedule 24.05.2011
comment
О, бэкенд. Я хочу иметь учетные данные на веб-сервере. Это часть более крупного проекта, но в основном я хочу иметь перемещаемую систему аутентификации, а не полагаться на записи /etc/passwd. Я знаю, что это возможно, потому что я видел примеры, но у меня просто проблемы с работой простого примера.   -  person beatgammit    schedule 24.05.2011
comment
Как LDAP, но настроенный. Подумайте о системе входа в систему на основе OpenID или OAuth или чего-то еще. Это то, чего я хочу добиться. Я могу заниматься всеми бэкендами (включая безопасность), но у меня нет опыта работы с PAM.   -  person beatgammit    schedule 24.05.2011
comment
Ах, круто. тогда это серьезный роуминг. :-) Тогда, наверное, неплохо было бы начать с исходного кода PAM и изучить его.   -  person Keith    schedule 24.05.2011
comment
Я, пожалуй, начну с создания модуля Node.js для PAM. Пока их нет, и я думаю, что это было бы очень полезно (плюс мне все равно больше нравится JS, чем C...)   -  person beatgammit    schedule 24.05.2011
comment
Это было бы прекрасно. Я только начал изучать Node.js сам.   -  person Keith    schedule 24.05.2011
comment
Прохладный. Я выкладываю материал на GitHub, и если я заставлю этот модуль работать хорошо, я обязательно буду хвастаться им везде =D Конечно, все это будет с открытым исходным кодом.   -  person beatgammit    schedule 24.05.2011
comment
С какой конфигурацией pam (строки pam.conf или pam.d/*) вы это используете? Добавьте некоторые выходные данные трассировки непосредственно перед каждым return, чтобы увидеть, что именно происходит. Может ли быть так, что ваш модуль возвращает PAM_SUCCESS, но какой-то другой требуемый модуль говорит «нет»?   -  person Gilles 'SO- stop being evil'    schedule 24.05.2011
comment
sshd — это не просто аутентификация. Вам также необходимо разрешение на учетную запись и сеанс, которые вы не предоставляете. На самом деле вы делаете более сложный случай, чем ваша цель HTTP-аутентификации.   -  person Mel    schedule 24.05.2011
comment
@Mel Хм .. Наверное, я. Я просто хотел проверить это, и я предполагал, что SSH будет проще, но то, что вы сказали, имеет смысл.   -  person beatgammit    schedule 25.05.2011


Ответы (1)


Во-первых, достаточное все равно будет терпеть неудачу, если предыдущий требуемый модуль вышел из строя. Поскольку вы говорите, что поместили свою достаточную строку под включением common-auth, вы можете столкнуться с ошибкой, потому что какой-то обязательный модуль в common-auth уже запретил доступ. Кроме того, у вас есть sshd, который мешает.

Я бы убрал все это с дороги, чтобы вы знали, что ваш тест - это действительно тест вашего модуля pam, а не какое-то дальнейшее взаимодействие с другими вещами. Я бы начал с простой тестовой программы, такой как здесь с /etc/pam.d/check_user, указывающим ваш модуль вместо pam_unix.

person Ciclamino    schedule 24.05.2011
comment
Хорошо, я посмотрю на это. Это, вероятно, будет проще, чем пытаться обойти весь SSH-материал. - person beatgammit; 25.05.2011
comment
Вы поставили меня на правильный путь, и у меня работает простой пример. Большое спасибо! - person beatgammit; 25.05.2011