[pgsql-jp: 27569] pg_ctl と OS起動時のpassword要求について

Yoshihiro Hanahara hanahara @ meiko.co.jp
2002年 10月 7日 (月) 20:59:42 JST


花原@明宏です。


FreeBSD4.5でPostgreSQL 7.2.1を動かしています。
PostgreSQLはFreeBSDのportsシステムでインストールしました。


PostgreSQLの data/pg_hba.conf ファイルのデフォルトは、

    local      all                                          trust
    host       all         127.0.0.1     255.255.255.255    trust

となっていますが、このままですと、そこのマシン上で動くプログラム&PHPスク
リプトなどは、任意のユーザーでPostgreSQLにアクセスできてしまいます。

あまり宜しくないので、これを

    local      all                                           crypt
    host       all         127.0.0.1     255.255.255.255     crypt

と変えたところ、リブート時の起動スクリプト(/usr/local/etc/rc.d/010.pgsql.sh) 
が実行されるところで、「Password:」とパスワードを求められ、起動処理がブ
ロックされてしまうようなりました。
これは、010.pgsql.sh の中の次の部分

    su -l pgsql -c \
            '[ -d ${PGDATA} ] && exec /usr/local/bin/pg_ctl start -s -w -l /var/log/pgsql'

のpg_ctlの「-w」オプションがついているのが原因です。
pg_ctlに「-w」をつけると、起動時に 「psql -l」というコマンドが正常に実行
できるまで、ループするというようになっています(/usr/local/sbin/pg_ctl ス
クリプトの末尾の部分)。

pg_ctlに「-w」オプションをつけなければ、「psql -l」を実行しないので、パ
スワードは聞かれません。ただ、PostgreSQLが完全にクライアントからの接続を
受け入れられる状態になっているわけではないので、PostgreSQLのデータベース
に依存するような他のデーモン等があった場合は、あまり良くないなぁ、と思っ
てしまいます。

[pgsql-jp: 25849] にも、この件に関する記述がチラッとあります。


psqlのソースコードも見たのですが、パスワードが必要なとき、
src/bin/psql/common.c のsimple_prompt() という関数の中で、

    termin = fopen("/dev/tty", "r");
    termout = fopen("/dev/tty", "w");
    if (!termin || !termout)
    {
        if (termin)
            fclose(termin);
        if (termout)
            fclose(termout);
        termin = stdin;
        termout = stderr;
    }

というように、制御端末を再オープンしてます。
したがって起動時のような場合、コンソールが制御端末になっているので、
コンソールからパスワードを読もうとし、ブロックしてしまいます。


何か良い方法はないでしょうか?

---
Yoshihiro Hanahara <hanahara @ meiko.co.jp>





pgsql-jp メーリングリストの案内