Adding an approle for Terraform in Hashicorp Vault
I recently set up a new Hashicorp Vault instance and wanted to use it with Terraform. I followed the instructions on the Hashicorp website and got it working. However, I wanted to use an approle
instead of a token. I found the instructions on the Hashicorp website to be a bit confusing, here is what I did to get it working.
First, I created a policy called terraform
with the following permissions.
$ vault policy write terraform - <<EOF
path "*" {
capabilities = ["list", "read"]
}
path "secrets/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
path "auth/token/create" {
capabilities = ["create", "read", "update", "list"]
}
EOF
Then I enabled the approle
auth method.
$ vault auth enable approle
Next, I created an approle called terraform
.
$ vault write auth/approle/role/terraform \
secret_id_ttl=0 \
token_num_uses=0 \
token_ttl=0 \
token_max_ttl=0 \
secret_id_num_uses=0
Note: The secret_id_num_uses=0
option will mean that the secret id does not expire, this is useful so we can useful in CI/CD pipelines without having to regenerate after x number of uses.
Let’s assign the policy we created earlier to the approle
.
$ vault write auth/approle/role/terraform/policy terraform
Now we can get the role id and secret id for the approle
, this is what we will use in Terraform to authenticate with Vault.
$ vault read auth/approle/role/terraform/role-id
$ vault write -f auth/approle/role/terraform/secret-id
Copy the role id and secret id and add them to your Terraform configuration I pass them in as variables and store in my CI/CD pipeline.
provider "vault" {
address = var.vault_address
skip_child_token = true # https://stackoverflow.com/questions/73034161/permission-denied-on-vault-terraform-provider-token-creation
auth_login {
path = "auth/approle/login"
parameters = {
role_id = var.vault_role_id
secret_id = var.vault_role_secret_id
}
}
}
That’s it you should now be able to authenticate with Vault using an approle
instead of a token.