PostgreSQLは、インストール後の状態では、そのサーバー内からしかアクセスできません。
ユーザークライアント、またはアプリケーションサーバーからアクセスさせるためには、それらのサーバー(またはネットワーク)からの接続許可の設定をする必要があります。
接続を許可するネットワークインターフェースを開放する
まずは、そのサーバーとの通信の際に使用されるネットワークインターフェースを指定します。
指定の方法は、設定ファイルのpostgresql.confを編集します。
#listen_addresses = 'localhost' # what IP address(es) to listen on; listen_addresses = '192.168.0.100'
上記の場合は、そのサーバーのネットワークインターフェースのうち、「192.168.0.100」のIPが設定されているほうのインターフェースでのリッスンを許可しています。
つまりは、複数のネットワークインターフェースを持っていない限りは、下記のように全てのインターフェースを許可してしまっても問題ありません。(もちろん、外部からの接続を許可する場合を除きます)
- 全てのネットワークインターフェースへの接続を許可する
#listen_addresses = '*'
複数のネットワークインターフェースを持っていて、そのサーバーのPostgreSQLのDBに接続するのが一方のN/Wセグメントからと決まっている場合、そちらの方だけのインターフェースを許可しておけばよいでしょう。
こうすることで、他のインターフェースからの接続要求を拒否することができます。
listen_addressesのパラメータのデフォルト値は「localhost」で、自分自身のサーバーからしか接続を許可しません。
なので、先に書いたように特定のインターフェースのみを指定してしまうと、そのサーバー内でのlocalhost指定の接続ができなくなってしまいます。
$ psql -h localhost testdb psql: could not connect to server: 接続を拒否されました Is the server running on host "localhost" and accepting TCP/IP connections on port 5432?
listen_addressesは、カンマ区切りで複数指定することもできますので、localhost(またはループバックアドレス)と併せて記載しておいたほうがよいでしょう。
listen_addresses = 'localhost,192.168.0.100'
予断ですが、PostgreSQL7ではlisten_addressesのパラメータは無く、tcpip_socketというパラメータでした。
- PostgreSQLバージョン7でのN/W越しの接続許可の設定
tcpip_socket = true
上記のように、許可する(true)か許可しない(false)の指定しか方法が無く、どのインターフェースで接続を受け付けるかの設定はできませんでした。
アクセスを許可するネットワークを指定する
接続を受け付けるインターフェースの指定が終わったら、どのN/Wセグメントから接続を許可するかを指定します。
この指定は、pg_hba.confという設定ファイルに記載します。
一番最後の行にデフォルトの設定が記載されていますが、例えば
host all all 192.168.0.0 255.255.0.0 password
のように指定すると、192.168.x.xのN/Wセグメントからは、パスワード認証で接続を許可することになります。
DB名や接続ユーザーによる制限もできて、
host testdb hoge 192.168.0.0 255.255.0.0 password
のように指定すると、192.168.x.xのセグメントから、testdbに対して、ユーザーhogeでのパスワード認証を許可するようになります。
もちろん、サーバー側でリッスンしているインターフェースと通信できるN/Wセグメントで無ければ意味がありませんが。
条件に合致しない接続要求はサーバー側で拒否されます。
- エラーメッセージの例
FATAL: no pg_hba.conf entry for host "192.168.0.200", user "foo", database "hogedb"
必要があれば(多くの場合は必要でしょうが)、そのサーバー自身(localhost)からの接続許可も指定しなくてはなりません。
local all all trust
localhostからの接続を許可する場合は、先頭に「local」を指定します。
最後にしていている(上記の場合はtrust)のは、認証方式となります。
「trust」を指定していた場合、その他の条件が合えば無条件に接続されます。
一方で「password」を指定していると、接続時にパスワード認証が行われます。
その他にも、PAMやLDAPを使った認証方式も指定できたりします。詳細はマニュアル書かれているので、そちらも併せて確認してください。
PostgreSQL 8.3.5文章 21.1 pg_hba.confファイル
最後に、postgresql.confやpg_hba.confの設定ファイルを編集した場合は、デーモンに設定ファイルの内容を再読み込みさせます。
$ pg_ctl reload