单位 6 / 11

基础设施即代码管理 (IaC):Terraform、Ansible 和计划控制

收益:

  • 能够使用人工智能以最窄的权限和安全默认值生成 IaC(Terraform、Ansible)代码,并了解声明性方法
  • 能够在应用计划/检查输出之前通过读取和捕获删除并强制替换行来防止数据丢失
  • 能够通过在远程后端对状态文件进行加密、锁定并将更改分解为小的可逆步骤来防止秘密泄漏

基础设施即代码管理 (IaC):Terraform、Ansible 和 AI 计划控制

过去,设置服务器是通过手动点击、命令和个人笔记完成的;结果是无法复制的“雪花”服务器,没有人确切知道如何设置。基础设施即代码 (IaC) 是结束这种混乱的方法:服务器、网络、安全规则不是手动定义的,而是由可版本控制的文本文件(代码)定义的。当您运行此代码时,基础设施的设置与您编写的完全一样 - 每次都相同、有记录且可重复。最常见的工具是用于云基础设施的 Terraform 和 CloudFormation 以及用于服务器配置的 Ansible。这里的AI非常熟练地编写、解释和审查这个IaC代码。但 IaC 的强大之处也在于它的危险:一条错误的线路可能会毁掉整个基础设施;所以人工智能编写代码,你阅读“计划”,批准它并执行它。

在本单元中,我们将讨论声明式方法、计划/应用区别、状态安全和幂等性;您将学习使用 AI 生成 IaC 以及最关键的技能“计划控制”。

声明式思考:“如果”,而不是“怎么做”

大多数 IaC 工具都是声明性的:您描述系统的最终状态(“假设 3 个 Web 服务器,1 个负载均衡器”),工具本身会计算如何达到该状态。这与编写脚本不同(“一步一步地做这个,然后做那个”)。声明式方法的一大优点是幂等性:即使您运行代码十次,结果也是相同的,因为该工具会检查所需的状态是否已存在,如果存在,则不会触及它。当你将 IaC 写入 AI 时,请记住这一区别:你让它说“让这个基础设施状态”,而不是“运行这些命令”。

规划/应用:最重要的安全栏杆

IaC 的救生功能是计划步骤。在 Terraform、terraform plan、Ansible 中,--check 模式会在运行代码之前生成“如果应用它会发生什么变化”的预览:“将添加 2 个资源,将更改 1 个资源,将删除 0 个资源”。这是在实施之前将您的意图与现实进行比较的唯一方法。关键规则:在未阅读计划的情况下切勿申请。特别注意“破坏”线;如果您因拼写错误而看到“12 将被删除”而不是“1 将被更改”,则该计划已将您从灾难中拯救出来。将代码打印到人工智能后,让它说“和我一起逐行检查计划输出,标记包含删除/重新创建的每一行。”

注意:Terraform 的某些更改会“销毁并重新创建”资源,而不是“就地更新”。这意味着数据库的数据丢失。忽略计划输出中的 -/+ 或“强制替换”是最昂贵的错误之一。

国家档案:秘密和真相的记录

Terraform 等工具将其管理的基础设施的当前状态保存在状态文件中。该文件之所以重要有两个原因。首先,它可能包含秘密(数据库密码、密钥可能会陷入明文状态);因此,切勿将状态粘贴到公共存储库或人工智能中,而应将其保存在加密且访问受限的远程后端中。其次,如果国家腐败或丢失,车辆就会失去真实基础设施和想象基础设施之间的联系;因此,状态的备份和锁机制(防止两个人同时破坏的锁)是必不可少的。

一步一步:利用 AI 保护 IaC

  1. 说明意图和提供者。 “AWS 上有 2 台服务器,采用 Terraform,在这个区域、这个规模和一个安全组。”如果云、工具、版本都清楚,AI就会产生正确的语法。
  2. 请求安全默认值。 “打开安全组,启用加密,将秘密提取到变量,授予公共访问权限。” AI默认可以生成松散样本。
  3. 阅读并理解代码。逐行了解每个资源、每个权限。不要申请您不理解的权限。
  4. 制定计划并对其进行审核。运行 plan/--check,用 AI 检查输出,标记删除和重建行。
  5. 涂抹小且可双面使用。从小事做起,而不是一下子全部实施大的改变。每一步都知道回来的路。
  6. 保护国家。使用远程、加密的后端和锁;永不泄漏状态。

三个迷你箱子

案例 1 — 该计划恢复了数据库。一位工程师想要用他用 AI 生成的 Terraform 代码来增加数据库的大小。虽然他预计 terraform 计划输出中会出现“1 个更改”,但他看到“1 个要销毁,1 个要添加”——他选择的参数会触发重建,而不是就地更新,这意味着所有数据都将被删除。计划控制在实施之前阻止了不可逆转的数据丢失。

案例 2 — 从宽松违约中恢复。一个团队向 AI 询问防火墙代码。为了运行该示例,AI 生成了一条简单的规则 0.0.0.0/0,意思是“在互联网上公开”。工程师在阅读代码时注意到了这一点,并将访问范围缩小到仅企业IP范围。如果在没有经过审计的情况下实施,数据库将向整个互联网开放。

案例 3 — 防止状态泄漏。一名初级成员打算将 terraform.tfstate 文件完整粘贴到公共工具中以解决 Terraform 问题。高级工程师停下来:状态包含明文数据库密码。相反,描述问题的解密摘要被共享,并且状态被移动到远程加密后端。

四个可复制模板

1)IaC资源生成(安全默认):

您的角色:高级云基础设施工程师。 [云,例如AWS] for[工具,例如Terraform]生成代码。目的:[目的]。安全规则:公共(0.0.0.0/0)访问OPEN;从最窄的权限开始;打开加密;将秘密提取到变量中,不要将它们嵌入到代码中;检查可能导致删除/重新创建的设置。用简短的评论解释每个来源。

2)计划输出审核:

以下是 [Terraform plan / Ansible check] 输出。告诉我:(1) 将添加/更改/删除多少资源,(2) 还标记可能造成数据丢失风险的“销毁”或“强制替换”行,(3) 列出任何看似意外或危险的更改。输出:[计划]

3)IaC代码安全审查:

检查以下 IaC 代码的安全性:(1) 是否存在过于广泛的访问/权限,(2) 加密是否已关闭,(3) 代码中是否嵌入了秘密,(4) 是否有公开可用的资源?对每项发现提出更正建议。代码:[屏蔽代码]

4) 将变更拆分为安全部分:

我不想一次性实施这一重大的基础设施变革[解释]。将其分解为易于返回的小而独立的步骤。对于每一步:有什么变化,计划中需要注意什么,出现问题如何撤消?

弱提示/强提示

弱提示:

编写在 AWS 上创建服务器的 Terraform 代码。

区域、规模、安全、网络、加密都不清楚。人工智能会产生最宽松、最明确的默认工作方式——如果投入生产,这将是一个漏洞。

强力提示:

您的角色:高级云基础设施工程师。在AWS eu-central-1上使用Terraform定义一个Web服务器:t3.small,仅来自公司IP范围(我将给它一个变量),端口443开放,磁盘加密,没有公共访问,标签是强制性的。秘密被暴露给变量。代码之后:在实现之前,告诉我规划中应该注意的3种线型,并解释一下返回路径。

舞台

风险

安全栏杆

写代码

宽松默认(公开)

最窄权限+读取

计划/检查

不知不觉中删除

计划检查、销毁标记

申请

重大一次性变更

小而可逆的步骤

国家行政部门

漏釉、变形

远程加密后台+锁

常见错误

  • 不阅读计划即可申请。该计划预示着删除和重建;如果跳过,数据丢失是不可避免的。
  • 没有注意到松散的默认值。 AI实例经常产生0.0.0.0/0;如果它被转移到生产环境,就意味着向整个互联网开源。
  • 泄漏状态。将状态文件导出到 AI 或开放存储库会暴露明文秘密。
  • 将秘密嵌入代码中。将密码写入 IaC 代码是代码版本历史记录中的持续泄漏。
  • 将重建误认为是更新。忽略强制替换行将导致数据库中的数据丢失。
提示:即使将计划输出交给人工智能进行审查,最终决定也是基于您自己的知识,而不是计划文本。人工智能总结计划并标记风险线路;但“此删除是否可接受”问题的答案取决于您的业务环境。

综上所述

IaC 通过使用可版本化的代码而不是手动点击来管理基础设施,从而带来可重复性和文档记录。人工智能是编写代码、描述代码和审查安全性的强大合作伙伴。但 IaC 的强大之处在于它的危险:一条线路可以摧毁整个基础设施。考虑声明性,从最窄的权限开始,修复松散的默认值,将秘密隐藏在代码和状态之外。最重要的护栏是计划/检查步骤:在未阅读删除和重建行的情况下切勿执行。保持状态加密、锁定和远程。代码是人工智能的,决定权是你的。

应用任务

选择小型基础设施目标(例如,单个虚拟机和安全规则)。使用上面的“IaC 资源生成”模板,向 AI 请求具有安全默认值的代码。使用“IaC 代码安全审查”模板仔细检查代码,并尝试找到至少一项松散的设置。如果可能,在测试帐户上运行 plan/--check 并使用“计划输出检查”模板检查输出;查看是否有删除或重新创建行。用 6 点写下您的发现以及您将如何确保国家安全。

清单

  • [ ] 我是否为 AI 指定了云、工具和版本,并以最窄的权限请求代码?
  • [ ] 我是否检查了代码的松散默认值(0.0.0.0/0,封闭加密)?
  • [ ] 我是否将秘密提取到变量中而不是将它们嵌入到代码中?
  • [ ] 在申请之前我是否阅读了计划/检查输出并标记了删除行?
  • [ ] 我是否评估过“强制更换”/重建线路对数据丢失的影响?
  • 我不是把[ ] State文件加密锁在远程后端然后泄露出去了吗?