Я пишу некоторое программное обеспечение на Ruby on Rails для простого управления пользователями для входа на наш сервер. Я работаю над методом для контроллера пользователя, который позволит пользователю изменять свой пароль на сервере (логин FTP / веб-сайта). Я хотел бы, чтобы администрирование паролей сервера осуществлялось через веб-сайт, и для этого я разработал следующий алгоритм.
- User logs into website, and indicates a change of password is desired using
current login password, and enters new password (with confirmation)
- Rails user.rb model file has algorithm which establishes read/write with a
program tty (via 'PTY.spawn' and 'expect'). This happens as user www-data.
- First command issued to the PTY is `su <username>`, enter current system password.
- Next, send `passwd`, wait for password prompt and pass current password.
- Wait for 'new password' and send desired password.
- again for confirmation of password.
- As long as none of the 'expect' statements fail (including 'password updated
successfully'), salt and hash the password and store it in the database as normal.
Я достаточно уверен, что это безопасный метод синхронизации паролей системной учетной записи. Но опять же .... Я не хакер или эксперт по безопасности. Это не публично открытая система, но есть множество пользователей, которые будут иметь доступ к системе.
Первый вопрос: есть ли более разумный способ сделать это? Может быть, через PAM? Я лично использовал Linux много лет, но мой опыт администрирования ограничен. На сервере работает Debian или Ubuntu Server, nginx и несколько экземпляров rails.
Второй вопрос: как мне работать с функцией «сброса» пароля в системе? Это, очевидно, требует root-доступа и будет выглядеть примерно так:
- Verify user by other means (email, administrator, whatev)
- su root or sudo -s (uhhhmmm....?!)
- passwd <username>
- set to generated value
- force user to change password @ next login
На первый взгляд, это кажется менее безопасным. Рут доступ и такое. Но я не могу найти способ обойти это без личного администратора sudo passwd <username>
каждый раз, когда пользователь забывает свой пароль ... более того, я не хочу, чтобы мое приложение rails имело root-доступ к системе. .... он работает от имени другого пользователя по причине. Поэтому я предполагаю, что это означает, что мне нужно настроить корневой cron, который запускает задачу rake для поиска паролей, которые необходимо сбросить ....
В моей пользовательской модели я также занимаюсь другими вещами, такими как мониторинг дискового пространства:
def update_disk_usage
home_dir =~ /\A((\w|[._0-9-])*)(.*)\Z/
#runs as www-data
home_dir_size = `/usr/bin/du -cs /home/#{$1} | grep total | awk '{print $1}'`
self.quota = home_dir_size.to_i
self.quota_checked = Time.now
self.quota
end