我了解将基础结构部署为代码的目的,并赞赏能够强制执行代码对等检查预部署的好处。从安全性的角度来看,此技术控制使我确信对环境所做的更改均经过同行评审。
但是,具有相关权限的人员(例如,具有角色Owner)是否仍然可以直接在控制台/云外壳上进行更改?然后,此更改将不会被同行评审。
只是想检查一下有什么控件可以防止这种情况发生?当然,我知道一种控制是限制项目或组织级别的IAM权限,以防止进行更改,因为那时只有terraform服务帐户可以进行更改,但是我想了解是否还有其他控件。
什么都不会阻止用户创建/更新/删除资源手动(通过手动我的意思是:通过控制台或云壳)如果他有IAM权限这样做。
在手动更新资源的情况下:如果资源是由Terraform管理的,则运行terraform plan
将提醒您已进行了修改。确实,Terraform会看到.tf
文件中的资源描述与现实之间的差异
。如果您应用这些更改,它将还原用户手动进行的修改。
进行定期检查以验证是否已对Terraform进行了某些修改(在Terraform管理的资源上),可能是一个不错的主意,以提醒您有人进行了手动操作。
但是,对于新创建的资源(不在Terraform中),除非在创建(terraform import
)之后将资源导入Terraform中,否则您将永远不会知道该资源已创建,并且无法跟踪对该资源的任何修改。阻止资源创建的唯一方法是限制IAM权限。例如,如果没有人(除非Terraform服务帐户)具有权限storage.buckets.create
,则没有人(Terraform服务帐户除外)将能够创建存储桶。资源更新也是如此。
如果您希望所有资源都由Terraform管理,请删除对除Terraform服务帐户以外的所有用户的创建/更新IAM权限。但是请注意:
总之,使用Terraform 管理整个组织中的所有资源并仅限制Terraform服务帐户创建/更新/删除资源是明确的目标目标,应尽可能多地完成,但实际上并非如此。总是完全可能的。关键资源必须得到保护,因此必须限制用于更新/删除它们的IAM。另外,所有者角色不是唯一允许创建/更新/删除资源的角色。您必须谨慎对待授予用户的角色,以确保他们不会获得此类权限,并且可能依赖自定义角色,因为预定义角色通常太宽泛。
请问您为什么不相信这是一个好主意?我可以想象有一个“碎玻璃”组,其中应用了“所有者”角色,并将用户添加到该组中,如果由于某种原因需要对环境进行手动更改会减轻仅允许使用资源的风险。由Terraform管理。
当我有更多时间时,我将用更多详细信息更新我的答案:)但是,从理论上讲,这是一个很好的主意,对于资源很少的小型项目,我将最终实现它。但是在企业规模(我不知道您的用例),它可能变得很难管理。另一个问题是,您不能使用Terraform(新的GCP产品)创建所有资源,也不能更新(例如,停止Compute Engine实例),因此有时您必须依赖控制台/ Cloud Shell / Deployment Manager。在Terraform状态下不会跟踪这些操作。
@ellefc我已经更新了我的答案,希望它有助于澄清。