PostgreSQL 5432ポート開放完全ガイド!安全に外部接続を許可する設定方法

データベース・SQL

「リモートから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への接続を実現しましょう!

安全第一で、慎重に設定を進めてください。


ポート開放で困ったことがあれば、ぜひ質問してください。セキュアな設定方法を一緒に考えましょう!

コメント

タイトルとURLをコピーしました