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. :

Parse JSON * Content * Schema "properties": Body X "primaryMasterKey": { "type": "string" "pr ima ryReadon lyMa Ste rKey•• : "t e": "strinq"

Le Schema à utiliser est le suivant :

Il ne nous reste plus qu’à créer un secret ou à l’updater pour chacune des clés à savoir les 2 clés master (primaire et secondaire) puis les 2 clés Read Only

,.VV$001devweu - Keys 
Azure Cosmos DB account 
Search (Ctrl i n 
Read-write Keys 
Overview 
Read-only Keys

Pour se faire nous utiliserons encore une fois les API :

primaryMaster 
Method 
• IJRI 
Headers 
Queries 
* Authentication 
Audience 
Add new parameter 
https:/a KeyVaultName X -vault-azure.net/secrets/ 
ResourceName X -primaryMasterKey 
Enter key 
api-version 
Enter key 
Enter value 
7.0 
Enter value 
"contentType": "ACCESSS_KEV, 
"tags": { 
"updatedBy": 
caller x 
"value"' "n primaryMasterKey x " 
Managed Identity 
https://vault.azure.net 
x

Attention à bien configurer l’audience sans quoi vous aurez une erreur (https://vault.azure.net)

Dans mon cas je récupère la valeur “Caller” afin de la rentrer dans un tag nommé updatedBy afin de savoir quel utilisateur est à l’origine de la régénération de mes clés.

Vous n’avez plus qu’à répéter l’étape pour les autres clés :

—properties": 
"primarßastergey": 
"ty*•—: •st ring* 
"tyx•-: -string"

Voila pour mon Logic App, désormais voyons comment déclencher celle-ci à chaque régénération d’une de mes clés !

Pour se faire nous allons utiliser les alertes de la manière suivante, tout d’abord je vais créer une nouvelle alerte :

Home > Monitor • Alerts > Rules > 
Create rule 
Rules management 
Create rule 
RESOURCE 
All Azure Cosmos DB accounts 
Select 
HIERARCHY

Je vais ensuite sélectionner la condition suivante :

Home > Monitor - Alerts 
Create rule 
Rules management 
RESOURCE 
> Rules 
Create rule 
Configure signal logic 
Choose a signal below and configure the logic on the next screen to define the alert condition. 
All signals (70) 
S nal O 
Activity Log 
Search by sig;na,' name 
SIGNAL NAME 
All Administrative operations 
Read database account (databaseAccounts) 
Update database account (databaseAccount5) 
List keys (databaseAccounts) 
Read database account readonly keys (databaseAccOunts) 
Get Connection Strings (databaseAccounts) 
v 
All Azure Cosmos DB accounts 
Select 
CONDITION 
No condition defined, click on 'Add condition ' 
Add condition 
ACTION GROUPS 
Notify your team via email and text messages Or 
integrating with external ITSM solutions. Leam n 
Monitor service O 
All 
SIGNAL TYPE 
Activity Log 
Activity Log 
Activity Log 
Activity Log 
Activity Log 
Activity Log 
Activity Log

Configure signal logic 
Back to signal selection 
Rotate keys (databaseAccounts) 
Chart period 
Over the last 6 hours 
Alert logic 
Event Level O 
Informational 
Condition preview 
x 
V 
No data to display 
Status O 
Succeeded 
Event initiated by O 
Whenever the Administrative Activity Log "Rotate keys (databaseAcCOunts) • has •informationar level, with "succeeded" Status and event is initiated by "any"

On créé ensuite un action group :

CONDITION 
Whenever the Administrative Activiw Log "Rotate keys (databaseAcco... 
Add condition 
We currently support configuring only two metrics signals or one log search signal or one activity log signal 
per alert rule. An alert will be triggered when the conditions for all the above configured criteria are met 
ACTION GROUPS 
NOW your team via email and text messages or automate actions using webhooks, runbooks, f'nctions, logic apps or 
integrating With external ITSM solutions. Learn more here 
ACTION GROW NAME 
NO action group selected 
Select existing 
ACTION GROUP TYPE 
Create New

Home > Monitor • Alerts > Rules 
x 
Add action group 
> Create rule 
> Add action group 
LogicApp 
Edit details 
x 
Action group name 0 CosmosDB_Rotation 
Short narne O 
Subscription O 
Resource group O 
Actions 
LAOOI 
Cosmos DB 
Default-ActiviwLogAIerts (to be created) 
STATUS 
LogicApp 
LogicApp 
Subscription 
Resource group 
VI'....RGOOODEVWELJ 
Choose your Logic-App HO 
to create a 
i CA 
Unique name for the ac.__ 
Privacy Statement 
Pricing

Il ne reste plus qu’à entrer un nom et une description :

ALERT DETAILS 
Alert rule name O 
COS mosDB_R0tation 
Description 
Detect the CosmosDB Rotation. 
Save alert to resource group O 
Enable rule upon creation 
No

Vous pouvez ensuite tester le déclenchement an régénérant une des clés :

- Keys 
Azure Cosmos DB account 
p search (ctrl") 
x 
Overview 
Activity log 
Access control (IAM) 
Tags 
Diagnose and solve problems 
Quick start 
Notifications 
Read-write Keys 
URI 
PRIMARY KEY 
SECONDARY KEY 
Read-only Keys 
NtxZ15sRiLoL1 NVcGZOWueR 1 sJwr

L’alerte est déclenchée :

Home > Monitor • Alerts > All Alerts 
All Alerts 
New alert rule 
— Edit columns 
Manage alert rules 
Don •t see a subscription? 
View classic alerts 
Refresh 
Subscription O 
Monitor service O 
14 selected 
Resource group O 
Fype to start fiftering 
Monitor condition O 
2 selected 
Resource type 
o 
C selected 
Severity O 
Sev 4 
All Alerts 
Alerts By Smart Group (Preview) 
TO view Status Of alerts configured through Alerts (classic), dick on •View classic alerts". 
Search within displayed alerts 
Change state 
Resource 
o 
Alert state O 
3 selected 
MONITOR saVICE 
LAST MODIFIED Tm 
3/5/2019, PM 
Time range O 
Past 7 days 
Smart group id O 
Smart group id 
Log 
x 
MONITOR CON Dim 
Fired 
STATE 
New 
TARGET REOURCE 
NLAOOIDE...

Puis déclenche la Logic App :

Runs history 
Specify the run identifier to open monitor view directly 
Pick a date 
STATUS 
Succeeded 
START TIME 
05/03/2019 1&26 
•••—••±u103 
Pick a time 
DURATION 
I .27 Seconds

ö 
owewneAÅay 
eweroa•nosau 
S! FonböJ dLLH e 
uny pue) uwqnsau 
unu 
uru dde

Il ne nous reste plus qu’a valider que les secrets soient bien au sein de notre Key Vault :

- Secrets 
Key vault 
p search 
(t) Overview 
Activity log 
Access control (IAM) 
Tags 
Diagnose and solve problems 
Keys 
Secrets 
Generate/lmport 
Restore Backup 
-prim aryMasterKey 
-p rim OnlyMast„ . 
-second aryMasterKey 
EXARAT'ON DATE 
ACCESSS_KEY Enabled 
ACCESSS_KEY Enabled 
ACCESSS_KEY Enabled 
ACCESSS_KEY Enabled

Voila vous n’avez désormais plus qu’à faire référence à un de ces secrets plutôt que d’utiliser la clé en dur pour vos appels à CosmosDB.

Vous pouvez également tout en vous basant sur cette exemple imaginer une solution d’auto régénération des clés !

Pin It on Pinterest