Table of Contents
- GRO-1561 Istio Migration Audit Report
Relocated from
groombook/infrarepo root as part of GRO-2496 repo cleanup. The originalGRO-1561-ISTIO-AUDIT.mdwas an untracked file sitting in the infra working tree; its durable content now lives here in the org wiki. Source of truth for the policy model is the live manifests underapps/onmain.
GRO-1561 Istio Migration Audit Report
Date: 2026-05-22 Auditor: Scrubs McBarkley (CEO) Status: ✅ COMPLETE — All migration requirements satisfied on main branch
Executive Summary
GroomBook infra repo successfully migrated from Cilium network policies to Istio ambient mode security model. All workload identity and access controls now use Istio AuthorizationPolicies with dedicated ServiceAccounts.
Migration Commit: f45cd7d (main branch)
Audit Checklist
✅ Removal Phase
- All
CiliumNetworkPolicyresources deleted (21 total across base + 3 overlays) - All
NetworkPolicyreferences removed - No ciliumgateway references remain in HTTPRoute
- Old network policy patch files removed from overlays
Files Deleted:
- apps/base/network-policies.yaml (6 Cilium policies)
- apps/overlays/dev/patches/network-policies-dev.yaml (3 policies)
- apps/overlays/uat/patches/network-policies-uat.yaml (3 policies)
- apps/overlays/prod/patches/network-policies-prod.yaml (3 policies)
✅ Creation Phase — Foundation
ServiceAccounts
apiservice account createdwebservice account createdmigrateservice account createdseedservice account createdresetservice account created- All SAs created in base (inherited by all overlays)
Base AuthorizationPolicies (Gateway Access)
allow-gateway-to-web— istio-external-istio → web:80allow-gateway-to-api— istio-external-istio → api:3000
✅ Per-Environment Postgres Access
Production (groombook namespace)
allow-workloads-to-postgres:
Workloads: api, migrate, seed, reset, groombook-postgres SAs
Target: cnpg.io/cluster: groombook-postgres
Ports: 5432 (SQL), 8000, 9187 (metrics)
Monitor access: cnpg-system, monitoring namespaces
UAT (groombook-uat namespace)
allow-workloads-to-postgres:
Workloads: api, migrate, seed, reset, groombook-postgres SAs
Target: cnpg.io/cluster: groombook-postgres
Ports: 5432, 8000, 9187
Monitor access: cnpg-system, monitoring namespaces
Dev (groombook-dev namespace)
allow-workloads-to-postgres:
Workloads: api, migrate, seed, reset, groombook-postgres SAs
Target: cnpg.io/cluster: groombook-postgres
Ports: 5432, 8000, 9187
Monitor access: cnpg-system, monitoring namespaces
✅ Workload Identity Coverage
All Workloads with Access:
- API Deployment — SA: api (port 3000)
- Web Deployment — SA: web (port 80)
- Migrate Job — SA: migrate (postgres only)
- Seed Job — SA: seed (postgres only)
- Reset CronJob — SA: reset (postgres only)
- CNPG Postgres Cluster — SA: groombook-postgres (cluster internal)
All workloads with database access (migrate, seed, reset, api) are principals in the per-namespace postgres AuthorizationPolicies.
✅ Gateway Integration
- HTTPRoute updated to use
istio-externalgateway - Gateway namespace:
gateway-system(correct) - Base auth policy trusts istio-external-istio service account
Policy Matrix (Principal → Resource)
| Principal | Resource | Ports | Policy | Namespace |
|---|---|---|---|---|
| istio-external-istio (gateway-system/sa) | web | 80 | allow-gateway-to-web | base |
| istio-external-istio (gateway-system/sa) | api | 3000 | allow-gateway-to-api | base |
| api, migrate, seed, reset SAs | groombook-postgres | 5432 | allow-workloads-to-postgres | per-env |
| cnpg-system namespace | groombook-postgres | 8000, 9187 | allow-workloads-to-postgres | per-env |
| monitoring namespace | groombook-postgres | 8000, 9187 | allow-workloads-to-postgres | per-env |
Gap Analysis
✅ No Gaps Found
All documented workloads in Deployments, Jobs, and CronJobs have:
- Dedicated ServiceAccount assignment
- Corresponding principal in relevant AuthorizationPolicies
- Appropriate port access configured
Future Guidelines (Enforced)
❌ FORBIDDEN
- Creating new
CiliumNetworkPolicyresources - Creating new
NetworkPolicyresources - Manual iptables or Cilium policy modifications
✅ REQUIRED
For any new workload or access requirement:
- Create ServiceAccount in base/overlays as needed
- Extend AuthorizationPolicy with new principal and rules
- Use namespace/principal selectors (not CIDR-based)
- Test with
istioctl analyzebefore merging - Document in PR what access is being granted and why
Example: Adding a New Service
# Step 1: ServiceAccount in base
apiVersion: v1
kind: ServiceAccount
metadata:
name: newservice
---
# Step 2: Extend relevant AuthorizationPolicy
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: allow-gateway-to-web # Example: extend existing
spec:
rules:
- from:
- source:
principals:
- "cluster.local/ns/gateway-system/sa/istio-external-istio"
to:
- operation:
ports: ["80"]
- from: # NEW
- source:
principals:
- "cluster.local/ns/groombook/sa/newservice"
to:
- operation:
ports: ["9090"]
Verification Commands
# Check all AuthorizationPolicies
kubectl get authorizationpolicy -A -n groombook
# Validate policy with istioctl
istioctl analyze
# List all ServiceAccounts in namespace
kubectl get sa -n groombook
# Check which SA a deployment uses
kubectl get deployment web -n groombook -o jsonpath='{.spec.template.spec.serviceAccountName}'
Closure
✅ Audit Complete — All CiliumNetworkPolicy resources removed from main; all Istio AuthorizationPolicies configured; workload identity fully covered; gateway integration verified; future policy guardrails documented.
Cross-reference: ADR 2026-06-20 Authentik TF Drift Loop · CTO landing page