DEV Community

Ana Carolina Manzan
Ana Carolina Manzan

Posted on

Automatizando a inclusão de certificados ao Key Vault usando Azure DevOps Secure Files com Terraform

Image description

Ao trabalharmos com certificados de autoridade certificadora, quando por exemplo, configuramos o SSL no Azure Application Gateway ou no Azure API Management, podemos nos deparar com a necessidade de adicionar os certificados ao Azure Key Vault. Neste artigo, veremos um método de adicionar os certificados automaticamente ao Key Vault, sem a necessidade de intervenções manuais que podem causar interrupções no processo de automação. Para alcançarmos este objetivo, vamos utilizar o Secure Files do Azure DevOps e Terraform.

Configurações no Azure DevOps

Vamos trabalhar com um cenário onde já temos um um certificado no formato .pfx e uma senha para o certificado. Para começar, vamos fazer o upload do nosso certificado na seção Secure Files do Azure DevOps. Acesse https://dev.azure.com/<nome_da_organizacao>/<nome_do_projeto>/_library?itemType=SecureFiles

Image description

Como na imagem acima, clique no botão + Secure File para fazer o upload do seu certificado. Para o exemplo do artigo, criei um dummy certificate (veja como criar aqui ou aqui) com o nome certificate.pfx, fiz o upload para o Secure Files e renomeei o arquivo para certificate (Removi a extensão .pfx do arquivo para facilitar o uso do nome do certificado em variáveis).

Depois de realizar o upload, acesse o arquivo do certificado para dar permissão à pipeline na qual você deseja usá-lo. Siga os passos conforme a imagem:

Image description

Como faremos o deployment da infraestrutura através de uma pipeline yaml, vamos adicionar duas variáveis ao grupo de variáveis que vamos utilizar para este artigo: CERTIFICATE_NAME e CERTIFICATE_PASSWORD.

Image description

Código Terraform

Vamos agora trazer o código terraform para a criação do Key Vault.
No código abaixo, temos a criação do Key Vault contendo políticas de acesso que vão permitir que a nossa Service Principal crie (Create), importe (Import) e obtenha (Get) certificados.

Além disso, no bloco azurerm_key_vault_certificate temos a criação do certificado em si, obtendo o conteúdo do certificado através da função filebase64 e da variável certificate_path que contém o caminho para o arquivo do certificado.

resource "azurerm_key_vault" "kv01" {
name = var.key_vault_name
location = var.location
resource_group_name = var.resource_group_name
enabled_for_disk_encryption = true
tenant_id = data.azurerm_client_config.current.tenant_id
soft_delete_retention_days = 7
purge_protection_enabled = false
sku_name = var.key_vault_sku
access_policy {
tenant_id = data.azurerm_client_config.current.tenant_id
object_id = data.azurerm_client_config.current.object_id
certificate_permissions = [
"Create", "Import", "Get
]
}
}
resource "azurerm_key_vault_certificate" "certificate" {
name = var.certificate_name
key_vault_id = azurerm_key_vault.kv01.id
certificate {
contents = filebase64(var.certificate_path)
password = var.certificate_password
}
}
view raw key_vault.tf hosted with ❤ by GitHub

Pipeline

Na pipeline, precisamos realizar o download do arquivo do certificado que está dentro do Secure Files. Para isso, usaremos a tarefa DownloadSecureFile@1. Esta é uma tarefa relativamente simples, que recupera um arquivo do Secure Files a partir do seu nome.

- task: DownloadSecureFile@1
name: certificate_secure_file
displayName: 'Download certificate from Secure File'
inputs:
secureFile: $(CERTIFICATE_NAME)

Neste bloco de código, podemos observar que a tarefa tem dois parâmetros importantes: name e secureFile (dentro do bloco inputs).
O parâmetro name vai nos servir como uma variável para obter as saídas da tarefa (como o caminho para onde o arquivo foi baixado, por exemplo).
Já o parâmetro secureFile vai receber o valor da variável CERTIFICATE_NAME que criamos anteriormente no nosso grupo de variáveis.

- task: Bash@3
displayName: Terraform Apply
env:
ARM_CLIENT_ID: $(AZURE_USER)
ARM_CLIENT_SECRET: $(AZURE_SECRET)
ARM_SUBSCRIPTION_ID: $(AZURE_SUBSCRIPTION)
ARM_TENANT_ID: $(AZURE_TENANT_ID)
inputs:
targetType: inline
workingDirectory: "$(System.DefaultWorkingDirectory)/IaC"
script: |
terraform apply -auto-approve \
-var="resource_group_name=$(RESOURCE_GROUP)" \
-var="location=$(LOCATION)" \
-var="key_vault_name=$(KEY_VAULT_NAME)" \
-var="key_vault_sku=$(KEY_VAULT_SKU)" \
-var="certificate_name=$(CERTIFICATE_NAME)" \
-var="certificate_password=$(CERTIFICATE_PASSWORD)" \
-var="certificate_path=$(certificate_secure_file.secureFilePath)"
view raw Bash@3.yml hosted with ❤ by GitHub

Já na tarefa que executa o comando terraform apply, como vemos acima, vamos passar o caminho do certificado para a variável certificate_path utilizando o mesmo valor do parâmetro name da tarefa DownloadSecureFile@1, e referenciando o valor de saída com o .secureFilePath. Neste exemplo, o resultado é $(certificate_secure_file.secureFilePath).

Excluindo o arquivo do certificado

Podemos realizar a exclusão do arquivo do certificado de dentro do agente de deployment usando a tarefa DeleteFiles@1. Esta tarefa faz a exclusão de arquivos e/ou pastas a partir do caminho apontado a ela no parâmetro Contents. Aqui também vamos utilizar a variável $(certificate_secure_file.secureFilePath) para garantir que depois de utilizado pelo terraform, o nosso certificado será excluído do agente.

- task: DeleteFiles@1
inputs:
Contents: $(certificate_secure_file.secureFilePath)

Você pode encontrar o código completo do exemplo deste artigo aqui.

Este é artigo traduzido e adaptado do artigo original escrito por T. Constantini.

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

AWS Security LIVE!

Hosted by security experts, AWS Security LIVE! showcases AWS Partners tackling real-world security challenges. Join live and get your security questions answered.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️