Skip to content

Commit bfeff33

Browse files
robgrameCopilot
andcommitted
docs: Phase 3 sealing pipeline closed (Azure consumer + Entra scan)
ENCRYPTION-BRIEFING.md sec 11.2 + summary banner now reflect that the `Functions/Triggers/SealedBatchConsumerFunction` and `Functions/Triggers/EntraScanFunction` are implemented, deployed, and verified on dev3 (commit 3c53d39): `az functionapp function list` reports both functions, App Insights shows zero startup exceptions. The two residual blockers are operational, not code: - HybridAgent producer needs `appsettings.json` populated on-prem (KV URI + SealedBatch SB FQDN) and its SP assigned as `hybridAgentPrincipalId` in `main.bicep` so it gets the `encrypt`-only role on `blkmon-agent-seal` and the Sender role on queue `dek-sealed-batches`. - Microsoft Graph application permissions (`Device.Read.All` + `BitlockerKey.ReadBasic.All`) on `mi-func` require admin consent in the tenant before `EntraScan` returns data. AZURE-PHASE3-ROADMAP.md gets a status banner up top + table rows updated. ENCRYPTION-BRIEFING.pdf regenerated from the new source. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 3c53d39 commit bfeff33

3 files changed

Lines changed: 43 additions & 25 deletions

File tree

docs/AZURE-PHASE3-ROADMAP.md

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,19 @@
11
# Azure Phase 3 — Roadmap di completamento
22

3+
> **STATO AL 2026-06-09 (post-implementazione): ✅ chiusa lato cloud.**
4+
> La pipeline `HybridAgent producer → Service Bus → SealedBatchConsumerFunction → Azure SQL`
5+
> e la `EntraScanFunction` timer-driven sono state implementate, committate (commit
6+
> `3c53d39`), deployate su `dev3` e verificate (`az functionapp function list`
7+
> 2 funzioni `EntraScan` + `SealedBatchConsumer`, zero eccezioni di startup in
8+
> App Insights). Unici task residui: (a) deploy operativo dell'HybridAgent su
9+
> almeno un server on-prem (servizio Windows con `appsettings.json` valorizzato,
10+
> + assegnazione SP come `hybridAgentPrincipalId` su `main.bicep`) e (b)
11+
> admin-consent delle permission Graph sulla MI `mi-func`. Tutto il codice
12+
> applicativo Azure-side è in produzione.
13+
314
> Generato il 2026-06-09 dopo la segnalazione _"sembra che l'hybrid worker non
415
> faccia mai la scansione su AD, e nemmeno la function faccia la scansione su
5-
> Entra"_. Conferma: la segnalazione è corretta. Questo documento è
16+
> Entra"_. Conferma: la segnalazione era corretta. Questo documento è
617
> l'**unica** roadmap di riferimento per portare la pipeline di scansione
718
> Azure-side in produzione.
819
@@ -14,22 +25,25 @@
1425
| Infra Bicep (Key Vault, App Config, SQL, Service Bus, Functions host) | ✅ Deployata | `Deploy-Azure.ps1 -EnvironmentName dev3` 33 risorse |
1526
| `KeyVaultKekProvider` + `DekSealingService` (Functions) | ✅ Codice + DI | `Functions/Program.cs:65-90` |
1627
| `HybridAgent.AdScanProducerJob` (Quartz job, seal & send) | ✅ Codice presente | `HybridAgent/Jobs/AdScanProducerJob.cs` |
17-
| `HybridAgent.SealedBatchProcessor` (BackgroundService consumer SB) | ✅ Codice presente | `HybridAgent/Security/SealedBatchProcessor.cs` |
28+
| `HybridAgent.SealedBatchProcessor` (BackgroundService consumer SB) | ✅ Codice presente (usato solo per testing on-prem ↔ on-prem; in produzione il consumer è la Function Azure-side) | `HybridAgent/Security/SealedBatchProcessor.cs` |
1829
| HybridAgent deployato su qualche server on-prem |**Da verificare con l'operatore** | Nessun deployment tracciato in `.azure/plan.md` |
1930
| HybridAgent `appsettings.json` valorizzato (`Encryption:KeyVault:Uri`, `SealedBatch:ServiceBusFullyQualifiedNamespace`) | ❌ Vuoti nei file committati | `HybridAgent/appsettings.json` |
20-
| Functions: classi `[Function]` (TimerTrigger, ServiceBusTrigger) | **Zero funzioni esistono** | `az functionapp function list -g rg-blkmon-dev3-italynorth -n func-blkmon-nsewij464oblc -o table``[]` |
21-
| Functions Entra scanner (TimerTrigger) | ❌ Non implementato | Manca classe `EntraScanFunction` |
22-
| Functions SB consumer per sealed batch da AD | ❌ Non implementato | Manca classe `SealedBatchConsumerFunction` |
31+
| Functions: classi `[Function]` (TimerTrigger, ServiceBusTrigger) | **2 funzioni live** | `az functionapp function list -g rg-blkmon-dev3-italynorth -n func-blkmon-nsewij464oblc -o table``EntraScan` + `SealedBatchConsumer` (verificato 2026-06-09 commit `3c53d39`) |
32+
| Functions Entra scanner (TimerTrigger) | ✅ Implementato | `Functions/Triggers/EntraScanFunction.cs` |
33+
| Functions SB consumer per sealed batch da AD | ✅ Implementato | `Functions/Triggers/SealedBatchConsumerFunction.cs` + handler condivisi `Core/Security/SealedBatchHandler.cs` + `Core/Security/IDekUnsealingFacade.cs` |
2334
| Permessi Graph (`Device.Read.All`, `BitlockerKey.ReadBasic.All`) sul MI `mi-func` | ❌ Da concedere | Richiede admin consent del tenant |
2435

2536
**Cosa significa in pratica:**
26-
- Nessuna scansione AD avviene oggi su nessun ambiente Azure, perché
27-
l'HybridAgent — anche se compilato — gira solo in modalità heartbeat
28-
(`AdScanProducerJob NOT scheduled` viene loggato all'avvio quando le due
29-
config sono vuote) e, ammesso che venga deployato e configurato, non c'è
30-
nessun consumer Service Bus lato Azure che persista i batch sigillati.
31-
- Nessuna scansione Entra avviene mai, perché il progetto Functions non
32-
contiene **nessuna** classe annotata `[Function]` — l'host gira a vuoto.
37+
- La pipeline cloud è **completa e in attesa di input dall'on-prem**.
38+
Appena il primo HybridAgent viene deployato con SP assegnata come
39+
`hybridAgentPrincipalId` su `main.bicep` (così riceve i ruoli `Key Vault Crypto User`
40+
scope-`encrypt-only` su `blkmon-agent-seal` + `Service Bus Data Sender` su
41+
queue `dek-sealed-batches`) e `appsettings.json` popolato, i batch sigillati
42+
iniziano a fluire e a essere persistiti su Azure SQL.
43+
- La scansione Entra parte automaticamente al primo trigger del CRON (default
44+
ogni 6h) appena viene concesso l'admin-consent delle permission Graph.
45+
Senza consent, l'host gira ma ogni chiamata Graph ritorna
46+
`Authorization_RequestDenied`.
3347

3448
## 2. Architettura target (riepilogo)
3549

0 commit comments

Comments
 (0)