鼎博下载-官网-入口欢迎您!  客服热线:13715267630
减压阀后为什么要装安全阀?

基于开源OPA实现Kubernetes资源安全合规基线检查

来源:鼎博官网下载作者:鼎博下载入口  2022-10-03 11:29:51

  任职民生银行云技术管理中心,负责云基础架构、运维以及云计算相关技术研究。毕业于北京邮电大学,从2013开始从事OpenStack相关工作,参与了OpenStack Nova、Cinder、Cloud Custodian等项目社区开发,公众号int32bit作者。

  近年来越来越多的企业选择使用容器用于软件构建和发布,随着Docker Swarm的逐渐没落,毫无疑问Kubernetes已经成为事实上的容器编排工具标准。

  目前使用Kubernetes已经不是什么大的难题,基本上几个命令几个yaml文件就能轻易地使应用运行在Kubernetes平台上。

  而对于Kubernetes平台运维人员来说关键的挑战在于如何用好Kubernetes以及如何高效治理Kubernetes的资源。因为往往企业应用部署和平台运维是独立负责的,极力推广的DevOps理念大大提升了开发人员的自主性,但是开发人员往往只关注于应用如何部署运行,而很少关注一些跟应用没有直接关系的诸如安全、可靠性、资源配比等因素。

  开发人员可能错误配置liveness以及readiness,甚至根本不配置。

  开发人员可能不会想到去合理配置limits以及requests资源,或者错误随意配置limits以及requests资源,设置不合理的比例。

  未设置企业要求的一些元数据标签labels或者注解annotations。

  而解决如上问题,最有效的方法就是设置准入门槛,不符合规范的请求直接拒绝,而不是先污染后治理。

  Kubernetes一开始设计就支持通过准入控制器(Admission Controllers)方案设置准入门槛,官方也提供了许多现成的准入控制器供用户选择使用。

  但是不同的企业可能安全准则、应用最佳实践标准并不一样,现有的准入控制器可能无法完全满足企业的所有需求,重新自研开发控制器则涉及开发成本高,并且后期也不易于维护扩展。

  因此,我认为最有效的办法是能通过统一标准的规则引擎实现合规基线检测和修正,针对不同的规范要求,只需要编写对应规则动态注入,无需大量开发控制器插件,无需重启Kubernetes平台。

  本文接下来将介绍基于开源OPA实现Kubernetes资源合规基线检查方案。

  虽然本文主要介绍如何使用OPA执行Kubernetes资源合规基线检查,但其原理离不开Kubernetes的准入控制,因此本文首先简单介绍下Kubernetes自带的准入控制机制。

  众所周知,我们每次请求Kubernetes API时都会经过API Server的三大核心关口,层层把关:

  第一个关口是认证,判定请求用户是谁以及其身份的真实性。关于认证的介绍可以参考我之前的几篇文章浅聊Kubernetes的各种认证策略以及适用场景以及Kubernetes通过Dex集成企业外部认证系统。

  第二个关口是授权,判定这个用户是否具有该操作的权限。目前用的比较多的是默认的RBAC插件,即通过role、clusterrole、rolebingding以及clusterrolebingding进行权限访问控制。

  第三个关口是准入控制。准入控制是对请求的进一步控制,比如检查请求的资源数量是否超出了配额(Quota)限制,请求的Pod是否符合容器安全要求等。

  每个关口都有可能存在多个保安插件,Kubernetes支持配置多个认证以及授权引擎从而支持多认证多授权模式。

  同理,Kubernetes可以配置多个准入控制器,只有所有准入控制器都判定通过时,请求方可放行。

  Kubernetes的准入控制与认证授权的设计理念相同,都是通过动态扩展插件的形式实现,每个插件依次串接。官方提供了许多现成的非常实用的准入控制器,比如:

  LimitRanger: 对请求的CPU、Memory等资源进行范围限制,阻止请求超出设置范围的CPU数量或者内存大小。

  更多的准入控制器可以参考官方文档Using Admission Controllers[1]。当然用户也可以根据自己的需求实现自定义准入控制器。

  Open Policy Agent(OPA)[2]是一款开源的通用策略规则引擎工具,提供Policy as Service服务,通过统一标准的高级声明式查询语言Rego定义规则,基于规则和输入数据输出判定结果:

  比如最典型的基于角色的权限控制(RBAC)就可以抽象成策略模型:定义各个角色具有哪些权限,通过规则判断用户隶属于哪个角色,从而判定该用户具备哪些权限,比如:

  还有一个典型的场景便是安全合规性检测,比如我们定义规则Kubernetes的所有Pod不允许使用latest标签镜像,通过这个规则可以查找出所有包含latest标签的违规Pod。我们还可以把这个规则设置为准入门槛,每次创建Pod前,都会通过我们的规则去做评审(Review),如果包含latest镜像则直接拒绝服务。

  做策略引擎的,除了OPA,还有之前介绍的Cloud Custodian[3](c7n),相对OPA,c7n主要面向公有云服务的合规检测,不同的公有云厂商需要绑定不同的provider,目前实现比较完善的provider是AWS。关于c7n的介绍可以参考我之前的一篇文章云资源安全合规基线自动化检查与配置。

  而OPA的设计理念则是软件服务本体与策略、策略与决策完全松耦合,换句话说,通过标准统一的策略决策,与检测体完全独立,只要检测对象能够转化为标准输入数据源即可。

  Docker权限访问控制[4]。Docker目前尚不支持严格的授权访问控制,只要用户能访问Docker API,就可以对所有容器进行CURD操作。Docker通过安装opa-docker-authz插件,可实现基于用户角色的权限控制。除此之外还可以实现容器的合规性检测,最典型的应用场景比如检测容器是否使用了高危的capabilities或者未配置某个必须的Security Options。

  HTTP服务RBAC控制[5]。通过OPA就不需要再去重复实现复杂的RBAC控制逻辑了,直接交给OPA就可以实现完备的权限访问控制。

  Terraform TF模板文件合规基线]。检查Terraform模板生成的资源是否满足合规基线要求,比如是否打上了必须的tag,安全组是否开启高危端口等。国内厂商云霁开源的CloudIaC[7]项目正是使用了OPA实现Terraform模板的安全合规基线检查。

  结合Linux PAM实现更细粒度的SSH以及sudo的权限控制[8]。对于没有使用堡垒机的场景,可以考虑这种过渡方案。

  使用OPA,最核心的工作便是编写规则,而OPA使用的是Rego语言进行规则定义,因此不妨先简单介绍下Rego。

  Rego是基于Datalog[12]扩展的声明式查询语言,其主要优化了JSON结构化数据的处理和查询能力。

  虽然和SQL一样都属于声明式查询语言这一语言类别,但是使用起来却更像编程语言,尤其是Python。

  关于Rego的详细语法可以参考官方文档policy-language[13],这里只简单介绍一些最简单的语法。

  如上所有表达式expr均为AND关系,即当且仅当所有的expr判定结果为true时,x会被置为y。

  后面变量赋值= true为默认值,可以省略,因此如下写法的效果是完全一样的:

  Rego不支持显式的OR逻辑语法,但是可以通过声明两个名称相同的并列Rule定义以支持OR语义:

  如上定义了两个相同的Ruleallow,当满足任意两个条件之一时,allow为true:

  除了OR,Rego也不像大多数编程语言一样具有丰富的分支选择语法(if-else),但是可以通过相同的方式实现if-else逻辑,比如实现f(x) 函数:

  前面介绍的语法还是比较容易理解的,Rego与大多数编程语言在使用方面最大的差别在于集合的操作以及迭代遍历,初次使用会感觉特别奇怪。

  比如arr[i],如果i为已定义的变量,则与大多数编程语言语义相同,都是取数组对应索引的值。

  但是当i未定义时,则表示遍历数组的索引和值,类似Python的enumerate()函数,在后面的迭代过程中可以引用索引值i以及对应数组的值。

  为什么会有如上奇怪的语法?个人感觉Rego的语法虽然理解起来可能比较绕,但是针对集合操作与查询写起来会比Python更简练些。

  前面介绍了Kubernetes的准入控制以及通用策略规则引擎工具OPA。显然,OPA是非常适合用于实现Kubernetes资源的安全合规基线配置检查的。

  针对这个场景,OPA官方已提供了现成的集成方案OPA Gatekeeper[16],该方案通过Webhook准入控制器方式集成。

  以一个简单的场景为例,假设我们要求所有的资源必须包含指定的labels,则可定义模板如下:

  openAPIV3Schema定义输入参数,上面的例子我们定义了一个数组变量labels。

  前面当我们直接创建不合规的namespace时会直接拒绝请求。但是有些资源我们不会直接创建,而是间接创建。比如我们一般不会直接创建Pod,而是往往通过Deployments或者DaemonSets间接创建Pod资源。当我们的规则限制作用于Pod时,则无法直接拒绝创建违规的Deployments或者DaemonSets,但创建的Deployment会创建Pod失败。

  前面当我们创建不合规的资源时会直接拒绝请求,这是因为OPA的默认违规处理方式是deny,即拒绝请求。除了deny阻断模式,OPA Gatekeeper还支持如下两种违规处理策略:

  dryrun: 仿真模式,Gatekeeper只记录违规的资源列表,但不会阻断违规资源的创建。

  在Github中官方维护了一些很有用的现成模板gatekeeper-library[18],内容还是很全的,涵盖安全、配置基线等最佳实践规则。

  本文首先简单介绍了Kubernetes的资源治理问题以及准入控制器,然后介绍了OPA以及Rego,最后介绍如何将OPA集成到Kubernetes的准入控制器中实现Kubernetes资源的安全合规自动检测。参考资料

  原题:基于开源OPA实现Kubernetes资源安全合规基线检查觉得本文有用,请转发或点击“在看”,让更多同行看到

在线客服 :

服务热线:13715267630

电子邮箱: regochinasz@163.com

公司地址:深圳市罗湖区

鼎博下载于1923年建立,主要生产液化气、无水氨及工业气体设备,包括:RegO调压阀、RegO安全阀、RegO拉断阀、RegO阀门等,获得世界各大石油集团...

版权所有:鼎博下载-官网-入口

沪ICP备08002587号  XML地图