Terraform 如何检测地形以外的变化?

Terraform 如何检测地形以外的变化?,terraform,Terraform,我现在已经使用Terraform几个月了,我的基础设施都是基于Terraform文件的,我现在可以更好地控制我们多个帐户中的资源 但我有一个大问题。如果有人对任何地形资源进行“手动”更改,则很容易检测到更改 但是如果资源不是使用Terraform创建的,会发生什么呢?如果资源不是使用Terraform创建的,我不知道如何跟踪任何新资源或其中的更改。Terraform的一个关键设计权衡是,它只会尝试管理它创建的或您显式导入的对象,因为Terraform通常用于混合环境,其中一些对象由其他软件(如应

我现在已经使用Terraform几个月了,我的基础设施都是基于Terraform文件的,我现在可以更好地控制我们多个帐户中的资源

但我有一个大问题。如果有人对任何地形资源进行“手动”更改,则很容易检测到更改


但是如果资源不是使用Terraform创建的,会发生什么呢?如果资源不是使用Terraform创建的,我不知道如何跟踪任何新资源或其中的更改。

Terraform的一个关键设计权衡是,它只会尝试管理它创建的或您显式导入的对象,因为Terraform通常用于混合环境,其中一些对象由其他软件(如应用程序部署工具)管理,或者Terraform描述被分解为多个单独的配置,以协同工作

因此,地形本身无法解决在地形之外创建的对象的问题。您需要使用其他技术来解决此问题,例如防止直接创建对象的访问策略,或定期扫描云供应商帐户以查找预期地形状态快照中不存在的对象的独立软件(可能是内部创建的)

访问策略通常是更直接的实现途径,因为首先阻止创建对象要比识别已经存在的对象容易,特别是如果您使用的云服务创建下游对象是其工作的副作用,如我们所见(例如)自动缩放控制器。

非常优秀,并解释了Terraform不能成为这方面的仲裁者,因为它的设计可以很好地与其他工具和自身(即跨不同的状态文件)配合使用

他还提到,访问策略(尽管这些策略必须是特定于云/提供商的)是一个很好的替代方案,因此,如果您确实希望强制执行,此答案将在这里提供一些选项,用于使用AWS处理此问题

AWS SDK和其他客户端(包括Terraform)都在所有请求中提供了一个完整的解决方案。这是由记录的,因此您可以使用您喜爱的日志搜索工具搜索CloudTrail日志,以查找应通过Terraform完成但不使用Terraform的用户代理的API操作

使用用户代理请求头的另一个选项是使用,它将阻止与已定义的用户代理头不匹配的任何请求。IAM策略的示例可能如下所示:

{
“版本”:“2012-10-17”,
“声明”:[
{
“Sid”:“Stmt1598919227338”,
“行动”:[
“dlm:GetLifecyclePolicys”,
“dlm:GetLifecyclePolicy”,
“dlm:ListTagsForResource”
],
“效果”:“允许”,
“资源”:“*”
},
{
“Sid”:“Stmt1598919387700”,
“行动”:[
“dlm:CreateLifecyclePolicy”,
“dlm:DeleteLifecyclePolicy”,
“dlm:TagResource”,
“dlm:UntagResource”,
“dlm:UpdateLifecyclePolicy”
],
“效果”:“允许”,
“资源”:“*”,
“条件”:{
“线状”:{
“aws:UserAgent”:“*terraform*”
}
}
}
]
}
上述策略允许其附加到的用户、组或角色能够对AWS帐户中的任何DLM资源执行只读任务。然后,它允许任何具有用户代理头(包括字符串
terraform
)的客户端执行可以创建、更新或删除DLM资源的操作。如果客户端在用户代理标头中没有
terraform
,则任何修改DLM资源的请求都将被拒绝

注意:值得注意的是,客户端可以覆盖用户代理字符串,因此不应将此作为防止访问此字符串以外内容的简单方法。上述技术对于了解您的帐户中其他工具(如AWS控制台)的使用情况非常有用,您更希望只通过Terraform进行更改

IAM全局条件键的AWS文档中有这样一句话:

警告

这把钥匙应该小心使用。自aws:UserAgent 值由调用方在HTTP头中提供,未经授权 各方可以使用修改的或自定义的浏览器来提供任何
aws:UserAgent
他们选择的值。因此,
aws:UserAgent
不应用于防止未经授权方直接 AWS请求。您可以使用它只允许特定的客户端 应用程序,并且仅在测试策略之后

Python SDK,
boto
,介绍了如何在中修改用户代理字符串