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 中实施网络策略的技能。内容涵盖标准策略,以及集群级规则、策略排序、拒绝规则和基于服务账户的选择器等 Calico 扩展。

主要功能

  1. 01应用 Kubernetes NetworkPolicy
  2. 02创建集群级 GlobalNetworkPolicy
  3. 03设置策略顺序与拒绝规则
  4. 04按服务账户选择工作负载
  5. 05使用层级组织策略

适用场景

  1. 01默认隔离命名空间
  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 网络策略

概述

Calico 是一个开源 CNI 插件,为 Kubernetes 集群提供细粒度的网络策略实施。它实现了完整的 Kubernetes NetworkPolicy API,并通过 Calico 特有的 GlobalNetworkPolicy 对其进行了扩展,支持策略排序、拒绝规则以及基于服务账号的选择器。

适用场景

  • 在您的环境中部署或配置使用 Calico 实现 Kubernetes 网络策略的能力时
  • 建立符合合规要求的安全控制措施时
  • 为该领域构建或改进安全架构时
  • 执行需要此实现的安全评估时

前提条件

  • Kubernetes 集群(v1.24+)
  • 已安装 Calico CNI(v3.26+)
  • kubectl 和 calicoctl 命令行工具
  • 集群管理员 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 到 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
命名空间隔离
# 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. 从默认拒绝开始 - 对每个命名空间应用拒绝所有策略,然后允许特定流量
  2. 一致地使用标签 - 为 app、tier、environment 定义标签标准
  3. 对策略排序 - 使用 Calico 策略排序(order 字段)控制评估优先级
  4. 优先允许 DNS - 在应用出站拒绝策略之前,始终先创建 DNS 出站规则
  5. 使用 GlobalNetworkPolicy 建立集群范围的安全基线
  6. 在预发布环境中测试策略 - 应用策略后验证网络连通性
  7. 监控被拒绝的流量 - 启用 Calico 流日志以了解被阻止的连接
  8. 使用层级 - 将策略组织为安全、平台和应用层级

评论

支持 Markdown