Panoramica dei criteri di autorizzazione
A differenza di un'applicazione monolitica che potrebbe essere in esecuzione in un unico posto, le app di microservizi distribuite a livello globale effettuano chiamate attraverso i confini di rete. Ciò significa più punti di accesso alle tue applicazioni e maggiori opportunità per attacchi dannosi. Inoltre, poiché i pod Kubernetes hanno IP temporanei, le regole firewall tradizionali basate su IP non sono adatte a garantire l'accesso tra i carichi di lavoro. In un'architettura di microservizi, è necessario un nuovo approccio alla sicurezza. Basato su funzionalità di sicurezza come gli account di servizio Kubernetes e i criteri di sicurezza Istio, Anthos Service Mesh offre ancora più funzionalità per aiutarti a proteggere le tue applicazioni.
Questa pagina offre agli operatori delle applicazioni una panoramica della risorsa personalizzata AuthorizationPolicy
. I criteri di autorizzazione consentono di abilitare il controllo dell'accesso sui carichi di lavoro a livello di applicazione (L7) e di trasporto (L3/4). Configuri i criteri di autorizzazione per specificare le autorizzazioni: cosa può fare questo servizio o l'utente?
Criteri di autorizzazione
Le richieste tra servizi nel mesh (e tra utenti finali e servizi) sono consentite per impostazione predefinita. Puoi utilizzare la RP AuthorizationPolicy
per definire criteri granulari per i tuoi carichi di lavoro. Dopo aver applicato i criteri di autorizzazione, Anthos Service Mesh li distribuisce ai proxy sidecar. Quando le richieste entrano in un carico di lavoro, il proxy sidecar controlla i criteri di autorizzazione per determinare se la richiesta deve essere consentita o rifiutata.
Ambito dei criteri
Puoi applicare un criterio all'intero mesh di servizi, a uno spazio dei nomi o a un singolo carico di lavoro.
Per applicare un criterio a livello di mesh, specifica lo spazio dei nomi root,
istio-system
, nel campometadata:namespace
:apiVersion: "security.istio.io/v1beta1" kind: "AuthorizationPolicy" metadata: name: "mesh-wide" namespace: istio-system spec: ...
Per applicare un criterio a uno spazio dei nomi, specifica lo spazio nel campo
metadata:namespace
:apiVersion: "security.istio.io/v1beta1" kind: "AuthorizationPolicy" metadata: name: "currencyservice" namespace: currencyservice spec: ...
Per limitare un criterio a un carico di lavoro specifico, includi un campo
selector
.apiVersion: "security.istio.io/v1beta1" kind: "AuthorizationPolicy" metadata: name: "frontend" namespace: demo spec: selector: matchLabels: app: frontend ...
Struttura di base
Un criterio di autorizzazione include l'ambito dei criteri, un action
e un elenco di
rules
:
Come descritto nella sezione precedente, l'ambito dei criteri può essere l'intero mesh, uno spazio dei nomi o un carico di lavoro specifico. Se lo includi, il campo
selector
specifica la destinazione del criterio.Il campo
action
specifica seALLOW
oDENY
la richiesta. Se non specifichi un'azione, per impostazione predefinita l'azione è impostata suALLOW
. Per chiarezza, ti consigliamo di specificare sempre l'azione. I criteri di autorizzazione supportano anche le azioniAUDIT
eCUSTOM
.Le
rules
specificano quando attivare l'azione.Il campo
from
inrules
specifica le origini della richiesta.Il campo
to
inrules
specifica le operazioni della richiesta.Il campo
when
specifica ulteriori condizioni necessarie per applicare la regola.
Nell'esempio seguente:
Il criterio viene applicato alle richieste al servizio
frontend
nello spazio dei nomidemo
.Le richieste sono consentite quando "hello:world" è nell'intestazione della richiesta; in caso contrario, le richieste vengono rifiutate.
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
name: "hello-world"
namespace: demo
spec:
selector:
matchLabels:
app: frontend
action: ALLOW
rules:
- when:
- key: request.headers[hello]
values: ["world"]
Controllo dell'accesso all'operazione di richiesta
Puoi controllare l'accesso a operazioni di richieste specifiche, come i metodi HTTP o le porte TCP, aggiungendo una sezione to
in rules
.
Nell'esempio seguente, solo i metodi HTTP GET
e POST
sono consentiti nello spazio dei nomi currencyservice
nello spazio dei nomi demo
.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: currencyservice
namespace: demo
spec:
selector:
matchLabels:
app: currencyservice
action: ALLOW
rules:
- to:
- operation:
methods: ["GET", "POST"]
Controllo dell'accesso sull'identità autenticata
Negli esempi precedenti, i criteri consentono le richieste da carichi di lavoro non autenticati. Se hai abilitato STRICT
TLS reciproco (mTLS), puoi limitare l'accesso in base all'identità del carico di lavoro o dello spazio dei nomi da cui proviene la richiesta nella sezione source
.
Utilizza il campo
principals
onotPrincipal
per controllare l'accesso a livello di carico di lavoro.Utilizza il campo
namespaces
onotNamespaces
per controllare l'accesso a livello di spazio dei nomi.
Per tutti i campi precedenti è necessario che sia abilitato il protocollo mTLS STRICT
. Se non riesci a impostare mTLS STRICT
, consulta Rifiuta richieste in testo normale per una soluzione alternativa.
Carico di lavoro identificato
Nell'esempio seguente, le richieste a currencyservice
sono consentite solo dal servizio frontend
. Le richieste al currencyservice
da altri carichi di lavoro vengono rifiutate.
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
name: "currencyservice"
namespace: demo
spec:
selector:
matchLabels:
app: currencyservice
action: ALLOW
rules:
- from:
- source:
principals: ["example-project-1234.svc.id.goog/ns/demo/sa/frontend-sa"]
Per specificare un account di servizio, i valori di principals
per l'autorità di certificazione Anthos Service Mesh (Mesh CA) e per il servizio autorità di certificazione devono essere nel seguente formato:
principals: ["PROJECT_ID.svc.id.goog/ns/NAMESPACE/sa/SERVICE_ACCOUNT_NAME"]
PROJECT_ID.svc.id.goog
è il
dominio trust per Mesh CA. Se utilizzi Istio CA (precedentemente nota come Citadel), il dominio di attendibilità predefinito è cluster.local
.
Spazio dei nomi identificato
L'esempio seguente mostra un criterio che nega le richieste se l'origine non è lo spazio dei nomi foo
:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: httpbin-deny
namespace: foo
spec:
selector:
matchLabels:
app: httpbin
version: v1
action: DENY
rules:
- from:
- source:
notNamespaces: ["foo"]
Corrispondenza del valore
La maggior parte dei campi dei criteri di autorizzazione supporta tutti i seguenti schemi corrispondenti:
- Corrispondenza esatta: corrispondenza esatta della stringa.
- Corrispondenza con carattere jolly utilizzando il carattere jolly
"*"
:- Corrispondenza prefisso: una stringa con una stringa
"*"
. Ad esempio,"test.example.*"
corrisponde a"test.example.com"
o"test.example.com.cn"
. - Corrispondenza suffisso: una stringa con un
"*"
iniziale. Ad esempio,"*.example.com"
corrisponde a"eng.example.com"
o"test.eng.example.com"
.
- Corrispondenza prefisso: una stringa con una stringa
- Corrispondenza presenza: per specificare che un campo deve essere presente e non vuoto, utilizza il formato
fieldname: ["*"]
. Questa impostazione è diversa da lasciare un campo non specificato, il che significa che puoi trovare corrispondenze, anche vuote.
Esistono alcune eccezioni. Ad esempio, i seguenti campi supportano solo la corrispondenza esatta:
- Il campo
key
nella sezionewhen
- L'elemento
ipBlocks
nella sezionesource
- Il campo
ports
nella sezioneto
Il seguente criterio di esempio consente l'accesso ai percorsi con il prefisso /test/*
o il suffisso */info
:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: tester
namespace: default
spec:
selector:
matchLabels:
app: products
action: ALLOW
rules:
- to:
- operation:
paths: ["/test/*", "*/info"]
Corrispondenza di esclusione
Per creare una corrispondenza con condizioni negative come notValues
nel campo when
,
notIpBlocks
nel campo source
, notPorts
nel campo to
, Anthos Service Mesh
supporta la corrispondenza di esclusione. L'esempio seguente richiede una richiesta valida
principals
, che deriva dall'autenticazione JWT, se il percorso della richiesta non è
/healthz
. Pertanto, il criterio esclude le richieste al percorso /healthz
dall'autenticazione JWT:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: disable-jwt-for-healthz
namespace: default
spec:
selector:
matchLabels:
app: products
action: ALLOW
rules:
- to:
- operation:
notPaths: ["/healthz"]
from:
- source:
requestPrincipals: ["*"]
Rifiuta richieste in testo non crittografato
In Anthos Service Mesh 1.5 e versioni successive, il protocollo mTLS automatico è abilitato per impostazione predefinita. Con mTLS automatico, un proxy sidecar client rileva automaticamente se il server ha un sidecar. Il sidecar client invia mTLS ai carichi di lavoro con sidecar e invia testo normale ai carichi di lavoro senza sidecar. Per la migliore sicurezza, ti consigliamo di attivare STRICT mTLS.
Se non riesci ad abilitare mTLS con la modalità STRICT
per un carico di lavoro o uno spazio dei nomi, puoi:
- Crea un criterio di autorizzazione per consentire esplicitamente il traffico con
principals
non vuoto onamespaces
non vuoto oppure - rifiuta il traffico con
namespaces
oprincipals
vuoto.
Poiché namespaces
e principals
possono essere estratti solo con una richiesta mTLS, questi criteri rifiutano efficacemente qualsiasi traffico di testo non crittografato.
Il seguente criterio nega la richiesta se l'entità nella richiesta è vuota (come nel caso delle richieste in testo non crittografato). Il criterio consente le richieste se l'entità non è vuota. ["*"]
significa una corrispondenza non vuota e l'utilizzo di notPrincipals
significa corrispondenza sull'entità vuota.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: require-mtls
namespace: NAMESPACE
spec:
action: DENY
rules:
- from:
- source:
notPrincipals: ["*"]
Priorità criteri di autorizzazione
Puoi configurare criteri di autorizzazione ALLOW
e DENY
separati, ma devi comprendere la precedenza dei criteri e il comportamento predefinito per assicurarti che facciano i criteri desiderati. Il seguente diagramma descrive la precedenza
dei criteri.
I criteri di esempio nelle sezioni seguenti illustrano alcuni del comportamento predefinito e le situazioni in cui potrebbero essere utili.
Non consentire nulla
L'esempio seguente mostra un criterio ALLOW
che non corrisponde a niente. Per impostazione predefinita, se non ci sono altri criteri ALLOW
, le richieste vengono sempre negate.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: allow-nothing
spec:
action: ALLOW
È buona prassi iniziare con il criterio allow-nothing e
aggiungere più criteri ALLOW
per aprire più accesso a un carico di lavoro.
Nega tutto l'accesso
L'esempio seguente mostra un criterio DENY
che corrisponde a tutto. Poiché i criteri DENY
vengono valutati prima dei criteri ALLOW
, tutte le richieste vengono rifiutate anche se esiste un criterio ALLOW
corrispondente alla richiesta.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: deny-all
spec:
action: DENY
rules:
- {}
Un criterio di tipo "Nega tutto" è utile se vuoi disabilitare temporaneamente l'accesso a un carico di lavoro.
Consenti tutti gli accessi
L'esempio seguente mostra un criterio ALLOW
che corrisponde a tutto e consente l'accesso completo a un carico di lavoro. Il criterio di autorizzazione consente di utilizzare altri criteri ALLOW
perché consente sempre la richiesta.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: allow-all
spec:
action: ALLOW
rules:
- {}
Un criterio di autorizzazione è utile se vuoi esporre temporaneamente l'accesso completo a un carico di lavoro. Se sono presenti criteri DENY
, le richieste potrebbero comunque essere rifiutate
perché i criteri DENY
vengono valutati prima dei criteri ALLOW
.
Best practice
creare un account di servizio Kubernetes per ogni servizio e specificare l'account di servizio nel deployment. Ad esempio:
apiVersion: v1 kind: ServiceAccount metadata: name: frontend-sa namespace: demo --- apiVersion: apps/v1 kind: Deployment metadata: name: frontend namespace:demo spec: selector: matchLabels: app: frontend template: metadata: labels: app: frontend spec: serviceAccountName: frontend-sa ...
Inizia con un criterio di non autorizzazione e aggiungi in modo incrementale più criteri
ALLOW
per aprire un accesso più ampio ai carichi di lavoro.Se utilizzi JWT per il tuo servizio:
Crea un criterio
DENY
per bloccare le richieste non autenticate, ad esempio:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: requireJWT namespace: admin spec: action: DENY rules: - from: - source: notRequestPrincipals: ["*"]
Applica un criterio di non autorizzazione.
Definisci i criteri
ALLOW
per ogni carico di lavoro. Per esempi, consulta Token JWT.
Passaggi successivi
Scopri di più sulle funzionalità di sicurezza di Anthos Service Mesh:
- Configurazione dell'autenticazione utente di Anthos Service Mesh
- Configurazione dei criteri di controllo per i servizi
- Configurazione della sicurezza del trasporto
- Integrazione di Identity-Aware Proxy con Anthos Service Mesh
- Best practice per l'utilizzo dei gateway in uscita di Anthos Service Mesh sui cluster GKE
Scopri di più sui criteri di autorizzazione nella documentazione relativa a Istio: