implementing-kubernetes-network-policy-with-calico について
Calicoを使ってKubernetesのネットワークポリシーを適用するための実装スキルです。標準ポリシーに加え、クラスタ全体のルール、順序付きポリシー、拒否ルール、サービスアカウントセレクターを扱います。
主な機能
- 01Kubernetes NetworkPolicyの適用
- 02クラスタ全体のGlobalNetworkPolicy作成
- 03ポリシー順序と拒否ルールの設定
- 04サービスアカウントによるワークロード選択
- 05ティアによるポリシー整理
活用シーン
- 01デフォルトでのNamespace分離
- 02指定Pod間通信の許可
- 03クラスタ共通のセキュリティ基準設定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill implementing-kubernetes-network-policy-with-calicoインストール後、Claude Code で/implementing-kubernetes-network-policy-with-calicoを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py詳細
Calico を使用した Kubernetes Network Policy の実装
概要
Calico は、Kubernetes クラスターにきめ細かなネットワークポリシーの適用機能を提供するオープンソースの CNI プラグインです。Kubernetes NetworkPolicy API の全機能を実装し、さらに Calico 固有の GlobalNetworkPolicy によって、ポリシーの順序、拒否ルール、サービスアカウントベースのセレクターをサポートします。
使用する場面
- お使いの環境で、Calico を使用した Kubernetes ネットワークポリシー機能をデプロイまたは設定する場合
- コンプライアンス要件に準拠したセキュリティ制御を確立する場合
- この分野のセキュリティアーキテクチャを構築または改善する場合
- この実装を必要とするセキュリティ評価を実施する場合
前提条件
- Kubernetes クラスター(v1.24+)
- Calico CNI がインストールされていること(v3.26+)
kubectlとcalicoctlCLI ツール- クラスター管理者の RBAC 権限
Calico のインストール
Operator ベースのインストール(推奨)
# Install the Tigera operator
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/tigera-operator.yaml
# Install Calico custom resources
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/custom-resources.yaml
# Verify installation
kubectl get pods -n calico-system
watch kubectl get pods -n calico-system
# Install calicoctl
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calicoctl.yaml
Calico の実行状態を確認する
# Check Calico pods
kubectl get pods -n calico-system
# Check Calico node status
kubectl exec -n calico-system calicoctl -- calicoctl node status
# Check IP pools
kubectl exec -n calico-system calicoctl -- calicoctl get ippool -o wide
Kubernetes NetworkPolicy
すべてのトラフィックをデフォルトで拒否する
# deny-all-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
---
# deny-all-egress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-egress
namespace: production
spec:
podSelector: {}
policyTypes:
- Egress
特定の Pod 間通信を許可する
# allow-frontend-to-backend.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: production
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
DNS の送信トラフィックを許可する
# allow-dns-egress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-dns-egress
namespace: production
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- namespaceSelector: {}
ports:
- protocol: UDP
port: 53
- protocol: TCP
port: 53
Namespace の分離
# allow-same-namespace.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-same-namespace
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- podSelector: {}
Calico 固有のポリシー
GlobalNetworkPolicy(クラスター全体)
# global-deny-external.yaml
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: deny-external-ingress
spec:
order: 100
selector: "projectcalico.org/namespace != 'ingress-nginx'"
types:
- Ingress
ingress:
- action: Deny
source:
nets:
- 0.0.0.0/0
destination: {}
拒否ルールを含む Calico NetworkPolicy
# calico-deny-policy.yaml
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: deny-database-from-frontend
namespace: production
spec:
order: 10
selector: app == 'database'
types:
- Ingress
ingress:
- action: Deny
source:
selector: app == 'frontend'
- action: Allow
source:
selector: app == 'backend'
destination:
ports:
- 5432
サービスアカウントベースのポリシー
# sa-based-policy.yaml
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-by-service-account
namespace: production
spec:
selector: app == 'api'
ingress:
- action: Allow
source:
serviceAccounts:
names:
- frontend-sa
- monitoring-sa
egress:
- action: Allow
destination:
serviceAccounts:
names:
- database-sa
ホストエンドポイントの保護
# host-endpoint-policy.yaml
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: restrict-host-ssh
spec:
order: 10
selector: "has(kubernetes.io/hostname)"
applyOnForward: false
types:
- Ingress
ingress:
- action: Allow
protocol: TCP
source:
nets:
- 10.0.0.0/8
destination:
ports:
- 22
- action: Deny
protocol: TCP
destination:
ports:
- 22
Calico ポリシーティア
# security-tier.yaml
apiVersion: projectcalico.org/v3
kind: Tier
metadata:
name: security
spec:
order: 100
---
# platform-tier.yaml
apiVersion: projectcalico.org/v3
kind: Tier
metadata:
name: platform
spec:
order: 200
監視とトラブルシューティング
# List all network policies
kubectl get networkpolicy --all-namespaces
# List Calico-specific policies
kubectl exec -n calico-system calicoctl -- calicoctl get networkpolicy --all-namespaces -o wide
kubectl exec -n calico-system calicoctl -- calicoctl get globalnetworkpolicy -o wide
# Check policy evaluation for a specific endpoint
kubectl exec -n calico-system calicoctl -- calicoctl get workloadendpoint -n production -o yaml
# View Calico logs
kubectl logs -n calico-system -l k8s-app=calico-node --tail=100
# Test connectivity
kubectl exec -n production frontend-pod -- wget -qO- --timeout=2 http://backend-svc:8080/health
ベストプラクティス
- デフォルトでの拒否から始める - すべての Namespace に拒否ポリシーを適用してから、特定のトラフィックを許可します
- ラベルを一貫して使用する - アプリ、ティア、環境のラベル付け標準を定義します
- ポリシーに順序を付ける - Calico ポリシーの順序を制御するには、ポリシーの評価優先順位を決める
orderフィールドを使用します - 最初に DNS を許可する - 送信トラフィックの拒否ポリシーを適用する前に、必ず DNS の送信ルールを作成します
- クラスター全体のセキュリティベースラインには GlobalNetworkPolicy を使用します
- ステージング環境でポリシーをテストする - ポリシー適用後にネットワーク接続を検証します
- 拒否されたトラフィックを監視する - ブロックされた接続を把握するため、Calico フローログを有効にします
- ティアを使用する - ポリシーをセキュリティ、プラットフォーム、アプリケーションのティアに整理します
コメント
Markdown 対応