Существует необходимость в предоставлении пользователям возможности смены своих системных паролей через web интерфейс на хосте под управлением *nix подобный OS.
Про реализацию сей задачи в сети есть несколько статей, но все они не удовлетворяют моим критериям безопасности :-)
Во-первых, должна производится проверка наличия в системе пользователя для которого хотят поменять пароль, ну это очевидно.
Во-вторых, дабы никто-то, а имеено владелец аккаунта мог сменить себе пароль, нужно производить проверку по старому паролю, до запроса нового. Это тоже само собой разумеется. (по аналогии утилиты passwd, если она запускается от имени простого не привилигированного пользователя).
В-третьих, если возможно (к сожалению это не совсем возможно) все должно запускаться и работать без всяких там suid битов на срипты и остальные программы.
(к сожалению без этого не обойтись, imho, но нужно постараться свисти к минимуму возможные такие изьяны).
На данный момент (я не один из первых) сделано все очень просто:
html страница с формой, где пользователь будет вводить свой логин, старый пароль, новый пароль и подтверждение нового пароля.
Далее данные из формы передаются в perl-скрипт, который делает проверку данных из форм, на наличие не допустимых символов, затем проверяет наличие "такого" пользователя в системе, потом делает проверку верности старого пароля (берется зашифрованый пароль из файла (тогоже /etc/shadow), шифруется взятый из формы (шифруется при помощи функции unix_md5_crypt() взятой из модуля Crypt-PasswdMD5 (есть на cpan.org, рекомендую использовать версию 1.2 а не 1.3 она не правильно работает, или поправить чтоб заработала)
и сравнивается с паролем из файла. Если все пучком, тогда просто вызывается внешняя утилитка chpasswd которой отдается логин и новый пароль.
Все бы ничего да есть свои тонкости:
Во-первых, не так то просто вытащить зашифрованый пароль из /etc/shadow.
Во-вторых, не так то просто запустить chpasswd(в нашем случае, она может выполняться только от пользователя с привилегиями соответсвующми, делать эту тузлу суидной я бы не рекомендовал), это утилита только для человека с мозгами - тобишь root (жаль не у всех есть мозги :-)), потому что эта тулза меняет пароли без всяких там проверок (возможно она как раз и существует для написания человеком с мозгами shell сценариев).
Кароче, присвоения suid бита на скприт который все это будет делать - не есть гуд, изменение пирмишенов на /etc/shadow, об этом даже и речи быть не можеть, хранить пароли в другом месте? а смысл? :-), про chpasswd я уже сказал...
Так вот я в раздумии, может быть благородные доны что-то посоветуют?
Да, и еще, есть другой вариант, когда данные с формы будут просто кладываться в файлик, а затем(например по crond) будет запускаться скрипт уже от root'a и делать нужные проверки, и замены... Но это не удобно, тем что меняться пароль будет не сразу, да и сообщать об ошибках(например старый пароль не подходит) пользователю как? отсылать потом е-майлом?! согласитесь это не удобно....