Самый безопасный способ аутентифицировать пользователей против/etc/shadow, использующего PHP?

USB к последовательным устройствам как серия Prolific или FTDI не следует ни за какой официальной спецификацией. Вместо этого они используют две объемных конечных точки (один для вывода, один для входа) с определенными определенными для поставщика управляющими сообщениями, используемыми для конфигурирования вещей как baudrate. Таким образом это не слишком много удивления если что-то как дженерик usbserial драйвер испытывает затруднения при установке baudrates или выполнении других задач конфигурации на микросхеме FTDI. Поскольку Вы заметили, с помощью ftdi_sio будет работать намного лучше.

Даже 10.04 должен загружаться ftdi_sio по умолчанию, как ftdi_sio был hardcoded для обработки 4003:6001 (FT232) устройства для почти, пока Ubuntu существовала. Мое предположение - то, что Вы загружали два драйвера, которые были оба зарегистрированы для обработки 4003:6001 - один дизайном, одним должным к параметрам модуля. При изменении ядра или даже фаза луны могла означать, что каждый, оказывается, загружается перед другим - и если usbserial загружается сначала, Вы не сможете установить baudrate. Необходимо удалить руководство usbserial конфигурация, и позволила ftdi_sio обработайте устройство. Это будет работать и над 10,04 и над 12.04.

4
14.12.2013, 01:40
1 ответ

Метод 1: Мне не нравится просто, потому что за 2 секунды размышления об этом те комментарии чрезвычайно корректны. Вы создаете поверхность, которая выставляет Ваш /etc/shadow файлу, годно ли это для использования или нет, я просто, не нравится это имеющее необходимость сделать это.

Метод 2: также плохо. Кодирование паролей в файле является просто немым. Передача их через канал кажется одинаково опасной.

Метод 3: вероятно, путь, которым я пошел бы, и я не думаю, что необходимо было бы записать собственное решение с нуля. За несколько минут поиска с помощью Google я нашел эту реализацию, что кто-то соединил использование libpam API.

c реализация

выборка реализации C - pam.c

#include <security/pam_appl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct pam_response *reply;

int null_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr) {

        *resp = reply;
        return PAM_SUCCESS;

}

static struct pam_conv conv = { null_conv, NULL };

int main(int argc, char *argv[]) {

        int retval;
        char *user, *pass;   

        if(argc == 3) {

                user = argv[1];
                pass = strdup(argv[2]);

        } else { 

                fprintf(stderr, "Usage: login [username] [password]\n");
                exit(1);

        }

        return authenticate("system-auth", user, pass);

}   

int authenticate(char *service, char *user, char *pass) {

        pam_handle_t *pamh = NULL;
        int retval = pam_start(service, user, &conv, &pamh);

        if (retval == PAM_SUCCESS) {

                reply = (struct pam_response *)malloc(sizeof(struct pam_response));
                reply[0].resp = pass;
                reply[0].resp_retcode = 0;

                retval = pam_authenticate(pamh, 0);

                if (retval == PAM_SUCCESS)
                        fprintf(stdout, "Authenticated\n");

                else
                        fprintf(stdout, "Not Authenticated\n");

                pam_end(pamh, PAM_SUCCESS);

                return ( retval == PAM_SUCCESS ? 0:1 );

        }

        return ( retval == PAM_SUCCESS ? 0:1 );
} 

управляйте для компиляции его

$ gcc -g -lpam -o chkpasswd pam.c

пример выполняется

$ ./chkpasswd myusername mypassword

Я предположил бы, что с небольшим усилием этот подход мог быть адаптирован для удовлетворения потребностям с Ордой.

PHP implmentation

Как другая альтернатива этому подходу Вы могли потенциально самокрутка в PHP. Я нашел эту библиотеку PAM по веб-сайту PECL, который похож на то, что Вы хотели бы.

Я также смотрел бы на то, как проект Moodle делает это. Это обсуждено здесь.

PAM с точки зрения безопасности

Рассмотрение цели PAM, я ожидал бы, что API-интерфейс был разработан так, чтобы никакой доступ для понижения объектов уровня, такой как /etc/shadow, должен был бы требоваться так, чтобы пользователи API могли использовать его. Это обсуждено немного на хинду Wiki в этой названной статье: PAM, раздел: Как PAM работает.

отрывок из того, Как PAM работает

Таким образом, когда пользователь хочет аутентифицировать себя против, скажем, веб-приложения, затем это веб-приложение называет PAM (передающий идентификатор пользователя и возможно пароль или проблему) и проверяет, что PAM возвращается, чтобы видеть, аутентифицируется ли пользователь и предоставленный доступ к приложению. Это - задача PAMs underlyingly для наблюдения, где пройти проверку подлинности против (такие как центральная база данных или сервер LDAP).

Сила PAM состоит в том, что все могут создать модули PAM для интеграции с любым поддерживающим PAM сервисом или приложением. Если компания выпускает новый сервис для аутентификации, все, что она должна сделать, обеспечивают модуль PAM, который взаимодействует с его сервисом, и затем все программное обеспечение, которое использует PAM, может сразу работать с этим сервисом: никакая потребность восстановить или улучшить те программные продукты.

Метод 4: Также хорошая альтернатива. Должна быть хорошая доступность к библиотекам и такому для совершения вызовов, необходимых для доступа к чему-то как LDAP по проводу, чтобы сделать аутентификацию для Вас. Сервер LDAP мог также быть установкой в той же системе как установка Орды, настроив его для просто использования Орды.

Это получило бы Вас доступ к аутентификации базовой системы, потенциально, путем "обертывания" его в сервис LDAP для Орды для потребления.

Ссылки

3
27.01.2020, 20:58
  • 1
    Спасибо, это было полезно. Но я думаю, что Вы неправильно поняли № 2: это не сохраняет пароли в файлах, но эквивалент PHP /bin/su -c /bin/true $user < $(echo $pass). Иметь это в виду, я не уверен, если № 3 лучше, чем № 2. И относительно реализации PHP: Разве это не означало бы (снова), что веб-серверу нужен доступ к теневому файлу? –  xwst 15.12.2013, 00:42
  • 2
    @Stephan - Я все еще не полностью понимаю что это su команда будет делать затем. Разве это не передает пароль в su управляйте при казни для пользователя $user? Относительно Вашего Q относительно доступа к тени. Нет я не верю так, так как Вы будете получать доступ к тени косвенно через API PAM, который является, как это предназначено, чтобы быть. Я полагаю, что этот API обеспечивает защищенные методы для выполнения запросов аутентификации w/o имеющий необходимость дать полный доступ для чтения-записи к фактическому теневому файлу. –  slm♦ 15.12.2013, 05:08
  • 3
    то, что Вы сказали. Выполнение su ... и передача пароля к нему путем записи его в соответствующий канал. Исправьте меня, если я неправ, но даже если я использую API PAM, это - все еще просто библиотека, не демон. Таким образом, для процесса, использующего этот API, будут нужны права считать теневой файл!? –  xwst 15.12.2013, 17:38
  • 4
    @Stephan - А-ч на № 2, я вижу то, что Вы имели в виду. Я не уверен в опции канала. Это кажется опасным для меня все еще все же. Относительно API, я ожидал бы, что API сможет иметь дело с безопасностью немного лучше. Посмотрите здесь для проблем w/что подход: linux-pam.org/Linux-PAM-html/old/pam_appl-4.html –  slm♦ 15.12.2013, 19:01
  • 5
    @Stephan - добавленный больше деталей к о su и PAM. –  slm♦ 15.12.2013, 19:09

Теги

Похожие вопросы