Sicurezza nelle IDP: Un Approccio Integrato
La sicurezza in una Internal Developer Platform non e un layer aggiuntivo da applicare a posteriori: deve essere integrata by design in ogni componente della piattaforma. Il paradigma Zero Trust ("never trust, always verify") e il fondamento architetturale di una piattaforma sicura: ogni richiesta, ogni accesso e ogni comunicazione viene verificata, indipendentemente dall'origine.
La sfida per i platform team e bilanciare sicurezza e developer experience: policy troppo restrittive rallentano lo sviluppo e incentivano workaround insicuri, mentre policy troppo permissive espongono l'organizzazione a rischi. La soluzione e la security automation: policy enforcement automatico che protegge senza essere un ostacolo.
Cosa Imparerai
- Principi Zero Trust applicati alle IDP
- RBAC e ABAC per access control granulare
- Policy enforcement con OPA e Kyverno
- Secret management automatizzato con Vault
- Supply chain security: SBOM, firma delle immagini, vulnerability scanning
- Compliance frameworks: GDPR, SOC2, ISO 27001
Zero Trust Architecture
Il modello Zero Trust si basa su principi fondamentali che devono essere implementati a ogni livello della piattaforma:
- Verify explicitly: ogni richiesta viene autenticata e autorizzata, anche se proviene dalla rete interna
- Least privilege access: ogni utente e servizio ha i permessi minimi necessari per svolgere la propria funzione
- Assume breach: la piattaforma e progettata assumendo che una compromissione possa avvenire, minimizzando il blast radius
Nel contesto Kubernetes, Zero Trust si traduce in: mTLS obbligatorio tra servizi (service mesh), network policies che bloccano il traffico non autorizzato, pod security standards che impediscono l'esecuzione di container privilegiati, e audit logging di ogni operazione.
# Zero Trust: network policies Kubernetes
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: checkout-service-policy
namespace: checkout
spec:
podSelector:
matchLabels:
app: checkout-service
policyTypes:
- Ingress
- Egress
ingress:
# Solo dal gateway e dal servizio ordini
- from:
- namespaceSelector:
matchLabels:
name: api-gateway
- namespaceSelector:
matchLabels:
name: orders
ports:
- protocol: TCP
port: 8080
egress:
# Solo verso database, cache e servizi necessari
- to:
- namespaceSelector:
matchLabels:
name: databases
ports:
- protocol: TCP
port: 5432
- to:
- namespaceSelector:
matchLabels:
name: cache
ports:
- protocol: TCP
port: 6379
# DNS resolution
- to:
- namespaceSelector:
matchLabels:
name: kube-system
ports:
- protocol: UDP
port: 53
---
# Pod Security Standard: restricted
apiVersion: v1
kind: Namespace
metadata:
name: checkout
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/warn: restricted
RBAC e ABAC: Access Control Granulare
Il controllo degli accessi nella piattaforma deve essere granulare e automatizzato:
- RBAC (Role-Based Access Control): assegna permessi basati su ruoli predefiniti (developer, tech lead, platform admin)
- ABAC (Attribute-Based Access Control): permessi basati su attributi dinamici (team, ambiente, orario, location)
- Just-In-Time access: accesso temporaneo a risorse privilegiate con approvazione e scadenza automatica
- Break-glass procedures: procedure di emergenza per accesso elevato con audit completo
# RBAC: ruoli Kubernetes per il platform team
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: platform-developer
rules:
# Può vedere e gestire i propri deployment
- apiGroups: ["apps"]
resources: ["deployments", "replicasets"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
# Può vedere i pod ma non eliminarli
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch"]
# Può gestire configmap e secrets nel proprio namespace
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
# NON può modificare namespace, RBAC o network policies
- apiGroups: [""]
resources: ["namespaces"]
verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: team-checkout-developer
namespace: checkout
subjects:
- kind: Group
name: team-checkout
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: platform-developer
apiGroup: rbac.authorization.k8s.io
Policy Enforcement Automatizzato
Le policy devono essere enforced automaticamente, non affidate alla buona volontà degli sviluppatori. I due principali strumenti per policy enforcement in Kubernetes sono:
- OPA/Gatekeeper: policy engine general-purpose con linguaggio Rego. Potente ma con curva di apprendimento ripida
- Kyverno: policy engine nativo Kubernetes che usa YAML. Più semplice e intuitivo per policy K8s-specifiche
# Kyverno: policy di sicurezza per la piattaforma
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-non-root
spec:
validationFailureAction: Enforce
rules:
- name: run-as-non-root
match:
any:
- resources:
kinds:
- Pod
validate:
message: "I container devono eseguire come non-root"
pattern:
spec:
containers:
- securityContext:
runAsNonRoot: true
allowPrivilegeEscalation: false
---
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-resource-limits
spec:
validationFailureAction: Enforce
rules:
- name: require-limits
match:
any:
- resources:
kinds:
- Pod
validate:
message: "Tutti i container devono avere resource limits"
pattern:
spec:
containers:
- resources:
limits:
memory: "?*"
cpu: "?*"
requests:
memory: "?*"
cpu: "?*"
---
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-labels
spec:
validationFailureAction: Enforce
rules:
- name: require-team-label
match:
any:
- resources:
kinds:
- Deployment
- StatefulSet
validate:
message: "Tutti i workload devono avere il label 'team'"
pattern:
metadata:
labels:
team: "?*"
app: "?*"
Supply Chain Security
La supply chain security protegge l'intero ciclo di vita del software, dalla dipendenza al deployment:
- SBOM (Software Bill of Materials): inventario completo di tutte le dipendenze di ogni servizio, generato automaticamente
- Image signing: firma crittografica delle immagini container con Cosign/Sigstore per garantirne l'integrita
- Vulnerability scanning: scansione automatica delle immagini con Trivy, Snyk o Grype integrata nel CI/CD
- Admission control: solo immagini firmate e scansionate possono essere deployate nel cluster
Principio di Security Automation
Se una policy di sicurezza richiede azione manuale da parte dello sviluppatore, fallirà. La sicurezza deve essere automatizzata: scanning nel CI/CD, policy enforcement negli admission controller, secret rotation automatica, certificate renewal automatico. Lo sviluppatore non deve pensare alla sicurezza: la piattaforma la gestisce per lui.
Compliance Frameworks
Le IDP moderne devono supportare la compliance con framework regolamentari:
- GDPR: data encryption, access logging, data retention policies, right to deletion
- SOC 2: security controls, availability, processing integrity, confidentiality, privacy
- ISO 27001: information security management system, risk assessment, continuous improvement
- PCI DSS: per piattaforme che gestiscono dati di pagamento
La piattaforma dovrebbe rendere la compliance continua e automatica: audit trail automatici, policy enforcement in tempo reale, report di compliance generati automaticamente. Questo trasforma la compliance da un audit annuale stressante a un processo continuo e indolore.
Audit Logging e Monitoring
Un sistema di audit logging completo e la base per la sicurezza e la compliance:
- Immutable logs: i log di audit devono essere immutabili e conservati per il periodo richiesto dalla compliance
- Centralized logging: tutti i log di sicurezza confluiscono in un sistema centralizzato (SIEM)
- Real-time alerting: alert immediati per eventi di sicurezza critici (accessi sospetti, privilege escalation)
- Forensic capability: capacità di ricostruire la sequenza di eventi in caso di incidente di sicurezza
# Audit logging: Kubernetes audit policy
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
# Log tutti gli accessi ai secrets
- level: Metadata
resources:
- group: ""
resources: ["secrets"]
# Log tutte le modifiche a RBAC
- level: RequestResponse
resources:
- group: "rbac.authorization.k8s.io"
resources: ["clusterroles", "clusterrolebindings", "roles", "rolebindings"]
# Log tutti i delete
- level: RequestResponse
verbs: ["delete", "deletecollection"]
# Log tutti gli exec nei pod
- level: Request
resources:
- group: ""
resources: ["pods/exec", "pods/attach"]
# Log minimo per le richieste di lettura frequenti
- level: None
resources:
- group: ""
resources: ["events", "nodes/status"]
verbs: ["get", "list", "watch"]
Security by Default
La configurazione più sicura deve essere la configurazione di default. I Golden Paths devono includere security best practice integrate: container non-root, resource limits, network policies, secret management tramite Vault. Lo sviluppatore che segue il Golden Path ottiene sicurezza senza sforzo aggiuntivo.







