Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Esempio 1: ABAC di base con OPA e Rego
Questa sezione descrive uno scenario in cui l'OPA viene utilizzato per prendere decisioni di accesso su quali utenti sono autorizzati ad accedere alle informazioni in un microservizio Payroll fittizio. Vengono forniti frammenti di codice Rego per dimostrare come utilizzare Rego per prendere decisioni sul controllo degli accessi. Questi esempi non sono né esaustivi né un'esplorazione completa delle funzionalità di Rego e OPA. Per una panoramica più completa di Rego, ti consigliamo di consultare la documentazione Rego sul sito web OPA

Esempio di regole OPA di base
Nel diagramma precedente, una delle regole di controllo degli accessi applicate dall'OPA per il microservizio Payroll è:
I dipendenti possono leggere il proprio stipendio.
Se Bob tenta di accedere al microservizio Payroll per visualizzare il proprio stipendio, il microservizio Payroll può reindirizzare la chiamata API all'API OPA per prendere una decisione RESTful di accesso. Il servizio Payroll richiede all'OPA una decisione con il seguente input JSON:
{ "user": "bob", "method": "GET", "path": ["getSalary", "bob"] }
OPA seleziona una o più politiche in base alla query. In questo caso, la seguente politica, scritta in Rego, valuta l'input JSON.
default allow = false allow = true { input.method == "GET" input.path = ["getSalary", user] input.user == user }
Questa politica nega l'accesso per impostazione predefinita. Quindi valuta l'input nella query associandolo alla variabile globale. input
L'operatore punto viene utilizzato con questa variabile per accedere ai valori della variabile. La regola Rego allow
restituisce true se anche le espressioni nella regola sono vere. La regola Rego verifica che l'input sia uguale method
a GET. Quindi verifica che il primo elemento dell'elenco path
sia presente getSalary
prima di assegnare il secondo elemento dell'elenco alla variabile. user
Infine, verifica che il percorso a cui si accede verifichi /getSalary/bob
verificando che la user
richiesta in corso corrisponda alla input.user
variabile. user
La regola allow
applica la logica if-then per restituire un valore booleano, come mostrato nell'output:
{ "allow": true }
Regola parziale che utilizza dati esterni
Per dimostrare funzionalità OPA aggiuntive, puoi aggiungere requisiti alla regola di accesso che stai applicando. Supponiamo di voler applicare questo requisito di controllo degli accessi nel contesto dell'illustrazione precedente:
I dipendenti possono leggere lo stipendio di chiunque risponda a loro.
In questo esempio, OPA ha accesso a dati esterni che possono essere importati per prendere una decisione di accesso:
"managers": { "bob": ["dave", "john"], "carol": ["alice"] }
È possibile generare una risposta JSON arbitraria creando una regola parziale in OPA, che restituisce un set di valori anziché una risposta fissa. Questo è un esempio di regola parziale:
direct_report[user_ids] { user_ids = data.managers[input.user][_] }
Questa regola restituisce un insieme di tutti gli utenti che riportano il valore diinput.user
, che, in questo caso, èbob
. Il [_]
costrutto contenuto nella regola viene utilizzato per iterare sui valori del set. Questo è il risultato della regola:
{ "direct_report": [ "dave", "john" ] }
Il recupero di queste informazioni può aiutare a determinare se un utente è un referente diretto di un manager. Per alcune applicazioni, è preferibile restituire un codice JSON dinamico piuttosto che restituire una semplice risposta booleana.
Mettere tutto insieme
L'ultimo requisito di accesso è più complesso dei primi due perché combina le condizioni specificate in entrambi i requisiti:
I dipendenti possono leggere il proprio stipendio e quello di chiunque risponda a loro.
Per soddisfare questo requisito, puoi utilizzare questa politica Rego:
default allow = false allow = true { input.method == "GET" input.path = ["getSalary", user] input.user == user } allow = true { input.method == "GET" input.path = ["getSalary", user] managers := data.managers[input.user][_] contains(managers, user) }
La prima regola della politica consente l'accesso a qualsiasi utente che tenti di visualizzare le proprie informazioni salariali, come discusso in precedenza. Avere due regole con lo stesso nomeallow
, funziona come operatore logico o come operatore in Rego. La seconda regola recupera l'elenco di tutti i report diretti associati a input.user
(dai dati del diagramma precedente) e assegna questo elenco alla variabile. managers
Infine, la regola verifica se l'utente che sta cercando di visualizzare il proprio stipendio è un referente diretto input.user
verificando che il suo nome sia contenuto nella variabile. managers
Gli esempi in questa sezione sono molto semplici e non forniscono un'esplorazione completa o approfondita delle funzionalità di Rego e OPA. Per ulteriori informazioni, consultate la documentazione OPA