見出し画像

CiliumのegressDeny設定でマイクロサービス間の通信制御を実現

アプリケーションのセキュリティを考えると、「本当に必要な通信だけを許可する」というのが大切ですよね。特にマイクロサービス構成では、サービス間の通信をどう制御するかが重要になります。たとえば、フロントエンド(Frontend)からデータベース(Database)へ直接アクセスできる状態だと、意図しないデータ操作が行われる可能性も…。

そこで活躍するのが Ciliumのネットワークポリシー です。Ciliumを使えば、Kubernetes環境で細かいアクセス制御を設定でき、不要な通信をシャットアウトできます。今回は「FrontendからDatabaseへの直接アクセスを防ぐ」設定を、具体的なCiliumのポリシーと一緒に見ていきましょう。


以下が、修正後のCiliumNetworkPolicyの例です。この設定で「frontend」から「db」への通信をブロックします。

apiVersion: "cilium.io/v2"  # Ciliumのネットワークポリシーを定義するAPIバージョン
kind: CiliumNetworkPolicy   # Ciliumのネットワークポリシーを作成するリソースの種類
metadata:
  name: frontend-db-block   # このネットワークポリシーの名前(識別用)
  namespace: frontend       # このポリシーを適用するKubernetesの名前空間(namespace)

spec:
  endpointSelector:         # このポリシーを適用する対象のPodを指定
    matchLabels:
      role: frontend        # "role=frontend" のラベルを持つPodに適用

  egressDeny:               # 外部(egress)への通信をブロックするルール
  - toEndpoints:            # 通信をブロックする対象(アクセス先)
    - matchLabels:
        role: db            # "role=db" のラベルを持つPodへの通信を禁止


ポリシーの重要ポイント

(1) 対象の選択 (endpointSelector)
この部分では、ラベルrole:frontendを持つPodを対象として指定しています。これにより、Frontendの役割を担うPodにのみポリシーが適用されます。

(2) アクセス制御 (egressDeny)
egressDenyは送信トラフィックの制御を行うセクションです。toEndpoints内でラベルrole:dbを持つPodを指定することで、Databaseの役割を持つPodへの通信をブロックします。


適用する対象

このポリシーは、以下の条件を満たすPodに適用されます。

  • ラベル: role:frontend を持つPod

  • Namespace: この例ではfrontend Namespaceに配置されているPod

Namespaceが異なる場合、適用範囲を調整する必要があります。例えば、Databaseがdb Namespaceにある場合は、toEndpointsでNamespaceを明示的に指定するとよいでしょう。


ポリシー適用後の確認手順

ポリシーが期待通りに機能するか確認するために、以下の手順を実施します。

(1) ポリシーの適用
ポリシー定義ファイルを作成したら、以下のコマンドを実行して適用します。

kubectl apply -f policy.yaml

(2) 通信テスト
Frontend PodからDatabase Podへの通信がブロックされているか確認します。たとえば、Frontend Podに入って以下のコマンドを実行します。

curl http://<db-pod-ip>:<port>

通信がブロックされていれば、ポリシーは正しく機能しています。

(3) Ciliumのログを確認
Ciliumのモニタリングコマンドを使用して、通信がブロックされたログを確認します。

cilium monitor

ブロックされたトラフィックがログに表示されるはずです。


注意点

  • Namespaceの確認: Databaseが別のNamespaceに存在する場合、ポリシーが期待通りに動作しない可能性があります。必要に応じてNamespaceスコープを追加してください。

  • ラベルの適切な設定: Podにラベルが正しく設定されていないと、ポリシーが適用されません。kubectl get pods --show-labelsコマンドでラベルを確認しましょう。


まとめ

今回の設定で、「role:frontend」を持つPodから「role:db」を持つPodへの通信を効果的にブロックできるようになります。ネットワークポリシーを活用することで、必要な通信のみを許可し、システム全体のセキュリティを向上させることができます。適用後のテストや確認を怠らず、設定が正しく反映されていることを確認してください。

いいなと思ったら応援しよう!