Remarques :
- Ce tutoriel nécessite un accès à Oracle Cloud. Pour vous inscrire à un compte gratuit, reportez-vous à Introduction au niveau gratuit d'Oracle Cloud Infrastructure.
- Il utilise des exemples de valeurs pour les informations d'identification, la location et les compartiments Oracle Cloud Infrastructure. Lorsque vous terminez votre atelier, remplacez ces valeurs par celles propres à votre environnement cloud.
Utiliser OCI Functions et OCI Queue pour autoriser les fonctionnalités utilisateur sans exposer de privilège d'administration aux approbateurs
Introduction
La mise à jour des fonctionnalités utilisateur est un besoin essentiel pour de nombreuses entreprises, en particulier lorsque les droits d'accès autorisés aux utilisateurs sont sensibles, comme la fonctionnalité de console ou la clé d'API. Toutefois, pour autant que nous ayons trouvé dans la documentation Oracle Cloud Infrastructure (OCI), seuls les utilisateurs du groupe d'administrateurs peuvent autoriser la capacité utilisateur même lorsqu'il existe des stratégies Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) qui l'autorisent explicitement. Pour plus d'informations, reportez-vous à Gestion des utilisateurs.
Ce tutoriel présente une solution pour le scénario dans lequel les utilisateurs ne font pas partie du groupe d'administrateurs d'un domaine OCI IAM, mais doivent tout de même avoir la capacité d'autoriser les fonctionnalités utilisateur en utilisant la nouvelle fonctionnalité d'OCI Connector Hub pour intégrer OCI Queue et OCI Functions.
Description de l'illustration SolutionArchitecture.png
Objectifs
-
Autorisez les fonctionnalités utilisateur en tirant parti de la fonctionnalité d'intégration d'OCI Connector Hub entre OCI Queue et OCI Functions.
-
Découvrez une approche native du cloud pour développer des solutions permettant de découpler les privilèges d'approbation et d'exécution des demandes utilisateur dans le cadre d'une implémentation IAM affinée sur OCI.
-
Découvrez comment gérer les utilisateurs à l'aide de l'API python dans OCI Functions.
-
Découvrez l'utilisation des groupes dynamiques pour l'utilisation des principes d'autorisation des ressources sur OCI.
Tâche 1 : création du canal de messagerie à partir de la file d'attente OCI vers OCI Functions
La partie essentielle de la solution consiste à découpler les autorisations requises en modifiant les capacités des utilisateurs des autorisations dont l'approbateur a besoin pour approuver une demande.
-
Créez la file d'attente OCI pour les demandes entrantes. Pour plus d'informations, reportez-vous à Création d'une file d'attente.
-
Créez la fonction OCI utilisée pour autoriser les utilisateurs. Pour plus d'informations, reportez-vous à la section Création de fonctions.
-
Configurez l'intégration d'OCI Queue et d'OCI Functions via OCI Connector Hub. Assurez-vous que la source est indiquée avec la file d'attente OCI créée et que la cible doit être OCI Functions. Nous allons laisser la tâche facultative vide dans ce tutoriel. Pour plus d'informations, reportez-vous à Annonce de la disponibilité d'OCI Queue en tant que source dans OCI Connector Hub.
Tâche 2 : configuration des stratégies OCI IAM et du groupe dynamique
Après avoir fractionné les rôles de l'approbateur dans la file d'attente OCI pour recevoir les demandes et les fonctions OCI pour exécuter la demande, nous devons configurer des stratégies OCI IAM strictes pour nous assurer que le droit d'accès n'est pas abusé. Etant donné que nous avons créé cette solution pour prendre en charge un client qui insiste pour utiliser le compartiment racine pour l'implémentation, nous ferons une démonstration de toutes les configurations du compartiment racine pour la partie OCI IAM.
-
Autorisez uniquement l'approbateur à propager les messages de file d'attente vers la file d'attente OCI cible.
Allow group 'testApprover' to use queues in tenancy
En ajoutant cette stratégie, nous autorisons les utilisateurs du groupe testApprover à utiliser la file d'attente pour recevoir les demandes d'accès à la console. Nous pouvons imposer davantage de limites au groupe en spécifiant uniquement le droit d'accès sur le type de ressource queue-push, comme indiqué dans l'exemple ci-dessous.
use queue-push in compartment <compartment> where target.queue.id = '<queue_ocid>'
-
Configurez le groupe dynamique pour inclure OCI Functions en indiquant la règle de mise en correspondance suivante.
ALL{resource.type='fnfunc',resource.id='ocid.fnfunc.oc1.....'}
Ce groupe dynamique sera ensuite autorisé avec un rôle Oracle Identity Cloud Service à gérer les utilisateurs dans le domaine.
-
Configurez le rôle de groupe dynamique Oracle Identity Cloud Service.
-
Configurez les fonctions OCI pour qu'elles puissent uniquement être appelées par la file d'attente OCI. L'exemple suivant limite uniquement la source de l'appel aux files d'attente. En fait, nous pouvons le rendre plus strict en utilisant des balises sur les ressources. Pour plus d'informations, reportez-vous à Utilisation des balises pour gérer l'accès.
Allow service faas to use functions-family in tenancy where request.principal.type='queues'
Tâche 3 : composition du code OCI Functions
Nous devons composer un morceau de code Python pour que les fonctions OCI exécutent réellement la demande provenant de la file d'attente OCI.
-
Le message de file d'attente OCI sera transmis à la fonction dans l'objet 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"
-
Authentifiez-vous à l'aide du principal de ressource.
Remarque : la ligne de code suivante peut ne pas fonctionner dans un IDE.
identity = IdentityClient({}, signer=oci.auth.signers.get_resource_principals_signer(), region=region)
-
Convertissez l'adresse électronique de l'utilisateur transmise en OCID (identificateur Oracle Cloud) de l'utilisateur.
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
-
Mettez à jour la capacité utilisateur avec le principal de ressource à l'aide de la fonction 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)
-
Déployez le code de la fonction dans la fonction OCI que nous venons de créer. Pour connaître les étapes détaillées du déploiement d'une fonction OCI, reportez-vous à Notes de configuration pour OCI Functions.
Tâche 4 : tester les modifications
Testez les modifications en envoyant un message à la file d'attente cible. Nous pouvons utiliser la console OCI ou n'importe quel kit SDK, y compris OCI Cloud Shell.
Description de l'image send-message.png
Description de l'illustration examine.png
Dépannage
Configuration de la fonction OCI pour utiliser OCIR
Si vous utilisez OCIR comme référentiel de la fonction OCI, quelques problèmes peuvent vous bloquer et il n'est pas si facile de trouver une solution que pour l'instant, aucun guide clair n'est prouvé spécifiquement pour éviter de tels problèmes.
-
Configuration d'un compartiment spécifique pour le référentiel OCIR et pour la fonction OCI en tant que contexte de fonction. Par défaut, le contexte du référentiel OCIR pointe vers le compartiment racine même si vous suivez la page d'instructions de la console pour l'exécuter sous les commandes cloud shell.
fn update context oracle.compartment-id ocid1.tenancy.oc1.....
Remarque : cette partie est assez trompeuse car avec
oracle.compartment-id
, les utilisateurs pensent que cette propriété est destinée à la fonction et à OCIR. Cependant, nous disposons d'une propriété distincte pour OCIR, à savoirimage-compartment-id
. Par conséquent, si vous utilisez un compartiment nommé pour exécuter la fonction et stocker l'image, assurez-vous que les deux ID de compartiment sont explicitement définis avec les commandes OCI Cloud Shell suivantes. La stratégie OCI IAM appropriée doit également être configurée pour autoriser les actions entre OCIR et la fonction si elles proviennent de différents compartiments nommés.fn update context oracle.image-compartment-id <compartment-ocid> fn update context oracle.compartment-id <compartment-ocid>
Si cela n'est pas fait correctement, vous rencontrerez des erreurs 403 câblées et comme vous n'êtes peut-être même pas au courant de
image-compartment-id
, il est difficile de trouver un indice. -
Configuration de la fonction pour qu'elle utilise OCIR pendant le lancement d'OCI Cloud Shell à partir d'un environnement réseau accessible à docker.io, car nous devons appliquer des API docker pour traiter l'image. En général, un réseau de service OCI ne vous permet pas d'obtenir l'accès. Nous vous suggérons d'utiliser le réseau public pour le déploiement de conteneurs si vous utilisez OCI Cloud Shell.
Pour plus d'informations, reportez-vous à Functions : démarrage à l'aide de Cloud Shell.
-
Un autre bloqueur potentiel est lorsque vous essayez de transmettre le message de file d'attente aux entrées de fonction. Plusieurs références peuvent être trouvées sur d'autres articles sur la façon de transmettre la variable, mais il est en fait aussi simple que d'entrer le json et reçu dans l'objet data en code Python.
Remarque : évitez d'utiliser le type Javascript json avec des apostrophes ou sans guillemets car pour l'instant, seule la syntaxe stricte peut être reconnue par la file d'attente OCI.
{"name":"John"}
Liens connexes
Remerciements
- Auteur - Henry Deng (Ingénieur solutions principal)
Ressources de formation supplémentaires
Explorez d'autres ateliers sur docs.oracle.com/learn ou accédez à d'autres contenus de formation gratuits sur le canal Oracle Learning YouTube. De plus, visitez le site education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.
Pour obtenir la documentation produit, consultez le site Oracle Help Center.
Use OCI Functions and OCI Queue to Authorize User Capabilities without Exposing Admin Privilege to Approvers
G16875-03
October 2024