person Tia Zanella
calendar_add_on Created April 5, 2026
update Updated April 26, 2026
Share
download Download MD

Producteur OSIRIS JSON pour Microsoft Azure

Le producteur Azure d’OSIRIS JSON se connecte à Microsoft Azure via la Azure CLI (az) et génère des instantanés OSIRIS JSON de la topologie de vos abonnements. À partir de v0.4.0, le producteur couvre les couches réseau, calcul, stockage, identité, bases de données, conteneurs, intégration, observabilité et sauvegarde, y compris leurs arêtes de dépendance inter-ressources (Private Endpoint vers des cibles PaaS, App Service vers App Insights, Log Analytics, RSV, Backup Vault vers des éléments protégés, AKS vers des sous-réseaux et des pools de nœuds, etc.).

Pour commencer à utiliser OSIRIS JSON avec Microsoft Azure, installez le répartiteur principal et le producteur OSIRIS JSON pour Microsoft Azure :

go install go.osirisjson.org/producers/cmd/osirisjson-producer@latest
go install go.osirisjson.org/producers/cmd/osirisjson-producer-azure@latest

Le répartiteur principal vous permet d’exécuter osirisjson-producer azure .... Sans lui, invoquez directement le binaire du fournisseur sous la forme osirisjson-producer-azure ....

Assurez-vous que $GOPATH/bin (ou $HOME/go/bin) figure dans votre PATH. Consultez la page getting started pour plus d’options d’installation.

Prérequis

  1. Installez la Azure CLI
  2. Authentifiez-vous : az login
  3. L’utilisateur authentifié doit disposer du rôle Reader (ou d’une autorisation de lecture équivalente) sur le ou les abonnements cibles. Pour une collecte complète des données, y compris les routes effectives, l’utilisateur doit également disposer de l’autorisation Microsoft.Network/networkInterfaces/effectiveRouteTable/action (incluse dans Network Contributor et au-delà). Si cette autorisation est absente, le producteur ignore la collecte des routes effectives avec un journal INFO et continue normalement.

Vous pouvez exécuter le producteur sur votre machine locale ou l’invoquer via une tâche planifiée avec un compte de service sur la plateforme de votre choix.

Utilisation de la CLI

osirisjson-producer azure [flags]
osirisjson-producer azure template --generate

Mode unique

Commencez par collecter un abonnement, qui sera automatiquement enregistré sous microsoft-azure-<timestamp>-<name>.json :

osirisjson-producer azure -S a1b2c3d4-e5f6-7890-abcd-ef1234567890

Mode interactif

Exécutez sans flags pour obtenir un sélecteur interactif d’abonnements :

osirisjson-producer azure

Le producteur détecte tous les abonnements accessibles et présente une liste numérotée. Sélectionnez avec des numéros individuels (1,3,5), des plages (30-55), des combinaisons (1,3,30-55) ou saisissez all.

Mode multi-abonnement

Collectez plusieurs abonnements dans un répertoire de sortie :

# Abonnements spécifiques
osirisjson-producer azure -S sub-id-1,sub-id-2,sub-id-3 -o ./output

# Tous les abonnements accessibles (détection automatique)
osirisjson-producer azure --all -o ./output

# Tous les abonnements d'un tenant spécifique
osirisjson-producer azure --all --tenant f1e2d3c4-b5a6-9078-fedc-ba9876543210 -o ./output

Mode batch (CSV)

Générez un modèle CSV :

osirisjson-producer azure template --generate

Collectez à partir d’un fichier CSV :

osirisjson-producer azure -s subscriptions.csv -o ./output

Le modèle CSV utilise les colonnes suivantes :

ColonneRequiseDescription
subscription_idouiUUID de l’abonnement Azure
subscription_nameouiLibellé lisible par un humain (utilisé comme nom de fichier de sortie)
tenant_idUUID du tenant Azure AD / Entra ID
environmentÉtape de déploiement : dv, np, pr (développement, préproduction, production)
regionFiltre sur une région Azure (vide = toutes les régions)
notesNotes en texte libre (ignorées par le producteur)

Hiérarchie de sortie

Mode unique : enregistre dans microsoft-azure-<timestamp>-<name>.json dans le répertoire courant.

Modes multi/batch/all : organisés par tenant et horodatage :

output/
  <TenantID>/
    <timestamp>/
      <SubscriptionName>.json

Chaque abonnement produit un document OSIRIS autonome. Les références inter-abonnements (par exemple les VNet peerings ou les connexions ExpressRoute vers des abonnements distants) sont émises comme des ressources factices avec provider.subscription défini sur l’ID de l’abonnement distant, afin que l’arête topologique survive à cette frontière tout en conservant un document valide.

Environnements multi-tenant

Exécutez le producteur une fois par tenant. Chaque az login s’authentifie auprès d’un tenant. Utilisez az login --tenant <tenant-id> pour basculer. La hiérarchie de sortie regroupe automatiquement les documents par tenant.

Référence des flags

FlagCourtDescription
--subscription-SID du ou des abonnements Azure, séparés par des virgules
--allDétecte automatiquement tous les abonnements accessibles
--source-sFichier CSV avec les abonnements cibles
--output-oRépertoire de sortie (obligatoire pour les modes multi/all/CSV)
--tenantID du tenant Azure AD / Entra ID (facultatif)
--regionFiltre sur une région Azure spécifique (facultatif)
--purposeNiveau de détail de la sortie : documentation (par défaut) ou audit. Voir finalité ci-dessous
--safe-failure-modeGestion des secrets : fail-closed (par défaut), log-and-redact, off
--version / -vAffiche la version et quitte
--helpAffiche l’aide et quitte

Finalité

Le flag --purpose implémente le chapitre 13.1.3 de la spécification OSIRIS JSON (minimisation des données). La collecte est toujours exhaustive ; l’émission est façonnée par la finalité déclarée, afin qu’une même exécution du producteur puisse répondre aussi bien à des cas d’usage de visualisation légère qu’à des cas d’usage d’audit / conformité.

ValeurComportement
documentation (par défaut)Champs minimaux : identité, type, traçabilité du fournisseur, noms, tags et relations de haut niveau. Les objets properties et extensions par ressource sont supprimés. Adapté aux diagrammes, tableaux de bord d’inventaire et documentation de haut niveau.
auditTous les champs lisibles, après masquage des champs sensibles. Objets properties et extensions complets pour chaque ressource, connexion et groupe. Adapté aux revues de conformité, audits, dérive de configuration ou documentation approfondie et conception topologique précise.

La valeur sélectionnée est enregistrée dans le document sous metadata.scope.purpose, afin que les consommateurs puissent savoir quel niveau de détail ils consultent.

[!IMPORTANT] Les secrets sont toujours masqués, quelle que soit la finalité. La projection d’audit ajoute des détails (adresses IP, règles NSG, sous-champs SKU, détails BGP, etc.) ; elle n’ajoute jamais d’éléments d’authentification. Les mots de passe administrateur de base de données, les clés d’accès Cosmos / Redis / Service Bus / Event Hubs, les clés d’instrumentation App Insights et les clés partagées Log Analytics ne sont jamais collectés.

# Par défaut : documentation (projection minimale)
osirisjson-producer azure -S a1b2c3d4-e5f6-7890-abcd-ef1234567890

# Audit : fidélité ARM complète
osirisjson-producer azure -S a1b2c3d4-e5f6-7890-abcd-ef1234567890 --purpose audit

Ce que collecte le producteur OSIRIS JSON pour Microsoft Azure

Le producteur OSIRIS JSON pour Microsoft Azure collecte un inventaire complet des types de ressources pris en charge via la Azure CLI à chaque exécution. Le tableau suivant regroupe les éléments interrogés.

Réseau

Ressource Microsoft AzureType OSIRIS JSON
Virtual Networksnetwork.vpc
Subnetsnetwork.subnet
Network Interfacesnetwork.interface
Network Security Groupsnetwork.security.group
Application Security Groupsosiris.azure.asg
Route Tablesosiris.azure.routetable
Public IP Addressesosiris.azure.publicip
Load Balancers (L4)network.loadbalancer
Application Gateways (L7)network.loadbalancer
Azure Firewallsnetwork.firewall
NAT Gatewaysosiris.azure.gateway.nat
VNet Gateways (VPN / ExpressRoute)osiris.azure.gateway.vnet
ExpressRoute Circuitsosiris.azure.expressroute
Private Endpointsosiris.azure.privateendpoint
DNS Zonesosiris.azure.dns.zone
Private DNS Zonesosiris.azure.dns.privatezone

Calcul et stockage

Ressource Microsoft AzureType OSIRIS JSON
Virtual Machinescompute.vm
Managed Disksosiris.azure.disk
Managed Snapshotsosiris.azure.snapshot
Storage Accountsosiris.azure.storageaccount

App Service / couche web

Ressource Microsoft AzureType OSIRIS JSON
App Service Planosiris.azure.appserviceplan
Web Apposiris.azure.webapp
Function Apposiris.azure.functionapp

Routage App Service : les sites dont kind contient functionapp sont émis comme osiris.azure.functionapp ; tous les autres sites sont émis comme osiris.azure.webapp.

Identité et sécurité

Ressource Microsoft AzureType OSIRIS JSON
Key Vaultosiris.azure.keyvault
Container Registryosiris.azure.containerregistry
User-Assigned Managed Identityosiris.azure.managedidentity

Sauvegarde et reprise après sinistre

Ressource Microsoft AzureType OSIRIS JSON
Recovery Services Vaultosiris.azure.recoveryvault
Backup Vault (Azure Backup)osiris.azure.backupvault

Bases de données

Ressource Microsoft AzureType OSIRIS JSON
SQL Serverosiris.azure.sqlserver
SQL Databaseosiris.azure.sqldatabase
PostgreSQL Flexible Serverosiris.azure.postgresqlserver
MySQL Flexible Serverosiris.azure.mysqlserver
Cosmos DB accountosiris.azure.cosmosaccount
Redis Cacheosiris.azure.redis

Conteneurs et intégration

Ressource Microsoft AzureType OSIRIS JSON
AKS Clusterosiris.azure.aks.cluster
AKS Agent Poolosiris.azure.aks.nodepool
Container App Managed Environmentosiris.azure.containerapp.environment
Container Apposiris.azure.containerapp
Container Group / ACIosiris.azure.containergroup
Service Bus Namespaceosiris.azure.servicebus.namespace
Event Hubs Namespaceosiris.azure.eventhubs.namespace
API Management Serviceosiris.azure.apim
Front Door (Standard / Premium)osiris.azure.frontdoor.profile

Observabilité

Ressource Microsoft AzureType OSIRIS JSON
Application Insightsosiris.azure.applicationinsights
Log Analytics Workspaceosiris.azure.loganalytics

Regroupement

Ressource Microsoft AzureType OSIRIS JSON
Groupes de ressourcescontainer.resourcegroup

Ce qui n’est volontairement pas collecté

OSIRIS JSON définit un format JSON neutre vis-à-vis des fournisseurs pour décrire les ressources d’infrastructure, leurs propriétés et leurs relations topologiques ; ce n’est pas un format d’Infrastructure-as-Code ni un format similaire. Vous pouvez en lire davantage ici : Qu’est-ce qu’OSIRIS JSON. Les éléments suivants sont volontairement hors périmètre :

  • Politique de supervision : alert rules, action groups, metric alerts, scheduled query rules.
  • Politiques de sauvegarde / rétention dans Recovery Services Vault et Backup Vault (les vaults et les arêtes vers les éléments protégés sont émis ; les corps de politique ne le sont pas).
  • Politique de couche base de données : SQL auditing, threat-detection, TDE, firewall rules, security-alert-policy.
  • Politiques, produits, opérations et named values d’API Management.
  • Routes Front Door, rule sets, endpoints et associations de politiques WAF (le profil est émis ; le routage ne l’est pas).
  • Secrets de Container App et variables d’environnement ACI.
  • Énumération des diagnostic settings par ressource (cela ajouterait un appel az par ressource).
  • Azure Front Door classique (Microsoft.Network/frontDoors, obsolète).
  • Microsoft.DBforPostgreSQL/servers historique (serveur unique, en fin de vie sur la feuille de route Azure).

Structure de sortie OSIRIS JSON pour Microsoft Azure

{
  "$schema": "https://osirisjson.org/schema/v1.0/osiris.schema.json",
  "version": "1.0.0",
  "metadata": {
    "generator": {
      "name": "osirisjson-producer-azure",
      "version": "0.4.0",
      "url": "https://osirisjson.org"
    },
    "scope": {
      "name": "<subscription-id> - <subscription-name>",
      "purpose": "documentation",
      "providers": ["azure"],
      "accounts": ["<tenant-id>"],
      "subscriptions": ["<subscription-id>"],
      "regions": ["westeurope", "eastus2"]
    }
  },
  "topology": {
    "resources": [ ... ],
    "connections": [ ... ],
    "groups": [ ... ]
  }
}

Types de connexion

Les arêtes de connexion utilisent les sous-types standard OSIRIS JSON v1.0 conformément au chapitre 5.2.3 de la spécification, afin que les consommateurs puissent distinguer les couches topologiques.

Type de connexion OSIRIS JSONUtilisé pour
containsContenance (sous-réseau au sein du VNet, App Service Plan au sein du site, cluster AKS au sein du pool de nœuds, groupe de ressources au sein de l’abonnement, SQL Server au sein de SQL Database, disque source au sein d’un snapshot, VM au sein du disque attaché)
networkConnectivité réseau générique (NIC vers un sous-réseau, associations NSG, liens DNS, connexions de passerelle, App Insights vers un espace de travail, Web App vers App Insights, AKS / Redis / ACI vers un sous-réseau, APIM vers un sous-réseau)
network.peeringPeerings VNet
network.vpnConnexions de passerelle VPN
network.bgpConnexions de circuit ExpressRoute
dependencyPrivate Endpoint vers une cible PaaS (Web App, Function App, Key Vault, Container Registry, Recovery Services Vault, cluster AKS, Service Bus, Event Hubs, APIM)
dependency.storagePrivate Endpoint vers Storage Account
dependency.databasePrivate Endpoint vers une base de données (SQL Server, Cosmos DB, Redis)

Types de groupe

Type de groupe OSIRIS JSONUtilisé pour
logical.subscriptionGroupe d’abonnement de niveau supérieur
logical.resourcegroupGroupes de groupes de ressources (enfants de l’abonnement)
container.regionUn groupe par provider.region distinct observé dans l’abonnement, incluant chaque ressource de cette région. La région global et les ressources sans région sont ignorées (elles ne sont pas géographiquement délimitées). Le jeton de délimitation est <subscription-id>/<region>, afin que les groupes n’entrent jamais en collision entre abonnements.

Types de ressource

Les types de ressource suivent la spécification OSIRIS JSON v1.0. Les types standard sont utilisés lorsqu’ils sont définis ; les types spécifiques à Azure utilisent l’espace de noms osiris.azure.*.

Types standard :

  • container.resourcegroup - Groupes de ressources
  • network.vpc - Réseaux virtuels
  • network.subnet - Sous-réseaux
  • network.interface - Interfaces réseau
  • network.security.group - Groupes de sécurité réseau
  • network.loadbalancer - Équilibreurs de charge (L4 et L7 / Application Gateway)
  • network.firewall - Azure Firewalls
  • compute.vm - Machines virtuelles

Extensions (osiris.azure)

Les données spécifiques à Azure qui ne correspondent pas à des propriétés OSIRIS JSON portables sont émises dans l’espace de noms d’extension osiris.azure. Cela suit la spécification OSIRIS JSON : properties contient les données communes / portables, extensions contient les données détaillées spécifiques au fournisseur. Les extensions ne sont émises qu’avec --purpose audit.

Les extensions représentatives comprennent :

Type de ressource OSIRIS JSONChamps d’extension sélectionnés
network.interfaceenable_accelerated_networking, effective_routes[]
network.security.groupsecurity_rules[], default_security_rules[]
osiris.azure.expressroutesku, sku_tier, service_provider, peerings[] (type de peering BGP, état, ASN du pair, ID VLAN, préfixes d’adresses)
osiris.azure.webapp / osiris.azure.functionappmanaged_identity, outbound_vnet_routing, private_endpoint_connection_ids[], app_insights_id
osiris.azure.storageaccount / osiris.azure.keyvault / osiris.azure.containerregistry / osiris.azure.recoveryvault / osiris.azure.sqlserver / osiris.azure.cosmosaccountprivate_endpoint_connection_ids[]
osiris.azure.applicationinsightsworkspace_resource_id (espace de travail Log Analytics associé)
osiris.azure.loganalyticscustomer_id (UUID de l’espace de travail utilisé par KQL ; ce n’est pas un secret)

Métadonnées du fournisseur

Chaque ressource inclut provider.type avec le type de ressource ARM natif (par exemple Microsoft.Network/virtualNetworks, Microsoft.Compute/virtualMachines). Les ressources factices inter-abonnements incluent provider.subscription avec l’ID de l’abonnement distant. Toutes les ressources incluent provider.source défini sur azure-cli.

ID de ressource

Les ID de ressource Azure suivent le modèle azure::<ARM-resource-id>, en utilisant l’ID de ressource ARM complet comme identifiant natif. Cela garantit des ID globalement uniques et déterministes qui résistent à la corrélation inter-abonnements.

Canonicalisation des régions

provider.region et metadata.scope.regions sont canonicalisés vers le format slug d’Azure (minuscules, sans espaces). La CLI az renvoie location de manière incohérente selon les types de ressource : la plupart des ressources ARM utilisent westeurope / eastus2, tandis que les App Service Plans et Web Apps exposent la forme d’affichage (West Europe). Le producteur normalise vers le slug afin qu’un abonnement mono-région n’apparaisse pas comme deux régions dans metadata.scope.regions.

Exigences RBAC

Niveau d’autorisationCe qui est collecté
ReaderTous les types de ressource, propriétés et extensions (règles NSG, peerings ER, connexions gateway, VNet peerings, liens DNS, arêtes Private Endpoint vers des cibles, App Service vers App Insights, ressources AKS, conteneurs, bases de données, messagerie et observabilité)
Reader + effectiveRouteTable/actionTout ce qui précède + routes effectives de la NIC
Network Contributor / OwnerJeu de données complet sans restriction

Le producteur teste l’autorisation sur la première NIC et ignore proprement la collecte des routes effectives si l’autorisation est refusée. Toutes les autres données sont collectées dans tous les cas.

Exemples

Abonnement unique

Nous allons explorer un abonnement unique dans notre tenant et générer depuis Microsoft Azure un document OSIRIS JSON.

osirisjson-producer azure -S a1b2c3d4-e5f6-7890-abcd-ef1234567890 --purpose audit

Document de sortie OSIRIS JSON (tronqué, --purpose audit) :

{
  "$schema": "https://osirisjson.org/schema/v1.0/osiris.schema.json",
  "version": "1.0.0",
  "metadata": {
    "generator": {
      "name": "osirisjson-producer-azure",
      "version": "0.4.0",
      "url": "https://osirisjson.org"
    },
    "scope": {
      "name": "a1b2c3d4-e5f6-7890-abcd-ef1234567890 - my-nonprod-subscription",
      "purpose": "audit",
      "providers": ["azure"],
      "accounts": ["f1e2d3c4-b5a6-9078-fedc-ba9876543210"],
      "subscriptions": ["a1b2c3d4-e5f6-7890-abcd-ef1234567890"],
      "regions": ["westeurope"]
    }
  },
  "topology": {
    "resources": [
      {
        "id": "azure::/subscriptions/a1b2c3d4/resourceGroups/network-rg/providers/Microsoft.Network/virtualNetworks/hub-vnet",
        "type": "network.vpc",
        "name": "hub-vnet",
        "status": "active",
        "provider": {
          "name": "azure",
          "native_id": "/subscriptions/a1b2c3d4/resourceGroups/network-rg/providers/Microsoft.Network/virtualNetworks/hub-vnet",
          "type": "Microsoft.Network/virtualNetworks",
          "region": "westeurope",
          "source": "azure-cli",
          "subscription": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
          "tenant": "f1e2d3c4-b5a6-9078-fedc-ba9876543210"
        },
        "properties": {
          "resource_group": "network-rg",
          "address_space": ["10.0.0.0/16"],
          "dns_servers": ["10.0.0.4"],
          "subnet_count": 4,
          "enable_ddos_protection": false,
          "peerings": [
            {
              "name": "hub-to-spoke",
              "peering_state": "Connected",
              "remote_vnet_id": "/subscriptions/a1b2c3d4/.../spoke-vnet",
              "allow_gateway_transit": true,
              "allow_forwarded_traffic": true
            }
          ]
        }
      },
      {
        "id": "azure::/subscriptions/a1b2c3d4/resourceGroups/data-rg/providers/Microsoft.Storage/storageAccounts/mystg",
        "type": "osiris.azure.storageaccount",
        "name": "mystg",
        "status": "active",
        "provider": {
          "name": "azure",
          "native_id": "/subscriptions/a1b2c3d4/resourceGroups/data-rg/providers/Microsoft.Storage/storageAccounts/mystg",
          "type": "Microsoft.Storage/storageAccounts",
          "region": "westeurope",
          "source": "azure-cli",
          "subscription": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
          "tenant": "f1e2d3c4-b5a6-9078-fedc-ba9876543210"
        },
        "properties": {
          "resource_group": "data-rg",
          "sku_tier": "Standard",
          "sku_name": "Standard_LRS",
          "kind": "StorageV2",
          "access_tier": "Hot",
          "https_only": true,
          "min_tls_version": "TLS1_2",
          "public_network_access": "Disabled",
          "allow_blob_public_access": false
        },
        "extensions": {
          "osiris.azure": {
            "private_endpoint_connection_ids": [
              "/subscriptions/a1b2c3d4/.../privateEndpoints/pe-mystg"
            ]
          }
        }
      }
    ],
    "connections": [
      {
        "source": "azure::/subscriptions/a1b2c3d4/.../subnets/default",
        "target": "azure::/subscriptions/a1b2c3d4/.../virtualNetworks/hub-vnet",
        "type": "contains",
        "direction": "forward"
      },
      {
        "source": "azure::/subscriptions/a1b2c3d4/.../privateEndpoints/pe-mystg",
        "target": "azure::/subscriptions/a1b2c3d4/.../storageAccounts/mystg",
        "type": "dependency.storage",
        "direction": "forward"
      }
    ],
    "groups": [
      {
        "id": "azure::subscription::a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "type": "logical.subscription",
        "name": "my-nonprod-subscription",
        "children": [
          "azure::resourcegroup::network-rg",
          "azure::resourcegroup::data-rg"
        ]
      },
      {
        "id": "azure::region::a1b2c3d4-e5f6-7890-abcd-ef1234567890/westeurope",
        "type": "container.region",
        "name": "westeurope",
        "members": [
          "azure::/subscriptions/a1b2c3d4/.../virtualNetworks/hub-vnet",
          "azure::/subscriptions/a1b2c3d4/.../storageAccounts/mystg"
        ]
      }
    ]
  }
}

La même exécution avec la valeur par défaut --purpose documentation renvoie un graphe de ressources identique, mais avec les objets properties et extensions supprimés de chaque ressource, connexion et groupe, ce qui le rend adapté aux vues topologiques de haut niveau et à la documentation.

edit_note

Help improve this page

Found an issue or want to contribute? Open an issue.