Security

このセクションには、CloudNativePGのセキュリティに関する情報が含まれており、コード、コンテナ、クラスターの3つの異なるレイヤーで分析されます。

警告

このページに含まれる情報は、Kubernetesクラスターでの通常のInfoSec業務の実行を免除するものであってはなりません。 Kubernetes文書の Overview of Cloud Native Security ページをよく理解してください。

コード

CloudNativePGのソースコードは、CI / CDパイプラインで直接 GolangCI-Lint と呼ばれるGoの一般的なオープンソースリンターを使用して、 セキュリティ問題 を含む静的分析目的で体系的にスキャンされます。GolangCI-Lintはいくつかのリンターを実行できます同じソースコードで。

これらの1つは Golang Security Checker 、または単に gosec 、ソースのアブストラクト構文ツリーをスキャンして、ハードコード資格情報、整数などのコードに隠されている既知の脆弱性、脅威、および脆弱性の発見を目的とした一連のルールに対してスキャンしますオーバーフローとSQLインジェクション-いくつか例を挙げ名前。

重要

CI / CDパイプラインの静的コード分析フェーズの失敗は、CloudNativePGの配信全体のブロッカーです。つまり、GolangCI-Lintによって定義されたすべてのリンターに対して各コミットが検証されます。

コンテナ

CloudNativePGのパートであるすべてのコンテナーイメージは、コミットごとにCI / CDパイプラインを介して自動的に構築されます。そのようなイメージには、オペレーターだけでなくオペランドも含まれます。具体的には、サポートされるすべてのPostgreSQLバージョンです。

  • Dockle :用語のベストプラクティス コンテナ構築プロセスの

重要

ベースイメージおよびパッケージレベルのセキュリティ更新の場合、すべてのオペランドイメージはパイプラインによって1日に1回自動的に再構築され、 EDBが配布するコンテナーイメージの**パッチレベルの更新**を提供します。

コンテナレベルのセキュリティでは、次のガイドラインとフレームワークがアカウントされています。

クラスター

クラスターレベルのセキュリティでは、コントロールプレーンとノードの両方を形成するすべてのKubernetesコンポーネント、およびクラスターで実行されるアプリケーション( PostgreSQLを含む)がアカウントされます。

役割ベースのアクセス制御(RBAC)

演算子は、 cnpg-manager という専用のサービスアカウントを使用してKubernetes APIサーバーと対話します。 Kubernetesでは、これはデフォルトで cnpg-system 名前空間にインストールされ、このサービスアカウントと、演算子に付与されたルール/リソース/動詞のセットを定義する cnpg-manager clusterロールとの間のクラスターロールバインドを使用します。

重要

上記のアクセス許可は、オペレーターのサービスアカウントがKubernetes APIサーバーと対話するためにのみ予約れています。 Cluster 、 Pooler 、 Backup 、および ScheduledBackup リソースとのみ対話する演算子のユーザーは、直接アクセスできません。

以下に、いくつかの例を示します。最も重要なのは、CloudNativePGが標準Kubernetesnamespacedリソースの完全または部分的な管理を必要とする理由です。

configmaps :演算子は、Prometheusエクスポーターモニタリングメトリックのデフォルトの構成マップを作成および管理するニーズがあります。

deployments :演算子は、標準のKubernetes Deployment リソースを使用してPgBouncerコネクションプーラを管理するニーズがあります。

jobs :演算子は、異なる Cluster のフェーズを管理するジョブをハンドルニーズがあります。

persistentvolumeclaims : PGDATA が存在するボリュームは、 PostgreSQL Cluster リソースの中心的な要素です。演算子は、定義されたスケジューリングポリシーに基づいて、選択されたストレージクラスと対話して、要求されたボリュームを動的にプロビジョニングするニーズがあります。

pods :演算子は Cluster のインスタンスを管理するニーズがあります。

secrets : Cluster オブジェクトに証明書とパスワードを提供しない限り、演算子はランダムに生成されたパスワードとTLS証明書を自己プロビジョニングし、それらを秘密に保存することにより、「設定より規約」のパラダイムを採用します。

serviceaccounts :演算子は、インスタンスマネージャ( PostgreSQLサーバーを制御するコンテナーの* PID 1 *プロセス)がKubernetes APIサーバーと安全に通信してアクションを調整し、信頼性の高いステータスを継続的に提供できるようにするサービスアカウントを作成するニーズがあります Cluster の。

ニーズ :演算子は、アプリケーションからPostgreSQLクラスター(またはコネクションプーラ)へのネットワークアクセスを制御し、自動化された方法でフェイルオーバー/スイッチオーバー操作を適切に管理する必要があります(例、サービスの正しいエンドポイントを適切なプライマリPostgreSQLインスタンス)。

ポッドセキュリティポリシー

Pod Security Policy は、ポッドがクラスターで実行するためにニーズのあるセキュリティルールと仕様を定義するKubernetesの方法です。InfoSecの理由により、すべてのKubernetesプラットフォームはそれらを実装する必要があります。

CloudNativePGでは、コンテナの実行に特権モードは必要ありませんPostgreSQLコンテナは postgres システムユーザとして実行されます。 root として実行する必要のコンポーネントは一切ありません。

同様に、ボリュームへのアクセスには* privileges *モードや root 特権も必要ありませんレイヤープラットフォームや管理者によって適切なアクセス許可が適切に割り当てられている必要がありますPostgreSQLコンテナは読み取り専用ルートファイルシステムで実行されます

演算子は、必要なセキュリティコンテキストを明示的に設定します。

AppArmorを使用してPodアクセスを制限する

container.apparmor.security.beta.kubernetes.io アノテーションを使用して、 Cluster ポッド内の postgres 、 initdb 、 join 、 full-recovery 、および bootstrap-controller コンテナに AppArmorを使用してPodアクセスを制限する プロファイルを割り当てることができます。

警告

この種類の注釈を使用すると、クラスターの動作が停止する可能性があります。この場合、注釈は Cluster から安全に削除できます。

AppArmor構成はKubernetesノードレベルである必要があります。つまり、基になるオペレーティングシステムでこのオプションを有効にし、適切に構成する必要があります。

これがシチュエーションではなく、注釈が Cluster の作成時に追加された場合、ポッドは作成されません。一方、 Cluster の作成後に注釈を追加すると、クラスター内のポッドはスタートできなくなり、次のようなエラーが表示されます。

metadata.annotations[container.apparmor.security.beta.kubernetes.io/postgres]: Forbidden: may not add AppArmor annotations]

そのような場合は、Kubernetes管理者に問い合わせて、使用する適切なAppArmorプロファイルを要求してください。

ネットワークポリシー

Cluster リソースによって作成されたポッドをKubernetes

ネットワークポリシー で制御して、IPおよびTCPレベルでインバウンドおよびアウトバウンドのネットワークアクセスを有効/無効にすることができます。

重要

演算子は、 PostgreSQLサーバーのステータスに関する情報を取得するために、TCPポート8000で各インスタンスと通信するニーズがあります。ネットワークポリシーを追加する場合はこれを念頭に置いてくださいmakeで詳細な制御に使用されるポートのリストについては、以下の「公開ポート」セクションを参照してください。

ネットワークポリシーはこのドキュメントの範囲外です。詳細については、Kubernetes文書の ネットワークポリシー セクションを参照してください。

露出ポート

CloudNativePGは、以下の表にリストされているように、 演算子、 インスタンス マネージャ 、およびoperandlevelsでポートを公開します。

System

Port number

Exposing

Name

Certificates

Authentication

operator

9443

webhook server

webhook-server

TLS

Yes

operator

8080

metrics

metrics

no TLS

No

instance manager

9187

metrics

metrics

no TLS

No

instance manager

8000

status

status

no TLS

No

operand

5432

PostgreSQL instance

postgresql

optional TLS

Yes

PostgreSQL

CloudNativePGの現在の実装では、 postgres スーパーユーザとデータベース所有者のパスワードと .pgpass ファイルが自動的に作成されます。

パスワードの暗号化に関する限り、CloudNativePGはPostgreSQLのデフォルトの動作に従います。PostgreSQL14以降、 PostgreSQLはデフォルトで scram-sha-256 に設定されますが、以前のバージョンでは md5 に設定されます。

重要

詳細については、 PostgreSQL文書の ユーザー名/パスワード認証 セクションを参照してください。

enableSuperuserAccess を false に設定すると、シークレット経由で postgres ユーザパスワードの管理を無効にできます。

注釈

演算子は、 enableSuperuserAccess オプションの切り替えをサポートしています。実行中のクラスターでそれを無効にすると、演算子はシークレットのコンテンツを無視し、それを削除し(演算子によって以前に生成された場合)、 postgres ユーザのパスワードを NULL に設定します(事実上のパスワード認証リモートアクセスの無効化)。

詳細については、 PgBouncerSecrets を参照してください。

これらのファイルを使用して、データベースへのアプリケーションアクセスを構成できます。

デフォルトでは、すべてのレプリカは、 streaming_replica という特別なユーザーを使用して、 physicalasyncストリーミングレプリケーション で現在のプライマリインスタンスに接続するように自動的に構成されます。ノード間の接続は 暗号化 され、認証は TLSクライアント証明書 を介して行われます(詳細については、 Client TLS/SSL Connections ページを参照してください)。

現在、演算子は、管理者が postgresql 構成の pg_hba セクションのmanifestasパートに pg_hba.conf 行を直接追加することを許可しています。それらのanifestで定義された行は、デフォルトの pg_hba.conf に追加されます。

演算子による pg_hba.conf の管理方法の詳細については、文書の PostgreSQL Configuration を参照してください。

重要

の例では、Kubernetesクラスターがプライベートで安全なネットワークで実行されることを想定しています。