pg_hba.confのIPv6の設定は消してはいけない
PostgreSQL&phpPgAdmin最速インストールマニュアル - 常水商会::よしなしごと の追記。
リモートホストからpsqlコマンドで接続できるのにphpPgAdminでログインできないという現象に'また'遭遇しました。phpPgAdmin初期導入の敷居高い…。迂闊にセキュリティホール作らせないための愛のムチ?
原因
/var/lib/pgsql/data/pg_hba.conf の
host all all ::1/128 md5
を消してたから。だってIPv6(ip6tables)使ってないし、サービス停止してるの再三確認したし、psqlコマンドででリモートホストから接続できたからいらないと思ったんだもの。
検証
phpPgAdminのソースを目視デバッグ。
phpPgAdminのソースは /usr/share/phpPgAdmin 以下にあります。
結果、どうやらADODBライブラリでDB接続する以下の箇所でエラーハンドラに投げられている模様。
- エラーで落ちていたところ(/usr/share/phpPgAdmin/classes/database/Connection.php L.42付近)。
class Connection { : function Connection($host, $port, $sslmode, $user, $password, $database, $fetchMode = ADODB_FETCH_ASSOC) { : $this->conn->connect($pghost, $user, $password, $database); //ココ } : }
php.iniのエラーログを出力する設定を有効にしてもエラーログが出力されている気配が全くなかったので、試しにADODBライブラリを使って手動で接続してうまくいくかどうか確認することにしました。
STEP:1
/var/lib/pgsql/data/pg_hba.conf の
host all all ::1/128 md5
をコメントアウトして、postgresqlサーバを再起動しておきます。
STEP:2
ここからADODBのライブラリをダウンロードします。適当な場所に展開しておきます。
STEP:3
<?php require ('adodb5/adodb.inc.php'); //ADODBライブラリのパスを指定 $driver = 'postgres'; $username = '(ログインID)'; $password = '(パスワード)'; $hostname = 'localhost'; $database = 'postgres'; $dsn = "$driver://$username:$password@$hostname/$database"; $conn = &ADONewConnection($dsn); print_r($conn);
STEP:4
実行。
Warning: pg_connect(): Unable to connect to PostgreSQL server:
FATAL: ホスト"::1"、ユーザ"postgres"、データベース"postgres、SSL無効用のエントリがpg_hba.confにありません。
in /home/kiyotune/src/adodb/adodb5/drivers/adodb-postgres64.inc.php on line 697
正常に接続できていればサーバの情報がみちみちに表示されるはずがFATAL error。
設定がないって言われてる"::1"ってIPv6のlocalhostのことではありませんか。
ADODBってサービスが起動していなくてもpg_hba.confのIPv6の設定見るのね...。
pg_hba.confにもともとあったIPv6のローカルホストの設定(md5に変更)を追加してpg_ctl restartして設定を反映させてphpPgAdminでログオン => 成功!
以上