避免在自定义提供程序中以 Terraform 状态写入机密

问题描述 投票:0回答:1

我们正在实现一个自定义提供程序,我们希望避免在 Terraform 状态中存储敏感值。假设我们有:

resource my_secret_resource {
  secret_value = var.secret_value
}

我们知道可以使用

StateFunc
来存储该值的转换。假设我们这样做:

"secret_value": {
  Type:      schema.TypeString,
  StateFunc: func stateFuncEncrypting(v interface{}) string {
    return encrypt(hash(v))   
  },
},

我们不想只是

hash
,因为它不是很安全,但是好的
encrypt
每次都会产生不同的值,从而使 Terraform 感到困惑:

$ terraform apply

...

╷
│ Error: Provider produced inconsistent final plan
│ 
│ When expanding the plan for my_secret_resource.test1 to include new values learned so far during apply, provider
│ "xxx" produced an invalid new value for .secret_value: was
│ cty.StringVal("TNwbQAAABBcHGEnvVmb..."),
│ but now
│ cty.StringVal("xuwrHk5COAAAADAJewY...").
│ 
│ This is a bug in the provider, which should be reported in the provider's own issue tracker.

有什么方法可以调整

StateFunc
DiffSuppressFunc
CustomizeDiff
或其他 Terraform 部件来实现此目的?


相关帖子:

相关 TF 问题:

go security terraform cryptography
1个回答
0
投票

一般来说,在今天的 Terraform 中,如果参数的值不存储在状态中,资源类型就无法接受参数。 SDK 中的

StateFunc
机制以及其他各种类似的东西,主要是为了区分标准化差异和有意义的差异,而不是用于存储实质上不同的值。

Terraform 的一致性检查有效地阻止了此类工作,因为从模块中其他地方的表达式对该参数的任何引用都将假定该值在验证、计划和应用阶段之间的含义保持一致,并且(除非预期状态被有意更改)作者)从一个计划/应用到下一个计划。

其他一些具有类似要求的提供商已经实施了解决方案,其共同主题是“间接”而不是直接传递值。例如,您可以使提供程序参数采用磁盘上包含秘密值的文件的路径,然后将其加载到提供程序代码中——当然,这需要敏感值到达磁盘——或者您可以鼓励操作员在需要时通过环境变量或各种其他类型的间接提供敏感值,这意味着敏感值永远不会由 Terraform Core 直接处理。 这些解决方案当然是不完美且麻烦的。希望有一天 Terraform 能够有一种更明确的方法来解决这个问题,但我建议不要试图欺骗今天的 Terraform 来允许这一点,因为你“做”的任何事情都可能最终取决于实现细节或错误,而这些细节并不存在。旨在作为保证,从而导致提供程序在不同版本的 Terraform 之间使用时变得脆弱。

© www.soinside.com 2019 - 2024. All rights reserved.