Présentation des conditions Cloud IAM

Cette page décrit la fonctionnalité des conditions de la gestion de l'authentification et des accès (Cloud IAM). Cette fonctionnalité vous permet de définir et d'appliquer un contrôle d'accès conditionnel basé sur des attributs pour les ressources Google Cloud.

Avec les conditions Cloud IAM, vous pouvez choisir de n'accorder aux identités (membres) l'accès aux ressources que si les conditions configurées sont remplies. Ce peut être le cas, par exemple, pour configurer un accès temporaire des utilisateurs en cas de problème de production ou pour ne limiter l'accès aux ressources qu'aux employés effectuant des requêtes depuis le siège de votre entreprise.

Les conditions sont spécifiées dans les liaisons de rôle de stratégie Cloud IAM d'une ressource. Lorsqu'une condition existe, la requête d'accès n'est accordée que si l'expression de condition renvoie true. Chaque expression de condition est définie comme un ensemble d'instructions logiques vous permettant de spécifier un ou plusieurs attributs à vérifier.

Stratégies Cloud IAM avec conditions

Les stratégies Cloud IAM comprennent une ou plusieurs liaisons de rôles, dont la structure est la suivante :

"bindings": [
  {
    "role": ...
    "members": ...
    "condition": ...
  },
  ...
]

L'objet condition est facultatif et chaque liaison de rôle peut contenir zéro ou une condition. Une liaison de rôle sans objet condition est considérée comme une autorisation inconditionnelle, car aucune vérification de condition n'est nécessaire. L'objet condition présente la structure suivante :

"condition": {
    "title": ...
    "description": ...
    "expression": ...
}

La condition title est obligatoire, mais la valeur description est facultative. Le titre et la description sont des champs purement indicatifs destinés à vous aider à identifier et à décrire la condition.

Le champ expression est obligatoire. Il définit une expression logique basée sur des attributs à l'aide d'un sous-ensemble de CEL (Common Expression Language). Le langage CEL est décrit plus en détail dans la section ci-dessous. La condition expression peut contenir plusieurs instructions, chacune utilisant un attribut ; les instructions sont combinées à l'aide d'opérateurs logiques, conformément aux spécifications du langage CEL.

Pour savoir comment ajouter, modifier et supprimer des liaisons de rôles conditionnelles, consultez la page Gérer les liaisons de rôles conditionnelles.

Utilisation du langage CEL pour les conditions

Le langage CEL, ou Common Expression Language, est le langage d'expression utilisé pour spécifier une expression dans les conditions Cloud IAM. Il est conçu pour exprimer des expressions logiques basées sur des attributs. Pour en savoir plus, consultez la documentation sur la spécification CEL et sa définition de langage.

Dans les conditions Cloud IAM, un sous-ensemble de CEL est utilisé dans le but d'obtenir des décisions d'autorisation booléennes basées sur les données d'attributs. En général, une expression de condition se compose d'une ou plusieurs instructions qui sont combinées à l'aide d'opérateurs logiques (&&, || ou !). Chaque instruction exprime une règle de contrôle basée sur des attributs qui s'applique à la liaison de rôle et détermine fondamentalement si l'autorisation est valide.

Les principales caractéristiques des éléments CEL liés aux conditions sont décrites ci-dessous :

  • Variables : les conditions utilisent des variables pour exprimer un attribut donné, comme request.time (de type Horodatage) ou resource.name (de type Chaîne). Ces variables sont renseignées avec une valeur basée sur le contexte lors de l'exécution.
  • Opérateurs : chaque type de données, tel que Horodatage ou Chaîne, accepte un ensemble d'opérateurs pouvant être utilisés pour créer une expression logique. Le plus souvent, les opérateurs sont utilisés pour comparer la valeur contenue dans une variable avec une valeur littérale, telle que resource.service == "compute.googleapis.com". Dans cet exemple, si la valeur d'entrée de resource.service est compute.googleapis.com, l'expression renvoie true.
  • Fonctions : une fonction est un opérateur composé pour les types de données qui acceptent des opérations plus complexes. Dans les expressions de condition, il existe des fonctions prédéfinies qui peuvent être utilisées conjointement avec un type de données spécifique. Par exemple, request.path.startsWith("/finance") utilise une fonction de correspondance de préfixe de chaîne et renvoie true si la valeur de request.path contient un préfixe correspondant, tel que "/finance".
  • Opérateurs logiques : les conditions acceptent trois opérateurs logiques qui peuvent être utilisés pour créer des expressions logiques complexes à partir d'expressions simples : &&, || et !. Ces opérateurs logiques permettent d'utiliser plusieurs variables d'entrée dans une expression de condition. Par exemple : request.time.getFullYear() < 2020 && resource.service == "compute.googleapis.com" combine deux conditions simples et requiert que les deux conditions soient remplies pour produire un résultat d'évaluation global true.

Pour en savoir plus sur les variables, les opérateurs et les fonctions compatibles, consultez la documentation de référence sur les attributs.

Attributs de condition

Les attributs de condition sont basés sur la ressource demandée (par exemple, son type ou son nom) ou sur les détails de la requête (par exemple, son horodatage, son adresse IP d'origine ou l'adresse IP de destination de l'instance de machine virtuelle (VM) Compute Engine). Des exemples d'expressions utilisant ces attributs sont fournis ci-dessous.

Attributs de ressource

Les attributs de ressources vous permettent de créer des conditions qui évaluent la ressource dans la requête d'accès, y compris le type de ressource, le nom de la ressource et le service Google Cloud utilisé.

Pour obtenir la liste complète des attributs de ressources, consultez la documentation de référence sur les attributs de ressources.

Pour apprendre à utiliser les attributs de ressources pour configurer l'accès basé sur les ressources, consultez la page Configurer un accès basé sur les ressources.

Exemples d'expressions

Autoriser l'accès aux instances de VM Compute Engine, mais à aucun autre type de ressource :

resource.type == "compute.googleapis.com/Instance"

Autoriser l'accès aux ressources de Cloud Storage, mais à aucun autre service de ressources :

resource.service == "storage.googleapis.com"

N'autoriser l'accès qu'aux ressources dont le nom commence par une chaîne de préfixe spécifiée :

resource.name.startsWith("projects/_/buckets/exampleco-site-assets-")

Attributs de requête

Les attributs de requête vous permettent de créer des conditions évaluant les détails de la requête, tels que l'horodatage, le nom d'hôte/chemin d'URL attendu (pour IAP), l'adresse IP et le port de destination (pour la tunnelisation TCP IAP) ou le niveau d'accès.

Exemples d'expressions d'horodatage

Autoriser l'accès temporairement jusqu'à une date/heure d'expiration spécifiée :

request.time < timestamp("2021-01-01T00:00:00Z")

N'autoriser l'accès que pendant les heures de travail spécifiées, en fonction du fuseau horaire de Berlin, en Allemagne :

request.time.getHours("Europe/Berlin") >= 9 &&
request.time.getHours("Europe/Berlin") <= 17 &&
// Days of the week range from 0 to 6, where 0 == Sunday and 6 == Saturday.
request.time.getDayOfWeek("Europe/Berlin") >= 1 &&
request.time.getDayOfWeek("Europe/Berlin") <= 5

N'autoriser l'accès que pour un mois et une année spécifiés, en fonction du fuseau horaire de Berlin, en Allemagne :

request.time.getFullYear("Europe/Berlin") == 2020
request.time.getMonth("Europe/Berlin") < 6

Pour spécifier un horodatage, utilisez le format RFC 3339. Pour spécifier un fuseau horaire, utilisez les identifiants de la base de données des fuseaux horaires IANA.

Pour en savoir plus sur les expressions de type horodatage, consultez la spécification CEL.

Pour savoir comment utiliser des expressions d'horodatage pour configurer un accès temporaire, consultez la page Configurer un accès temporaire.

Exemples d'expressions associées à l'hôte et au chemin d'URL (pour IAP)

N'autoriser l'accès qu'à certains sous-domaines ou chemins d'URL dans la demande :

request.host == "hr.example.com"
request.host.endsWith(".example.com")
request.path == "/admin/payroll.js"
request.path.startsWith("/admin")

Exemples d'expressions associées à l'adresse IP ou au port de destination (pour la tunnelisation TCP IAP)

Autoriser l'accès à certaines adresses IP ou ports de destination dans la demande :

destination.ip == "14.0.0.1"
destination.ip != "127.0.0.1"
destination.port == 22
destination.port > 21 && destination.port <= 23

Exemples d'expressions associées au niveau d'accès (pour IAP seulement)

N'autoriser l'accès que si la requête répond à un niveau d'accès défini par l'organisation : dans l'exemple suivant, l'organisation a défini un niveau d'accès CorpNet qui limite l'accès à la plage d'adresses IP où le trafic entre et sort du réseau de l'entreprise :

"accessPolicies/199923665455/accessLevels/CorpNet" in
request.auth.access_levels

Les niveaux d'accès sont définis par votre organisation. Ils sont attribués en fonction des attributs de la requête, tels que l'adresse IP d'origine, les attributs de l'appareil, l'heure de la journée, etc. Pour en savoir plus sur les niveaux d'accès, consultez la documentation Access Context Manager.

Exemples d'expressions associées aux règles de transfert

Autoriser l'accès d'un membre si la requête ne crée pas de règle de transfert ou si la requête crée une règle de transfert pour un équilibreur de charge Google Cloud interne :

!compute.isForwardingRuleCreationOperation() || (
  compute.isForwardingRuleCreationOperation() &&
  compute.matchLoadBalancingSchemes([
    'INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'
  ]))
)

Pour en savoir plus sur les schémas d'équilibrage de charge, consultez la section Utiliser des conditions Cloud IAM sur des équilibreurs de charge Google Cloud.

Exemples d'expressions associées à différents types d'attributs

Autoriser l'accès si la demande est effectuée pendant une plage horaire spécifique, en faisant correspondre un préfixe de nom de ressource au niveau d'accès souhaité et pour un type de ressource spécifique :

request.time > timestamp("2018-08-03T16:00:00-07:00") &&
request.time < timestamp("2018-08-03T16:05:00-07:00") &&
((resource.name.startsWith("projects/project-123/zones/us-east1-b/instances/dev") ||
 (resource.name.startsWith("projects/project-123/zones/us-east1-b/instances/prod") &&
  "accessPolicies/34569256/accessLevels/CorpNet" in request.auth.access_levels)) ||
 resource.type != "compute.googleapis.com/Instance")

Ressources acceptant les liaisons de rôles conditionnelles

Vous pouvez ajouter des conditions aux stratégies Cloud IAM pour les types de ressources Google Cloud suivants :

Service Google Cloud Types de ressources
Cloud Storage Buckets1
Compute Engine
  • Services de backend mondiaux
  • Services backend régionaux
  • Pare-feu
  • Images
  • Modèles d'instance
  • Instances
  • Disques persistants régionaux
  • Disques persistants zonaux
  • Instantanés
Identity-Aware Proxy (IAP)
  • Tunnels
  • Instances de tunnel
  • Zones de tunnel
  • Tous les services Web
  • Services Web individuels
  • Types de services Web
  • Versions de services Web
Cloud Key Management Service (Cloud KMS)
  • Clés de chiffrement
  • Versions des clés de chiffrement
  • Trousseaux
Resource Manager
  • Organisations
  • Projets
1. Vous pouvez utiliser l'attribut resource.name dans une condition pour faire référence à des objets dans des buckets Cloud Storage. Toutefois, vous devez ajouter la condition à la stratégie Cloud IAM pour une ressource de niveau supérieur, telle que le bucket ou le projet.

Les autres types de ressources n'autorisent pas les conditions dans leurs stratégies Cloud IAM. Toutefois, vous pouvez ajouter des liaisons de rôles conditionnelles au niveau de l'organisation, du dossier ou du projet. Les autres ressources hériteront de ces liaisons via la hiérarchie de ressources.

Pour en savoir plus sur les attributs qui affectent les types de ressources, consultez la documentation de référence sur les attributs.

Limites connues

Les limites suivantes s'appliquent aux conditions Cloud IAM :

  • Comme indiqué dans les informations sur les services compatibles sur cette page, vous ne pouvez ajouter des conditions aux liaisons de rôles que pour certains services Google Cloud. En outre, la plupart des attributs de condition sont compatibles avec un nombre limité de services.
  • Les rôles primitifs (roles/owner, roles/editor, roles/viewer) ne sont pas acceptés. Si vous tentez de définir une condition dans une liaison de rôle qui utilise un rôle primitif, l'opération setIamPolicy échouera.
  • Les valeurs allUsers et allAuthenticatedUsers sont des types de membres non compatibles dans une liaison de rôle conditionnelle. Si vous spécifiez l'un de ces types de membre, l'opération setIamPolicy échouera.
  • Nous recommandons que chaque stratégie ne contienne pas plus de 100 liaisons de rôles conditionnelles. Il existe une limite de taille de stockage sous-jacente pour une stratégie. Les stratégies comprenant de nombreuses liaisons conditionnelles peuvent dépasser la taille limite et être refusées.
  • Nous vous recommandons de ne définir que quelques liaisons de rôles conditionnelles différentes pour un même membre et pour le même rôle (conditions différentes). Toutefois, vous pouvez inclure jusqu'à 20 liaisons de rôle pour le même rôle et le même membre. Si vous dépassez ce nombre, l'opération setIamPolicy échouera.
  • Vous pouvez utiliser un maximum de 12 opérateurs logiques dans une seule expression de condition. Si vous dépassez ce nombre, l'opération setIamPolicy échouera.

Étape suivante