「リモートからPostgreSQLに接続したい」 「5432ポートを開けたいけど、セキュリティが心配…」 「設定したのに接続できない!」
PostgreSQLのポート開放は、 設定ミスで大きなセキュリティホールになる可能性があります。
でも、正しく設定すれば 安全にリモート接続を実現できます。
この記事では、 セキュリティを保ちながら確実に接続する方法を OS別・環境別に完全解説します!
【重要】作業前のセキュリティチェック

ポート開放前に必ず確認すること
絶対にやってはいけないこと:
❌ postgresユーザーのパスワードが弱い
-- まず強力なパスワードに変更
ALTER USER postgres PASSWORD 'Strong#Pass123!@#';
❌ すべてのIPからの接続を許可
# 危険な設定
host all all 0.0.0.0/0 md5 # これは避ける
❌ trustメソッドで認証なし
# 絶対ダメ
host all all 0.0.0.0/0 trust # パスワード不要!
推奨セキュリティ設定
必須のセキュリティ対策:
✅ 強力なパスワード設定 ✅ 特定IPのみ許可 ✅ SSL/TLS暗号化 ✅ ログ監視 ✅ fail2ban導入
ステップ1:PostgreSQL設定ファイルの変更
postgresql.conf の編集
設定ファイルの場所を確認:
# 設定ファイルの場所を表示
sudo -u postgres psql -c "SHOW config_file;"
# 一般的な場所
# Ubuntu/Debian: /etc/postgresql/15/main/postgresql.conf
# CentOS/RHEL: /var/lib/pgsql/15/data/postgresql.conf
リッスンアドレスの設定:
# postgresql.conf を編集
sudo nano /etc/postgresql/15/main/postgresql.conf
# 変更前(ローカルのみ)
#listen_addresses = 'localhost'
# 変更後の選択肢:
# オプション1:特定のIPアドレスでリッスン(推奨)
listen_addresses = '192.168.1.100,localhost'
# オプション2:すべてのインターフェースでリッスン
listen_addresses = '*'
# オプション3:特定のネットワークインターフェース
listen_addresses = '0.0.0.0'
# ポート番号(デフォルト)
port = 5432
# 最大接続数も確認
max_connections = 100
pg_hba.conf の編集(認証設定)
アクセス制御の設定:
# pg_hba.conf を編集
sudo nano /etc/postgresql/15/main/pg_hba.conf
安全な設定例:
# TYPE DATABASE USER ADDRESS METHOD
# ローカル接続(変更不要)
local all all peer
# 特定IPからの接続を許可(推奨)
host all all 192.168.1.0/24 scram-sha-256
host mydb myuser 203.0.113.10/32 scram-sha-256
# VPNネットワークからのアクセス
host all all 10.0.0.0/8 scram-sha-256
# SSL接続を強制(より安全)
hostssl all all 0.0.0.0/0 scram-sha-256
# 特定のデータベースとユーザーのみ(最も安全)
host production prod_user 203.0.113.0/24 scram-sha-256
認証方式の選択:
方式 | セキュリティ | 説明 |
---|---|---|
scram-sha-256 | ⭐⭐⭐⭐⭐ | 最も安全(推奨) |
md5 | ⭐⭐⭐ | 従来の暗号化 |
password | ⭐⭐ | 平文パスワード(非推奨) |
trust | ❌ | 認証なし(絶対ダメ) |
peer | ⭐⭐⭐⭐ | ローカルのみ |
ステップ2:ファイアウォール設定(OS別)
Ubuntu/Debian(UFW)
# UFWの状態確認
sudo ufw status
# 特定IPからのみ許可(推奨)
sudo ufw allow from 192.168.1.0/24 to any port 5432
# すべてのIPから許可(非推奨)
sudo ufw allow 5432/tcp
# より詳細な設定
sudo ufw allow from 203.0.113.10 to any port 5432 proto tcp comment 'PostgreSQL from office'
# ルールの確認
sudo ufw status verbose
# ルールの削除(番号指定)
sudo ufw status numbered
sudo ufw delete [番号]
CentOS/RHEL/Rocky(firewalld)
# 現在の設定確認
sudo firewall-cmd --list-all
# ポート開放(恒久的)
sudo firewall-cmd --permanent --add-port=5432/tcp
# 特定IPからのみ許可
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="5432" protocol="tcp" accept'
# サービスとして追加
sudo firewall-cmd --permanent --add-service=postgresql
# 設定を反映
sudo firewall-cmd --reload
# 確認
sudo firewall-cmd --list-ports
iptables(従来の方法)
# 現在のルール確認
sudo iptables -L -n -v
# ポート5432を開放
sudo iptables -A INPUT -p tcp --dport 5432 -j ACCEPT
# 特定IPからのみ許可
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 5432 -j ACCEPT
# 設定の保存(Ubuntu/Debian)
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
# 設定の保存(CentOS/RHEL)
sudo service iptables save
ステップ3:PostgreSQLサービスの再起動
# 設定ファイルの文法チェック
sudo -u postgres pg_ctl reload -D /var/lib/postgresql/15/main
# サービス再起動(Ubuntu/Debian)
sudo systemctl restart postgresql
# サービス再起動(CentOS/RHEL)
sudo systemctl restart postgresql-15
# 状態確認
sudo systemctl status postgresql
# ポートが開いているか確認
sudo ss -tlnp | grep 5432
# 出力例:LISTEN 0 244 *:5432 *:*
ステップ4:接続テスト
ローカルからの確認
# ポートが開いているか確認
netstat -an | grep 5432
ss -tlnp | grep 5432
lsof -i :5432
# ローカル接続テスト
psql -h localhost -p 5432 -U postgres -d postgres
リモートからの接続テスト
# 別のマシンから接続確認
# 1. telnetでポート疎通確認
telnet サーバーIP 5432
# 2. ncコマンド
nc -zv サーバーIP 5432
# 3. psqlで接続
psql -h サーバーIP -p 5432 -U postgres -d postgres
# 4. pg_isreadyコマンド
pg_isready -h サーバーIP -p 5432
接続文字列での確認
# 標準的な接続文字列
psql "postgresql://username:password@server_ip:5432/database"
# SSL接続
psql "postgresql://username:password@server_ip:5432/database?sslmode=require"
クラウド環境での追加設定

AWS EC2
# セキュリティグループで5432ポートを開放
# AWSコンソールから:
# 1. EC2 → セキュリティグループ
# 2. インバウンドルール → ルールを追加
# 3. タイプ: PostgreSQL
# 4. ソース: カスタム(特定IP推奨)
# AWS CLIでの設定
aws ec2 authorize-security-group-ingress \
--group-id sg-xxxxxx \
--protocol tcp \
--port 5432 \
--source-group sg-yyyyyy
Google Cloud Platform
# ファイアウォールルールを作成
gcloud compute firewall-rules create postgres-allow \
--allow tcp:5432 \
--source-ranges 203.0.113.0/24 \
--target-tags postgres-server
Azure
# ネットワークセキュリティグループでルール追加
az network nsg rule create \
--resource-group myResourceGroup \
--nsg-name myNsg \
--name postgres_rule \
--protocol tcp \
--direction inbound \
--source-address-prefix 192.168.1.0/24 \
--source-port-range '*' \
--destination-address-prefix '*' \
--destination-port-range 5432 \
--access allow \
--priority 1000
SSL/TLS暗号化の設定(推奨)
サーバー側のSSL設定
# 証明書の生成
sudo -u postgres openssl req -new -x509 -days 365 -nodes \
-text -out /var/lib/postgresql/15/main/server.crt \
-keyout /var/lib/postgresql/15/main/server.key \
-subj "/CN=postgres.example.com"
# 権限設定
sudo chmod 600 /var/lib/postgresql/15/main/server.key
sudo chown postgres:postgres /var/lib/postgresql/15/main/server.{crt,key}
postgresql.conf に追加:
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL'
ssl_prefer_server_ciphers = on
クライアント側の接続
# SSL必須で接続
psql "host=server_ip port=5432 dbname=mydb user=myuser sslmode=require"
# SSL証明書検証付き
psql "host=server_ip port=5432 dbname=mydb user=myuser sslmode=verify-full sslrootcert=server.crt"
トラブルシューティング
問題1:接続できない
チェックリスト:
# 1. PostgreSQLが起動しているか
sudo systemctl status postgresql
# 2. ポートでリッスンしているか
sudo ss -tlnp | grep 5432
# 3. ファイアウォールルール確認
sudo ufw status
sudo firewall-cmd --list-all
# 4. PostgreSQLログ確認
sudo tail -f /var/log/postgresql/postgresql-15-main.log
# 5. pg_hba.confの設定確認
sudo grep -v "^#" /etc/postgresql/15/main/pg_hba.conf | grep -v "^$"
問題2:認証エラー
# エラー: FATAL: no pg_hba.conf entry for host
# → pg_hba.confにクライアントIPの設定を追加
# エラー: FATAL: password authentication failed
# → パスワード確認、認証方式確認
# パスワードリセット
sudo -u postgres psql
ALTER USER postgres PASSWORD 'NewPassword123!';
問題3:タイムアウト
# ネットワーク経路確認
traceroute サーバーIP
# MTUサイズ問題の確認
ping -M do -s 1472 サーバーIP
# PostgreSQL接続タイムアウト設定
# postgresql.conf
tcp_keepalives_idle = 60
tcp_keepalives_interval = 10
tcp_keepalives_count = 6
セキュリティ強化策
fail2banで不正アクセスをブロック
# fail2banインストール
sudo apt install fail2ban # Ubuntu/Debian
sudo yum install fail2ban # CentOS/RHEL
# PostgreSQL用設定
sudo nano /etc/fail2ban/jail.local
[postgresql]
enabled = true
port = 5432
filter = postgresql
logpath = /var/log/postgresql/postgresql-15-main.log
maxretry = 3
findtime = 600
bantime = 3600
ログ監視
# 接続ログを有効化(postgresql.conf)
log_connections = on
log_disconnections = on
log_duration = on
# 不審なアクセスを監視
tail -f /var/log/postgresql/postgresql-15-main.log | grep -i "failed\|error\|fatal"
VPNやSSHトンネルの活用
# SSHトンネル経由で接続(より安全)
ssh -L 5432:localhost:5432 user@server_ip
# 別ターミナルで
psql -h localhost -p 5432 -U postgres
ベストプラクティス
推奨設定まとめ
# postgresql.conf
listen_addresses = 'localhost,192.168.1.100' # 特定IPのみ
port = 5432
ssl = on
max_connections = 100
# pg_hba.conf
# 特定IPからのSSL接続のみ許可
hostssl production prod_user 192.168.1.0/24 scram-sha-256
セキュリティチェックリスト
✅ デフォルトポートを変更する(5432→カスタム) ✅ 強力なパスワードを設定 ✅ 特定IPのみ許可 ✅ SSL/TLS暗号化を有効化 ✅ 定期的なログ監視 ✅ fail2banでブルートフォース対策 ✅ 不要なデータベースユーザーを削除 ✅ 最小権限の原則を適用
まとめ:環境別推奨設定
開発環境:
- ローカルネットワークのみ許可
- SSL任意
本番環境:
- 特定IPのみ許可
- SSL必須
- fail2ban必須
- VPN経由推奨
クラウド環境:
- セキュリティグループ/ファイアウォールルール必須
- プライベートサブネット推奨
- マネージドサービス検討
セキュリティを確保しながら、 確実にPostgreSQLへの接続を実現しましょう!
安全第一で、慎重に設定を進めてください。
ポート開放で困ったことがあれば、ぜひ質問してください。セキュアな設定方法を一緒に考えましょう!
コメント