似乎有很多关于如何在 terraform 中检索和查看敏感数据的信息,但关于如何通过非敏感函数“防止”查看它的信息却很少。 例如,假设我在 Azure Key Vault 中存储了一个秘密,我希望我的配置能够获取它并在某个地方使用它:
data "azurerm_key_vault_secret" "my_ultra_secret" {
name = "my_ultra_secret"
key_vault_id = data.azurerm_key_vault.mykeyvault.id
}
(我使用存储在 HCP Terraform(又名 Terraform Cloud)中的远程状态,以及 Terraform 的服务主体来与 Azure 通信并操作资源。)
如果开发人员能够获取此代码并进入 terraform 控制台,他们可以执行以下操作:
nonsensitive(data.azurerm_key_vault_secret.my_ultra_secret)
从而以明文形式暴露秘密。我不希望开发人员看到这些秘密,但显然 terraform cloud 需要这样做,因此限制我的服务主体权限的想法似乎不符合要求。
知道我该怎么做吗? (我研究过动态提供者凭证,但据我所知,这似乎并没有限制基于
user的权限。
一般来说,当最终用户获得足够的权限在多个环境/资源中使用秘密时,我们应该提供足够的权限来执行这些任务。
在访问策略方面,我们可以通过单独提供 get 权限来向最终用户提供限制,这是使用秘密所需的最低权限。不幸的是,如果用户获得了此权限,那么他也将有足够的权限来查看秘密,反之亦然。
我可以分享几个步骤,您可以通过这些步骤来克服这个问题,但在应用这些步骤之前,请确保您的最终用户没有在其状态文件中存储秘密。
即使
nonsensitive()
sensitive = true
,它也不会允许最终用户看到秘密。
data "azurerm_key_vault_secret" "example" {
name = "testsample"
key_vault_id = data.azurerm_key_vault.example.id
}
output "exposed_secret_value" {
value = nonsensitive(data.azurerm_key_vault_secret.example.value)
sensitive = true
}
为开发人员创建不包含查看状态文件权限的特定角色。限制他们运行
terraform console
nonsensitive()
。您还可以使用 Azure DevOps、GitHub Actions 等秘密传递。尝试进行一些更改,以便开发人员无法通过锁定配置文件来更改配置文件,这可以在进行更改之前通过拉取请求来完成当您为最终用户或开发人员提供必要的权限时,他将能够使用它来查看秘密的价值。我们必须忍受它。
参考:https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/key_vault_access_policy需要在terraform中显示敏感数据输出变量
,作者:Mark B