デフォルトでは、PostgreSQLに外部から接続できません。
例えば、WindowsからLinux上のPostgreSQLに接続できないということです。
この記事では、外部接続が可能になるための設定を解説していきます。
そのことに絞って無駄な説明は、できる限りで省きます。
本記事の内容
- PostgreSQLを外部接続可能にするには?
- 接続用のユーザー作成
- 接続許可の設定(設定ファイル変更)
- ファイアウォールでポート開放
- 外部接続の動作確認
それでは、上記に沿って解説していきます。
PostgreSQLを外部接続可能にするには?
もちろん、PostgreSQLのインストールは済ませておいてください。
外部接続を可能にするためにやることは、次の3つです。
- 接続用のユーザー作成
- 接続許可の設定(設定ファイル変更)
- ファイアウォールの開放
管理者であるpostgresを利用するのは、リスクが高すぎます。
そのため、接続用のユーザーを新規に作成する必要があります。
次にやることは、PostgreSQL自体の設定を変更することです。
デフォルトでは、PostgreSQLは外部からの接続を許可していません。
そのため、PostgreSQLの設定を変更します。
最後の一つは、意外と盲点です。
ファイアウォールの開放になります。
対象となるポートを開放しておく必要があります。
デフォルトでは、5432がPostgreSQLの利用するポートになります。
以上、PostgreSQLを外部接続可能にするための設定を説明しました。
以下では、これらを説明していきます。
接続用のユーザー作成
まずは、postgresユーザーになります。
$ sudo -u postgres -i
そして、PostgreSQLに接続します。
ここでの接続は、ローカル接続です。
$ psql psql (13.3 (Ubuntu 13.3-1.pgdg20.04+1)) "help"でヘルプを表示します。 postgres=#
接続できたら、次のコマンドでユーザーを作成します。
postgres=# CREATE USER testuser WITH PASSWORD 'testpass' CREATEDB; CREATE ROLE
「CREATE USER ユーザー名 WITH PASSWORD ‘パスワード’ CREATEDB;」
クエリは、上記の形式となります。
では、ユーザー(ロール)を確認しましょう。
postgres=# \du ロール一覧 ロール名 | 属性 | 所属グループ ----------+--------------------------------------------------------------------------+-------------- postgres | スーパユーザ, ロール作成可, DB作成可, レプリケーション可, RLS のバイパス | {} testuser | DB作成可 | {}
作成した「testuser」が、存在しています。
これでユーザー作成自体は、完了です。
しかし、このままではダメです。
作成したユーザーがアクセスできるデータベースを用意する必要があります。
データベースが関連付いていないと、ログインできない仕様になっています。
そこで、次のコマンドで「testuser」がアクセスできるデータベースを作成します。
postgres=# CREATE DATABASE testdb WITH OWNER testuser; CREATE DATABASE
「testdb」が、作成するデータベース名です。
以上、接続用のユーザー作成に関しての説明でした。
次は、接続許可の設定(設定ファイル変更)を行いましょう。
接続許可の設定(設定ファイル変更)
対象となるファイルは、以下の2つ。
- postgresql.conf
- pg_hba.conf
それぞれを説明していきます。
postgresql.conf
aptコマンドでインストールした場合、次の場所に存在しています。
/etc/postgresql/13/main/postgresql.conf
バージョンにより、若干は異なるでしょう。
このファイルの「listen_addresses」部分を変更します。
#listen_addresses = 'localhost' # what IP address(es) to listen on; listen_addresses = '*'
正確には、「listen_addresses = ‘*’」を追記します。 「」はすべてのIPを許可しています。
IPを指定すれば、指定したIPアドレスからのアクセスを許可します。
複数のIPを指定する場合は、「,」カンマ区切りとなります。
各自の状況に応じて、ここは設定しましょう。
pg_hba.conf
aptコマンドでインストールした場合、次の場所に存在しています。
/etc/postgresql/13/main/pg_hba.conf
このファイルの「IPv4 local connections」部分を設定します。
# IPv4 local connections: host all all 127.0.0.1/32 md5 host all all 0.0.0.0/0 md5
「host all all 0.0.0.0/0 md5」
この部分を追記しています。
上記の設定により、パスワード認証での外部接続を許可します。
「0.0.0.0/0」と指定していることにより、すべてのネットワークが対象となっています。
ここも各自の状況に応じて、設定してください。
まとめ
上記の設定ファイルを変更したら、反映させましょう。
下記コマンドにより、PostgreSQLを再起動しています。
$ sudo service postgresql restart
以上、接続許可の設定を説明しました。
次は、ファイアウォールを開放します。
ファイアウォールでポート開放
PostgreSQLの初期ポートを変更していないなら、次のコマンドで状況を確認可能です。
$ sudo ufw status | grep '5432'
何も表示されないなら、「5432」は未開放という状況になります。
なお、「ufw」コマンドが動かない場合は、次の記事をご覧ください。
「ファイアウォールの設定」の箇所に、「ufw」のインストールについて説明があります。
「ufw」コマンドが動くなら、次のコマンドを実行します。
sudo ufw allow 5432
では、確認です。
$ sudo ufw status | grep '5432' 5432 ALLOW Anywhere 5432 (v6) ALLOW Anywhere (v6)
ポートが、開放されていますね。
以上、ファイアウォールの開放について説明しました。
最後に、外部接続の動作確認を行います。
外部接続の動作確認
別の環境にログインします。
別の環境とは、先ほどまでログインしていたのとは別のサーバーのことです。
psqlコマンドが使えることは、前提条件となります。
下記のコマンドを実行。
psql -h 192.168.33.30 -U testuser -d testdb
「psql -h 接続先サーバー -U ユーザー名 -d 接続先DB」
「192.168.33.30」は、先ほどまで作業していたPostgreSQLサーバーのIPアドレスです。
あとは、もう大丈夫ですね。
コマンドを入力すると、パスワードを聞かれます。
入力して、成功すると以下のように表示されます。
$ psql -h 192.168.33.30 -U testuser -d testdb ユーザ testuser のパスワード: psql (13.3 (Ubuntu 13.3-1.pgdg20.04+1)) SSL 接続 (プロトコル: TLSv1.3、暗号化方式: TLS_AES_256_GCM_SHA384、ビット長: 256、圧縮: オフ) "help"でヘルプを表示します。 testdb=>
外部接続が成功しています。
以上、外部接続の動作確認に関しての説明でした。