[聚合文章] 使用HashiCorp Sentinel创建并执行“策略即代码”

软件架构 2017-11-27 16 阅读

HashiCorp发布了 Sentinel ,一种集成在HashiCorp Enterprise产品中的嵌入式“策略即代码”(Policy as Code)框架。Sentinel支持“基于逻辑的细粒度策略决策”,实现了审计的自动化,并在与架构即代码和其它HashiCorp平台工具一并工作时,,实现在如有必要时执行企业策略、合规策略或安全策略。

HashiCorp 当前提供了架构自动化工具产品套装,使用了广为采用的开源项目 TerraformVaultConsulNomad ,分别支持工程师实现架构的策略规定、安全、连接并运行。根据“HashiCorp之道”( Tao of HashiCorp )介绍,工具基于“ 架构即代码(IaC,Infrastructure as Code) ”构建。IaC支持大规模地开展基础设施管理的编纂和自动化。但是在大型组织中,这种大规模创建、更改和注销基础架构的能力是有风险的,因为缺乏经验的工程师或自动化的配置错误可引发影响业务运营的重大错误。

一些现代基础设施平台和工具提供了不同程度的访问控制,一些云服务提供商也提供了 身份和访问管理(IAM,Identity and Access Management) 类型的策略及 访问列表(ACL,Access Control List )控制。据 HashiCorp Sentinel 官方网页介绍,这些ACL系统“解决了一个直接且必要的问题,就是广泛存在的系统锁定问题”。对于更高级的软件策略决策,Sentinel从中脱颖而出,它实现的是一种可重用的系统。

很多现有的策略或ACL系统并非可实用的“策略即代码”。一些策略是通过点击GUI设置的,不易于重做和版本管理。通常它们并不提供任何测试策略的系统,而是去测试可能破坏策略的行为。这使得自动化测试难以实现。而策略语言本身也是因产品而异的。

Sentinel将策略的组织和监管编码为文本配置,实现了限制风险,可确保对基础设施的变更是安全的。Sentinel在Terraform Enterprise、Vault Enterprise、Consul Enterprise和Nomad Enterprise中引入了“ 策略即代码 ”。当前,Sentinel并不支持上述工具的开源版本。Sentinel是在实时运行的系统中实现“防护栏”、业务需求和合法合规等。这就是说,Sentinel并非一种“亡羊补牢”型的审计工具。

Sentinel支持:

  • 策略即代码:Sentinel将策略看成是应用,可用于版本控制、代码审核、测试和自动化等。策略的语法和行为 易于被Sentinel验证 ,并且可以使用Sentinel提供的 命令行接口(CLI) 实现自动化测试。如果辅以版本控制系统,可以支持拉取(Pull)请求工作流,以验证策略是否保持了合并(Merge)前的预期系统行为。

  • 基于条件的细粒度策略:Sentinel的策略支持拒绝 任何可用输入 上的行为,而非粗粒度的读取、吸入和管理策略。任何使用 公开Sentinel SDK 的开发人员,都可以编写插件访问来自于定制系统的外部信息。通过将策略逻辑表示为代码,可以直接在代码中表示策略相关的信息和逻辑,并可以加入评论信息,避免了依赖于口口相传去了解策略制定原因的传统方式。

  • 多重 执法等级(Enforcement Levels) :包括建议性(Advisory), 软强制(soft-mandatory)和硬强制(hard-mandatory)等级,支持策略编写者对侵犯行为赋予适当的严重性,给出警告,甚至拒绝。所有的活动可被日志记录和审计。

  • 兼容多云。确保架构更改符合业务的范围,也符合各个基础设施提供商的合规策略。

Sentinel定义并使用自己的 策略语言 。该语言在设计上考虑了非编程人员的理解,其中提供了多个用例,使得非开发人员也可以成为策略制定者。要了解更多的信息,可访问 策略编写章节 和Sentinel 语言参考

命令 sentinel apply 实现在本地执行一个用于开发的策略,其用法为 sentinel apply [选项] POLICY 。命令执行由POLICY指定的路径中的策略文件。输出显示了策略是否通过,或是失败。配置文件可使用 -config 选项指定,其中定义了可用的 导入插件 、模拟数据和全局值,用于模拟嵌入到应用中的策略。可用的命令行选项如下:

  • -config=path :指定配置文件的目录。配置文件中定义了可用的导入插件、模拟数据和全局值等。模拟数据可定义任何用于内建 Sentinel Simulator 测试的复杂场景。

  • -global key=value :设置注入运行中策略的全局值。

  • -explain :设置为总是显示执行追踪的情况。追踪将会显示执行过程中间的布尔表达式值,总是会显示失败的策略。

下面是Terraform Sentinel策略文件的一个例子,策略定义为不允许在未提供标签的情况下设置资源:

import "tfplan"
main = rule {
    all tfplan.resources as r {
        r.attr contains "tags" and length(r.attr.tags) > 0
    }
}

对于那些在工作中无需使用HashiCorp工具的工程师,如果他们热衷于此类“策略即代码”方法,可以尝试如下工具:对AWS资源做RSpec测试的 awspecAzure Resource Manager模板Google Deployment Manager最佳实践 等。他们也可以尝试使用 AWS ConfigAzure Advisor 等工具,实施合规性与安全的事后审计和报告。

关于HashiCorp Sentinel的更多信息,可参见 HashiCorp网站 ,也可查看 Sentinel公告 的博客文章。

查看英文原文: Creating and Enforcing "Policy as Code" with HashiCorp Sentinel

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。