Note :

Utiliser le service des fonctions pour OCI et la file d'attente pour OCI pour autoriser les capacités d'utilisateur sans exposer le privilège d'administration aux approbateurs

Présentation

La mise à jour des capacités d'utilisateur est un besoin clé pour de nombreuses entreprises, en particulier lorsque l'autorisation autorisée pour les utilisateurs est sensible comme la capacité de la console ou la clé d'API. Toutefois, selon ce que nous avons trouvé dans la documentation sur Oracle Cloud Infrastructure (OCI), seuls les utilisateurs du groupe d'administrateurs peuvent autoriser les fonctions d'utilisateur, même si des politiques Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) l'autorisent explicitement. Pour plus d'informations, voir Gestion des utilisateurs.

Ce tutoriel présente une solution pour le scénario où les utilisateurs ne font pas partie du groupe d'administrateurs d'un domaine IAM OCI, mais doivent avoir la capacité d'autoriser les capacités d'utilisateur en utilisant la nouvelle fonction du centre de connecteurs OCI pour intégrer la file d'attente OCI et le service des fonctions pour OCI.

Architecture de la solution

Description de l'illustration SolutionArchitecture.png

Objectifs

Tâche 1 : Créer le canal de messagerie de la file d'attente OCI au service des fonctions pour OCI

La partie essentielle de la solution consiste à dissocier l'autorisation requise par la modification des capacités de l'utilisateur de l'autorisation 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, voir Création d'une file d'attente.

  2. Créez la fonction OCI utilisée pour autoriser les utilisateurs. Pour plus d'informations, voir Création de fonctions.

  3. Configurez l'intégration de la file d'attente OCI et du service des fonctions pour OCI au moyen du centre de connecteurs OCI. Assurez-vous que la source est spécifiée avec la file d'attente OCI créée et que la cible doit être le service des fonctions pour OCI. Nous laisserons la tâche facultative vide dans ce tutoriel. Pour plus d'informations, voir Présentation de la disponibilité de la file d'attente OCI en tant que source dans le centre de connecteurs OCI.

Tâche 2 : Configurer les politiques IAM OCI et le groupe dynamique

Après avoir fractionné les rôles de l'approbateur dans la file d'attente OCI pour prendre en charge les demandes et le service des fonctions pour OCI pour exécuter la demande, nous devons configurer des politiques OCI IAM strictes pour nous assurer que l'autorisation n'est pas abusée. Puisque nous avons créé cette solution pour prendre en charge un client qui insiste pour utiliser le compartiment racine pour la mise en oeuvre, nous présenterons toutes les configurations du compartiment racine pour la partie IAM d'OCI.

  1. Autoriser uniquement l'approbateur à pousser les messages de file d'attente dans la file d'attente OCI cible.

    Allow group 'testApprover' to use queues in tenancy
    

    En ajoutant cette politique, nous autorisons les utilisateurs du groupe testApprover à utiliser la file d'attente pour recevoir les demandes d'accès à la console. Nous sommes en mesure de mettre plus de limites sur le groupe en spécifiant seulement l'autorisation 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 le service des fonctions pour OCI en spécifiant la règle de correspondance suivante.

    ALL{resource.type='fnfunc',resource.id='ocid.fnfunc.oc1.....'}
    

    Ce groupe dynamique sera alors autorisé avec un rôle Oracle Identity Cloud Service à gérer les utilisateurs du domaine.

  3. Configurer le rôle Oracle Identity Cloud Service du groupe dynamique.

    Rôle du domaine IDCS

    Description de l'illustration DomainRole.png

  4. Configurez le service des fonctions pour OCI afin qu'il puisse uniquement être appelé par la file d'attente OCI. L'exemple suivant ne limite la source de l'appel qu'aux files d'attente, nous pouvons en fait le rendre plus strict en utilisant des marqueurs sur les ressources. Pour plus d'informations, voir Utilisation des marqueurs pour gérer l'accès

    Allow service faas to use functions-family in tenancy where request.principal.type='queues'
    

Tâche 3 : Composer le code du service des fonctions pour OCI

Nous devons composer un morceau de code Python pour le service des fonctions pour OCI afin d'exécuter la demande provenant de la file d'attente OCI.

  1. Le message de file d'attente OCI sera transmis à la fonction dans l'objet de données.

    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.

    Note : Il est possible que la ligne de code suivante ne fonctionne pas dans un environnement IDE.

    identity = IdentityClient({}, signer=oci.auth.signers.get_resource_principals_signer(), region=region)
    
  3. Convertissez le courriel de l'utilisateur transmis en identificateur Oracle Cloud (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
    
  4. Mettez à jour la capacité de l'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 fonction dans la fonction OCI que nous venons de créer. Pour les étapes détaillées du déploiement d'une fonction OCI, voir Notes de configuration pour le service des fonctions pour OCI

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 toute trousse SDK, y compris OCI Cloud Shell.

Send Message

Description de l'illustration 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 résolution que pour le moment, 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écution sous les commandes de l'interpréteur de commandes en nuage.

    fn update context oracle.compartment-id ocid1.tenancy.oc1.....
    

    Note : Cette partie est assez trompeuse, car avec oracle.compartment-id, les gens pensent que cette propriété est à la fois pour la fonction et pour OCIR. Toutefois, nous avons une propriété distincte pour OCIR, qui est image-compartment-id. Donc, si vous utilisez un compartiment nommé pour exécuter votre fonction et stocker votre image, assurez-vous que les deux ID compartiment sont explicitement définis avec les commandes OCI Cloud Shell suivantes. Une politique IAM OCI appropriée doit également être configurée pour autoriser les actions entre OCIR et la fonction si elles proviennent de compartiments nommés différents.

    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 utiliser OCIR pendant que Cloud Shell pour OCI est lancé à partir d'un environnement réseau accessible à l'adresse docker.io, car nous devons appliquer des API docker pour traiter l'image et, généralement, un réseau de services OCI ne vous permet pas d'y accéder. 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, voir Fonctions : Démarrer à l'aide de Cloud Shell.

  3. Un autre bloqueur potentiel ici 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 fichier json et reçu dans l'objet de données en code Python.

    Note : Évitez d'utiliser le type Javascript json avec des guillemets simples ou sans guillemets, car pour le moment, seule la syntaxe stricte a pu être reconnue par la file d'attente OCI.

    {"name":"John"}
    

Confirmation

Autres ressources d'apprentissage

Explorez d'autres laboratoires sur la page docs.oracle.com/learn ou accédez à plus de contenu d'apprentissage gratuit sur le canal YouTube d'Oracle Learning. De plus, visitez education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

Pour obtenir de la documentation sur le produit, visitez Oracle Help Center.