系列文章

前言

今天我们进入 Cilium 安全相关主题, 介绍 CiliumNetworkPolicies 相比于 Kubernetes 网络策略最大的不同: 7 层网络策略能力.

CiliumNetworkPolicy 7 层能力

CiliumNetworkPolicy 与标准 NetworkPolicy 的最大区别之一是支持 L7 协议感知规则。在 Cilium 中,可以为不同的协议(包括 HTTP、Kafka 和 DNS)制定特定于协议的 L7 策略。

第 7 层策略规则扩展了第 4 层策略的 toPorts 部分,可用于 Ingress 和 Egress.

Notes

<networkpolicy.io> 目前只支持 L3/L4 策略的编辑和制作, 可以先用可视化编辑器制作 L4 的 CiliumNetworkPolicy, 再根据需求扩展为 L7 的 CiliumNetworkPolicy YAML。

第 7 层策略规则属性因 Cilium 支持的不同协议而异。特定协议的属性有详细的文档说明,后续主要以 HTTP 为例进行介绍。

L7 HTTP 策略

当节点上运行的任何端点的任何 L7 HTTP 策略处于活动状态时,该节点上的 Cilium Agent 将启动一个嵌入式本地 HTTP Agent 服务(基于 Envoy, 二进制包为 cilium-envoy),并指示 eBPF 程序将数据包转发到该本地 HTTP 代理。HTTP 代理负责解释 L7 网络策略规则,并酌情进一步转发数据包。此外,一旦 HTTP 代理就位,你就可以在 Hubble 流量中获得 L7 可观察性,我们将在后续介绍。

在编写 L7 HTTP 策略时,HTTP 代理可以使用几个字段来匹配网络流量:

  • PATH: 与 URL 请求的常规路径相匹配的扩展 POSIX regex。如果省略或为空,则允许所有路径。
  • Method: 请求的方法,如 GET、POST、PUT、PATCH、DELETE。如果省略或为空,则允许使用所有方法。
  • Host: 与请求的主机标头匹配的扩展 POSIX regex。如果省略或为空,则允许使用所有主机。
  • Headers: 请求中必须包含的 HTTP 头信息列表。如果省略或为空,则无论是否存在标头,都允许请求。

下面的示例使用了几个具有 regex 路径定义的 L7 HTTP 协议规则,以扩展 L4 策略,限制所有带有 app=myService 标签的端点只能使用 TCP 在 80 端口接收数据包。在此端口上通信时,只允许使用以下 HTTP API 端点:

  • GET /v1/path1: 精确匹配 "/v1/path1"
  • PUT /v2/path2.*: 匹配所有以 "/v2/path2" 开头的 paths
  • POST .*/path3: 这将匹配所有以 "/path3" 结尾的路径,并附加 HTTP 标头 X-My-Header 必须设为 true 的限制条件:

具体策略如下:

  1. apiVersion: "cilium.io/v2"
  2. kind: CiliumNetworkPolicy
  3. metadata:
  4. name: "l7-rule"
  5. spec:
  6. endpointSelector:
  7. matchLabels:
  8. app: myService
  9. ingress:
  10. - toPorts:
  11. - ports:
  12. - port: '80'
  13. protocol: TCP
  14. rules:
  15. http:
  16. - method: GET
  17. path: "/v1/path1"
  18. - method: PUT
  19. path: "/v2/path2.*"
  20. - method: POST
  21. path: ".*/path3"
  22. headers:
  23. - 'X-My-Header: true'

该规则块包含扩展 L4 Ingress 策略的 L7 策略逻辑。您只需在 toPorts 列表中添加相应的规则块作为属性,就可以从 L4 策略开始,提供细粒度的 HTTP API 支持。

L7 策略示例

可以再看几个 L7 策略示例:

第一个, HTTP L7 策略: 允许来自 env=prod 的实体使用 HTTP GET app=service pod 的 /public

  1. apiVersion: "cilium.io/v2"
  2. kind: CiliumNetworkPolicy
  3. metadata:
  4. name: "rule1"
  5. spec:
  6. description: "Allow HTTP GET /public from env=prod to app=service"
  7. endpointSelector:
  8. matchLabels:
  9. app: service
  10. ingress:
  11. - fromEndpoints:
  12. - matchLabels:
  13. env: prod
  14. toPorts:
  15. - ports:
  16. - port: "80"
  17. protocol: TCP
  18. rules:
  19. http:
  20. - method: "GET"
  21. path: "/public"

第二个, Kafka L7 策略: 使《星球大战》中的帝国总部(app: empire-hq)能够生成(produce)帝国公告(empire-announce)和死星计划(deathstar-plans)主题消息。

Notes

Cilium 用于演示 CiliumNetworkPolicy 能力的 Demo 程序, 借用了《星球大战》帝国和反抗军的概念。

  1. apiVersion: "cilium.io/v2"
  2. kind: CiliumNetworkPolicy
  3. metadata:
  4. name: "rule1"
  5. spec:
  6. description: "enable empire-hq to produce to empire-announce and deathstar-plans"
  7. endpointSelector:
  8. matchLabels:
  9. app: kafka
  10. ingress:
  11. - fromEndpoints:
  12. - matchLabels:
  13. app: empire-hq
  14. toPorts:
  15. - ports:
  16. - port: "9092"
  17. protocol: TCP
  18. rules:
  19. kafka:
  20. - role: "produce"
  21. topic: "deathstar-plans"
  22. - role: "produce"
  23. topic: "empire-announce"

第三个, DNS L7 策略: "tofqdn-dns-visibility"

  1. apiVersion: cilium.io/v2
  2. kind: CiliumNetworkPolicy
  3. metadata:
  4. name: "tofqdn-dns-visibility"
  5. spec:
  6. endpointSelector:
  7. matchLabels:
  8. any:org: alliance
  9. egress:
  10. - toEndpoints:
  11. - matchLabels:
  12. "k8s:io.kubernetes.pod.namespace": kube-system
  13. "k8s:k8s-app": kube-dns
  14. toPorts:
  15. - ports:
  16. - port: "53"
  17. protocol: ANY
  18. rules:
  19. dns:
  20. - matchName: "cilium.io"
  21. - matchPattern: "*.cilium.io"
  22. - matchPattern: "*.api.cilium.io"
  23. - toFQDNs:
  24. - matchName: "cilium.io"
  25. - matchName: "sub.cilium.io"
  26. - matchName: "service1.api.cilium.io"
  27. - matchPattern: "special*service.api.cilium.io"
  28. toPorts:
  29. - ports:
  30. - port: "80"
  31. protocol: TCP

在此示例中,L7 DNS 策略允许查询 cilium.iocilium.io 的任何子域以及 api.cilium.io 的任何子域。不允许其他 DNS 查询。

单独的 L3 toFQDNs Egress 规则允许连接到 DNS 查询中返回的 cilium.iosub.cilium.ioservice1.api.cilium.iospecial*service.api.cilium.io 的任何匹配 IP,如 special-region1-service.api.cilium.io,但不包括 region1-service.api.cilium.io。允许对 anothersub.cilium.io 进行 DNS 查询,但不允许连接到返回的 IP,因为没有 L3 toFQDNs 规则选择它们。

总结

今天我们进入 Cilium 安全相关主题, 介绍 CiliumNetworkPolicies 相比于 Kubernetes 网络策略最大的不同: 7 层网络策略能力.

L7 策略基于 L4 策略扩展而来, 增加了 toPorts 字段. 并提供了 HTTP DNS Kakfa 的 L7 策略示例.

后续我们会基于 Cilium 官方的《星球大战》 Demo 做详细演示。

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

Cilium系列-15-7层网络CiliumNetworkPolicy简介的更多相关文章

  1. [C#网络编程系列]专题一:网络协议简介

    转自:http://www.cnblogs.com/zhili/archive/2012/08/11/NetWorkProgramming.html 因为这段时间都在研究C#网络编程的一些知识, 所以 ...

  2. 软件开发架构,网络编程简介,OSI七层协议,TCP和UDP协议

    软件开发架构 什么是软件开发架构 1.软件架构是一个系统的草图. 2.软件架构描述的对象是直接构成系统的抽象组件. 3.各个组件之间的连接则明确和相对细致地描述组件之间的通讯. 4.在实现阶段,这些抽 ...

  3. HelloX操作系统网络功能简介及使用和开发指南

    HelloX网络功能简介及使用和开发指南 HelloX网络功能简介 作为物联网操作系统,网络功能是必备的核心功能之一.按照规划,HelloX实现了两个不同类型的TCP/IP协议栈,一个面向资源受限的嵌 ...

  4. 计算机网络通信TCP/IP协议浅析 网络发展简介(二)

    本文对计算机网络通信的原理进行简单的介绍 首先从网络协议分层的概念进行介绍,然后对TCP.IP协议族进行了概念讲解,然后对操作系统关于通信抽象模型进行了简单介绍,最后简单描述了socket   分层的 ...

  5. Web技术的发展 网络发展简介(三)

    在上一篇文章中,对TCP/IP通信协议进行了简单的介绍 通信协议是通信的理论基石,计算机.操作系统以及各种网络设备对通信的支持是计算机网络通信的物质基础 而web服务则是运行于应用层,借助于应用层的协 ...

  6. UNIX网络编程---简介

    UNIX网络编程---简介 一.           概述 a)       在编写与计算机通信的程序时,首先要确定的就是和计算机通信的协议,从高层次来确定通信由哪个程序发起以及响应在合适产生.大多数 ...

  7. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计     ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)    ...

  8. tcp/ip 卷一 读书笔记(2)物理层和链路层网络

    物理层和链路层网络 术语 链路 是一对相邻结点间的物理线路,中间没有任何其他的交换结点. 数据链路 除了物理线路外,还必须有通信协议来控制这些数据的传输. 帧 数据链路层的协议数据单元(PDU) 串行 ...

  9. 网络知识--OSI七层网络与TCP/IP五层网络架构及二层/三层网络

    作为一个合格的运维人员,一定要熟悉掌握OSI七层网络和TCP/IP五层网络结构知识. 废话不多说!下面就逐一展开对这两个网络架构知识的说明:一.OSI七层网络协议OSI是Open System Int ...

  10. 网络知识梳理--OSI七层网络与TCP/IP五层网络架构及二层/三层网络(转)

     reference:https://www.cnblogs.com/kevingrace/p/5909719.html https://www.cnblogs.com/awkflf11/p/9190 ...

随机推荐

  1. 【CSS】使元素在父元素中居中显示的几种方法

    在页面元素布局时经常会有把元素居中的需求,大多都是用弹性盒或者定位,下面来说一下使用方法 一.使用边距进行固定位置 这种方法需要把父元素和子元素的宽度固定,然后利用二者宽高之差添加边距移动元素的位置 ...

  2. docker安装kibana,报错Kibana server is not ready yet,未解决

    1.命令 docker run -d -e ELASTICSEARCH_URL=http://192.168.101.158:9200 -p 5601:5601 --name kibana kiban ...

  3. Node.js出现‘Cannot find module init’ 解决方法

    1. 首先查看当前根目录是否有node_module文件夹,如果有,请删除 2. 输入 npm clean cache 3. 再次输入 node init -y 大功告成

  4. Qt数据可视化项目

    一.创建项目(步骤按常规来即可) 二.ui设计界面 控件的使用 默认视角:Label标签和horizontalSlider标签 水平旋转:Label标签和horizontalSlider标签 垂直旋转 ...

  5. flutter填坑之旅(环境搭建篇)

    自从Google 在 2018 世界移动大会上发布 Flutter 的 Beta 版本,看看官方的介绍Flutter widgets are built using a modern framewor ...

  6. 1、初认 AS400

    一.AS400 简介 AS/400是一种主机型计算机,是IBM公司开发的.AS/400是IBM的应用服务器产品,针对企业级应用开发.重要应用系统支持进行设计开发.AS/400的系统工作环境中同时支持多 ...

  7. .net 搜索联想词

    思路: 1.ajax请求后台方法获取数据. 2.通过jquery将请求到的数据显示在页面上. 前台 <div class="sc_con" id="bbsearch ...

  8. spring cloud gateway网关(一)之网关路由

    1.gateway相关介绍 在微服务架构中,系统往往由多个微服务组成,而这些服务可能部署在不同机房.不同地区.不同域名下.这种情况下,客户端(例如浏览器.手机.软件工具等)想要直接请求这些服务,就需要 ...

  9. 在Istio中,到底怎么获取 Envoy 访问日志?

    Envoy 访问日志记录了通过 Envoy 进行请求 / 响应交互的相关记录,可以方便地了解具体通信过程和调试定位问题. 环境准备 部署 httpbin 服务: kubectl apply -f sa ...

  10. CANoe学习笔记(五):Diva自动化测试工程

    内容: Diva工程的建立 Diva工程的配置 测试条例选择 一.新建一个Diva工程 左上角选择New,然后配置好下面部分 二.配置Diva工程 1. 2. 3.配置一些时间参数,按需求填写 4.其 ...