Appel de services à partir d'une instance

Cette rubrique explique comment autoriser des instances à appeler des services dans Oracle Cloud Infrastructure.

Introduction

Cette procédure explique comment autoriser une instance à effectuer des appels d'API dans les services Oracle Cloud Infrastructure. Après avoir configuré les ressources et les stratégies requises, une application exécutée sur une instance peut appeler des services publics Oracle Cloud Infrastructure. Ainsi, vous n'avez pas besoin de configurer des informations d'identification utilisateur ou un fichier de configuration.

Concepts

Groupe dynamique
Les groupes dynamiques vous permettent de regrouper des instances Oracle Cloud Infrastructure en tant qu'acteurs principaux, semblables à des groupes d'utilisateurs. Vous pouvez ensuite créer des stratégies permettant aux instances de ces groupes d'effectuer des appels d'API vers les services Oracle Cloud Infrastructure. L'appartenance au groupe est déterminée par un ensemble de critères que vous définissez, appelé règles de mise en correspondance.
Règle de mise en correspondance
Lorsque vous configurez un groupe dynamique, vous définissez également les règles d'appartenance au groupe. Les ressources qui répondent aux critères de règle sont membres du groupe dynamique. Les règles de mise en correspondance ont une syntaxe spécifique que vous devez suivre. Reportez-vous à Ecriture de règles de mise en correspondance pour définir des groupes dynamiques.
Principaux d'instance
Fonctionnalité du service IAM permettant aux instances d'être des acteurs autorisés (ou des principaux) pour effectuer des actions sur les ressources de service. Chaque instance de calcul possède sa propre identité et est authentifiée à l'aide des certificats qui lui sont ajoutés. Ces certificats sont créés et affectés aux instances, et font également l'objet d'une rotation, le tout de façon automatique. Cela vous évite d'avoir à diffuser les informations d'identification aux hôtes et d'effectuer leur rotation.

Remarques concernant la sécurité

Tout utilisateur ayant accès à l'instance (via une connexion SSH) hérite automatiquement des privilèges octroyés à celle-ci. Avant d'accorder des droits d'accès à une instance à l'aide de cette procédure, assurez-vous que vous savez quels utilisateurs peuvent y accéder et qu'ils doivent être autorisés avec les droits d'accès accordés à l'instance.

Tous les principaux d'instance de calcul bénéficient du droit d'accès compartment_inspect. Vous ne pouvez pas révoquer ce droit d'accès. Ce droit d'accès permet à l'instance d'effectuer l'opération ListCompartments dans la location afin d'extraire les informations suivantes :

Présentation du processus

Les étapes suivantes récapitulent le flux de processus permettant de configurer et d'utiliser des instances en tant que principaux. Les sections suivantes fournissent d'autres détails.

  1. Créer un groupe dynamique. Dans la définition du groupe dynamique, vous fournissez les règles de mise en correspondance afin d'indiquer les instances autorisées à effectuer des appels d'API vers les services.

  2. Créez une stratégie octroyant au groupe dynamique des droits d'accès aux services de votre location (ou compartiment).

  3. Un développeur de votre organisation configure l'application créée avec le kit SDK Oracle Cloud Infrastructure pour effectuer l'authentification à l'aide du fournisseur de principaux d'instance. Le développeur déploie l'application et le kit SDK sur toutes les instances appartenant au groupe dynamique.

  4. Le kit SDK déployé effectue des appels vers les API Oracle Cloud Infrastructure comme autorisé par la stratégie (sans avoir à configurer des informations d'identification d'API).

  5. Pour chaque appel d'API effectué par une instance, le service Audit consigne l'événement, en enregistrant l'OCID de l'instance en tant que valeur de principalId dans le journal des événements. Pour plus d'informations, reportez-vous à Contenu d'un événement de journal d'audit.

Etapes pour permettre aux instances d'appeler des services

Ecriture de stratégies pour les groupes dynamiques

Après avoir créé un groupe dynamique, vous devez créer des stratégies afin de lui permettre d'accéder aux services Oracle Cloud Infrastructure.

Les stratégies pour les groupes dynamiques suivent la syntaxe décrite dans Fonctionnement des stratégies. Consultez cette rubrique pour comprendre les fonctionnalités de base des stratégies.

La syntaxe permettant à un groupe dynamique d'accéder aux ressources d'un compartiment est la suivante :

Allow dynamic-group <dynamic_group_name> to <verb> <resource-type> in compartment <compartment_name>

La syntaxe permettant à un groupe dynamique d'accéder à une location est la suivante :

Allow dynamic-group <dynamic_group_name> to <verb> <resource-type> in tenancy

Voici quelques exemples de stratégie :

Pour autoriser un groupe dynamique (FrontEnd) à utiliser un équilibreur de charge dans un compartiment spécifique (ProjectA), suivez l'exemple ci-après :

Allow dynamic-group FrontEnd to use load-balancers in compartment ProjectA

Pour autoriser un groupe dynamique à lancer des instances dans un compartiment spécifique, suivez l'exemple ci-après :

Allow dynamic-group FrontEnd to manage instance-family in compartment ProjectA
Allow dynamic-group FrontEnd to use volume-family in compartment ProjectA
Allow dynamic-group FrontEnd to use virtual-network-family in compartment ProjectA

Pour obtenir d'autres exemples de stratégie, reportez-vous à Stratégies courantes.

Configuration du kit SDK, de l'interface de ligne de commande ou de Terraform

Pour plus d'informations sur les kits SDK, reportez-vous à Kits SDK et interface de ligne de commande.

Kit SDK pour Java :

Dans le kit SDK pour Java, créez un objet InstancePrincipalsAuthenticationDetailsProvider. Par exemple :

public static void main(String[] args) throws Exception {

   InstancePrincipalsAuthenticationDetailsProvider provider =

      InstancePrincipalsAuthenticationDetailsProvider.builder().build();

   IdentityClient identityClient = new IdentityClient(provider);

...

Pour le kit SDK Python :

Dans votre kit SDK Python, créez un objet oci.auth.signers.InstancePrincipalsSecurityTokenSigner. Par exemple :

# By default this will hit the auth service in the region returned by http://169.254.169.254/opc/v1/instance/region on the instance.
			
signer = oci.auth.signers.InstancePrincipalsSecurityTokenSigner()
identity_client = oci.identity.IdentityClient(config={}, signer=signer)

...

Pour actualiser le jeton sans attendre, utilisez la commande suivante :

signer.refresh_security_token()

Activation de l'autorisation de principal d'instance pour l'interface de ligne de commande

Pour activer l'autorisation de principal d'instance à partir de l'interface de ligne de commande, vous pouvez définir l'option d'autorisation (--auth) pour une commande. Par exemple :

oci os ns get --auth instance_principal

Vous pouvez également définir la variable d'environnement suivante :

OCI_CLI_AUTH=instance_principal

Si les deux sont définies, la valeur définie pour --auth est prioritaire sur la variable d'environnement.

Pour plus d'informations sur l'interface de ligne de commande, reportez-vous à Utilisation de l'interface de ligne de commande.

Activation de l'autorisation de principal d'instance pour Terraform

Pour activer l'autorisation de principal d'instance dans Terraform, vous pouvez définir l'attribut auth sur "InstancePrincipal" dans la définition de fournisseur, comme indiqué dans l'exemple suivant :

variable "region" {}

provider "oci" {
   auth = "InstancePrincipal"  
   region = "${var.region}"

}

Lorsque vous utilisez l'autorisation de principal d'instance, vous n'avez pas besoin d'inclure les attributs tenancy_ocid, user_ocid, fingerprint et private_key_path.

Foire aux questions

Comment interroger le service de métadonnées d'instance pour interroger le certificat sur l'instance ?

Utilisez cette commande cURL : curl http://169.254.169.254/opc/v1/identity/cert.pem

Quelle est la fréquence de rotation du certificat sur chaque instance ?

Le certificat fait l'objet d'une rotation plusieurs fois par jour.

Que se passe-t-il si j'obtiens une erreur 401-Not Authenticated ?
Si vous recevez une erreur 401-Not Authenticated, vérifiez les problèmes suivants :
  • Essayez d'exécuter à nouveau la commande. Parfois, la rotation du certificat et la demande se produisent en même temps.
  • Le certificat a peut-être expiré. Vérifiez que le certificat est valide.
Puis-je modifier la fréquence de rotation du certificat ?

Non. Vous ne pouvez pas modifier la fréquence de rotation du certificat. Cependant, vous pouvez modifier la stratégie sur le groupe dynamique. Si vous pensez qu'une instance a été compromise, vous pouvez modifier la stratégie sur le groupe dynamique afin de révoquer les droits d'accès pour tous les membres du groupe, ou enlever l'instance du groupe dynamique. Reportez-vous à Puis-je enlever une instance d'un groupe dynamique ?

Que se passe-t-il en cas de rotation du certificat alors qu'une opération longue est en cours d'exécution ?

L'expiration du jeton est indépendante de la période d'expiration du certificat. De plus, elle dépend également de l'application avec laquelle vous interagissez. Par exemple, si Object Storage ne dispose pas d'opération PUT multipart, la durée d'exécution de l'opération n'a pas d'importance.

Les certificats sont-ils accessibles pour tous les utilisateurs sur une instance ?

Oui. Assurez-vous que seuls les utilisateurs devant disposer de l'accès que vous avez accordé au groupe dynamique ont accès à l'instance.

Puis-je enlever une instance d'un groupe dynamique ?

Oui. Vous pouvez l'enlever en modifiant la règle de mise en correspondance afin de l'exclure. Reportez-vous à l'exemple ci-dessous.

Puis-je exclure des instances spécifiques situées dans un compartiment du groupe dynamique ?

Oui. Par exemple, supposons que vous voulez exclure deux instances spécifiques d'un compartiment du groupe dynamique. Ecrivez une règle de mise en correspondance comme suit :

All {instance.compartment.id = '<compartment_ocid>',
 instance.id != '<instance1_to_exclude_ocid>', instance.id != '<instance2_to_exclude_ocid>'}

La règle ci-dessus inclut toutes les instances dans le compartiment, sauf celles ayant les OCID indiqués.