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
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:
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.
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 | |
} | |
} |
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)" |
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.
Top comments (0)