如何设计具有多个敏感属性的 Terraform 资源

How to design a Terraform resource with multiple sensitive attributes

上下文:我正在为我的 TF 提供程序开发新资源。

这个 foo 资源有一个名称和关联的配置:键值对列表(敏感和非敏感)。

我确定了 3 个选项:

resource "foo" "option1" {
  name = "option1"
  config = {
    "name"            = "option1"
    "errors.length"   = 3
    "tasks.type"      = "FOO"
  }
  config_sensitive = {
    "jira.key"         = "..."
    "credentials.json" = "..."
  }
}

resource "foo" "option2" {
  name = "option2"
  config = {
    "name"            = "option1"
    "errors.length"   = 3
    "tasks.type"      = "FOO"
    "jira.key"         = "..."
    "credentials.json" = "..."
  }
}

resource "foo" "option3" {
  name = "option3"
  config = file("config.json")
}

选项 #3 的优点是它看起来非常易读,但需要用户在同一文件夹中存储额外的 json 文件(带有机密)(我不确定该设置是否可接受) .选项 #2 看起来很诱人,但 foo 应该接受更新,如果我们将整个块标记为敏感(因为它可能包含秘密键值对),更新功能将受到影响(用户不会看到预期的变化) .所以选项 #1 是我眼中的赢家,因为它是最明确的选项,允许我们区分敏感属性和非敏感属性(同时允许更新 non-sensitive 属性)。从文件中读取整个配置可能并不理想,因为它实际上不允许工程师在不打开另一个文件的情况下查看配置的外观。

还有这个奇怪的重复 name 属性,但我们暂时忽略它。

哪种配置最可接受并被其他 TF 提供商使用?

Terraform 提供程序应处理 credential/auth 实现,资源处理资源配置。

例如

resource "jira_issue" "some_story" {
  title  = "My story"
  type   = "story"
  labels = ["someexampleonWhosebug","jakewashere"]
}

请注意,没有与我在 Terraform 资源中创建的内容无关的配置。

在您的提供程序中有一些记录的约定从某处读取凭据是非常可以接受的,无论是 OS 变量、磁盘上的文件等。

例如:Google Cloud provider 将读取环境变量(如果已填充),否则它将尝试读取位于 $HOME 隐藏目录内的配置文件或尝试读取用于凭据的本地主机 http 元数据服务器。

选项 #3 应立即取消,原因有以下三个:

  • 您不能像使用 1 和 2 那样真正使用 sensitive flag in the schema struct
  • 它需要一个 JSON 格式值,除非您被迫使用它(例如安全策略),否则使用起来很麻烦。
  • 有人可以内联 JSON 而不是将其存储在文件中,这将完全解决您隐藏秘密的企图。

从机密管理的角度来看,选项 1 和 2 老实说没有什么不同。您可以在 per-attribute 基础上将 sensitive 标志应用于嵌套架构结构中的任何一个,并使用例如Vault 以 KV 为基础传递值。

我会选择 1 over 2,因为在我看来,从你的问题来看,两个块中的参数和值彼此没有关系。因此,出于代码整洁的目的,将架构组织成两个单独的块更有意义。

我还会提到,如果可以将 credentials.json 重构到您的提供程序中,并为 jira.key 利用 JIRA 提供程序,那么这将是代码架构和安全。这也是主要提供商处理这种情况的方式。