![見出し画像](https://assets.st-note.com/production/uploads/images/165799572/rectangle_large_type_2_79c7f94d5e0976fde6f3f01c577911e3.png?width=1200)
Kubernetesの通信制御をスマートに!CiliumでICMP通信をブロックする方法
Kubernetesクラスターを運用していると、必要以上の通信を防ぎたい場面がよくあります。たとえば、フロントエンドアプリケーションがデータベースにICMP(Pingなど)で通信を行う必要がない場合、それを制御して無駄なトラフィックを防ぎたくなることがあります。今回は、Ciliumを使って「フロントエンドアプリケーションからデータベースへのICMPトラフィックを拒否する」ポリシーを設定する方法を紹介します。
ポリシー設定の背景:ICMP通信をブロックする理由
ICMP通信は、ネットワークの状態をチェックしたり、障害診断を行うためのプロトコルですが、システム設計によってはこれが悪用される可能性もあります。たとえば、「Ping」を送り続けることで不正アクセスの下準備をされるようなことがあっては困りますよね。
これをたとえるなら、大事な書類を管理する部屋のドアを「触っても良いけど中に入れない」ではなく、「触ることすら禁止」にするようなもの。Ciliumを使うことで、このレベルのきめ細かな制御が可能になります。
Ciliumでの設定手順:フロントエンドからデータベースへのICMP通信を拒否
それでは、具体的な設定方法を見ていきましょう。
1. 前提条件
Ciliumがすでにクラスターに導入されていること。
type=frontendラベルを持つPod(フロントエンド)と、type=databaseラベルを持つPod(データベース)が存在していること。
CiliumのegressDeny機能を使用します。
2. NetworkPolicyの作成
以下のYAMLファイルを作成します。このポリシーは、type=frontendラベルを持つPodからtype=databaseラベルを持つPodへのICMP通信(PingやEcho Requestなど)を拒否します。
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: p2
namespace: web-app
spec:
endpointSelector:
matchLabels:
type: frontend # Deployment "frontend" の Pod を指定
egressDeny:
- toEndpoints:
- matchLabels:
type: database # Service "database" の Pod を指定
icmps:
- fields:
- type: 8 # IPv4 Echo Request (Ping)
family: IPv4 # IPv4 プロトコル
- type: EchoRequest # IPv6 Echo Request (Ping)
family: IPv6 # IPv6 プロトコル
ポリシーの構成ポイント
metadata
name: ポリシー名をp2と設定しています。
namespace: ポリシーを適用する名前空間をweb-appに指定しています。
endpointSelector
このポリシーは、type=frontendラベルを持つPodに適用されます。
egressDeny
type=frontendラベル付きPodから外部に向かう特定の通信を拒否します。
toEndpoints
対象となる通信先として、type=databaseラベルを持つPodを指定します。
icmps
ICMP通信のうち、type: 8(IPv4のEcho Request)とEchoRequest(IPv6)を拒否する設定です。
ポリシー適用後の効果
このポリシーを適用すると、type=frontendラベルを持つPodからtype=databaseラベルを持つPodへのPingなどのICMP通信がすべて拒否されます。一方で、HTTPやTCPといった他の通信はポリシーの対象外となります。
参考
まとめ
ICMP通信を制限することは、システムのセキュリティと安定性を向上させる有効な手段です。今回紹介したCiliumのポリシー設定は、フロントエンドアプリがデータベースに不要なPingを送るのを防ぎ、リソースの無駄や潜在的なリスクを減らすのに役立ちます。
ちょうど、大事なドアを触れないように鍵をかけて守るような感覚で、Ciliumを活用してあなたのシステムをしっかり守りましょう。