PostgreSQL8 外部からのアクセス制御あれこれ。 | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

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