Skip to content

V. Azure Vault

1. Lil' intro ?

➜ Une Vault est un terme gĂ©nĂ©rique (dĂ©mocratisĂ© un peu par HashiCorp Vault) pour un machin qui permet de stocker, gĂ©rer et rĂ©cupĂ©rer des secrets.

C'est un cas plutÎt récurrent désormais, avec l'Úre du Cloud et des outils comme Terraform : on écrit des secrets en clair un peu partout si on fait rien de particulier.

L'idĂ©e d'une Vault est donc de proposer un endroit centralisĂ© et sĂ©curisĂ© oĂč stocker ces secrets.

On peut ensuite accéder à ces secrets aprÚs authentification (lecture/écriture). Souvent ça passe par le protocole HTTP (une API REST quoi) pour la plupart des Vaults.

➜ Azure propose une Vault, permettant de partager des secrets entre plusieurs VMs ou ressources.

Et avec Terraform, on peut les définir à la volée de façon aléatoire, ou les prédéfinir manuellement.

Note

On imagine facilement dans la vie réelle de passer sous forme de secrets stockés en Vault :
- des mots de passe de base de données (pour qu'un site accÚde à a sa DB)
- un token de monitoring (pour que la VM envoie ses datas)
- etc.

Keep it safe

2. Do it !

🌞 ComplĂ©ter votre plan Terraform et mettez en place une Azure Key Vault

  • je vous recommande de crĂ©er un nouveau fichier keyvault.tf Ă  cĂŽtĂ© de votre main.tf
  • ce fichier doit :

Note

Encore une fois, en situation rĂ©elle, cette variable d'environnement pourrait ensuite ĂȘtre consommĂ©e par une application qui tourne sur la VM par exemple.
On peut aussi facilement imaginer un templating de fichiers à partir d'un secret récupéré dans la Azure Key Vault.

📁 Fichiers attendus

  • main.tf
  • keyvault.tf
  • tout autre fichier Terraform utilisĂ©
Tip

Perso j'ai ajouté dans mon output.tf l'affichage du secret, pour vérifier que ça fonctionne bien pendant les tests.

Help : Exemple de fichiers Terraform

  • Il faut crĂ©er un Azure Key Vault et donner Ă  votre VM les droits dessus
Example
resource "azurerm_key_vault" "meow_vault" {
  name                       = "<Le nom de ta Azure Key Vault ici>"
  location                   = azurerm_resource_group.main.location
  resource_group_name        = azurerm_resource_group.main.name
  tenant_id                  = data.azurerm_client_config.current.tenant_id
  sku_name                   = "standard"
  soft_delete_retention_days = 7
  purge_protection_enabled   = false

  access_policy {
    tenant_id = data.azurerm_client_config.current.tenant_id
    object_id = data.azurerm_client_config.current.object_id
    secret_permissions = [
      "Get", "List", "Set", "Delete", "Purge", "Recover"
    ]
  }

  access_policy {
    tenant_id = data.azurerm_client_config.current.tenant_id
    object_id = azurerm_linux_virtual_machine.main.identity[0].principal_id
    secret_permissions = [
      "Get", "List"
    ]
  }
}
  • Terraform peut gĂ©nĂ©rer des strings random, y'a une ressource dĂ©diĂ©e Ă  ça
Example
# 16 caractÚres, en remplaçant certains caractÚres qu'on veut pas
resource "random_password" "meow_secret" {
  length           = 16
  special          = true
  override_special = "@#$%^&*()"
}
  • On peut ensuite rĂ©cupĂ©rer la valeur dans une autre ressource
Example
# au hasard, pour créer un Secret dans une Azure Key Vault :)
resource "azurerm_key_vault_secret" "meow_secret" {
  name         = "<Le nom de ton secret ici>"
  value        = random_password.meow_secret.result
  key_vault_id = azurerm_key_vault.meow_vault.id
}
  • vous pouvez alors voir dans la WebUI Azure si vous voulez :

    • dans Key vaults > Le nom de ta Azure Key Vault > Secrets > Le nom de ton secret > Current version > Show Secret value

3. Proof proof proof

🌞 Avec une commande az, afficher le secret

  • depuis votre poste, et votre compte Azure, vous avez les droits pour voir le secret normalement
  • ça va se faire avec un az keyvault secret show --name "<Le nom de ton secret ici>" --vault-name "<Le nom de ta Azure Key Vault ici>"

🌞 Depuis la VM, afficher le secret

  • il faut donc faire une requĂȘte Ă  la Azure Key Vault depuis la VM Azure
  • un ptit script shell ça le fait !
Note

En situation rĂ©elle, ce serait l'application qui a besoin de ce secret qui effecturait la requĂȘte.
Si c'est pour templater un fichier de conf, on imagine facilement un Ansible, cloud-init, ou équivalent qui se charge de ça !

GG EZ