DEV Community

Jasper Rodda
Jasper Rodda

Posted on

Install Hashicorp Vault to store Secrets and use it in Terraform.

1. Installation Steps

  • Install gpg
sudo apt update && sudo apt install gpg
Enter fullscreen mode Exit fullscreen mode
  • Download the signing key to a new keyring
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
Enter fullscreen mode Exit fullscreen mode
  • Verify the key's fingerprint
gpg --no-default-keyring --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg --fingerprint
Enter fullscreen mode Exit fullscreen mode
  • Add the HashiCorp repo
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
Enter fullscreen mode Exit fullscreen mode
  • Update packages
sudo apt update
Enter fullscreen mode Exit fullscreen mode
  • Install Vault
sudo apt install vault
Enter fullscreen mode Exit fullscreen mode

2. Start Vault Server

  • Start Vault Server
vault server -dev -dev-listen-address="0.0.0.0:8200"
Enter fullscreen mode Exit fullscreen mode

3. Configure Terraform to read the secret from Vault.

  1. Enable AppRole Authentication: > To enable the AppRole authentication method in Vault, you need to use the Vault CLI or the Vault HTTP API.
  2. Run the following command to enable the AppRole authentication method:
vault auth enable approle
Enter fullscreen mode Exit fullscreen mode
  1. Create an AppRole:
  2. 2.a) Create Policy
vault policy write terraform - <<EOF
path "*" {
  capabilities = ["list", "read"]
}

path "secrets/data/*" {
  capabilities = ["create", "read", "update", "delete", "list"]
}

path "kv/data/*" {
  capabilities = ["create", "read", "update", "delete", "list"]
}


path "secret/data/*" {
  capabilities = ["create", "read", "update", "delete", "list"]
}

path "auth/token/create" {
capabilities = ["create", "read", "update", "list"]
}
EOF
Enter fullscreen mode Exit fullscreen mode

2.b) Create the AppRole:

vault write auth/approle/role/terraform \
    secret_id_ttl=10m \
    token_num_uses=10 \
    token_ttl=20m \
    token_max_ttl=30m \
    secret_id_num_uses=40 \
    token_policies=terraform
Enter fullscreen mode Exit fullscreen mode
  1. Generate Role ID and Secret ID: > After creating the AppRole, you need to generate a Role ID and Secret ID pair. The Role ID is a static identifier, while the Secret ID is a dynamic credential.
  2. 3.a) Generate Role ID:
vault read auth/approle/role/my-approle/role-id
Enter fullscreen mode Exit fullscreen mode
  • 3.b) Generate Secret ID:
vault write -f auth/approle/role/my-approle/secret-id
Enter fullscreen mode Exit fullscreen mode

This command generates a Secret ID and provides it in the response. Save the Secret ID securely, as it will be used for Terraform authentication.

4. Provider.tf file

provider "vault" {
  address = "<>:8200"
  skip_child_token = true

  auth_login {
    path = "auth/approle/login"

    parameters = {
      role_id = "<>"
      secret_id = "<>"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

5. Main.tf

  • 5.a) Create vault server
# Create vault server - 1 
resource "aws_instance" "vault-server-1" {
  ami                    = "ami-053b0d53c279acc90"
  instance_type          = "t2.micro"
  key_name               = "efronlogin"
  subnet_id              = aws_subnet.sd-snet1.id
  vpc_security_group_ids = [aws_security_group.sd-sg-1.id]
  user_data              = base64encode(file("vault_userdata.sh"))

   tags = {
    name="vault-Master"
    Environment="dev"
  }

}
Enter fullscreen mode Exit fullscreen mode
  • 5.b) Connect to Hashicorp Vault via "data" resource
 data "vault_kv_secret_v2" "example" {
   mount = "secret" // change it according to your mount
   name  = "dev-s3" // change it according to your secret
 }
Enter fullscreen mode Exit fullscreen mode
  • 5.c) Use it to retrieve in Terraform

  • create EC2 instance with Tag names and Secret Name

resource "aws_instance" "my_instance" {
  ami           = "ami-053b0d53c279acc90"
  instance_type = "t2.micro"

  tags = {
    Name = "test"
    Secret = data.vault_kv_secret_v2.example.data["secret_name"]
  }
}
Enter fullscreen mode Exit fullscreen mode

Credits:-
Thanks to Abhishek Veeramalla

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

The Most Contextual AI Development Assistant

Pieces.app image

Our centralized storage agent works on-device, unifying various developer tools to proactively capture and enrich useful materials, streamline collaboration, and solve complex problems through a contextual understanding of your unique workflow.

👥 Ideal for solo developers, teams, and cross-company projects

Learn more