mcpField
I
implementing-kubernetes-network-policy-with-calico

implementing-kubernetes-network-policy-with-calico

github.com/mukul975セキュリティ35.2k66 回インストール8 週間前に更新
リポジトリ

implementing-kubernetes-network-policy-with-calico について

Calicoを使ってKubernetesのネットワークポリシーを適用するための実装スキルです。標準ポリシーに加え、クラスタ全体のルール、順序付きポリシー、拒否ルール、サービスアカウントセレクターを扱います。

主な機能

  1. 01Kubernetes NetworkPolicyの適用
  2. 02クラスタ全体のGlobalNetworkPolicy作成
  3. 03ポリシー順序と拒否ルールの設定
  4. 04サービスアカウントによるワークロード選択
  5. 05ティアによるポリシー整理

活用シーン

  1. 01デフォルトでのNamespace分離
  2. 02指定Pod間通信の許可
  3. 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 と一緒にインストールされる参考資料やスクリプト。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.py

詳細

Calico を使用した Kubernetes Network Policy の実装

概要

Calico は、Kubernetes クラスターにきめ細かなネットワークポリシーの適用機能を提供するオープンソースの CNI プラグインです。Kubernetes NetworkPolicy API の全機能を実装し、さらに Calico 固有の GlobalNetworkPolicy によって、ポリシーの順序、拒否ルール、サービスアカウントベースのセレクターをサポートします。

使用する場面

  • お使いの環境で、Calico を使用した Kubernetes ネットワークポリシー機能をデプロイまたは設定する場合
  • コンプライアンス要件に準拠したセキュリティ制御を確立する場合
  • この分野のセキュリティアーキテクチャを構築または改善する場合
  • この実装を必要とするセキュリティ評価を実施する場合

前提条件

  • Kubernetes クラスター(v1.24+)
  • Calico CNI がインストールされていること(v3.26+)
  • kubectl と calicoctl CLI ツール
  • クラスター管理者の 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

ベストプラクティス

  1. デフォルトでの拒否から始める - すべての Namespace に拒否ポリシーを適用してから、特定のトラフィックを許可します
  2. ラベルを一貫して使用する - アプリ、ティア、環境のラベル付け標準を定義します
  3. ポリシーに順序を付ける - Calico ポリシーの順序を制御するには、ポリシーの評価優先順位を決める order フィールドを使用します
  4. 最初に DNS を許可する - 送信トラフィックの拒否ポリシーを適用する前に、必ず DNS の送信ルールを作成します
  5. クラスター全体のセキュリティベースラインには GlobalNetworkPolicy を使用します
  6. ステージング環境でポリシーをテストする - ポリシー適用後にネットワーク接続を検証します
  7. 拒否されたトラフィックを監視する - ブロックされた接続を把握するため、Calico フローログを有効にします
  8. ティアを使用する - ポリシーをセキュリティ、プラットフォーム、アプリケーションのティアに整理します

コメント