Fonctionnalités de stratégie avancées

Cette section décrit les fonctionnalités de langage de stratégie qui vous permettent d'accorder un accès plus granulaire.

Conditions

Dans le cadre d'une instruction de stratégie, vous pouvez spécifier des conditions qui doivent être remplies pour que l'accès soit accordé.

Chaque condition se compose d'au moins une variable prédéfinie pour laquelle vous indiquez des valeurs dans l'instruction de stratégie. Par la suite, lorsqu'une personne demande l'accès à la ressource en question, si la condition de la stratégie est remplie, elle renvoie la valeur True et la demande est autorisée. Si la condition n'est pas remplie, elle renvoie la valeur False et la demande n'est pas autorisée.

Il existe deux types de variable : celles qui sont pertinentes pour la demande elle-même et celles portant sur la ressource faisant l'objet d'une action dans la demande, également connue sous le nom de cible. Le préfixe request ou target est ajouté au nom de la variable en conséquence, suivi d'un point. Par exemple, il existe une variable de demande appelée request.operation pour représenter l'opération d'API demandée. Cette variable vous permet d'écrire une instruction de stratégie générale, mais d'ajouter une condition basée sur l'opération d'API spécifique. Pour obtenir un exemple, reportez-vous à Autoriser les utilisateurs à écrire des objets dans des buckets Object Storage.

Important

La mise en correspondance de conditions ne tient pas compte de la casse. Gardez ce point à l'esprit lorsque vous écrivez des conditions pour les types de ressource qui utilisent la dénomination avec respect de la casse. Par exemple, le service Object Storage permet de créer un bucket nommé "BucketA" et un bucket nommé "bucketA" dans le même compartiment. Si vous écrivez une condition indiquant "BucketA", elle s'appliquera également à "bucketA" car la mise en correspondance de conditions ne fait pas la distinction entre les majuscules et les minuscules.

Variables non applicables à une demande donnant lieu au refus de la demande

Si la variable n'est pas applicable à la demande entrante, la condition renvoie la valeur False et la demande est refusée. Par exemple, voici les instructions de stratégie de base qui, ensemble, permettent à une personne d'ajouter des utilisateurs à n'importe quel groupe, à l'exception du groupe d'administrateurs, ou d'en enlever :

Allow group GroupAdmins to use users in tenancy 
 where target.group.name != 'Administrators'

Allow group GroupAdmins to use groups in tenancy 
 where target.group.name != 'Administrators'

Compte tenu de la stratégie ci-dessus, si GroupAdmins tentait d'appeler une opération d'API générale pour des utilisateurs telle que ListUsers ou UpdateUser (qui permet de modifier la description de l'utilisateur), la demande serait refusée, même si ces opérations d'API sont couvertes par use users. Cela s'explique par le fait que l'instruction de stratégie ci-dessus pour use users comprend également la variable target.group.name, alors que la demande ListUsers ou UpdateUser n'implique pas d'indiquer un groupe. Aucune variable target.group.name n'existe pour ces demandes. Par conséquent, la demande est refusée.

Si vous souhaitez également autoriser l'accès aux opérations d'API utilisateur générales qui n'impliquent pas de groupe particulier, vous avez besoin d'une instruction supplémentaire donnant le niveau d'accès à accorder, mais sans la condition. Par exemple, si vous souhaitez accorder l'accès à ListUsers, vous avez besoin de l'instruction supplémentaire suivante :

Allow group GroupAdmins to inspect users in tenancy

Si vous souhaitez octroyer un accès à UpdateUser, vous avez besoin de cette instruction supplémentaire (qui couvre également ListUsers car le verbe use inclut les capacités du verbe inspect) :

Allow group GroupAdmins to use users in tenancy

Ce concept général s'applique également aux groupes (par exemple, ListGroups et UpdateGroup), ainsi qu'à tout autre type de ressource comportant des variables cible.

Pour plus d'informations sur la syntaxe des conditions, reportez-vous à Conditions. Pour obtenir la liste de toutes les variables que vous pouvez utiliser dans les stratégies, reportez-vous aux tableaux dans Référence de stratégie.

Contrôle d'accès basé sur des balises

A l'aide de conditions et d'un ensemble de variables de balise, vous pouvez écrire une stratégie pour attribuer l'accès en fonction des balises appliquées à une ressource. L'accès peut être contrôlé à l'aide d'une balise qui existe sur la ressource demandeuse (groupe ou groupe dynamique dans la stratégie) ou sur la cible de la demande (ressource ou compartiment). Le contrôle d'accès basé sur des balises offre une plus grande flexibilité à vos stratégies en vous permettant de définir un accès englobant des compartiments, des groupes et des ressources. Pour plus d'informations sur l'écriture de stratégies destinées à attribuer l'accès en fonction des balises, reportez-vous à Utilisation des balises pour gérer l'accès.

Droits d'accès

Les droits d'accès sont des unités d'autorisation atomiques qui contrôlent la capacité d'un utilisateur à effectuer des opérations sur des ressources. Oracle définit tous les droits d'accès dans le langage de stratégie. Lorsque vous écrivez une stratégie donnant à un groupe l'accès à un verbe et à un type de ressource particuliers, vous lui donnez en fait accès à des droits d'accès prédéfinis. L'objectif des verbes est de simplifier le processus d'octroi de plusieurs droits d'accès associés qui couvrent un large ensemble d'accès ou un scénario opérationnel spécifique. Les sections suivantes donnent des exemples et plus de détails.

Relation avec les verbes

Pour comprendre la relation entre les droits d'accès et les verbes, examinons un exemple. Une instruction de stratégie qui autorise un groupe à inspecter des volumes (inspect volumes) lui permet en réalité d'accéder à un droit appelé VOLUME_INSPECT (les droits d'accès sont toujours écrits entièrement en lettres majuscules et avec des traits de soulignement). En général, ce droit d'accès permet à l'utilisateur d'obtenir des informations sur les volumes de blocs.

Chaque fois que vous passez d'un verbe à un autre (inspect > read > use > manage), en général, le niveau d'accès augmente et les droits d'accès accordés sont cumulés. Le tableau suivant indique les droits d'accès inclus avec chaque verbe pour le type de ressource volumes. Aucun droit d'accès supplémentaire n'est accordé pour le passage du verbe inspect au verbe read.

Inspecter les volumes Lire les volumes Utiliser les volumes Gérer les volumes
VOLUME_INSPECT VOLUME_INSPECT

VOLUME_INSPECT

VOLUME_UPDATE

VOLUME_WRITE

VOLUME_INSPECT

VOLUME_UPDATE

VOLUME_WRITE

VOLUME_CREATE

VOLUME_DELETE

La référence de stratégie répertorie les droits d'accès couverts par chaque verbe pour chaque type de ressource donné. Par exemple, pour les volumes de blocs et les autres ressources couvertes par les services de base, reportez-vous aux tableaux dans Détails des combinaisons de verbe et de type de ressource. La colonne de gauche de chaque tableau répertorie les droits d'accès couverts par chaque verbe. Les autres sections de la référence de stratégie incluent le même type d'informations pour les autres services.

Relation avec les opérations d'API

Chaque opération d'API nécessite que l'appelant ait accès à des droits d'accès. Par exemple, pour utiliser ListVolumes ou GetVolume, vous devez avoir accès à un seul droit : VOLUME_INSPECT. Pour attacher un volume à une instance, vous devez avoir accès à plusieurs droits d'accès, dont certains sont liés au type de ressource volumes, d'autres au type de ressource volume-attachments et d'autres encore au type de ressource instances :

  • VOLUME_WRITE
  • VOLUME_ATTACHMENT_CREATE
  • INSTANCE_ATTACH_VOLUME

La référence de stratégie répertorie les droits d'accès requis pour chaque opération d'API. Par exemple, pour les opérations d'API de services de base, reportez-vous au tableau dans Droits d'accès requis pour chaque opération d'API.

Présentation de l'accès d'un utilisateur

Le langage de stratégie est conçu pour vous permettre d'écrire des instructions simples impliquant uniquement des verbes et des types de ressource, sans avoir à indiquer les droits d'accès souhaités. Toutefois, dans certains cas, un membre ou un auditeur de l'équipe de sécurité peut vouloir comprendre les droits d'accès spécifiques dont dispose un utilisateur donné. Les tableaux de la référence de stratégie présentent chaque verbe et les droits d'accès associés. Vous pouvez consulter les groupes auxquels appartient l'utilisateur ainsi que les stratégies applicables à ces groupes, puis compiler la liste des droits d'accès octroyés. Toutefois, le fait de disposer de la liste des droits d'accès ne permet pas d'avoir une vue globale. Les conditions d'une instruction de stratégie peuvent déterminer la portée de l'accès d'un utilisateur au-delà des droits d'accès individuels (reportez-vous à la section suivante). Par ailleurs, chaque instruction de stratégie indique un compartiment particulier et peut disposer de conditions limitant l'accès uniquement à certaines ressources du compartiment en question.

Définition de la portée de l'accès avec des droits d'accès ou des opérations d'API

Dans une instruction de stratégie, vous pouvez utiliser des conditions en association avec des droits d'accès ou des opérations d'API pour réduire la portée des accès octroyés par un verbe particulier.

Par exemple, supposons que vous souhaitez que le groupe XYZ puisse répertorier, obtenir, créer ou mettre à jour des groupes (c'est-à-dire modifier leur description) sans avoir le droit de les supprimer. Pour répertorier, obtenir, créer et mettre à jour des groupes, vous avez besoin d'une stratégie avec le verbe manage groups et le type de ressource. Comme indiqué par le tableau dans Détails des combinaisons de verbe et de type de ressource, les droits d'accès couverts sont les suivants :

  • GROUP_INSPECT
  • GROUP_UPDATE
  • GROUP_CREATE
  • GROUP_DELETE

Pour restreindre l'accès uniquement aux droits souhaités, vous pouvez ajouter une condition qui indique explicitement les droits d'accès à autoriser :

Allow group XYZ to manage groups in tenancy

 where any {request.permission='GROUP_INSPECT',
            request.permission='GROUP_CREATE',
            request.permission='GROUP_UPDATE'}

Vous pouvez également opter pour une stratégie qui autorise tous les droits d'accès à l'exception de GROUP_DELETE :

Allow group XYZ to manage groups in tenancy where request.permission != 'GROUP_DELETE'

Cependant, avec cette approche, sachez que les nouveaux droits d'accès que le service pourrait ajouter à l'avenir sont automatiquement accordés au groupe XYZ. Seul GROUP_DELETE est omis.

Une autre alternative consiste à écrire une condition basée sur des opérations d'API spécifiques. En fonction du tableau dans Droits d'accès requis pour chaque opération d'API, ListGroups et GetGroup ne nécessitent que le droit d'accès GROUP_INSPECT. La stratégie est la suivante :

Allow group XYZ to manage groups in tenancy

 where any {request.operation='ListGroups',  
            request.operation='GetGroup',
            request.operation='CreateGroup',
            request.operation='UpdateGroup'}

Il peut être utile d'utiliser des droits d'accès plutôt que des opérations d'API dans des conditions. A l'avenir, si une nouvelle opération d'API est ajoutée et qu'elle nécessite l'un des droits d'accès répertoriés dans la stratégie basée sur des droits d'accès ci-dessus, cette stratégie contrôlera déjà l'accès du groupe XYZ à cette nouvelle opération d'API.

Cependant, vous pouvez définir davantage la portée de l'accès d'un utilisateur à un droit en indiquant également une condition basée sur une opération d'API. Par exemple, vous pouvez donner à un utilisateur l'accès à GROUP_INSPECT, mais uniquement à ListGroups.

Allow group XYZ to manage groups in tenancy

 where all {request.permission='GROUP_INSPECT',  
            request.operation='ListGroups'}

Définition de la portée d'une stratégie avec l'adresse IP du demandeur

Vous pouvez attribuer l'accès à un ensemble d'adresses IP autorisées uniquement. Par exemple, vous pouvez écrire une stratégie autorisant uniquement les demandes d'une plage d'adresses IP publiques donnée à accéder à un bucket Object Storage spécifique. Vous pouvez également n'autoriser que des sous-réseaux précis d'un réseau cloud virtuel spécifique à effectuer des demandes via une passerelle de service.

Pour restreindre l'accès à un ensemble d'adresses IP, procédez comme suit :

  1. Créez un objet de source réseau qui spécifie les adresses IP autorisées. Pour plus d'informations, reportez-vous à Gestion des sources réseau.
  2. Ecrivez une stratégie qui utilise l'objet de source réseau dans une condition.

Utilisez la variable suivante dans la stratégie :

request.networkSource.name='<network_source_name>'

Par exemple :

allow group GroupA to manage object-family in tenancy where request.networkSource.name='corpnet'

Restriction de l'accès aux ressources en fonction d'une période

Vous pouvez utiliser des variables temporelles dans vos stratégies pour limiter l'accès accordé dans la stratégie à certaines périodes uniquement. Cette fonctionnalité permet de limiter les actions sur les ressources à des moments particuliers. Par exemple, vous pouvez créer une stratégie autorisant l'accès uniquement à une date donnée. Une telle stratégie est utile si votre société recourt à des sous-traitants et que vous voulez vous assurer que l'accès n'est pas autorisé après la date de fin du contrat. Vous pouvez également autoriser l'accès aux ressources uniquement pendant les heures de bureau (par exemple, du lundi au vendredi, de 9h à 17h). Cette restriction peut réduire le risque qu'un acteur malveillant effectue des modifications lorsqu'elles sont plus susceptibles de passer inaperçues.

Les variables que vous pouvez utiliser pour définir la portée de l'accès en fonction du temps sont les suivantes :

  • request.utc-timestamp
  • request.utc-timestamp.month-of-year
  • request.utc-timestamp.day-of-month
  • request.utc-timestamp.day-of-week
  • request.utc-timestamp.time-of-day

L'utilisation de ces variables est décrite plus en détail dans les sections suivantes.

Informations sur l'utilisation des variables temporelles

Vous devez indiquer la date et l'heure pour les variables en utilisant le format ISO 8601 : YYYY-MM-DDThh:mm:ssZ. Voici des exemples de ce format :

  • Date et heure avec secondes : '2020-04-01T15:00:00Z'
  • Date et heure avec minutes : '2020-04-01T05:00Z'
  • Date uniquement : '2020-04-01Z'
  • Heure uniquement : '05:00:00'

Même si vous pouvez spécifier une heure à la seconde près, vous devez prévoir une marge de 5 minutes entre l'horodatage de la demande et l'heure à laquelle la demande est évaluée par le service IAM. Cet écart peut être dû à plusieurs facteurs. Par conséquent, soyez conscient de cette différence potentielle lorsque vous planifiez et implémentez vos stratégies basées sur le temps.

L'heure que vous indiquez est évaluée selon la norme UTC (temps universel coordonné). Cela signifie que vous devez calculer l'heure UTC correcte pour le fuseau horaire dans lequel la stratégie est évaluée. Par exemple, afin d'indiquer 9h à l'heure standard du Pacifique pour la valeur d'une variable, entrez '17:00:00'. Si votre environnement local applique l'heure d'hiver et d'été, vous devez mettre à jour les stratégies qui font référence à une heure spécifique lorsque le changement d'heure entre en vigueur.

Détails de chaque variable temporelle

L'utilisation de chaque variable est décrite dans les sections suivantes :

request.utc-timestamp

Description : heure à laquelle la demande est reçue pour autorisation. Vous pouvez écrire une stratégie autorisant l'accès uniquement avant ou après un horodatage spécifique. L'horodatage doit respecter le format ISO 8601 (YYYY-MM-DDThh:mm:ssZ) et la norme UTC.

Opérateurs pris en charge : before | after

Valeurs autorisées : horodatage UTC au format ISO 8601 YYYY-MM-DDThh:mm:ssZ

Exemples de valeur :
  • '2020-04-01T00:00:00Z'
  • '2020-04-01T00:00Z'

Exemple de stratégie : autoriser le groupe Contractors à accéder aux ressources instance-family uniquement jusqu'à une certaine date :

Allow group Contractors to manage instance-family in tenancy where request.utc-timestamp before '2022-01-01T00:00Z'

L'accès accordé par la stratégie au groupe Contractors expire le 1er janvier 2022 à 12h00 (UTC).

request.utc-timestamp.month-of-year

Description : mois de l'année de réception de la demande pour autorisation. Vous pouvez écrire une stratégie autorisant l'accès uniquement pendant des mois spécifiques.

Opérateurs pris en charge : = | != | in

Valeurs autorisées : mois numérique (ISO 8601)

Exemples de valeur : '1', '2', '3', ... '12'

Exemple de stratégie : autoriser le groupe SummerInterns à accéder aux ressources instance-family uniquement pendant les mois de juin, de juillet et d'août :

Allow group SummerInterns to manage instance-family in tenancy where ANY {request.utc-timestamp.month-of-year in ('6', '7', '8')}

L'accès accordé par la stratégie au groupe SummerInterns est valide uniquement en juin, en juillet et en août d'une année donnée.

request.utc-timestamp.day-of-month

Description : jour du mois de réception de la demande pour autorisation. Vous pouvez écrire une stratégie autorisant l'accès uniquement pendant des jours spécifiques du mois. Gardez à l'esprit que l'étendue de la journée est calculée en fonction de l'heure UTC. Par exemple, supposons que vous vous trouvez à Miami (Floride, Etats-Unis) et que vous entrez '1' pour indiquer le premier jour du mois. Pour le mois de février, la stratégie est en vigueur de 0 h 00 à 23 h 59 UTC le 1er février, soit à Miami de 19 h 00 le 31 janvier à 18 h 59 le 1er février.

Opérateurs pris en charge : = | != | in

Valeurs autorisées : jour numérique du mois

Exemples de valeur : '1', '2', '3', ... '31'

Exemple de stratégie : autoriser le groupe ComplianceAuditors à lire all-resources uniquement le premier jour du mois.

Allow group ComplianceAuditors to read all-resources in tenancy where request.utc-timestamp.day-of-month = '1'

L'accès accordé par la stratégie au groupe ComplianceAuditors est valide uniquement le premier jour de chaque mois (le jour est défini par l'heure UTC).

request.utc-timestamp.day-of-week

Description : jour de la semaine de réception de la demande pour autorisation. Vous pouvez écrire une stratégie autorisant l'accès uniquement pendant des jours spécifiques de la semaine. L'étendue de la journée est calculée en fonction de l'heure UTC. Par exemple, supposons que vous vous trouvez à Miami (Floride, Etats-Unis) et que vous entrez 'monday'. La stratégie est en vigueur de 0h00 à 23h59 UTC le lundi, soit à Miami de 19 h 00 (EST) le dimanche à 18 h 59 le lundi.

Opérateurs pris en charge : = | != | in

Valeurs autorisées : nom du jour de la semaine en anglais

Exemples de valeur : 'Monday', 'Tuesday', 'Wednesday', etc.

Exemple de stratégie : autoriser le groupe WorkWeek à gérerinstance-family uniquement pendant la semaine de travail de la société.

Allow group WorkWeek to manage instance-family where ANY {request.utc-timestamp.day-of-week in ('monday', 'tuesday', 'wednesday', 'thursday', 'friday')}

L'accès accordé par la stratégie au groupe WorkWeek est valide uniquement les jours indiqués (le jour est défini par l'heure UTC).

request.utc-timestamp.time-of-day

Description : heure de réception de la demande pour autorisation. Vous pouvez écrire une stratégie autorisant l'accès uniquement pendant une période spécifique de la journée. L'heure de la journée est calculée en fonction de l'heure UTC. Si vous vivez dans un fuseau horaire qui implémente l'heure d'hiver et d'été, vous devez mettre à jour la stratégie lorsque l'heure change.

Opérateurs pris en charge : between

Valeurs autorisées : intervalle UTC au format ISO 8601 hh:mm:ssZ

Exemples de valeur : '01:00:00Z' AND '2:01:00Z'

Exemples de stratégie : autoriser le groupe DayShift à gérer les instances et les ressources associées entre 9 h 00 et 17 h 00 à l'heure standard du Pacifique (PST).

Les heures sont converties au format UTC :

Allow group DayShift to manage instance-family where request.utc-timestamp.time-of-day between '17:00:00Z' and '01:00:00Z'

Nous voulons autoriser le groupe NightShift à gérer les instances et les ressources associées entre 17 h 00 et 9 h 00 PST.

Allow group NightShift to manage instance-family where request.utc-timestamp.time-of-day between '01:00:00Z' and '17:00:00Z'

Dans ces deux exemples, l'heure en cours est calculée et testée pour vérifier si elle se situe dans la plage fournie (en ignorant le jour).