当前位置: 首页 > 科技观察

什么是政策即代码?OpenPolicyAgent简介

时间:2023-03-15 01:18:27 科技观察

在云原生时代,我们经常听到“没有安全就什么都没有”,也就是说安全比什么都重要。我们受益于现代基础设施和解决方案,但与此同时,由于应用服务越来越多,需要担心的事情也越来越多:您如何控制对基础设施的访问?如何控制服务之间的访问?每个人的访问权限等。在需要回答的众多问题中,还有政策方面的问题:例如,大量的安全规则、标准和条件。例如:谁可以访问这个资源?允许来自哪个子网的出口流量?工作负载必须部署到哪些集群?从Internet访问的服务器不允许使用哪些协议?我可以从哪个注册表二进制文件下载它?容器可以使用哪些操作系统来执行功能?一天中的什么时间可以访问系统?所有组织都有策略,因为它们定义了关于遵守法律要求、在技术限制内工作、避免重复错误等方面的重要知识。为什么选择政策即代码?政策基于渗透到组织文化中的成文或不成文的规则。因此,假设我们的组织有一条书面规则,明确规定对于从Internet上的公共子网访问的服务器,使用不安全的“HTTP”协议公开端口不是一个好的做法。那么我们应该如何实施呢?如果我们手动创建基础设施,“四眼原则”可能会有所帮助。但前提是,在做关键事情的时候,总有第二个人在一起。如果我们使用基础设施即代码,并使用像Terraform这样的工具来自动创建基础设施,那么代码审查可能会有所帮助。然而,传统的策略执行过程有几个明显的缺点:不能保证这个策略永远不会被破坏。一个人不可能一直都知道所有的策略,并且根据策略列表进行手动检查是不切实际的。谈到代码审查,即使是高级工程师也不太可能每次都抓住所有潜在问题。现代组织是敏捷的,这意味着员工、服务和团队都在不断成长,这使得安全团队不可能使用传统技术来保护所有资产。由于人为错误,迟早会违反政策。这不是“如果”的问题,而是“何时”的问题。这正是大多数组织在主要发布之前进行定期安全检查和合规性审查的原因——我们首先违反政策,然后创建事后修复。这样做不是很科学。那么,管理和执行策略的正确方法是什么?什么是策略即代码(PaC)?随着业务的发展和团队的成熟,我们希望从手动定义策略转变为在企业层面定义更易于管理和可重复的策略。我该怎么做呢?首先,我们可以从大规模管理系统的成功实验中学习:基础设施即代码(IaC):将定义环境和基础设施的内容视为源代码。DevOps:人员、流程和自动化的结合,使“连续的一切”能够持续为最终用户提供价值。PolicyasCode(PaC)就是从这些想法中诞生的。策略即代码使用代码来定义和管理策略,即规则和条件。使用代码和利用源代码管理(SCM)工具定义、更新、共享和执行策略。通过将策略定义保存在源代码控制中,无论何时进行更改,都可以对其进行测试、验证,然后强制执行。PaC的目标不是检测策略违规,而是防止它们犯错。这利用了DevOps自动化而不是依赖手动流程,使团队能够更快地行动并减少由于人为错误而导致错误的可能性。PolicyasCodevs.InfrastructureasCode“ascode”运动并不是什么新鲜事,它的目标是“一切都在一个连续体上”。PaC的概念听起来可能类似于基础设施即代码(IaC),但IaC侧重于基础设施和配置,而PaC则改进了安全操作、合规性管理、数据管理等。PaC可以与IaC集成以自动执行基础架构策略。现在我们已经介绍了PaC与IaC,让我们看看用于实现PaC的工具。关于OpenPolicyAgent(OPA)OpenPolicyAgent(OPA,读作“oh-pa”)是云原生计算基金会的一个孵化项目。它是一个开源的通用策略引擎,旨在为将策略即代码应用于任何领域提供一个通用框架。OPA提供了一种高级声明性语言(Rego,发音为“ray-go”,为策略而构建),允许您将策略指定为代码。因此,您可以跨微服务、Kubernetes、CI/CD、API网关等定义、实施和强制执行策略。简而言之,OPA的工作原理是将决策制定与政策实施脱钩。当需要做出策略决策时,使用结构化数据(例如JSON)作为输入查询OPA,OPA返回决策:先决条件要开始,请从GitHub版本下载适用于您的平台的OPA二进制文件:在macOS(64-位):在M1Mac上测试过,也可以。规范让我们从一个简单的示例开始,为一个虚构的工资单微服务实现基于访问的访问控制(ABAC)。规则很简单:您只能访问您的薪资信息或您下属的薪资信息,不能访问其他任何人的薪资信息。所以如果它是你自己的,或者你的一个下属,那么你可以访问以下内容:bobjohn/getSalary/bob/getSalary/john但不是作为用户:/getSalary/alice输入数据(文件):input.json让我们创建一个注册文件。在这里,评论会让你很好地了解这段代码的作用:文件:example.regorun下面的值应该评估为:true将input.json文件中的路径更改为“path”:[”getSalary","john"],它仍然评估为"true",因为第二条规则允许经理查看下属的薪水。但是,如果我们将input.json文件的路径更改为"path":["getSalary","alice"],则结果为false。Policy-as-code集成上面的示例非常简单,仅对了解OPA的工作原理有用。但是OPA非常强大,可以和当今很多主流工具和平台集成,比如:KubernetesEnvoyAWSCloudFormationDockerTerraformKafkaCeph等等。为了快速展示OPA的强大功能,这里有一个在AWS上定义自动缩放组和服务器的Terraform代码示例:使用此Rego代码,我们可以根据Terraform计划计算分数并根据策略返回决策。自动化过程非常简单:terraformplan-outtfplan创建Terraform计划terraformshow-jsontfplan|jq>tfplan.json将计划转换为JSON格式opaexec--decisionterraform/analysis/authz--bundlepolicy/tfplan.json以获得结果。