Rotation des clés CosmosDB

Qui n’a pas été confronté un jour à une ressource inaccessible suite à la régénération de la clé d’accès par Douby le stagiaire ? Douby ou michel d’ailleurs peu importe…
La bonne pratique voudrait que nous n’utilisions pas la clé en direct dans notre code (ce que je recommande fortement) mais alors comment faire ? Certains types de ressources proposent des solutions via Key Vault, par exemple la fonctionnalité du managed storage qui permet au Key Vault d’auto regénéré la clé d’un storage account et de la référencer en tant que secret : https://docs.microsoft.com/en-us/azure/key-vault/key-vault-overview-storage-keys-powershell
Vous faites donc référence directement au secret au sein du Key Vault et donc plus besoin de renseigner une clé en dur dans votre code, de plus la clé étant régénérée automatiquement vous évitez qu’une clé divulgué se retrouve utilisable sur le long terme.

Malheureusement cette fonctionnalité n’est pas disponible pour toutes les ressources proposant des clés et c’est notamment le cas de CosmosDB.
D’où ma réflexion, comment référencer au sein d’un key vault les master keys de ma CosmosDB à chaque fois que Doubby régénère celles-ci ?

Premièrement comment détecter la regénération des clés ?
Réponse simple, Activity Logs !

Ok mais ensuite comment récupérer les nouvelles clés et surtout comment les ajouter à mon Key Vault ?
J’ai évidemment pensé à PowerShell mais au sein de Functions ce n’est pas encore ça… J’ai donc opté pour Logic App, plus graphique certes mais tout aussi efficace pour cette tâche.
Voyons comment cela a été mis en place.

J’ai tout d’abord créé ma Logic App en utilisant un trigger HTTP, le schéma à utiliser est le suivant :

On va ensuite récupérer le nom de la CosmosDB qui a déclenchée notre Logic App au sein d’une variable, pour cela on va spliter le resourceId :

When a HI-rp request is received ResourceName String split(...) X Add an expression to do basic things like access, convert, and compare values. Learn more Dynamic content Expression Add dynamic content Update Hide ResourceName * Name Value

On va ensuite définir le nom du Key Vault à utiliser et plutôt que de le renseigner en dur nous allons utiliser une variable :

{x} KeyVaultName * Name Type Value KeyVaultName String

Nous avons alors les éléments nécessaire pour aller récupérer les clés via API mais il nous manque cependant un élément à savoir l’authentification !

Plutôt que d’utiliser un SPN nous allons utiliser MSI (Managed Service Identity)

L’activation se fait simplement comme ceci au sein de notre Logic App:

- Identity app - PREVIEW p search (ctr/•n Versions API connections Quick start guides Release notes Workflow settings keys t Identity properties Locks System assigned (preview) A system assigned managed identity enables Azure all necessary permissions can be granted via Azure r Additionally, each resource (e.g. Virtual Machine) Refresh Status O Object ID O This resource is registered with Azure At

Notre Logic App possède désormais une identité que nous allons pouvoir utiliser pour lui assigner des droits, chose que nous allons faire afin de lui permettre de récupérer les clés de notre CosmosDB par API, pour se faire nous allons lui attribuer le rôle DocumentDB Account Contributor

T Äkdb001devweu - Access control (IAM) Azure Cosmos DB account + Add Edit columns p search Overview Activity log Access control (JAM) DOCUMENTDB ACCOUNT CONTRIBUTOR Tags .•.W•• LAOOIDEVWEU Diagnose and solve problems Quick start Remove DocumentDB Account . x This resource

On va ensuite créer une access policy afin de l’authoriser à créer / updater les secrets au sein de notre Key Vault:

Home > Keyvaults > Add access policy Add a new access policy Configure from template (optional) Select principal None selected Key permissions O selected Secret permissions 3 selected Select all Secret Operations V Get V Set Delete Recover Backup Privik--Fd Secret purge x Access policies > Principal Select a principal + Invite Select O Add access policy Principal x ..„V..ÄAOOIDEVWEU

Désormais notre Logic App sera capable à la fois de récupérer les clés puis de créer des secrets au sein de notre Key Vault.

L’étape de récupération des clés de notre CosmosDB se fera en utilisant les API de cette manière :

* Meth0d Headers Querjes * Authentication Add new parameter О https://management.azure.com,/subsciptions.• subscription1d Х /resourceGroups,• resourceGroupNarne Х /providers /MTosoft.DocumentDB/databaseAccoun ResourceName х Enter Кеу api-version Enter Кеу Enter request COrTter1t Мападесј [dentity Enter value 2015-04-08 Enter value ><

Nous allons ensuite parser le résultat afin de réutiliser les clés pour pouvoir créer nos secrets. :