Cilium

Ciliumについて

Cilium は、2021年にインキュベートプロジェクトとして受け入れられ、2023年に卒業したCNCF卒業プロジェクトです。もともとIsovalentによって作成されました。これは、クラウドネイティブ環境のための高度なネットワーキング、セキュリティ、およびオブザーバビリティのソリューションであり、 eBPF テクノロジーに基づいて構築されています。 Ciliumは、LinuxカーネルにeBPFプログラムを動的に注入することにより、Kubernetesクラスターのネットワークトラフィックを管理し、低遅延、高性能通信を有効にし、きめの細かいセキュリティポリシーを適用します。

Ciliumの主な機能

  • 詳細なL3-L7セキュリティポリシーによるきめの細かいネットワークトラフィック制御

  • eBPFを介した効率的なカーネルレベルのトラフィック管理

  • サービスメッシュ統合Cilium Service Mesh

  • Kubernetes NetworkPolicyとCiliumNetworkPolicyの両方のサポート

  • ビルトインの可観測性とハッブルによるモニタリング

環境にCiliumをインストールするには、ドキュメントの指示に従ってください。

https://docs.cilium.io/en/stable/gettingstarted/k8s-install-default/

CloudNativePGとCiliumを使用したポッド間のネットワークセキュリティ

Kubernetesのデフォルトの動作は、クラスターネットワーク内の2つのポッド間のトラフィックを許可することです。 Ciliumは、CiliumNetworkPolicy リソースを使用して、高度なL3 / L4ネットワークセキュリティを提供します。これにより、Kubernetesクラスター内のポッド間のネットワークトラフィックのきめの細かい制御が可能になります。これは、アプリケーションのワークロードとバックエンドサービス間の通信を保護するために特に役立ちます。

次の例では、Ciliumを使用して、入力トラフィックを許可されたポッドのみに制限することにより、CloudNativePG PostgreSQLインスタンスを保護する方法を示します。

注釈

続行する前に、cluster-example Postgresクラスターが環境で稼働していることを確認してください。

Ciliumのデフォルト拒否動作

デフォルトでは、Ciliumは明示的に構成されていない限り、すべてのトラフィックを拒否しません**。ポリシーが名前空間に存在すると、デフォルトによる拒否モデルを使用するKubernetes NetworkPolicyとは対照的に、Ciliumはデフォルトの拒否動作をより柔軟に制御します。

Ciliumでデフォルトの拒否ポスチャを適用するには、特に許可されない限り、ポッドのセットへのすべてのトラフィックを拒否するポリシーを明示的に作成する必要があります。これは一般に、 空の``ingress`` セクションendpointSelector と組み合わせて使用するか、より広範な適用のためにCiliumエージェントレベルで ``--enable-default-deny`` を有効にすることにより実現されます。

デフォルトの拒否ポリシーの最小限の例

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: default-deny
  namespace: default
spec:
  description: "Default deny all ingress traffic to all Pods in this namespace"
  endpointSelector: {}
  ingress: []

CiliumネットワークポリシーをCloudNativePGオペレーターと連携させる

Ciliumかどうかにかかわらず、ネットワークポリシーを使用する場合、最初のステップは、オペレーターがターゲット名前空間のポッドに到達できることを確認することです。オペレーターはポッドでチェックとアクションを実行できる必要があり、これらのアクションの1つでは、ポッドのポート8000 にアクセスして、内部で実行されているPostgreSQLインスタンスの現在のステータスを取得する必要があるため、これは重要です。

次のCiliumNetworkPolicy により、オペレーターはターゲットdefault 名前空間のポッドにアクセスできます。

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: cnpg-operator-access
  namespace: default
spec:
  description: "Allow CloudNativePG operator access to any pod in the target namespace"
  endpointSelector: {}
  ingress:
    - fromEndpoints:
        - matchLabels:
            io.kubernetes.pod.namespace: cnpg-system
      toPorts:
        - ports:
            - port: "8000"
              protocol: TCP

注釈

cnpg-system 名前空間は、YAMLマニフェストを使用する場合のオペレーターのデフォルトの名前空間です。オペレーターが別のプロセスHelm、OLMなどを使用してインストールされた場合、名前空間は異なる場合があります。名前空間を適切に調整してください。

クラスターポッド間のアクセスの許可

デフォルトポリシーは「deny all」であるため、同じ名前空間内のクラスターポッド間のアクセスを明示的に許可する必要があります。必要なイングレスルールを追加することにより、以前のポリシーを改善します。

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: cnpg-cluster-internal-access
  namespace: default
spec:
  description: "Allow CloudNativePG operator access and connection between pods in the same namespace"
  endpointSelector: {}
  ingress:
    - fromEndpoints:
        - matchLabels:
            io.kubernetes.pod.namespace: cnpg-system
        - matchLabels:
            io.kubernetes.pod.namespace: default
            cnpg.io/cluster: cluster-example
      toPorts:
        - ports:
            - port: "8000"
              protocol: TCP
            - port: "5432"
              protocol: TCP

このポリシーは、 cnpg-system ポッドと、 cluster-example にも属するdefault 名前空間ポッドからのアクセスを許可します。 matchLabels セレクターでは、ポッドにリストされたラベルの完全なセットが必要です。ラベルが1つだけない場合は、ポッドが一致しないことを意味します。

Ciliumを使用してPostgreSQLへのアクセスを制限する

この例では、 default 名前空間のrole=backend というラベルのポッドのみがcluster-example という名前のPostgreSQLクラスターに接続することを許可するCiliumNetworkPolicy を定義します。他のすべての入力トラフィックはデフォルトでブロックされます。

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: postgres-access-backend-label
  namespace: default
spec:
  description: "Allow PostgreSQL access on port 5432 from Pods with role=backend"
  endpointSelector:
    matchLabels:
      cnpg.io/cluster: cluster-example
  ingress:
    - fromEndpoints:
       - matchLabels:
            role: backend
      toPorts:
        - ports:
          - port: "5432"
            protocol: TCP

このCiliumNetworkPolicy は、 role=backend でラベル付けられたポッドのみがdefault 名前空間のポート5432を介してCloudNativePGによって管理されるPostgreSQLインスタンスにアクセスできるようにします。

次のポリシーでは、名前空間のラベルrole=backend を持つポッドからのみ、cluster-example という名前のPostgreSQLクラスターのポート5432への入力トラフィックを許可する方法を示します。

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: postgres-access-backend-any-ns
  namespace: default
spec:
  description: "Allow PostgreSQL access on port 5432 from Pods with role=backend in any namespace"
  endpointSelector:
    matchLabels:
      cnpg.io/cluster: cluster-example
  ingress:
    - fromEndpoints:
        - labelSelector:
            matchLabels:
              role: backend
            matchExpressions:
              - key: io.kubernetes.pod.namespace
                operator: Exists
      toPorts:
        - ports:
          - port: "5432"
            protocol: TCP

次の例では、 backend 名前空間のポッドからcluster-example クラスター default 名前空間にありますのポート5432への入力トラフィックを許可します。

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: postgres-access-backend-namespace
  namespace: default
spec:
  description: "Allow PostgreSQL access on port 5432 from any Pods in the backend namespace"
  endpointSelector:
    matchLabels:
      cnpg.io/cluster: cluster-example
  ingress:
    - fromEndpoints:
        - matchLabels:
            io.kubernetes.pod.namespace: backend
      toPorts:
        - ports:
            - port: "5432"
              protocol: TCP

CiliumのL3 / L4ポリシーモデルを使用して、 backend 名前空間のアプリケーションポッドからのみクラスターポッドへの入力トラフィックを明示的に許可するCiliumNetworkPolicy を定義します。追加ポリシーで明示的に許可されない限り、他のすべてのトラフィックは暗黙的に拒否されます。

次の例では、Kubernetesクラスター内の任意のソースからcluster-example クラスターdefault 名前空間にありますのポート5432への入力トラフィックを許可します。

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: postgres-access-cluster-wide
  namespace: default
spec:
  description: "Allow ingress traffic to port 5432 of the cluster-example from any pods within the Kubernetes cluster"
  endpointSelector:
    matchLabels:
      cnpg.io/cluster: cluster-example
  ingress:
    - fromEntities:
        - cluster
      toPorts:
        - ports:
            - port: "5432"
              protocol: TCP

Ciliumネットワークポリシーの作成と検証を簡素化するビジュアルでインタラクティブツール editor.networkpolicy.io の使用を検討できます。視覚的な方法で表示することにより、構成の間違いを回避し、交通ルールをより明確に理解するのに特に役立ちます。

これらのポリシーにより、PostgreSQLのベースラインのアクセス制御が確立されました。 Ciliumのポリシー言語を使用して追加の出力または監査ルールを階層化したり、Envoyを使用してL7適用に拡張したりできます。