• 安全保障基于软件全生命周期-NetworkPolicy应用


    NetworkPolicy可以从IP地址或者端口层面控制网络流量,网络策略通过网络插件来实现,如果要使用网络策略,必须使用支持networkPolicy的网络解决方案。创建一个NetworkPolicy资源对象,如果没有控制器来使用,那么这个NetworkPolicy不会有任何作用。当网络策略选择了某些Pod后,这些被选中的Pod就会遵循NetworkPolicy中定义的规则。另外,网络测试不会冲突,如果有一个或者多个策略选择了一个Pod,那么该Pod会使用多个策略的和集。在定义NetworkPolicy规则时有一些关键字段,具体字段含义如下所示:
    spec:包含了在一个namespace中定义特定网络策略所需的所有信息。
    podSelector:用于选择一组Pod,如果podSelector字段是空,代表选择namespace下的所有Pod
    policyTypes:policyType包含Ingress或者Egress或者两者都有,如果policyTypes没有指定,那么默认是Ingress。
    Ingress:Ingress规则白名单列表,每个允许同时匹配from和ports部分的流量
    Egress:Egress规则的白名单列表,每个规则允许匹配to和port部分的流量

    例如下面的规则是:选择打了标签role=db的pod。

    1. podSelector:
    2. matchLabels:
    3. role:db

    下面的规则是允许所有的流量,如果ingress后面没有-{},则是拒绝所有的流量。

    1. spec:
    2. podSelector:{}
    3. policyType:
    4. - Ingress
    5. spec:
    6. podSelector:{}
    7. ingress:
    8. -{}
    9. policyTypes:
    10. -Ingress

    NetworkPolicy是命名空间级别的资源,规则应用与标签选择器匹配的endpoint的集合。GlobalNetworkPolicy与NetworkPolicy功能一样,是整个集群级别的资源,GlobalNetworkPolicy会在集群中所有Namespace生效,并且能限制主机(HostEndpoint).

    接下来通过实际例子演示NetworkPolicy工作过程,集群使用的网络插件是Calico。首先部署两个应用,部署的yaml文件如下,toolbox是用于访问部署的calico-demo的pod的。

    1. apiVersion: v1
    2. kind: Namespace
    3. metadata:
    4. name: calico-demo
    5. ---
    6. apiVersion: apps/v1
    7. kind: Deployment
    8. metadata:
    9. namespace: calico-demo
    10. name: calico-demo
    11. labels:
    12. app: calico-demo
    13. spec:
    14. replicas: 1
    15. selector:
    16. matchLabels:
    17. app: calico-demo
    18. template:
    19. metadata:
    20. labels:
    21. app: calico-demo
    22. access: "true"
    23. spec:
    24. containers:
    25. - name: calico-demo
    26. image: nginx
    27. ports:
    28. - containerPort: 80
    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. # namespace: default
    5. name: toolbox
    6. spec:
    7. replicas: 1
    8. selector:
    9. matchLabels:
    10. app: toolbox
    11. template:
    12. metadata:
    13. labels:
    14. app: toolbox
    15. access: "true"
    16. spec:
    17. containers:
    18. - name: toolbox
    19. image: centos
    20. command:
    21. - tail
    22. - -f
    23. - /dev/null

    toolbox一个部署在calico-demo的namespace下,一个部署在default的namespace下面,部署完成后,登录到toolbox pod里面,用curl和ping命令访问calico-demo服务,可以看到都访问成功。同理进入在default namespace下的toolbox,curl和ping都能成功。

     此时让NetworkPolicy生效,NetworkPolicy的规则如下,表示不允许任何流量。NetworkPolicy生效后,在两个namespace下的toolbox pod里面再用curl和ping命令,都不通了

    1. kind: NetworkPolicy
    2. apiVersion: networking.k8s.io/v1
    3. metadata:
    4. name: default-deny
    5. namespace: calico-demo
    6. spec:
    7. podSelector: {}

    接着让下面的GlobalNetworkPolicy生效,这个规则是开通ping命令。因为是Global的policy,所以在两个namespace下用ping命令都能成功,curl命令仍然失败。

    1. apiVersion: projectcalico.org/v3
    2. kind: GlobalNetworkPolicy
    3. metadata:
    4. name: allow-ping-in-cluster
    5. spec:
    6. selector: all()
    7. types:
    8. - Ingress
    9. ingress:
    10. - action: Allow
    11. protocol: ICMP
    12. source:
    13. selector: all()
    14. icmp:
    15. type: 8 # Ping request
    16. - action: Allow
    17. protocol: ICMPv6
    18. source:
    19. selector: all()
    20. icmp:
    21. type: 128 # Ping request

    接着在开通80端口,但是该端口的流量要来源于default namespace中的pod才行。所以下面的NetworkPolicy生效后,在default namespace下的toolbox中用curl命令访问calico-demo服务是通的。

    1. apiVersion: networking.k8s.io/v1
    2. kind: NetworkPolicy
    3. metadata:
    4. name: allow-http
    5. namespace: calico-demo
    6. spec:
    7. podSelector: {}
    8. ingress:
    9. - from:
    10. - namespaceSelector:
    11. matchLabels:
    12. kubernetes.io/metadata.name: default
    13. ports:
    14. - protocol: TCP
    15. port: 80

    上面演示了NetworkPolicy工作过程,而NetworkPolicy实际是通过防火墙规则进行控制,而Iptables项目最早出来就是为了解决防火墙规则配置。所以查看Calico的Iptables即可知道背后控制的逻辑。查看Calico的防火墙规则会看到有cali-INPUT的chain。

     通过命令ip a命令查看网络配置,可以看到有cali开头的配置。实际如果采用了cali的网络插件,那么通过网络插件的请求,都会以cali开头。

    下面是添加了第一条NetworkPolicy后Iptables的主要内容。这里对cali开头的请求打了标签0x0/0x20000,而对于打了这些标签的请求,-j的处理是DROP,即被抛弃了,不处理。通过这样显示了拒绝请求的NetworkPolicy。

    在开通ICMP后,防火墙规则进行了变更,变化点如下。对于matchle icmp-type 8的请求打了0x10000标签,而对于打了这样标签的请求,-j操作是RETURN,即直接返回,而不是被DROP掉.

    以上就是NetworkPolicy工作原理,可以看到通过配置NetworkPolicy可以在网络层面对请求进行定制好的控制,保证集群安全。

  • 相关阅读:
    【Java】 java | sonar | sonar生成扫描token | 扫描示例 | 常见问题处理
    Web开发-session介绍
    万兆以太网MAC设计(9)数据流仲裁模块
    怎么把jpeg改成pdf格式
    LCM Sum (hard version)(树状数组,筛因子)
    国产编程—— 仓颉
    在setup中使用计算属性
    vue2 过渡到 vue3 指南
    Prim算法
    短链系统设计性能优化-缓存提速及CDN
  • 原文地址:https://blog.csdn.net/qiaotl/article/details/125999251