RoundCubeMail からパスワードを変更
RoundCubeMail からパスワードを変更できれば便利だろうということで、 password プラグインを入れることにした。
何が悪いのかみんなも考えてみよう。テストに出ます。
password プラグインのインストール
1. 事前確認
Linux に SSH でログインして、以下のコマンドでユーザのパスワードが変更できることを確認する。変更できれば、 chpasswd ドライバーを使えるということ。
更なる条件としては、 Apache 起動ユーザが chpasswd コマンドを使えなければならない。
以下のコマンドでユーザのパスワード変更ができれば OK。
# echo "ユーザ名:パスワード" | sudo /usr/sbin/chpasswd 2> /dev/null;
できなければ、できるようなコマンドを考える必要がある。そしてそのコマンドになるよう config.inc.php と chpasswd.php を修正するのだ。
2. 設定ファイル (chpasswd ドライバーを使う)
# cd roundcubemail/plugins/password # cp -p config.inc.php.dist config.inc.php # vi config.inc.php -------------------------------------------------- 7 $config['password_driver'] = 'chpasswd'; 287 $config['password_chpasswd_cmd'] = 'sudo /usr/sbin/chpasswd 2> /dev/null'; --------------------------------------------------
3. Apache のユーザに chpasswd の権限を与える
# visudo # Disable "ssh hostname sudo", because it will show the password in clear. # You have to run "ssh -t hostname sudo ". # Defaults requiretty # # Refuse to run if unable to disable echo on the tty. This setting should also be # changed in order to be able to use sudo without a tty. See requiretty above. # Defaults !visiblepw # # Preserving HOME has security implications since many programs # use it when searching for configuration files. Note that HOME # is already set when the the env_reset option is enabled, so # this option is only effective for configurations where either # env_reset is disabled or HOME is present in the env_keep list. # Defaults always_set_home Defaults env_reset Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS" Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE" Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES" Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE" Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY" # # Adding HOME to env_keep may enable a user to run unrestricted # commands via sudo. # # Defaults env_keep += "HOME" Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin ## Next comes the main part: which users can run what software on ## which machines (the sudoers file can be shared between multiple ## systems). ## Syntax: ## ## user MACHINE=COMMANDS ## ## The COMMANDS section may have other options added to it. ## ## Allow root to run any commands anywhere root ALL=(ALL) ALL hoge ALL=(ALL) ALL apache ALL=NOPASSWD: /usr/sbin/chpasswd
4. 実際にパスワード変更してみる (読者への問題)
RoundCubeMail からパスワードを変更すると、できなかった。
ログには以下のエラーが残されていた。
# cat logs/errors [29-Sep-2014 15:15:46 +0900]: PHP Error: Password plugin: Unable to execute sudo /usr/sbin/chpasswd 2> /dev/null in /var/www/html/roundcubemail/plugins/password/drivers/chpasswd.php on line 32 (POST /webmail/?_task=settings&_action=plugin.password-save?_task=&_action=) ※ このエラーの意味を真剣に考えるべきだった
ちなみに、現在のパスワードが違うとこんなエラーになるので、プラグイン自体は機能しているようだ。
5. 実に意味のない作業 (ミスリード)
※ この部分は無駄な作業なので、実行してはいけませんw
私と同じような状況で、 password プラグインが動作しないという質問が海外フォーラムにあった。解決策を真似してみた。
# vi plugins/password/drivers/chpasswd.php 15 class rcube_chpasswd_password 16 { 17 public function save($currpass, $newpass) 18 { 19 $username = $_SESSION['username']; 20 $cmd = "echo '" . $username . ":" . $newpass ."' | " . rcmail::get_instance()->config->get('password_chpasswd_cmd'); 21 22 $handle = popen($cmd, "w"); 23 fwrite($handle, "");
6. エラーとなっていた原因 (ヒント)
RoundCubeMail からパスワード変更したが、パスワードが変更できない旨のエラーが出て、変更されない。
原因を探るために、どんなエラーがでているのか、テキストファイルに書き出してみることにした。
# vi plugins/password/drivers/chpasswd.php 20 //$cmd = "echo '" . $username . ":" . $newpass ."' | " . rcmail::get_instance()->config->get('password_chpasswd_cmd'); 21 $cmd = "echo 'hoge:passhogehoge' | sudo /usr/sbin/chpasswd >& /tmp/hoge.txt"; こんなエラーだった。 # cat /tmp/hoge.txt sudo: sorry, you must have a tty to run sudo
なるほど、 apache ユーザが sudo できないってことだったのか。
前に見たログの
# cat logs/errors [29-Sep-2014 15:15:46 +0900]: PHP Error: Password plugin: Unable to execute sudo /usr/sbin/chpasswd 2> /dev/null in /var/www/html/roundcubemail/plugins/password/drivers/chpasswd.php on line 32 (POST /webmail/?_task=settings&_action=plugin.password-save?_task=&_action=)
この部分にだけ注目すれば、権限の問題かもしれないとアタリはついたのに、コードの問題だろうと思い込んでしまった。
考えてみれば、コードに問題があれば Fix されないわけがないだろうに……
7. requiretty を無効にする (回答編)
Cento OS では tty 以外からの sudo を禁じてある。
ということは、 Apache ユーザに chpasswd の権限を与えたとしても sudo の段階でこけているということだ。
# echo "ユーザ名:パスワード" | sudo /usr/sbin/chpasswd 2> /dev/null;
これを修正するには requiretty を無効にしなければならない。
requiretty をコメントアウト # visudo 56 #Defaults requiretty
5 ~ 6 の無意味な修正を元に戻し、 RoundCubeMail からパスワード変更してみる。できた。あっさりできてしまった。
結論としては、 config.inc.php の修正と、 visudo で requiretty をコメントアウト、 apache に chpasswd の権限を与えるという 3 点で行けた。
エラーログをチェックし、少し頭を働かせることが正解への最短ルートだということを思い知った。