- Add Legal Office of the Master seal (SVG design with Maltese Cross, scales of justice, legal scroll) - Create legal-office-manifest-template.json for Legal Office credentials - Update SEAL_MAPPING.md and DESIGN_GUIDE.md with Legal Office seal documentation - Complete Azure CDN infrastructure deployment: - Resource group, storage account, and container created - 17 PNG seal files uploaded to Azure Blob Storage - All manifest templates updated with Azure URLs - Configuration files generated (azure-cdn-config.env) - Add comprehensive Azure CDN setup scripts and documentation - Fix manifest URL generation to prevent double slashes - Verify all seals accessible via HTTPS
10 KiB
Entra VerifiedID Operational Runbook
This runbook provides operational procedures for managing the Entra VerifiedID integration.
Table of Contents
Daily Operations
Health Checks
Check Service Health
curl https://api.theorder.org/health
Check Entra Client Status
# Check logs for Entra client initialization
kubectl logs -n the-order-prod deployment/identity-service | grep -i entra
Verify Metrics Collection
curl https://api.theorder.org/metrics | grep entra
Key Metrics to Monitor
-
Issuance Success Rate: Should be >95%
rate(entra_credentials_issued_total{status="success"}[5m]) / rate(entra_credentials_issued_total[5m]) -
API Latency: p95 should be <5 seconds
histogram_quantile(0.95, entra_api_request_duration_seconds_bucket{operation="issueCredential"}) -
Error Rate: Should be <5%
rate(entra_api_errors_total[5m]) / rate(entra_api_requests_total[5m]) -
Webhook Processing: Should process all webhooks
rate(entra_webhooks_received_total[5m])
Monitoring
Grafana Dashboard
Access the Entra VerifiedID dashboard at: https://grafana.theorder.org/d/entra-verifiedid
Key Panels:
- Issuance Success Rate (gauge)
- API Request Rate (graph)
- Error Rate by Operation (graph)
- Issuance Duration (histogram)
- Webhook Events (graph)
- Active Requests (gauge)
Alerts
Critical Alerts:
EntraIssuanceErrorRateHigh: Error rate >10%EntraIssuanceLatencyHigh: p95 latency >10 secondsEntraWebhookProcessingFailed: Webhook processing failuresEntraAPIDown: No successful API requests in 5 minutes
Warning Alerts:
EntraIssuanceErrorRateWarning: Error rate >5%EntraIssuanceLatencyWarning: p95 latency >5 secondsEntraRateLimitApproaching: Rate limit usage >80%
Troubleshooting
Issue: Credential Issuance Failing
Symptoms:
- High error rate in metrics
- 500 errors in logs
- No credentials being issued
Diagnosis:
# Check recent errors
kubectl logs -n the-order-prod deployment/identity-service --tail=100 | grep -i error
# Check Entra API connectivity
curl -X POST https://verifiedid.did.msidentity.com/v1.0/<tenant-id>/verifiableCredentials/createIssuanceRequest \
-H "Authorization: Bearer <token>"
# Verify credentials
kubectl get secret -n the-order-prod entra-credentials -o yaml
Solutions:
- Verify Entra credentials are correct
- Check API permissions are granted
- Verify credential manifest exists
- Check network connectivity to Entra API
- Review Entra service status in Azure Portal
Issue: Webhooks Not Received
Symptoms:
- No webhook events in metrics
- Credentials stuck in "pending" status
- Database not updated
Diagnosis:
# Check webhook endpoint
curl -X POST https://api.theorder.org/vc/entra/webhook \
-H "Content-Type: application/json" \
-d '{"requestId":"test","requestStatus":"issuance_successful"}'
# Check webhook logs
kubectl logs -n the-order-prod deployment/identity-service | grep webhook
# Verify webhook URL in Entra
# Go to Azure Portal → Verified ID → Settings → Webhooks
Solutions:
- Verify webhook URL is configured in Entra VerifiedID
- Check webhook endpoint is accessible (firewall, ingress rules)
- Verify webhook payload format matches expected schema
- Check database connectivity
- Review webhook processing logs
Issue: High Latency
Symptoms:
- Slow credential issuance (>10 seconds)
- High p95/p99 latency metrics
- Timeout errors
Diagnosis:
# Check API request duration
kubectl logs -n the-order-prod deployment/identity-service | grep "duration"
# Check network latency to Entra
ping verifiedid.did.msidentity.com
# Check retry attempts
kubectl logs -n the-order-prod deployment/identity-service | grep retry
Solutions:
- Check network connectivity and latency
- Verify Entra API is not experiencing issues
- Review retry configuration (may be retrying too many times)
- Check if rate limiting is causing delays
- Consider increasing timeout values
Issue: Rate Limit Errors
Symptoms:
- 429 errors in logs
- Rate limit metrics showing violations
- Requests being rejected
Diagnosis:
# Check rate limit violations
kubectl logs -n the-order-prod deployment/identity-service | grep "429"
# Check current rate limit settings
kubectl get configmap -n the-order-prod identity-service-config -o yaml | grep ENTRA_RATE_LIMIT
Solutions:
- Review current rate limit configuration
- Check Entra API quota limits
- Adjust rate limits if needed
- Implement request queuing if necessary
- Contact Entra support if quota needs increase
Issue: Token Refresh Failures
Symptoms:
- "Failed to get access token" errors
- Authentication failures
- 401 errors
Diagnosis:
# Check token refresh logs
kubectl logs -n the-order-prod deployment/identity-service | grep "token"
# Verify credentials
kubectl get secret -n the-order-prod entra-credentials -o jsonpath='{.data.ENTRA_CLIENT_SECRET}' | base64 -d
Solutions:
- Verify client secret is correct and not expired
- Check API permissions are granted
- Verify tenant ID and client ID are correct
- Check if client secret needs rotation
- Review Azure AD app registration status
Common Operations
Issue a Credential Manually
curl -X POST https://api.theorder.org/vc/issue/entra \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"claims": {
"email": "user@example.com",
"name": "John Doe",
"role": "member"
},
"manifestName": "default"
}'
Check Credential Status
curl https://api.theorder.org/vc/entra/status/<requestId> \
-H "Authorization: Bearer <token>"
Verify a Credential
curl -X POST https://api.theorder.org/vc/verify/entra \
-H "Content-Type: application/json" \
-d '{
"credential": {
"id": "vc:123",
"type": ["VerifiableCredential"],
"issuer": "did:web:...",
"credentialSubject": {...},
"proof": {...}
}
}'
View Recent Issuances
# Query database
kubectl exec -n the-order-prod deployment/identity-service -- \
psql $DATABASE_URL -c "SELECT * FROM verifiable_credentials ORDER BY created_at DESC LIMIT 10;"
Check Metrics
# Get all Entra metrics
curl https://api.theorder.org/metrics | grep entra_
# Get specific metric
curl https://api.theorder.org/metrics | grep entra_credentials_issued_total
Rotate Client Secret
- Create new client secret in Azure Portal
- Update secret in Key Vault:
az keyvault secret set --vault-name <keyvault> --name "entra-client-secret" --value "<new-secret>" - Restart identity service to pick up new secret
- Verify service starts correctly
- Test credential issuance
- Delete old secret after verification
Add New Credential Manifest
- Create manifest in Azure Portal → Verified ID
- Note the Manifest ID
- Update
ENTRA_MANIFESTSenvironment variable:ENTRA_MANIFESTS='{"default":"id1","new-manifest":"new-id"}' - Restart identity service
- Test issuance with new manifest:
curl -X POST .../vc/issue/entra -d '{"claims": {...}, "manifestName": "new-manifest"}'
Emergency Procedures
Disable Entra Integration
If critical issues occur:
-
Scale down identity service (if using separate deployment):
kubectl scale deployment identity-service -n the-order-prod --replicas=0 -
Or disable Entra routes by setting:
ENTRA_TENANT_ID="" -
Verify routes are disabled:
curl https://api.theorder.org/vc/issue/entra # Should return 503 or route not found -
Monitor for stability
Rollback Deployment
- Identify previous working version
- Rollback deployment:
kubectl rollout undo deployment/identity-service -n the-order-prod - Verify rollback:
kubectl rollout status deployment/identity-service -n the-order-prod - Test critical functionality
- Monitor metrics
Emergency Credential Issuance
If automated issuance fails, use manual process:
- Access Entra VerifiedID portal directly
- Issue credential manually
- Export credential data
- Import into database if needed
- Notify affected users
Diagnostic Commands
Check Service Status
kubectl get pods -n the-order-prod -l app=identity-service
kubectl describe pod <pod-name> -n the-order-prod
View Logs
# Recent logs
kubectl logs -n the-order-prod deployment/identity-service --tail=100
# Follow logs
kubectl logs -n the-order-prod deployment/identity-service -f
# Logs with grep
kubectl logs -n the-order-prod deployment/identity-service | grep -i entra
Check Configuration
# Environment variables
kubectl exec -n the-order-prod deployment/identity-service -- env | grep ENTRA
# ConfigMap
kubectl get configmap -n the-order-prod identity-service-config -o yaml
# Secrets (base64 encoded)
kubectl get secret -n the-order-prod entra-credentials -o yaml
Test Connectivity
# Test Entra API
curl -v https://verifiedid.did.msidentity.com/v1.0/
# Test webhook endpoint
curl -X POST https://api.theorder.org/vc/entra/webhook \
-H "Content-Type: application/json" \
-d '{"requestId":"test","requestStatus":"issuance_successful"}'
Support Escalation
- Level 1: Check logs, metrics, and run diagnostic commands
- Level 2: Review configuration and test connectivity
- Level 3: Contact Azure support for Entra VerifiedID issues
- Level 4: Escalate to engineering team for code issues
Contact Information
- On-Call Engineer: [Contact Info]
- Azure Support: Azure Portal
- Entra Documentation: Microsoft Learn
Last Updated: [Current Date] Version: 1.0