Webpasswd - механизм смена пароля в базе /etc/master.passwd через WWW-интерфейс для FreeBSD 2.2.x

Файлы:

Итак, вы - сисадмин. У вас есть FreeBSD и юзеры, которые вас периодически достают. Good Users - Dead User, но реализм заставляет думать по другому... Время от времени юзера прибегают или звонят по телефону и просят просто сменить пароль. Чтобы автоматизировать эту процедуру, я придумал на мой взгляд неплохой, универсальный и надежный вариант - юзер заходит браузером на специальную страничку, набирает свой логин, старый и новый пароль и далее все происходит автоматически. Начнем с того, что все пароли должны у вас хранится в вашей системе в зашифрованном виде в единственном месте, которое называется /etc/passwd (/etc/master.passwd). Если смена пароля будет происходить через www-интерфейс, значит, без www-сервера никак не обойтись. Разумеется, это будет apache. Номер версии - совершенно неважен. Если на вашей машине уже крутится некий apache, то лучше оставьте его в покое и установите новый, можно IP-based виртуальный и закройте его от внешнего мира файрволом. Сделаем страничку-форму ввода с соответствующими полями:

<HTML>
<HEAD>
<TITLE>Webpasswd</TITLE>
</HEAD>
<BODY>
<H3>You can change your password here</H3>
<form action="/cgi-bin/webpasswd.cgi" action="POST">
Login: <INPUT TYPE=text Name="login" SIZE=9><BR> 
Old Password: <INPUT TYPE=password NAME="old_password" SIZE=15 MAXLENGTH=15><BR> 
New Password: <INPUT TYPE=password NAME="new_password" SIZE=15 MAXLENGTH=15><BR> 
Retype New Password: <INPUT TYPE=password NAME="retyped" SIZE=15 MAXLENGTH=15><BR> 
<INPUT TYPE=submit> 
</FORM> 
</BODY> 
</HTML> 

Поля ввода должны называться именно так, как я их назвал. В противном случае вам нужно зайти в исходный текст и подправить их название. Программа webpasswd использует CGI-интерфейс, поэтому я нашем соответствующую С-библиотеку для рутинных CGI-операций (например парсинг POST-данных или определение переменных окружения). Ее автор некто Noel V Aguilar. Библиотеку зовут CGI-LIB ver. 1.0. Она находится по адресу http://www.geocities.com/SiliconValley/Vista/6493/cgi-lib.html. Чтобы не ходить в Силиконовую Долину, файл cgi-lib.tgz (~16KB) можно взять и у меня. Процедура устрановки CGI-LIB довольно проста:

cd /usr/local/src/cgi-lib
tar -xvzf cgi-lib.tgz
cd cgi-lib
make

Результатом работы будет файл cgi-lib.a, который дальше будем "цеплять" к webpasswd. Далее займемся архивом webpasswd.tgz:

cd /usr/local/src/webpasswd
tar -xvzf webpasswd.tgz
cd webpasswd
make

В результате получим webpasswd.cgi, который нужно поместить в /cgi-bin/ нашего нового Apache и назначить такие атрибуты:

chown root.whell webpasswd.cgi
chmod a+rx webpasswd.cgi
chmod u+s webpasswd.cgi

Да-да, webpasswd является SUID-ной программой, поэтому относиться к ней нужно внимательно. Однако ничего в ней страшного нет, она представляет собой лишь немного модифицированную консольную программу passwd от FreeBSD версии 2.2.5 (я полагаю что моя программа будет работать на всех версиях ветви 2.2.x), которая, кстати, тоже SUID-ная. Особенностью webpasswd.cgi является то, что она позволяет менять пароль юзерам только из одной заданной группы, GID которой задается в файле parameters.h. Если вы хотите чтобы юзера из нескольких группы меняли свои пароли - вам потребуется откомпилировать соответствующее количество webpasswd.cgi с разными GID'ами.

Несколько слов о security: в приведенной схеме пароли передаются на www-сервер в открытом виде, что теоретически позволяет путем "прослушивания" сети их выловить. Конечно, это - недостаток. Для его устранения можно, например, заюзать SSL, если бы не... Во-первых, лично у меня пароли могут менять только DialUp-пользователи. Все модемы у меня установлены на одной машине и на этой же машине крутится Apache с webpasswd. Поэтому возможность "прослушивания" исключена. Во-вторых, если уж так выходит, то ваш пароль могут узнать также совершенно свободно ваши коллеги из локальной сети ethernet, прослушивая POP3-пакеты. В-третьих, запретите доступ к серверу из вашего прокси. В четвертых, по логам webpasswd отслеживается кто, когда, откуда (remote addr) и чем (http user agent) сменил пароль или произвел попытку смены - я не думаю, что DialUp-пользователи будут подбирать пароль у своего провайдера - уж слишком легко их "вычислить"...

(c) Alexey Kazakovsky stalingrad@mail.ru

Вернуться в начало

counter.list.ru