セキュリティに関する考慮事項
Patroniクラスターには、不正アクセスから保護すべき2つのインターフェースがあります。1つは分散型構成ストレージ(DCS)、もう1つはPatroni REST APIです。
DCSの保護
Patroniとpatronictl は、DCSに対してデータの格納および取得を行います。
DCSに機密情報が含まれていない場合でも、Patroni/PostgreSQLの構成の一部を変更できるため、最初に保護すべきはDCS自体です。
保護の詳細は使用するDCSの種類によって異なります。サポートされているDCSの種類における認証および暗号化パラメータ(トークン/基本認証/クライアント証明書)は、設定 で説明されています。
一般的な推奨は、すべてのDCS通信でTLSを有効にすることです。
REST APIの保護
REST APIの保護はより複雑な作業です。
PatroniのREST APIは、リーダー選出の実行中にPatroni自身が使用し、patronictl がフェイルオーバー/スイッチオーバー/再初期化/再起動/リロードを実行するために使用し、HAProxyまたはその他のロードバランサーがHTTPヘルスチェックを実行するために使用され、もちろんモニタリングにも利用できます。
セキュリティの観点から、REST APIには安全な(GETリクエスト、情報の取得のみ)と安全でない(PUT、POST、PATCHおよびDELETEリクエスト、ノードの状態の変更)エンドポイントが含まれます。
安全でないエンドポイントは、restapi.authentication.usernameおよびrestapi.authentication.passwordパラメータを設定することでHTTP basic-authで保護できます。安全なエンドポイントをTLSを有効化せずに保護する方法はありません。
REST API用のTLSを有効にし、PKIを構築した場合、すべてのエンドポイントでAPIサーバーとAPIクライアントの相互認証が可能になります。
restapiセクションのパラメータにより、サーバーへのTLSクライアント認証が可能になります。verify_clientパラメータの値に応じて、APIサーバーがクライアント証明書の検証成功を要求する対象は、安全なAPI呼び出しと安全でないAPI呼び出しの両方(verify_client: required)、安全でないAPI呼び出しのみ(verify_client: optional)、あるいはどのAPI呼び出しでもない(verify_client: none)のいずれかです。
ctlセクションのパラメータにより、クライアント(Patroniと同じ構成を使用するpatronictl
)がTLSサーバーを認証できます。insecure: trueを設定することで、クライアントによるサーバー証明書の検証を無効化できます。TLSクライアントパラメータの詳細については、設定
を参照してください。
PostgreSQLデータベース本体に対する不正アクセスからの保護は、本ドキュメントの範囲外であり、https://www.postgresql.org/docs/current/client-authentication.html で説明されています。