|| разделы:: | |
|| поиск по сайту:: | |
|| реклама:: | |
|| новости почтой:: | |
Популярные статьи |
|
Hot 5 Stories |
|
|| рекомендуем:: |
|
| |
Аутентификация пользователей через Веб-интерфейс
Аутентификация пользователей через Web интерфейс.
Про аутентификацию пользователей написано масса статей и для оной процедуры
изготовлено сотни скриптов.
Однако, в большинстве своем все эти методы рассчитаны на хранение
логинов/паролей в отдельном файле, или на аутентификацию пользователей с помошью
апачесвкого .htaccess.
Здесь же речь пойдет про аутентификацию реальных пользователей Unix сервера через
веб-интерфейс.
Есть довольно много методов для решения этой задачи, но используют в основном
два способа:
- шифруют пароль, введенный в веб-форме и сравнивают его с паролем в файле passwd или shadow
- используют pop3 аутентификацию.
Первый метод весьма скользкий, ибо его реализация требует прав суперпользователя
(root) для открытия файла зашифрованных паролей (shadow), и, как следствие, является
дырой в безопасности сервера. Он реализуется путем исполнения cgi-скрипта с правами
root (suid).
Вообщем, алгоритм простой:
- взять пару логин/пароль с Web-формы;
- зашифровать пароль тем же алгоритмом, что и на сервере;
- открыть файл shadow для сравнения пароля, там хранящегося с полученным с web-формы.
- Ежели результат сравнения положителен, аутентификация прошла успешна и увы в противном случае.
- Не забыть позакрывать все файлы.
Все вообщем-то довольно просто.
Открыли файл, прочитали в буфер, нашли нужную нам строчку,
закриптовали пароль, сравнили с тем, что в файле и по делам ихним воздаем
аутентифицирующемуся юзеру.
В Unix системах шифрование происходит в одну сторону -
к зашифрованному паролю добаваляется хорошая порция избыточной информации (salt - соли),
и выдернуть пароль назад оттуда не представляется возможным. Так что, "взлом" паролей
возможен лишь методом подбора оного. Ну, а если пользователь легальный и пароль
действительный, то зашифруя его, мы сразу же успешно проходим аутентификацию.
За что мне нравится Perl, так это ненужность изобретать велосипеды.
проверка пароля сводится к вызову стандартной системной функции crypt($text,$salt).
Действует она так :
в качестве параметров подается пароль в "чистом" виде и зашифрованный,
на выходе она должна выдать тот же зашифрованный пароль. Если этого не произошло,
значит пароль в виде простого текста был неправильный.
В общем вся процедура выглядит все где-то так:
#!/usr/bin/suidperl
#
# читаем форму
.........
&check_passwd;
sub check_passwd {
my $shadow = "/etc/shadow";
# ниже две строчки = переданные из формы пароль/логин
$plaintext = $form{'password'};
$username = $form{'login'};
# пытаемся открыть файл зашифрованных паролей (на нормальной системе
# он доступен только для чтения только root-ом.)
# и заодно попытаемся его залочить.
open (SHADOW, "<$shadow") or die "Internal system error: $!";
flock (SHADOW, 2) or die "Internal lock error: $!";
@shadows=;
flock SHADOW, 8;
# закроем shadow
close SHADOW;
foreach $line(@shadows) {
chomp($line);
($currentuser, $currentpass, $restofline) = split /:/, $line, 3;
if ($currentuser eq $username)
# Выдергиваем зашифрованный пароль из shadow
$saltedpass = $currentpass;
# Проверяем его стандартной функцией crypt
if ( crypt ($plaintext, $saltedpass) eq $saltedpass) {
print "Authentification for $username success!\n";
} else {
print "Authentification for $username failure!\n";
}
}
}
}
Файлу, содержащему сей "шедевр" программистского искусства следует в целях безопасности
установить атрибуты:
Владелец - root
Взведенный бит установки ID пользователя при исполнении
режим доступа r-sr-xr-x
грубо говоря, в восьмеричном отображении оно будет выглядеть как 104555
В этом suid-e и кроется опасность, - если кто-то умудрится всунуть кусок своего кода
в вашу программу, то сможет получить доступ к вашей системе.
(Для неверующих - прочитайте что-нибудь про Ramen - он еще и не то делает/делал).
А посему сей метод, как небезопасный, лучше не использовать.
Лучше взять готовую Perl-библиотеку: Net.
2. POP3 Аутентификация.
Простой и безопасный метод проверки подлинности пользователя.
Берется библиотека Net::POP3 и стандартными методами пытаемся
влогиниться в почтовый ящик. Если нам это удалось, то логин/пароль верны,
и обратный результат в ином случае.
Модуль Net::POP3 дает пользователю создать объект и 14 методов к нему.
Все методы изучать нет смысла - они довольно-таки неподробно описаны в документации к модулю,
нас более интересует метод login($user,$passwd).
Он возвращает значение undef в случае неудачной аутентификации, или, в случае
удачного входа в почтовый ящик, количество писем в оном, или строку "0E0", если
писем нет , т.е. "пишут".
Порядок работы с ним следующий:
use Net::POP3;
&parse_form # Читаем из формы переданные пароль/логин
# Создаем объект
$pop = Net::POP3->new('popserver') || print "Cannot create connection\n";
# пробуем влогиниться
# в $res будет возвращен результат логина
$res = $pop->login($form{'login'},$form{'password'});
if ($res == undef) {
# неудача
print "Incorrect username or password!\n";
} else {
# влогинились
# делаем, что надо
#
# следующий код нарисован для того, чтобы хоть что-то
# делалось.
if ($res eq "0E0") {
# писем нет
print "You have $res messages in mailbox.\n";
} else {
# письма есть
print "You have $res messages in mailbox.\n";
}
}
#закрываем соединение.
$pop->quit();
Намного проще и безопаснее, чем лезть в святая святых безопасности Unix систем-
файл shadow.
Да и не нужно просить сисадмина сервера установить на ваш скрипт setuid bit,
хотя заранее можно сказать, что любой нормальный сисадмин вам в этом откажет,
и будет на все сто прав. А библиотека Net есть практически на любом Web-сервере,
где есть доступ к perl интерпретатору.
А.Сухинин. (shurick31@yahoo.com)
|
::::: podlom пишет 24.06.2001 @ 08:02 | |
Спасибо за хорошую статью!
|
::::: Dicr пишет 13.07.2001 @ 07:23 | |
::::: VorteX пишет 01.01.2002 @ 05:48 | |
Вообще интересно, кто пытается сделать аутентификацию при помощи учетных записей сервера? Тот же Apache никогда не полезет в /etc/passwd | /etc/shadow для проверки валидности пользователя. У него просто на это прав нету. Есть же специальный механизм авторизации, встроенный в Apache, который позволяет создать достаточно надежную схему авторизации без обращения с системным файлам. Да простит меня Автор, но первый спсоб авторизации я просто не понял.
|
::::: noname пишет 12.03.2002 @ 22:39 | |
Чушь полная!
Давать suid-ные права левому скрипту НЕЛЬЗЯ!
POP3 - здесь вообще не к месту... tcpdump никто не отменял, а кричать свои пароли на лево и на право для системы безопасности - плохой тон!
|
::::: Goody пишет 22.03.2002 @ 01:15 | |
Отличная идея насчет POP3. Никакие пароли никто не сопрет никаким сниффером, если юзать POP3 на localhost. А иначе и смысла нет, проверять юзеров с другого сервака. Насчет SUID конечно гон, ну ничего.. главное информация к размышлению, а остальное пусть каждый сам решает.
А вот что мешает, сохранить криптованные пароли в свой файл, а не в shadow? Главное чтоб пароли были корректно выбраны и тогда, даже если сопрут файл с паролями, то долго будут его раскриптовывать.
|
Статья нормальная
2-ой способ (РОР3) хорош (я вот не допер), если просто
проверять пароль, но 1-ый все равно нужен, если надо
менять пароль в автоматическом режиме.
Предложение хранить пароли в какой-то БД - глупое.
Зачем городить огород, если есть стандартные средства.
А если им не доверять, то как же господа Вы оберегаете
пароль root
А те кто ругают, либо ничего не поняли, либо не являются
админами. Все эти операции делаются на самом сервере
и сниферы тут ничего не разнюхают. Трафика то сетевого нет
|
::::: HTML2k пишет 04.12.2002 @ 02:41 | |
Хорошее средство для взлома pop3 ящиков на серваке где установлен такой скрипт
|
::::: Тима пишет 13.01.2003 @ 05:36 | |
ИМХО, бесполезняк. Более того, опасный бесполезняк. Ну кто согласится делать /etc/shadow читабельным для юзера, который ПО ОПРЕДЕЛЕНИЮ должен иметь права минимальные! Жуть. И второй способ бред собачий. Представь, что ты пишешь прогу для интернет-магазина. И что, каждому клиенту e-mail заводить? Заболел, что ли? Сорри за резкий тон, но такое не часто увидишь, тем более на столь уважаемом сервере. Это все равно что Google порнушной рекламой облепить...
|
::::: shurik пишет 13.01.2003 @ 10:48 | |
IMHO, ты бредишь. Читай внимательно статью.
Речь идет об аутентификации РЕАЛЬНЫХ пользователей сервера, а для инет магазина, сайта и проч. используй .htaccess, ТвойСиКвеЛ и проч.
|
::::: Канат пишет 08.03.2003 @ 10:04 | |
Статья отличная, написано достаточно подробно чтобы любой смог попробовать.
Непонятны возмущения некоторых читателей - кажется они статью читают кусками и не представляют что такое SUID.
Эти скрипты для админов серверов (1 способ) и юзеров (2 способ) которым необходима идентификация реальных пользователей сервера, а не "левых" (для сервера) пользователей сайтов.
От себя хочу добавить что аутентифицировать можно так же не только через POP3, но и FTP, возможно через еще что-то.
2 Alexander Suhhinin: respect
|
::::: DIMAS пишет 28.03.2003 @ 07:50 | |
скажите пожалуйста в каком файле сервера хранится пароль системного администратора.Пишите на combattt@mail.ru
|
::::: henady пишет 18.04.2003 @ 21:07 | |
Первый скрипт можно сильно упростить используя getpwnam вместо чтения /etc/shadow. Правда всё равно нужны root привелегии.
|
::::: Syrius пишет 25.04.2003 @ 13:40 | |
Статья класс. Второй вариант реальный способ авторизации при смене паролей почтовых юзеров через web. Неделю назад мучался с этой проблемой, пытался решить проблему первым способом, но до авторизации через pop3 не допер. Спасибо за статью.
|
::::: triptyl пишет 07.06.2003 @ 22:31 | |
Хорошо, когда автор говорит, что предложенный им способ плохой! Сразу ясно, что писано для объёма. Зачем лезть в etc/shadow, если ни один нормальный хостер не даст полезть туда? Или мы не для Web? Ах, да, аутентификация через Web... Логин через POP3-объект выглядит экзотично, ещё бы через посылку письма на адрес admin@yourhost.com сделано было! ИМХО, в trash. Где здесь здесь кнопка помещения в trash?
|
::::: PHOENIX пишет 18.09.2003 @ 14:40 | |
Оба способа неудобны. Кто-то уже сказал, что в самом Apache есть система контроля доступа. Она легко настраивается, т.к. не требует написания специальных скриптов. Все элементарно контролируется файлами .htacces! Сделайте запрос на Яндексе - получите исчерпывающие данные по этому вопросу.
|
::::: Druid пишет 26.09.2003 @ 10:39 | |
Такое впечателение, что ребятя, ругающие статью и считающие себя "гуру", просто её не читали (нифига не поняли).
Написано же, для авторизации РЕАЛЬНЫХ ПОЛЬЗОВАТЕЛЕЙ!!!
Если это интернет-магазин, то делайте свою (берите чужую) систему авторизации и эта статья не для вас!
Простите, что перевел дискусию на уровень - "сам дурак", но других мыслей после прочтения некоторых комментариев не возникло.
|
Да, народ не умеет ЧИТАТЬ.
Тима, PHOENIX см. 3-й абзац статьи.
Вы вероятно не видите разницы между клиентом инет-лабаза и РЕАЛЬНЫМ пользователем.
Эта статья, собственно написана не для web-кодеров, а для людей, которые работают под *NIX системами, и доступаются удаленно к оным. (читай - для админов всех уровней).
Для аутентификации пользователей веб-сайта достаточно использовать встроенные средства апача, но если вы считаете, что лучше и реальных пользователей аутентифицировать через эту систему, то я снимаю шляпу , но не перед вами, а перед "гробом" вашей системы, которая невдолге почнет в бозе.
|
::::: dimar пишет 14.10.2003 @ 17:41 | |
Каким образом можно обнаружить разрыв пользователя через Web интерфейс (при разрешении доступа через локальную сеть на сервер выхода в Интернет необходимо знать когда он оторвется)
|
Обычно разрыв отслеживают с помощью cookie.
Как оно работает - посмотри в исходниках любого движка форума веб-почты.
|
::::: Роман пишет 20.01.2004 @ 01:55 | |
::::: kav пишет 30.04.2004 @ 07:30 | |
А как тоже сделать с помощью PHP
|
На PHP этого делать не надо. Появилась куча библиотек для Perl и PHP, чтобы проводить аутентификацию реальных юзеров системы. Вдумчиво изучаем http://www.cpan.org/modules/by-category/14_Security_and_Encryption/ для perl, или используем IMAP,POP,LDAP функции для проверки логина/пароля в случае PHP (возможно, есть классы типа Authen::PAM).
|
::::: Brat пишет 06.12.2007 @ 23:08 | |
Ны вы блин даете. Половину не понял. А главное что брат мой в меня- умный. Молодец Саня.
Знай наших.
|
| |