¿Por qué tienes dos access keys para Azure Storage?

En más de una ocasión los desarrolladores no ven el sentido a tener dos claves para una cuenta de Azure Storage, cuando siempre utilizan la primera de ellas para sus desarrollos. Lo cierto es que he comprobado que la mayoría de las veces no se está siguiendo un mantenimiento de estas claves para mejorar la seguridad de la cuenta de almacenamiento.

Azure Storage - Manage Access Keys
Azure Storage – Manage Access Keys

La idea que se propone con este par de claves es tener siempre una de «repuesto» cuando regeneras una de ellas, para que no exista pérdida del servicio en ningún momento. El proceso de actualización en este caso podría ser el siguiente:

  1. Se usa la primera clave en tus aplicaciones.
  2. Cuando sea el momento de regenerar las claves, cambia la primera clave por la segunda en la configuración de los aplicativos que la estén utilizando.
  3. Regenera la clave principal y vuelve a cambiar la clave por la nueva generada.
  4. Regenera la segunda clave.

Este proceso puede ser fácilmente automatizado utilizando PowerShell:

Param(
[string]$StorageName,
[string]$WebAppName,
[string]$ConnectionStringName
)
 
#Get Azure Storage Account
 
$StorageAccount = Get-AzureAccount -Name $StorageName;
 
#Get Secondary Access Key
 
$SecondayAccessKey = (Get-AzureStorageKey -StorageAccountName $StorageName).Secondary;
 
Write-Output "Current Secondary Access Key: $SecondayAccessKey";
 
#Change Primary Access Key in my application to the Secondary Access Key
 
$MyWebSite = Get-AzureWebsite -Name $WebAppName;
 
$ConnectionStrings = (Get-AzureWebsite $WebAppName -Slot "production").ConnectionStrings;
 
$NewConnectionString = "DefaultEndpointsProtocol=https;AccountName=returngisstorage;AccountKey=" + $SecondayAccessKey;
 
$ConnectionStrings.Find({ param($m) $m.Name.Equals($ConnectionStringName) }).ConnectionString = $NewConnectionString;
 
#Update the connection string
 
Set-AzureWebsite $WebAppName -ConnectionStrings $ConnectionStrings;
 
Write-Output "Primary Access Key Replaced with Secondary Access Key";
 
#Regenerate Primary Access Key
 
$PrimaryAccessKey = (New-AzureStorageKey -StorageAccountName $StorageName -KeyType Primary).Primary;
 
Write-Output "Primary Access Key Regenerated: $PrimaryAccessKey";
 
#Change Secondary Access key to my new Primary Access Key
 
$NewConnectionString = "DefaultEndpointsProtocol=https;AccountName=returngisstorage;AccountKey=" + $PrimaryAccessKey;
 
$ConnectionStrings.Find({ param($m) $m.Name.Equals($ConnectionStringName) }).ConnectionString = $NewConnectionString;
 
#update the connection string
 
Set-AzureWebsite $WebAppName -ConnectionStrings $ConnectionStrings;
 
Write-Output "Secondary Access Key replaced with a new Primary Access Key";
 
#Regenerate Secondary Access Key
 
$SecondaryAccessKey = (New-AzureStorageKey -StorageAccountName $StorageName -KeyType Secondary).Secondary;
 
Write-Output "Secondary Access Key regenerated: $SecondayAccessKey";
 
Write-Output "Done";

Imagen por Victor Sá

¡Feliz Viernes!