Remarques :

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.

Architecture de solution

Description de l'illustration SolutionArchitecture.png

Objectifs

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.

  1. Créez la file d'attente OCI pour les demandes entrantes. Pour plus d'informations, reportez-vous à Création d'une file d'attente.

  2. Créez la fonction OCI utilisée pour autoriser les utilisateurs. Pour plus d'informations, reportez-vous à la section Création de fonctions.

  3. 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.

  1. 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>'
    
  2. 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.

  3. Configurez le rôle de groupe dynamique Oracle Identity Cloud Service.

    Rôle de domaine IDCS

    Description de l'illustration DomainRole.png

  4. 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.

  1. 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"
    
  2. 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)
    
  3. 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
    
  4. 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)
    
  5. 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.

Envoyer un message

Description de l'image send-message.png

Examiner

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.

  1. 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, à savoir image-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.

  2. 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.

  3. 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"}
    

Remerciements

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.