HashiCorp 当前提供了架构自动化工具产品套装,使用了广为采用的开源项目 Terraform、Vault、Consul 和 Nomad,分别支持工程师实现架构的策略规定、安全、连接并运行。根据“HashiCorp 之道”(Tao of HashiCorp)介绍,工具基于“架构即代码(IaC,Infrastructure as Code)”构建。IaC 支持大规模地开展基础设施管理的编纂和自动化。但是在大型组织中,这种大规模创建、更改和注销基础架构的能力是有风险的,因为缺乏经验的工程师或自动化的配置错误可引发影响业务运营的重大错误。
一些现代基础设施平台和工具提供了不同程度的访问控制,一些云服务提供商也提供了身份和访问管理(IAM,Identity and Access Management) 类型的策略及访问列表(ACL,Access Control List)控制。据 HashiCorp Sentinel 官方网页介绍,这些 ACL 系统“解决了一个直接且必要的问题,就是广泛存在的系统锁定问题”。对于更高级的软件策略决策,Sentinel 从中脱颖而出,它实现的是一种可重用的系统。
很多现有的策略或 ACL 系统并非可实用的“策略即代码”。一些策略是通过点击 GUI 设置的,不易于重做和版本管理。通常它们并不提供任何测试策略的系统,而是去测试可能破坏策略的行为。这使得自动化测试难以实现。而策略语言本身也是因产品而异的。
Policy as Code
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)等级,支持策略编写者对侵犯行为赋予适当的严重性,给出警告,甚至拒绝。所有的活动可被日志记录和审计。
- 兼容多云。确保架构更改符合业务的范围,也符合各个基础设施提供商的合规策略。
Policy Language
Sentinel 定义并使用自己的策略语言。该语言在设计上考虑了非编程人员的理解,其中提供了多个用例,使得非开发人员也可以成为策略制定者。要了解更多的信息,可访问策略编写章节和 Sentinel语言参考。
下面是 Terraform Sentinel 策略文件的一个例子,策略定义为不允许在未提供标签的情况下设置资源:
import "tfplan"
main = rule {
all tfplan.resources as r {
r.attr contains "tags" and length(r.attr.tags) > 0
}
}
Policies and Policy Sets
Policy Set 是 Policy 的集合,只有 Policy Set 能够被 apply 到 Terraform Enterprise workspace 中,而不是单独的 policies。
每个 Sentinel Policy 由以下几部分组成:
- an enforcement mode: hard/soft mandatory, or advisory
- the policy code
一个 Policy 的输出是 main rule 评估后的结果,只能为 true 或者 false。当一个 Policy 的输出结果为 true 时,则该 Policy 通过检查。如果输出结果为 false,则根据 enforcement mode 的结果来判断本次运行能否继续。
import "time"
# Validate time is between 8 AM and 4 PM
valid_time = rule { time.now.hour >= 8 and time.now.hour < 16 }
# Validate day is M - Th
valid_day = rule {
time.now.weekday_name in ["Monday", "Tuesday", "Wednesday", "Thursday"]
}
main = rule { valid_time and valid_day }
Commands
命令 sentinel apply 实现在本地执行一个用于开发的策略,其用法为 sentinel apply [选项] POLICY。命令执行由 POLICY 指定的路径中的策略文件。输出显示了策略是否通过,或是失败。配置文件可使用 -config选项指定,其中定义了可用的导入插件、模拟数据和全局值,用于模拟嵌入到应用中的策略。可用的命令行选项如下:
-config=path:指定配置文件的目录。配置文件中定义了可用的导入插件、模拟数据和全局值等。模拟数据可定义任何用于内建Sentinel Simulator测试的复杂场景。-global key=value:设置注入运行中策略的全局值。-explain:设置为总是显示执行追踪的情况。追踪将会显示执行过程中间的布尔表达式值,总是会显示失败的策略。
对于那些在工作中无需使用 HashiCorp 工具的工程师,如果他们热衷于此类“策略即代码”方法,可以尝试如下工具:
- 对 AWS 资源做 RSpec 测试的awspec;
- Azure Resource Manager 模板;- Google Deployment Manager 最佳实践等。
Reference
-
No backlinks found.