implementing-network-policies-for-kubernetes について
NetworkPolicy で Pod 単位の通信を制御する、クラスタ管理者やセキュリティエンジニア向けの Kubernetes セキュリティスキルです。デフォルト拒否からアプリケーション別ルール、疎通検証までの手順を示します。
主な機能
- 01全通信のデフォルト拒否
- 02DNS のアウトバウンド設定
- 03アプリケーション別・Namespace 別ポリシー
- 04外部へのアウトバウンド制限
- 05クラウドメタデータへのアクセス遮断
- 06ポリシーと疎通の検証
活用シーン
- 01Namespace にネットワーク分離を適用
- 02アプリケーション Pod の送信通信を制限
- 03クラスタ内のラテラルムーブメントを抑制
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill implementing-network-policies-for-kubernetesインストール後、Claude Code で/implementing-network-policies-for-kubernetesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py詳細
Kubernetes のネットワークポリシーの実装
概要
Kubernetes の NetworkPolicy は、Pod、Namespace、外部エンドポイント間のトラフィックフローを制御するイングレスルールとエグレスルールを定義し、Pod レベルのネットワークセグメンテーションを提供します。Calico や Cilium などの CNI プラグインと組み合わせることで、ネットワークポリシーはゼロトラストのマイクロセグメンテーションを適用し、クラスター内でのラテラルムーブメントを防止します。
使用する場面
- 環境に Kubernetes のネットワークポリシー機能をデプロイまたは設定する場合
- コンプライアンス要件に準拠したセキュリティ制御を確立する場合
- この領域のセキュリティアーキテクチャを構築または改善する場合
- この実装を必要とするセキュリティ評価を実施する場合
前提条件
- NetworkPolicy に対応した CNI(Calico、Cilium、Antrea)を備えた Kubernetes クラスター
- 管理者アクセス権で設定された kubectl
- Pod のラベルとセレクターに関する知識
ワークフロー
ステップ 1:すべてのトラフィックをデフォルトで拒否する
# default-deny-all.yaml - Apply to every namespace
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: production
spec:
podSelector: {} # Applies to all pods
policyTypes:
- Ingress
- Egress
ステップ 2:DNS のエグレスを許可する(サービスディスカバリーに必須)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-dns
namespace: production
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
ports:
- protocol: UDP
port: 53
- protocol: TCP
port: 53
ステップ 3:アプリケーション固有のポリシー
# Allow frontend to reach backend only
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-allow-frontend
namespace: production
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
---
# Allow backend to reach database only
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: database-allow-backend
namespace: production
spec:
podSelector:
matchLabels:
app: database
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: backend
ports:
- protocol: TCP
port: 5432
ステップ 4:Namespace をまたぐポリシー
# Allow monitoring namespace to scrape metrics
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-monitoring-scrape
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
purpose: monitoring
ports:
- protocol: TCP
port: 9090 # Prometheus metrics port
ステップ 5:エグレスの制限
# Restrict egress to specific external services
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: restrict-egress
namespace: production
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Egress
egress:
- to:
- podSelector:
matchLabels:
app: database
ports:
- protocol: TCP
port: 5432
- to: # Allow external API
- ipBlock:
cidr: 203.0.113.0/24
ports:
- protocol: TCP
port: 443
- to: # DNS
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
ports:
- protocol: UDP
port: 53
ステップ 6:クラウドメタデータへのアクセスをブロックする
# Prevent SSRF to cloud metadata service
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: block-metadata
namespace: production
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 169.254.169.254/32 # AWS/GCP metadata
- 100.100.100.200/32 # Azure metadata
検証コマンド
# Verify policies are applied
kubectl get networkpolicies -n production
# Test connectivity (should be blocked)
kubectl run test-pod --image=busybox --restart=Never -n production -- wget -qO- --timeout=2 http://database-service:5432
# Expected: timeout (blocked by policy)
# Test allowed traffic
kubectl run frontend-test --image=busybox --labels=app=frontend --restart=Never -n production -- wget -qO- --timeout=2 http://backend-service:8080
# Expected: connection succeeds
参考資料
コメント
Markdown 対応