Azure Storage Accounts sont des services fondamentaux de Microsoft Azure qui fournissent un stockage cloud évolutif, sécurisé et hautement disponible pour différents types de données, y compris blobs (binary large objects), files, queues et tables. Ils servent de conteneurs regroupant ces différents services de stockage sous un même namespace pour une gestion simplifiée.
Principales options de configuration :
Chaque storage account doit avoir un nom unique dans tout Azure.
Chaque storage account est déployé dans une région ou dans une zone étendue Azure.
Il est possible de sélectionner la version premium du storage account pour de meilleures performances.
Il est possible de choisir parmi 4 types de redondance pour se protéger contre les pannes de rack, disque et datacenter.
Options de configuration de sécurité :
Require secure transfer for REST API operations : Exiger TLS pour toute communication avec le storage.
Allows enabling anonymous access on individual containers : Sinon, il ne sera pas possible d’activer l’accès anonyme ultérieurement.
Enable storage account key access : Sinon, l’accès avec Shared Keys sera interdit.
Minimum TLS version
Permitted scope for copy operations : Autoriser depuis n’importe quel storage account, depuis n’importe quel storage account du même tenant Entra ou depuis des storage account avec private endpoints dans le même virtual network.
Blob Storage options :
Allow cross-tenant replication
Access tier : Hot (données fréquemment consultées), Cool et Cold (données rarement consultées)
Options réseau :
Network access :
Allow from all networks
Allow from selected virtual networks and IP addresses
Disable public access and use private access
Private endpoints : Permet une connexion privée au storage account depuis un virtual network
Options de protection des données :
Point-in-time restore for containers : Permet de restaurer des containers à un état antérieur.
Cela nécessite l’activation de versioning, change feed, et blob soft delete.
Enable soft delete for blobs : Active une période de rétention en jours pour les blobs supprimés (même écrasés).
Enable soft delete for containers : Active une période de rétention en jours pour les containers supprimés.
Enable soft delete for file shares : Active une période de rétention en jours pour les file shares supprimés.
Enable versioning for blobs : Conserve les versions précédentes de vos blobs.
Enable blob change feed : Conserve des logs de création, modification et suppression des blobs.
Enable version-level immutability support : Permet de définir une politique de rétention temporelle au niveau du compte qui s’appliquera à toutes les versions de blobs.
Version-level immutability support et point-in-time restore for containers ne peuvent pas être activés simultanément.
Options de chiffrement :
Encryption type : Il est possible d’utiliser Microsoft-managed keys (MMK) ou Customer-managed keys (CMK).
Enable infrastructure encryption : Permet de chiffrer doublement les données “pour plus de sécurité”.
Static websites sont servies depuis le container spécial $web via un endpoint spécifique à la région, par exemple https://<account>.z13.web.core.windows.net/.
Le container $web peut renvoyer publicAccess: null via l’API blob, mais les fichiers restent accessibles via l’endpoint du site statique, donc déposer des artefacts de config/IaC là-bas peut leak des secrets.
Flux de travail d’audit rapide:
# Identify storage accounts with static website hosting enabled
az storage blob service-properties show --account-name <acc-name> --auth-mode login
# Enumerate containers (including $web) and their public flags
az storage container list --account-name <acc-name> --auth-mode login
# List files served by the static site even when publicAccess is null
az storage blob list --container-name '$web' --account-name <acc-name> --auth-mode login
# Pull suspicious files directly (e.g., IaC tfvars containing secrets/SAS)
az storage blob download -c '$web' --name iac/terraform.tfvars --file /dev/stdout --account-name <acc-name> --auth-mode login
Localisez les storage accounts pouvant exposer des données : az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'. Si allowBlobPublicAccess est false vous ne pouvez pas rendre les containers publics.
Inspectez les comptes risqués pour confirmer le flag et d’autres paramètres faibles : az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'.
Énumérez l’exposition au niveau du container lorsque le flag est activé:
az storage container list --account-name <acc> \
--query '[].{name:name, access:properties.publicAccess}'
"Blob": accès en lecture anonyme autorisé uniquement lorsque le nom du blob est connu (sans possibilité de lister).
"Container": liste + lecture anonymes de chaque blob.
null: privé ; authentification requise.
Prouver l’accès sans identifiants :
Si publicAccess est Container, le listing anonyme fonctionne : curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list".
Pour Blob et Container, le téléchargement anonyme d’un blob fonctionne lorsque son nom est connu :
az storage blob download -c <container> -n <blob> --account-name <acc> --file /dev/stdout
# or via raw HTTP
curl "https://<acc>.blob.core.windows.net/<container>/<blob>"
Il est possible de générer des Shared Keys signées avec les clés d’accès pour autoriser l’accès à certaines ressources via une URL signée.
Note
Notez que la partie CanonicalizedResource représente la ressource du service de stockage (URI). Et si une partie de l’URL est encodée, elle doit également être encodée à l’intérieur de la CanonicalizedResource.
Note
Ceci est utilisé par défaut par az cli pour authentifier les requêtes. Pour qu’il utilise les identifiants du principal Entra ID, précisez le paramètre --auth-mode login.
Il est possible de générer une shared key for blob, queue and file services en signant les informations suivantes :
Les Shared Access Signatures (SAS) sont des URL sécurisées et limitées dans le temps qui accordent des autorisations spécifiques d’accès aux ressources dans un compte Azure Storage sans exposer les clés d’accès du compte. Alors que les clés d’accès fournissent un accès administratif complet à toutes les ressources, les SAS permettent un contrôle granulaire en spécifiant des permissions (comme lecture ou écriture) et en définissant une date d’expiration.
User delegation SAS : Ceci est créé à partir d’un principal Entra ID qui signera le SAS et délèguera les permissions de l’utilisateur au SAS. Il ne peut être utilisé qu’avec blob and data lake storage (docs). Il est possible de révoquer tous les SAS délégués générés.
Même s’il est possible de générer un User delegation SAS avec des permissions « plus » que celles de l’utilisateur. Cependant, si le principal ne les possède pas, cela ne fonctionnera pas (pas de privesc).
Service SAS : Celui-ci est signé en utilisant l’une des clés d’accès du compte de stockage. Il peut être utilisé pour accorder l’accès à des ressources spécifiques dans un seul service de stockage. Si la clé est renouvelée, le SAS cessera de fonctionner.
Account SAS : Il est aussi signé avec l’une des clés d’accès du compte de stockage. Il accorde l’accès aux ressources à travers les services d’un compte de stockage (Blob, Queue, Table, File) et peut inclure des opérations au niveau du service.
Une URL SAS signée par une clé d’accès ressemble à ceci:
Lors de la génération d’un SAS, il est nécessaire d’indiquer les permissions qu’il doit accorder. Selon l’objet sur lequel le SAS est généré, différentes permissions peuvent être incluses. Par exemple :
Azure Blob Storage supporte désormais le SSH File Transfer Protocol (SFTP), permettant le transfert et la gestion sécurisés de fichiers directement vers Blob Storage sans nécessiter de solutions personnalisées ou de produits tiers.
Protocol Support : SFTP fonctionne avec les comptes Blob Storage configurés avec hierarchical namespace (HNS). Cela organise les blobs en répertoires et sous-répertoires pour une navigation facilitée.
Security : SFTP utilise des identités d’utilisateurs locaux pour l’authentification et ne s’intègre pas à RBAC ou ABAC. Chaque utilisateur local peut s’authentifier via :
Azure-generated passwords
Public-private SSH key pairs
Granular Permissions : Des permissions telles que Read, Write, Delete et List peuvent être assignées aux utilisateurs locaux pour jusqu’à 100 containers.
Networking Considerations : Les connexions SFTP s’effectuent via le port 22. Azure prend en charge des configurations réseau comme les firewalls, private endpoints ou virtual networks pour sécuriser le trafic SFTP.
Hierarchical Namespace : HNS doit être activé lors de la création du compte de stockage.
Supported Encryption : Nécessite des algorithmes cryptographiques approuvés par Microsoft Security Development Lifecycle (SDL) (ex. rsa-sha2-256, ecdsa-sha2-nistp256).
SFTP Configuration :
Enable SFTP on the storage account.
Create local user identities with appropriate permissions.
Configure home directories for users to define their starting location within the container.
az storage blob show –account-name –container-name –sas-token ‘se=2024-12-31T23%3A59%3A00Z&sp=racwdxyltfmei&sv=2022-11-02&sr=c&sig=ym%2Bu%2BQp5qqrPotIK5/rrm7EMMxZRwF/hMWLfK1VWy6E%3D’ –name ‘asd.txt’