DBAtlas · データベース運用アトラス

PostgreSQL セキュリティ強化 (状態監査、ネットワーク、TLS、認証、権限、監査ログ、暗号化)

PostgreSQLレベル: 中級所要時間: 5 分 (監査) – 3 時間 (完全な強化)

インストールガイドではありません。稼働中の PostgreSQL サーバーのセキュリティ上の不備を見つけて塞ぎます。まず読み取り専用の 状態監査 が検出事項を重大度順に一覧し、各検出事項がどのカードにつながるかを示します。その後、各領域を一つずつ、または全部を順番に対処します: リッスンアドレス、ファイアウォールと pg_hba、TLS とクライアント側の sslmode=verify-full、scram-sha-256 と postgres のネットワーク経由ログインの禁止、ロール設計と PUBLIC 権限、pgaudit と集中ログ、LUKS / pgcrypto、暗号化バックアップ、OS、バージョン管理。最後に監査を再実行し、解消した検出事項は一覧から消えます。

構成: 単一の PostgreSQL サーバー + アプリケーションサーバー (クライアント側の検証)。レプリカ/Patroni 環境は注記で扱います

シナリオ

  • 状態監査: どこに不備があるか (読み取り専用) — 最初に実行するスキャンです。pg_hba、リッスンアドレス、TLS、md5 パスワード、スーパーユーザー、PUBLIC 権限、監査ログ、ファイル権限、ファイアウォールを確認し、何も変更しません。
  • 完全な強化 (全領域を順番に) — 新規構築、または一度も強化していないサーバー: 全領域を安全な順序で適用します。PostgreSQL を 1〜2 回再起動します (メンテナンスウィンドウが必要です)。
  • ネットワークと接続: 誰がどこから接続できるか (listen、ファイアウォール、pg_hba) — PostgreSQL が全インターフェースでリッスンしている、pg_hba に 0.0.0.0/0 や trust がある、ポートが誰にでも開いている。listen_addresses を変更すると再起動が必要です。
  • 接続を暗号化する (TLS、sslmode=verify-full) — ssl = off、またはクライアントが証明書を検証していない。サーバー証明書、hostssl、クライアント側の verify-full。reload のみで済み、停止はありません。
  • 認証とパスワード (scram-sha-256、postgres のリモートログイン) — md5/password 方式、md5 ハッシュのパスワード、postgres ユーザーがネットワーク経由でログインできる状態。scram-sha-256 への移行と個人用 DBA アカウント。停止はなく、パスワードは再設定します。
  • 最小権限: ロール、PUBLIC、アプリケーションアカウント — アプリケーションアカウントがテーブルの所有者またはスーパーユーザーで、public スキーマに誰でも書き込める。読み取り/書き込み/所有者ロールと権限レポート。停止はありません。
  • 監査: 誰が何をしたか (pgaudit、集中ログ) — 監査人やセキュリティチームが DDL とロール変更の記録を求めている。pgaudit の導入とログの集中サーバーへの転送。再起動が 1 回必要です。
  • 保存データを暗号化する (LUKS / pgcrypto) — ディスクやバックアップの盗難に対する保護が求められている。PostgreSQL には組み込みの TDE はありません: ディスクレベルの LUKS (移行時に停止あり) か、列レベルの pgcrypto です。
  • バックアップのセキュリティ (暗号化バックアップ、権限) — バックアップファイルが暗号化されていない、または誰でも読めるディレクトリにある。pgBackRest のリポジトリ暗号化または pg_dump + GPG、.pgpass とディレクトリ権限。停止はありません。
  • OS 側 (サービスアカウント、権限、コアダンプ、SELinux) — postgres アカウントに使用可能なパスワードがある、データディレクトリの権限が緩い、SELinux が Permissive/Disabled。コアダンプの設定は次回の再起動で有効になります。
  • パッチとバージョン: サポート対象のバージョンか — バージョン、サポート終了日、未適用のマイナーアップデートを確認します。適用はパッチガイドにつながります。読み取り専用です。

開始前の確認

  • PostgreSQL … が稼働しており、サーバー自身から postgres ユーザーでパスワードなしに接続できる (sudo -iu postgres psql、pg_hba に local all postgres peer)。PostgreSQL インストールガイド で構築した場合は既にこの状態です。
  • データディレクトリは …、設定ディレクトリは …。psql と pg_dump は … 配下にあります。postgres ユーザーのログインシェルでは PATH に入っています。root から実行するときはフルパスを指定してください。
  • サーバーに 2 つの SSH セッション を開いておく: 一方で手順を実行し、もう一方 (sudo -iu postgres psql を開いた状態) は誤ったルールで締め出された場合の切り戻し用です。アクセスを絞るステップの後は毎回、新しい接続を 3 つ目 のセッションで試してください。成功を確認するまで既存のセッションは閉じないでください。
  • メンテナンスウィンドウ: 選択した領域では PostgreSQL を再起動します (listen_addresses、shared_preload_libraries、コアダンプ上限、ディスク移行)。アプリケーションチームに連絡済みであること。
  • データベースに接続するすべてのアプリケーションの一覧と接続情報 (サーバー IP、ユーザー、ドライバーのバージョン) が手元にある。制限をかける前に、誰がどこから接続しているか は監査ステップで確認できます。一覧にないクライアントは制限後に接続できなくなります。
  • 最新で、リストアを検証済みのバックアップがある (pgBackRest または pg_dump)。強化作業はデータに触れませんが、ロール/権限の変更とディスク移行は元に戻せない誤りが起きやすい作業です。

ガイドのフェーズ

  • 状態監査 (読み取り専用) — データベース内の検出事項を一覧表示する · 各データベースのスキーマと関数の検出事項を一覧表示する · OS 側を監査する
  • 開始前に: フォールバックポイント — 現在の設定とロールのコピーを取る · 追加の設定ディレクトリ (conf.d) を有効にする
  • 権限 — 1. 診断 — ロール、所有権、PUBLIC 権限を表示する
  • 権限 — 2. 安全策 — 現在の権限をダンプする
  • 権限 — 3. 適用 — グループロールとログインアカウントを作成する · 新しいログインアカウントにパスワードを設定する · データベースとスキーマの権限を設定する · アプリケーションアカウントが所有するオブジェクトを所有者ロールに移管する · 権限レポート
  • 権限 — 4. 確認 — アプリケーションアカウントが DDL を実行できず、データは書き込めることを確認する
  • 権限 — 5. 事後作業 — マイグレーションツールを所有者ロールに切り替える
  • 認証 — 1. 診断 — パスワードハッシュ、認証方式、アカウントを表示する
  • 認証 — 2. 安全策 — ドライバーの互換性を確認する
  • 認証 — 3. 適用 — 新しいパスワードを scram-sha-256 で保存する · 設定を読み込み、md5 アカウントのパスワードを再設定する · pg_hba の md5/password 方式を scram-sha-256 に変更する · postgres スーパーユーザーのネットワーク経由ログインを禁止する · 個人用 DBA アカウントを作成する
  • 認証 — 4. 確認 — ハッシュと、スーパーユーザーのネットワーク経由ログインの拒否を確認する · アプリケーションサーバーからの scram ログインと postgres の拒否
  • 認証 — 5. 事後作業 — 使われていないアカウントと期限切れのアカウントを見直す
  • TLS — 1. 診断 — 現在の SSL の状態と暗号化なしのクライアントを表示する
  • TLS — 2. 安全策 — 証明書ディレクトリを準備する
  • TLS — 3. 適用 — テスト CA とサーバー証明書を作成する · 鍵と証明書署名要求 (CSR) を作成する · 署名済み証明書と CA チェーンを配置する · 証明書、鍵、チェーンを検証する · サーバーで TLS を有効にする · 設定を読み込み、TLS が有効になったことを確認する …
  • TLS — 4. 確認 — 暗号化なしの接続が拒否されることを確認する
  • TLS — 5. 事後作業: 証明書の更新 — 証明書の更新手順
  • ネットワーク — 1. 診断: 誰がどこから接続しているか — リッスンアドレス、pg_hba ルール、接続中のクライアントを表示する
  • ネットワーク — 2. 安全策 — フォールバック用セッションを開いたままにする
  • ネットワーク — 3. 適用 — リッスンアドレスを絞る · pg_hba.conf を最小限のアクセスで書き直す · ルールを確認して読み込む · ファイアウォールでポートを許可したネットワークにのみ開く · リッスンアドレスのために PostgreSQL を再起動する
  • ネットワーク — 4. 確認 — アプリケーションサーバーから許可される接続と拒否される接続を試す
  • ネットワーク — 5. 事後作業 — 拒否された接続を監視する
  • 監査 — 1. 診断 — 監査とログの設定を表示する
  • 監査 — 2. 安全策 — ログディスクの場所と空き容量を確認する
  • 監査 — 3. 適用 — pgaudit パッケージをインストールする · pgaudit を事前ロードライブラリに追加し、設定を書き込む · pgaudit を有効にするため再起動する · pgaudit 拡張を作成する · ログを集中サーバーに転送する (rsyslog) · ローカル監査ファイルの保存期間 (logrotate) …
  • 監査 — 4. 確認 — DDL とロール変更を実行し、ログで確認する
  • 監査 — 5. 事後作業 — 監査の無効化を監視する
  • バックアップ — 1. 診断 — バックアップの暗号化状態と権限を表示する
  • バックアップ — 2. 安全策 — 暗号化鍵の保管場所を準備する
  • バックアップ — 3. 適用 — 新しい暗号化リポジトリを定義する · 暗号化リポジトリを作成し、最初のフルバックアップを取得する · GPG 公開鍵をサーバーにインポートする · 暗号化バックアップのスクリプト · バックアップディレクトリ、権限、手動テスト · 暗号化バックアップをスケジュールする (cron) …
環境に合わせた手順プランを開く →