未加星标

Cilium 1.3:支持Envoy、Cassandra和Memcached的Go语言扩展

字体大小 | |
[数据库(综合) 所属分类 数据库(综合) | 发布者 店小二03 | 时间 2018 | 作者 红领巾 ] 0人收藏点击收藏

作者:Cilium team

译者:马若飞

原文: cilium.io/blog/2018/1…


Cilium 1.3:支持Envoy、Cassandra和Memcached的Go语言扩展

我们很高兴地宣布Cilium 1.3发布了。这个版本加入了几个新特性。主要的亮点是实现了Cassandra和带有策略执行能力的Memcached协议解析器,作为 Envoy 的Go语言扩展包。

和往常一样,整个Cilium社区的开发者贡献巨大,他们在1.2到1.3版本的这段时间贡献了785个提交。

什么是Envoy的Go语言扩展?

从1.0版本开始,我们一直依赖 Envoy 处理所有的HTTP、gRPC以及HTTP的派生如Elasticsearch的请求。社区讨论如何扩大支持7层协议的范围,Envoy作为推动未来协议补充的首选平台是显而易见的。焦点迅速转移到寻找简化Envoy可扩展性的方法,并且允许重用现有的开源项目,如CNCF项目Vitess。于是实现Envoy的Go扩展的想法就诞生了。

在Cilium 1.3中,我们引入了Envoy的Go扩展作为其Beta特性。


Cilium 1.3:支持Envoy、Cassandra和Memcached的Go语言扩展

扩展的透明注入: 在Cilium的帮助下,连接被透明地重定向到Envoy,而不需要修改应用程序或pod。重定向基于目标端口配置,可以根据labels、IPs、DNS以及ingress和egress连接的服务名称限定到源或目标服务,并通过扩展的名称将连接映射到扩展。重定向是通过CiliumNetworkPolicy CRD或REST API配置的。Envoy可以被配置为在每个pod中作为sidecar或作为每个node的独立代理运行。

完全分布式: Go扩展完全分布在每个Envoy节点或pod内部,不需要为一个数据处理的集中化控制面板。当然,go扩展本身可以调用任意的外部控制面板组件来报告遥测数据或验证请求。

动态扩展映射: Go扩展被设计为共享库提供给Envoy。Cilium可以根据设置好的重定向自动加载相应的Go扩展来配置Envoy,并在连接数据时调用它。未来的版本将支持在运行时更新和重新加载扩展,而无需重启Envoy并且也不会丢失连接状态。

通过CRD配置扩展: 通过CRD或REST API使用通用键值对配置Go扩展。这允许传递如安全策略、安全令牌或其他的配置,而无需让Envoy知道。

通用访问日志: 与配置类似,扩展可以返回通用键值对,这些键值对将提取的可见性传递到访问日志层。

沙盒化: 沙盒确保任何解析器的不稳定性都不会破坏Envoy的核心。受Matt Klein发表的文章Exceptional Go启发,解析器被容许panic或抛出异常。当panic发生时,信息被记录到访问日志中,TCP连接与被关闭的请求关联。

Cilium是什么?

Cilium是一个开源软件,可以透明地提供和保护部署在诸如Kubernetes、Docker和Mesos等linux容器管理平台的应用程服务之间的网络和API连接。

Cilium的基础是一种新的Linux内核技术BPF,它支持在Linux内部动态的注入安全、可见性和网络控制逻辑。除了提供传统的网络层安全,BPF的灵活性还让API和流程级别的安全,保护容器或pod间通信成为了可能。因为BPF在Linux内核中运行,Cilium的安全策略可以在不修改程序代码或容器配置的情况下使用和更新。

有关Cilium更详细的介绍请参见 Introduction to Cilium

Envoy是什么?

Envoy是一个7层代理和通信总线,被设计用于大型的面向服务的架构。这个项目诞生于以下理念:

网络应该对应用程序透明。当网络和应用程序出现问题时,应该很容易确定问题的根源。

你可以通过Envoy的文档What is Envoy了解更多关于Envoy的内容。

怎样编写Envoy的Go语言扩展

编写Envoy的Go扩展很简单。为说明这一点,我们将为R2-D2控制协议实现一个基本的协议解析器,并实现过滤逻辑用来排除任何包含字符串”C-3PO”的控制请求。


Cilium 1.3:支持Envoy、Cassandra和Memcached的Go语言扩展

要实现扩展的主要API是 OnData() 函数,当Envoy收到通过 CiliumNetworkPolicy 映射到扩展连接的数据时,就会调用这个函数。函数必须解析数据并返回下面的断言之一:

MORE :解析器需要更多的字节来继续解析。

PASS :传递

n

字节数据流。

DROP :删除

n

字节数据流。

INJECT :向指定的方向注入

n

字节的数据。

ERROR :发生了解析错误,连接必须关闭。

NOP :什么也没发生。

为了注册扩展,需要创建一个必须实现 Create() 函数的解析器工厂。当Envoy建立了一个新的连接并使用解析器时就会调用该函数。

import ( "github.com/cilium/cilium/proxylib/proxylib")type parser struct{ connection *proxylib.Connection}func (p *parser) OnData(reply, endStream bool, dataArray [][]byte) (proxylib.OpType, int) { data := string(bytes.Join(dataArray, []byte{})) msgLen := strings.Index(data, "\r\n") if msgLen < 0 { return proxylib.MORE, 1 // No delimiter, request more data } msgStr := data[:msgLen] msgLen += 2 // Inlcude the "\r\n" in the request if reply { return proxylib.PASS, msgLen // Pass responses without additional parsing } if strings.Contains(msgStr, "C-3PO") { return proxylib.DROP, msgLen } return proxylib.PASS, msgLen}type factory struct{}func (f *factory) Create(connection *proxylib.Connection) proxylib.Parser { return &parser{connection: connection}}func init() { proxylib.RegisterParserFactory("r2d2", &factory{})}复制代码

最后,将新的解析器导入到proxylib包中。 libcilium.so 将包含解析器并被Envoy加载。编辑文件 proxylib/proxylib.go :

import ( [...] _ "github.com/cilium/cilium/proxylib/r2d2")复制代码

上面的示例省略了扩展配置、集成到策略代码库以及访问日志等内容。学习如何编写Go扩展,请参阅指南Envoy Go Extensions。

Cassandra支持(Beta)
Cilium 1.3:支持Envoy、Cassandra和Memcached的Go语言扩展

Cassandra 是一个流行的NoSQL数据库管理系统。它通常被多个服务大规模的访问并在团队间共享。Cilium 1.3引入了对Apache Cassandra 协议的支持,并提供了可见性和策略执行能力。

Cassandra的Go扩展能够在以下协议字段上提供可见性和执行能力:

query_action : 这个行为在数据库的 SELECT , INSERT , UPDATE 等操作上执行,字段总是精确匹配。

query_table : 查询执行的表,以正则表达式进行匹配。

例子:Empire如何通过表限制Cassandra访问

下面的示例展示了Empire如何暴露有限的访问给运行在端口9042的Empire Cassandra集群。Outposts被标签 app=empire-outpost 标识,并具有以下权限:

SELECT 操作在表"system.

”和”system_schema.

“上执行

INSERT 操作在表"attendance.daily_records"上执行。注意outposts不能从这些表读取,因此不能从其他outposts读取每日记录。

apiVersion: "cilium.io/v2"kind: CiliumNetworkPolicydescription: "Allow only permitted requests to empire Cassandra server"metadata:name: "secure-empire-cassandra"specs:- endpointSelector: matchLabels: app: cass-serveringress:- fromEndpoints: - matchLabels: app: empire-outpost toPorts: - ports: - port: "9042" protocol: TCP rules: l7proto: cassandra l7: - query_action: "select" query_table: "system\\..*" - query_action: "select" query_table: "system_schema\\..*" - query_action: "insert" query_table: "attendance.daily_records"复制代码

这是一个简单的例子,更多复杂示例请参阅 Cassandra getting started guide 。

Memcached支持(Beta)
Cilium 1.3:支持Envoy、Cassandra和Memcached的Go语言扩展
Memcached是一种流行的基于内存的分布式缓存,通常用于缓存或在服务之间共享数据。随着memcached解析器的golang扩展加入Envoy,Cilium现在可以执行安全规则去限制memcached客户端的某些命令,比如读写,也可以根据key前缀进行限制。 例子:Rebels如何保护共享的memcached服务

在下面的示例中,Rebels运行了一个标签为 app=memcached 的memcached服务,几个服务与memcached交互并应用不同的规则:

function=fleet-maintenance 标识的维护服务被授予对前缀为 alliance/fleet 的所有key的读写权限。禁止访问任何其他key。

function=fleet-monitoring 标识的监控服务仅对前缀为 alliance/fleet 的key授予读权限。禁止对前缀中的key进行写入访问或访问前缀之外的任何key。

所有Jedis被标签 role=jedi 标识,拥有完整的Memcached服务,可以访问所有的key。

apiVersion: "cilium.io/v2"kind: CiliumNetworkPolicydescription: "Secure the Rebel memcached service"metadata: name: "secure-rebel-alliance-memcache"specs: - endpointSelector: matchLabels: app: memcached ingress: - fromEndpoints: - matchLabels: function:

本文数据库(综合)相关术语:系统安全软件

代码区博客精选文章
分页:12
转载请注明
本文标题:Cilium 1.3:支持Envoy、Cassandra和Memcached的Go语言扩展
本站链接:https://www.codesec.net/view/610900.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 数据库(综合) | 评论(0) | 阅读(198)