Phase 0 research (R1-R10) + Phase 1 design artifacts: - research.md: 10 decisions (fingerprint migration, Graph API, catalog, alerts) - data-model.md: stored_reports migration, model/enum changes, new classes - contracts/internal-services.md: 3 service + job contracts - quickstart.md: implementation guide with file list + test commands - plan.md: 6-phase implementation plan (A-F) with constitution check Agent context: copilot-instructions.md updated
4.4 KiB
4.4 KiB
Quickstart: Entra Admin Roles Evidence + Findings (Spec 105)
Branch: 105-entra-admin-roles-evidence-findings
Prerequisites
- Laravel Sail running (
vendor/bin/sail up -d) - Database migrated (
vendor/bin/sail artisan migrate) - At least one tenant with a provider connection configured
- Spec 104 (Provider Permission Posture) deployed (
stored_reportstable exists)
New Files Created (Implementation Order)
Phase A — Foundation (Config + Migration + Constants)
config/entra_permissions.php # NEW: Entra permission registry
database/migrations/XXXX_add_fingerprint_to_stored_reports.php # NEW: fingerprint + previous_fingerprint columns
Phase B — Catalog + Report Service
app/Services/EntraAdminRoles/HighPrivilegeRoleCatalog.php # NEW: role classification
app/Services/EntraAdminRoles/EntraAdminRolesReportResult.php # NEW: value object
app/Services/EntraAdminRoles/EntraAdminRolesReportService.php # NEW: Graph fetch + report creation
Phase C — Finding Generator
app/Services/EntraAdminRoles/EntraAdminRolesFindingResult.php # NEW: value object
app/Services/EntraAdminRoles/EntraAdminRolesFindingGenerator.php # NEW: findings lifecycle
Phase D — Job + Scheduling
app/Jobs/ScanEntraAdminRolesJob.php # NEW: orchestrator job
Phase E — UI Widget
app/Filament/Widgets/Tenant/AdminRolesSummaryWidget.php # NEW: dashboard card
resources/views/filament/widgets/tenant/admin-roles-summary.blade.php # NEW: card template
Modified Files Summary
| File | Change |
|---|---|
app/Models/StoredReport.php |
Add REPORT_TYPE_ENTRA_ADMIN_ROLES constant, add fingerprint+previous_fingerprint to fillable |
app/Models/Finding.php |
Add FINDING_TYPE_ENTRA_ADMIN_ROLES constant |
app/Models/AlertRule.php |
Add EVENT_ENTRA_ADMIN_ROLES_HIGH constant |
app/Support/OperationRunType.php |
Add EntraAdminRolesScan case |
app/Support/Auth/Capabilities.php |
Add ENTRA_ROLES_VIEW, ENTRA_ROLES_MANAGE constants |
app/Support/Badges/Domains/FindingTypeBadge.php |
Add entra_admin_roles badge mapping |
app/Services/Intune/TenantPermissionService.php |
Merge entra_permissions.php into getRequiredPermissions() |
app/Jobs/Alerts/EvaluateAlertsJob.php |
Add entraAdminRolesHighEvents() method + call in handle() |
config/graph_contracts.php |
Add entraRoleDefinitions + entraRoleAssignments type entries |
app/Support/Auth/RoleCapabilityMap.php (or equivalent) |
Map new capabilities to roles |
app/Filament/Resources/AlertRuleResource.php |
Add EVENT_ENTRA_ADMIN_ROLES_HIGH to event type dropdown |
routes/console.php |
Register daily scan schedule |
database/factories/FindingFactory.php |
Add entraAdminRoles() state |
Running Tests
# All Spec 105 tests
vendor/bin/sail artisan test --compact --filter=EntraAdminRoles
# Specific test files
vendor/bin/sail artisan test --compact tests/Feature/EntraAdminRoles/HighPrivilegeRoleCatalogTest.php
vendor/bin/sail artisan test --compact tests/Feature/EntraAdminRoles/EntraAdminRolesReportServiceTest.php
vendor/bin/sail artisan test --compact tests/Feature/EntraAdminRoles/EntraAdminRolesFindingGeneratorTest.php
vendor/bin/sail artisan test --compact tests/Feature/EntraAdminRoles/ScanEntraAdminRolesJobTest.php
vendor/bin/sail artisan test --compact tests/Feature/EntraAdminRoles/AdminRolesAlertIntegrationTest.php
vendor/bin/sail artisan test --compact tests/Feature/EntraAdminRoles/AdminRolesSummaryWidgetTest.php
Key Design Decisions
- Fingerprint on stored_reports: Migration adds nullable columns — existing permission_posture reports unaffected
- HighPrivilegeRoleCatalog: Static PHP catalog using Microsoft template_ids (GUIDs), extensible later via workspace settings
- Finding per (principal, role): One finding per role assignment, not per principal — enables precise auto-resolve
- Registry merge:
TenantPermissionService::getRequiredPermissions()now merges bothintune_permissions.phpandentra_permissions.php - Alert integration: Same pattern as existing alert event producers — new method in
EvaluateAlertsJob - Widget not Resource: Admin Roles card is a widget on the tenant dashboard, not a full CRUD resource
- RBAC boundary:
ENTRA_ROLES_VIEWgates card+report only; findings use existingFINDINGS_VIEW