Nota
- Questa esercitazione richiede l'accesso a Oracle Cloud. Per iscriverti a un account gratuito, consulta Inizia a utilizzare Oracle Cloud Infrastructure Free Tier.
- Utilizza valori di esempio per le credenziali, la tenancy e i compartimenti di Oracle Cloud Infrastructure. Al termine del laboratorio, sostituisci questi valori con quelli specifici del tuo ambiente cloud.
Utilizza OCI Functions e OCI Queue per autorizzare le funzionalità utente senza esporre il privilegio di amministrazione agli approvatori
Introduzione
L'aggiornamento delle funzionalità utente è un'esigenza fondamentale per molte aziende, soprattutto quando l'autorizzazione autorizzata agli utenti è riservata, ad esempio la funzionalità della console o la chiave API. Tuttavia, per quanto abbiamo trovato nella documentazione di Oracle Cloud Infrastructure (OCI), solo gli utenti del gruppo di amministratori sono in grado di autorizzare la funzionalità utente anche quando ci sono criteri Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) che esplicitamente la consentono. Per ulteriori informazioni, vedere Gestione degli utenti.
Questa esercitazione consente di dimostrare una soluzione per lo scenario in cui gli utenti non fanno parte del gruppo di amministratori di un dominio IAM OCI, ma devono comunque avere la capacità di autorizzare le funzionalità utente utilizzando la funzione appena rilasciata di OCI Connector Hub per integrare OCI Queue e OCI Functions.
Descrizione dell'immagine SolutionArchitecture.png
Obiettivi
-
Autorizza le funzionalità utente sfruttando la funzione di integrazione di OCI Connector Hub tra OCI Queue e OCI Functions.
-
Scopri un approccio cloud nativo per sviluppare soluzioni per disaccoppiare i privilegi per approvare ed eseguire le richieste degli utenti come implementazione IAM con filtro su OCI.
-
Scopri come gestire gli utenti utilizzando l'API python nelle funzioni OCI.
-
Scopri l'uso dei gruppi dinamici per l'uso dell'autorizzazione dei principi delle risorse su OCI.
Task 1: creare il canale di messaggistica da OCI Queue a OCI Functions
La parte essenziale della soluzione consiste nel disaccoppiare l'autorizzazione richiesta modificando le funzionalità utente dall'autorizzazione necessaria all'approvatore per approvare una richiesta.
-
Creare OCI Queue per le richieste in entrata. Per ulteriori informazioni, vedere Creazione di una coda.
-
Crea la funzione OCI utilizzata per autorizzare gli utenti. Per ulteriori informazioni, vedere Creazione di funzioni.
-
Configura l'integrazione di OCI Queue e OCI Functions tramite OCI Connector Hub. Assicurarsi che l'origine sia specificata con la coda OCI creata e che la destinazione sia OCI Functions. L'attività facoltativa verrà lasciata vuota in questa esercitazione. Per ulteriori informazioni, vedere Annuncio della disponibilità di OCI Queue come origine in OCI Connector Hub.
Task 2: configurare i criteri IAM OCI e il gruppo dinamico
Dopo aver diviso i ruoli dell'approvatore nella coda OCI per accogliere le richieste e le funzioni OCI per eseguire la richiesta, dobbiamo configurare rigorosi criteri IAM OCI per assicurarci che l'autorizzazione non venga abusata. Poiché abbiamo creato questa soluzione per supportare un cliente che insiste nell'uso del compartimento radice per l'implementazione, eseguiremo una demo di tutte le configurazioni dal compartimento radice per la parte IAM OCI.
-
Consentire solo all'approvatore di inserire i messaggi nella coda OCI di destinazione.
Allow group 'testApprover' to use queues in tenancy
L'aggiunta di questo criterio consente agli utenti del gruppo testApprover di utilizzare la coda per ricevere le richieste di accesso alla console. Siamo in grado di porre ulteriori limitazioni al gruppo specificando solo l'autorizzazione per il tipo di risorsa Queue-Push come mostrato nell'esempio riportato di seguito.
use queue-push in compartment <compartment> where target.queue.id = '<queue_ocid>'
-
Configurare il gruppo dinamico per includere le funzioni OCI specificando la regola di corrispondenza seguente.
ALL{resource.type='fnfunc',resource.id='ocid.fnfunc.oc1.....'}
Questo gruppo dinamico verrà quindi autorizzato con un ruolo Oracle Identity Cloud Service per gestire gli utenti nel dominio.
-
Consente di configurare il ruolo di gruppo dinamico Oracle Identity Cloud Service.
-
Configurare le funzioni OCI in modo che possano essere richiamate solo da OCI Queue. L'esempio seguente limita solo l'origine del richiamo alle code, possiamo effettivamente renderlo più rigoroso utilizzando le tag sulle risorse. Per ulteriori informazioni, vedere Utilizzo delle tag per gestire l'accesso
Allow service faas to use functions-family in tenancy where request.principal.type='queues'
Task 3: Comporre il codice delle funzioni OCI
È necessario comporre una parte di codice Python per le funzioni OCI per eseguire effettivamente la richiesta acquisita da OCI Queue.
-
Il messaggio di OCI Queue verrà passato alla funzione nell'oggetto data.
def handler(ctx, data: bytes = None) -> response.Response: try: # Parse the message from the OCI Queue if data: message = json.loads(data.getvalue().decode('utf-8')) else: message = "no useremail received"
-
Eseguire l'autenticazione utilizzando il principal risorsa.
Nota: la seguente riga di codice potrebbe non funzionare in un IDE.
identity = IdentityClient({}, signer=oci.auth.signers.get_resource_principals_signer(), region=region)
-
Convertire il messaggio di posta elettronica dell'utente passato in Oracle Cloud Identifier (OCID) dell'utente.
def get_user_ocid_by_email(identity_client,email,tenancy_id): # List all users in the tenancy users = oci.pagination.list_call_get_all_results(identity_client.list_users,tenancy_id).data # Find the user with the matching email address for user in users: if user.email.lower() == email.lower(): return user.id return None
-
Aggiornare la funzionalità utente con il principal risorsa utilizzando la funzione IdentityClient.
# Get the user by email address user_ocid = get_user_ocid_by_email(identity,user_email,tenancy) # Update user capabilities (example: enable API keys) update_details = oci.identity.models.UpdateUserCapabilitiesDetails( can_use_api_keys=True, can_use_auth_tokens=True, can_use_console_password=True, can_use_customer_secret_keys=True, can_use_db_credentials=True, can_use_o_auth2_client_credentials=True, can_use_smtp_credentials=True ) # Update the user identity.update_user_capabilities(user_ocid, update_details)
-
Distribuire il codice funzione nella funzione OCI appena creata. Per i passi dettagliati della distribuzione di una funzione OCI, vedere Note di configurazione per OCI Functions
Task 4: Test delle modifiche
Eseguire il test delle modifiche inviando un messaggio alla coda di destinazione. Possiamo utilizzare OCI Console o qualsiasi SDK, inclusa OCI Cloud Shell.
Descrizione dell'immagine send-message.png
Descrizione dell'immagine examine.png
Risoluzione dei problemi
Configurazione della funzione OCI per l'uso di OCIR
Se utilizzi OCIR come repository della funzione OCI, un paio di problemi potrebbero bloccarti e non è così facile trovare una soluzione poiché per ora non è dimostrata una guida chiara specificamente per evitare tali problemi.
-
Configurazione di un compartimento specifico sia per il repository OCIR che per la funzione OCI come contesto di funzione. Per impostazione predefinita, il contesto del repository OCIR punta al compartimento radice anche se si segue la pagina delle istruzioni sulla console per l'esecuzione sotto i comandi cloud shell.
fn update context oracle.compartment-id ocid1.tenancy.oc1.....
Nota: questa parte è fuorviante in quanto con
oracle.compartment-id
fa pensare che questa proprietà sia per la funzione e per OCIR, tuttavia, per OCIR è disponibile una proprietà separata che èimage-compartment-id
. Pertanto, se si utilizza un compartimento denominato per eseguire la funzione e memorizzare l'immagine, assicurarsi che entrambi gli ID compartimento siano impostati in modo esplicito con i comandi OCI Cloud Shell seguenti. Anche il criterio IAM OCI appropriato deve essere configurato in modo da consentire le azioni tra OCIR e la funzione se provengono da compartimenti denominati diversi.fn update context oracle.image-compartment-id <compartment-ocid> fn update context oracle.compartment-id <compartment-ocid>
Se questo non viene fatto correttamente, si incorrerà in 403 errori cablati e poiché si potrebbe non essere nemmeno a conoscenza del
image-compartment-id
, è difficile trovare un indizio. -
Configurazione della funzione per l'uso di OCIR mentre OCI Cloud Shell viene avviata da un ambiente di rete accessibile a docker.io in quanto è necessario applicare le API docker per elaborare l'immagine e in genere una rete di servizi OCI non consentirà di ottenere l'accesso. Si consiglia di utilizzare la rete pubblica per la distribuzione dei container se si utilizza OCI Cloud Shell.
Per ulteriori informazioni, vedere Funzioni: Introduzione all'uso di Cloud Shell.
-
Un altro potenziale bloccante è quando si tenta di passare il messaggio di coda agli input della funzione. È possibile trovare più riferimenti in altri articoli su come passare la variabile, ma in realtà è semplice come inserire il json e ricevuto nell'oggetto data nel codice Python.
Nota: evitare di utilizzare il tipo json Javascript con l'utilizzo di virgolette singole o senza virgolette, poiché per ora solo la sintassi rigorosa potrebbe essere riconosciuta da OCI Queue.
{"name":"John"}
Collegamenti correlati
Conferme
- Autore - Henry Deng (Principal Solution Engineer)
Altre risorse di apprendimento
Esplora altri laboratori su docs.oracle.com/learn o accedi a più contenuti gratuiti sulla formazione su Oracle Learning YouTube channel. Inoltre, visita education.oracle.com/learning-explorer per diventare un Oracle Learning Explorer.
Per la documentazione del prodotto, visita l'Oracle Help Center.
Use OCI Functions and OCI Queue to Authorize User Capabilities without Exposing Admin Privilege to Approvers
G16876-03
October 2024