On Tue, Jun 01, 2004 at 08:24:03PM +0300, Anton Zinoviev wrote:
> На  1.VI.2004 в 19:53 (+0300) часа Peter Pentchev писа:
> > 
> > Пффт.. това е доста по-сложно :(  Както каза Васил, passwd(1) по принцип
> > не е направено за ползване в не-интерактивен режим - имам чувството, че
> > в някои реализации направо си проверява за tty и те отсвирва, ако не
> > намери. 
> 
> Предполагам, че Samba прави това вече по някакъв начин, защото ето
> какво пише в smb.conf:
> 
> ; For Unix password sync. to work on a Debian GNU/Linux system, the following
> ;       parameters must be set (thanks to Augustin Luton
> ;       <[EMAIL PROTECTED]> for sending the correct chat script for
> ;       the passwd program in Debian Potato).
>    passwd program = /usr/bin/passwd %u
>    passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* 
> %n\n .

Да, вярно е, че Samba прави нещо подобно, само че това не значи, че го
прави лесно :(  Не знам дали досега си се сблъсквал с този проблем:
нуждата да parse-ваш това, което всякакви откачени локализирани или
просто изпонамодифицирани и изпонапрепачвани програми плюят, вместо
това, което ти *очакваш* да изплюят, но във всеки случай не е добра идея
:(

Още повече, че цялата история със setup-ване на твой си виртуален
терминал и прихващане на целия вход/изход не е проста.  Правил съм я
навремето на C, след като я направих, не я ползвах, защото беше
отвратително... Направих го след това с expect (който е повече или
по-малко правен за това), после се опитах да го интегрирам с външна
програма и много бързо се отказах...  Основният проблем в тази ситуация
може да се изрази точно с две думи: shell injection.

Виж по-долу за може би малко по-добро решение :)

> > Струва ми се, че ще стане малко по-просто, отколкото да се опитваш да
> > автоматизираш диалога с passwd(1);
> 
> Да.  Просто без sudo и специални права ми изглежда по-сигурно.

Ммм.  Трябваше ми известно време, за да разбера какво точно ти се струва
несигурно, но накрая май ми просветна: като оставим настрана
възможността за дупки в самото sudo (която не може да бъде *напълно*
пренебрегната, но според мен не трябва да бъде основното, от което да се
водим), остава малкият проблем с това, че ако позволим на уеб-сървъра да
прави chpass, то едно малко malicious скриптче ще може наистина да смени
паролата на произволен потребител по този начин.  Въх!  Кофти :)

Ако наистина това е това, което те притеснява, може би идейката, която
Васил Колев ми подхвърли вчера вечерта, ще ти се стори свястна: на
http://devel.ringlet.net/sysutils/passwdif/passwdif.pl има малко
скриптченце, което чете от стандартния вход три реда: username, old
password, new password, след което проверява дали паролата на акаунта
username наистина е old password и ако е, я променя на new password.
Да, това пак използва chpass/usermod/chpasswd/pw/whatever (между
другото, ще трябва да го пипнеш, за да го настроиш точно какво да ползва
при теб), но не изпълнява *никоя* от тези програми, преди да е успяло с
помощта на съвсем нормалните и стандартни getpwent() и crypt() да е
проверило, че потребителят наистина е този, за когото се представя, а и
след това променя само неговата парола.  Надявам се да ти хареса - не е
нещо завършено или изпипано, нахвърлях го тази сутрин набързо, но може и
да свърши работа :)  Да, трябва да работи като root, но мисля, че няма
голяма опасност да направи някоя глупост :)

А ако не искаш да разчиташ на sudo, винаги можеш да промениш първия ред
на passwdif и да го пускаш през suidperl (брррррррррррррррр! :)

Поздрави,
Петър

-- 
Peter Pentchev  [EMAIL PROTECTED]    [EMAIL PROTECTED]    [EMAIL PROTECTED]
PGP key:        http://people.FreeBSD.org/~roam/roam.key.asc
Key fingerprint FDBA FD79 C26F 3C51 C95E  DF9E ED18 B68D 1619 4553
If this sentence didn't exist, somebody would have invented it.

Attachment: pgp6nrnit9h97.pgp
Description: PGP signature

Reply via email to