Bloody Mary - blog

Bloody Mary 別館

password プラグインの利用開始

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 点で行けた。

エラーログをチェックし、少し頭を働かせることが正解への最短ルートだということを思い知った。

Updated: 2014/10/1 水曜日 — 16:34:31

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Bloody Mary - blog © 2008 - 2021