Note:
- Este tutorial requiere acceso a Oracle Cloud. Para registrarse para obtener una cuenta gratuita, consulte Introducción a la cuenta gratuita de Oracle Cloud Infrastructure.
- Utiliza valores de ejemplo para credenciales, arrendamiento y compartimentos de Oracle Cloud Infrastructure. Al finalizar la práctica, sustituya estos valores por otros específicos de su entorno en la nube.
Uso de OCI Functions y OCI Queue para autorizar las capacidades de usuario sin exponer el privilegio de administración a los aprobadores
Introducción
La actualización de las capacidades de usuario es una necesidad clave para muchas empresas, especialmente cuando el permiso autorizado para los usuarios es confidencial, como la capacidad de la consola o la clave de API. Sin embargo, en la documentación de Oracle Cloud Infrastructure (OCI), solo los usuarios del grupo de administradores pueden autorizar la capacidad de usuario aunque haya políticas de Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) que lo permitan de forma explícita. Para obtener más información, consulte Gestión de usuarios.
En este tutorial se muestra una solución para el escenario en el que los usuarios no están en el grupo de administradores de un dominio de OCI IAM, pero aún necesitan tener la capacidad de autorizar las capacidades de usuario mediante la función recién lanzada de OCI Connector Hub para integrar OCI Queue y OCI Functions.
Descripción de la ilustración SolutionArchitecture.png
Objetivos
-
Autorice las capacidades de usuario aprovechando la función de integración de OCI Connector Hub entre OCI Queue y OCI Functions.
-
Descubre un enfoque nativo en la nube para desarrollar soluciones que disocien los privilegios para aprobar y ejecutar las solicitudes de los usuarios como una implementación de IAM detallada en OCI.
-
Descubra cómo gestionar usuarios mediante la API de python en OCI Functions.
-
Conozca el uso de grupos dinámicos para el uso de principios de autorización de recursos en OCI.
Tarea 1: Creación del canal de mensajes de OCI Queue a OCI Functions
La parte esencial de la solución es separar el permiso requerido cambiando las capacidades de usuario del permiso que el aprobador necesita para aprobar una solicitud.
-
Cree OCI Queue para las solicitudes entrantes. Para obtener más información, consulte Creación de una cola.
-
Cree la función de OCI utilizada para autorizar usuarios. Para obtener más información, consulte Creación de funciones.
-
Configurar la integración de OCI Queue y OCI Functions a través de OCI Connector Hub. Asegúrese de que el origen se especifica con la cola de OCI creada y de que el destino debe ser OCI Functions. Dejaremos la tarea opcional vacía en este tutorial. Para obtener más información, consulte Anuncio de la disponibilidad de OCI Queue como origen en OCI Connector Hub.
Tarea 2: Configuración de políticas y grupos dinámicos de OCI IAM
Después de haber dividido los roles del aprobador en OCI Queue para recibir las solicitudes y OCI Functions para ejecutar la solicitud, debemos configurar políticas estrictas de OCI IAM para garantizar que no se abuse del permiso. Desde que creamos esta solución para dar soporte a un cliente que insiste en utilizar el compartimento raíz para la implantación, realizaremos una demostración de todas las configuraciones del compartimento raíz para la parte de OCI IAM.
-
Permitir que solo el aprobador transfiera mensajes de cola a la cola de OCI de destino.
Allow group 'testApprover' to use queues in tenancy
Al agregar esta política, permitimos a los usuarios del grupo testApprover utilizar la cola para recibir las solicitudes de acceso a la consola. Podemos poner más limitaciones al grupo especificando solo el permiso en el tipo de recurso queue-push, como se muestra en el siguiente ejemplo.
use queue-push in compartment <compartment> where target.queue.id = '<queue_ocid>'
-
Configure el grupo dinámico para incluir OCI Functions especificando la siguiente regla de coincidencia.
ALL{resource.type='fnfunc',resource.id='ocid.fnfunc.oc1.....'}
A continuación, se autorizará a este grupo dinámico con un rol de Oracle Identity Cloud Service para gestionar los usuarios del dominio.
-
Configurar el rol de grupo dinámico de Oracle Identity Cloud Service.
-
Configure OCI Functions para que solo OCI Queue pueda llamar a él. En el siguiente ejemplo, solo se limita el origen de la llamada a las colas. En realidad, podemos hacerlo más estricto mediante el uso de etiquetas en los recursos. Para obtener más información, consulte Uso de etiquetas para gestionar el acceso.
Allow service faas to use functions-family in tenancy where request.principal.type='queues'
Tarea 3: Redacción del código de OCI Functions
Necesitamos componer un fragmento de código Python para que OCI Functions ejecute realmente la solicitud tomada de OCI Queue.
-
El mensaje de OCI Queue se transferirá a la función en el objeto 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"
-
Autenticar mediante la entidad de recurso.
Nota: Es posible que la siguiente línea de código no funcione en un IDE.
identity = IdentityClient({}, signer=oci.auth.signers.get_resource_principals_signer(), region=region)
-
Convierta el correo electrónico de usuario transferido al usuario Oracle Cloud Identifier (OCID).
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
-
Actualice la capacidad de usuario con la entidad de recurso mediante la función 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)
-
Despliegue el código de función en la función OCI que acabamos de crear. Para obtener pasos detallados sobre el despliegue de una función de OCI, consulte Notas de configuración para OCI Functions
Tarea 4: Prueba de los cambios
Pruebe los cambios enviando un mensaje a la cola de destino. Podemos utilizar la consola de OCI o cualquier SDK, incluido OCI Cloud Shell.
Descripción de la ilustración send-message.png
Descripción de la ilustración examine.png
Solución de problemas
Configuración de OCI Function para utilizar OCIR
Si está utilizando OCIR como repositorio de la función OCI, es posible que un par de problemas lo estén bloqueando y no es tan fácil encontrar una resolución como, por ahora, no se prueba ninguna guía clara específicamente para evitar dichos problemas.
-
Configurar un compartimento específico para el repositorio de OCIR y para la función OCI como contexto de función. Por defecto, el contexto del repositorio de OCIR apunta al compartimento raíz incluso si sigue la página de instrucciones de la consola que se ejecuta debajo de los comandos de Cloud Shell.
fn update context oracle.compartment-id ocid1.tenancy.oc1.....
Nota: Esta parte es bastante engañosa, ya que con
oracle.compartment-id
, hace que la gente piense que esta propiedad es tanto para la función como para OCIR. Sin embargo, tenemos una propiedad separada para OCIR, que esimage-compartment-id
. Por lo tanto, si utiliza un compartimento con nombre para ejecutar la función y almacenar la imagen, asegúrese de que ambos ID de compartimento estén definidos explícitamente con los siguientes comandos de OCI Cloud Shell. También se debe configurar la política de OCI IAM adecuada para permitir las acciones entre OCIR y la función si son de diferentes compartimentos con nombre.fn update context oracle.image-compartment-id <compartment-ocid> fn update context oracle.compartment-id <compartment-ocid>
En caso de que esto no se haga correctamente, se encontrará con errores 403 cableados y como es posible que ni siquiera tenga en cuenta
image-compartment-id
, es difícil encontrar una pista. -
Configurar la función para utilizar OCIR mientras OCI Cloud Shell se inicia desde un entorno de red al que puede acceder docker.io, ya que debemos aplicar las API de docker para procesar la imagen y, normalmente, una red de servicio de OCI no le permitirá obtener acceso. Le sugerimos que utilice la red pública para el despliegue de contenedores si utiliza OCI Cloud Shell.
Para obtener más información, consulte Functions: Get Started using Cloud Shell.
-
Otro posible bloqueador aquí es cuando intenta transferir el mensaje de cola a las entradas de la función. Se pueden encontrar varias referencias en otros artículos sobre cómo transferir la variable, pero en realidad es tan simple como introducir el json y recibirlo en el objeto data en el código Python.
Nota: Evite utilizar el tipo json de Javascript con comillas simples o sin comillas, ya que, por ahora, OCI Queue solo podría reconocer la sintaxis estricta.
{"name":"John"}
Enlaces relacionados
Agradecimientos
- Autor: Henry Deng (ingeniero principal de soluciones)
Más recursos de aprendizaje
Explore otros laboratorios en docs.oracle.com/learn o acceda a más contenido de formación gratuita en el canal YouTube de Oracle Learning. Además, visita education.oracle.com/learning-explorer para convertirte en un Oracle Learning Explorer.
Para obtener documentación sobre el producto, visite Oracle Help Center.
Use OCI Functions and OCI Queue to Authorize User Capabilities without Exposing Admin Privilege to Approvers
G16873-03
October 2024