我在 Terraform IaC 代码中使用 Vault 提供程序,如下所示:
provider "vault" {
address = var.vault_address
auth_login {
path = "auth/approle/login"
parameters = {
role_id = var.role_id
secret_id = var.secret_id
}
}
}
我传递一个地址,例如:https://www.vault.organization.com并更正role_id和secret_id。当我通过 HTTP 请求请求令牌时它可以工作,但在这种提供程序情况下我收到 403 权限被拒绝错误,如下所示:
│ Error: failed to create limited child token: Error making API request.
│
│ URL: POST https://vault.organization.com/v1/auth/token/create
│ Code: 403. Errors:
│
│ * 1 error occurred:
│ * permission denied
│
│
│
│ with provider["registry.terraform.io/hashicorp/vault"],
│ on providers.tf line 23, in provider "vault":
│ 23: provider "vault" {
我的配置有什么问题吗?
Terraform version ">= 0.13"
Vault provider version "3.7.0"
此问题源于 Vault 提供程序需要创建中间/子令牌,由于 Terraform 提供程序中的策略设置方式,该令牌没有权限,因此它始终会失败。
在最新版本中,他们引入了
skip_child_token
选项来解决这个问题。 (https://github.com/hashicorp/terraform-provider-vault/issues/29#issuecomment-988121638)
此外,似乎有一个未记录的要求将命名空间放置在
provider
和 auth_login
块中,如果我不将它们都添加,我会收到 403 错误。
provider "vault" {
address = var.vault_address
namespace = "admin"
skip_child_token = true
auth_login {
path = "auth/approle/login"
namespace = "admin"
parameters = {
role_id = var.cms_vault_role_id
secret_id = var.cms_vault_secret_id
}
}
}
403错误不是来自路径
auth/approle/login
,而是来自auth/token/create
。
Terraform 将尝试在环境中找到现有令牌时创建子令牌。我认为您的脚本正在获取旧令牌,并且在到达您的代码之前就失败了。
尝试这个(适应您的环境):
rm -v ~/.vault-token
)unset VAULT_TOKEN
)vault print token
需要更新与给定身份验证关联的策略,以便它可以创建子令牌。将策略与您的 appRole 相关联。
路径“auth/token/create”{
功能= [“创建”,“更新”,“sudo”]
}
不鼓励使用
skip_child_token
,应将其作为最后的手段。