読者です 読者をやめる 読者になる 読者になる

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ソース(adodb.php)。

<?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

実行。

$> php ./adodb.php

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"ってIPv6localhostのことではありませんか。
ADODBってサービスが起動していなくてもpg_hba.confのIPv6の設定見るのね...。
pg_hba.confにもともとあったIPv6のローカルホストの設定(md5に変更)を追加してpg_ctl restartして設定を反映させてphpPgAdminでログオン => 成功!

以上