Présentation des conditions Cloud IAM

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

Avec les conditions IAM, vous pouvez choisir de n'accorder l'accès aux comptes principaux que si les conditions spécifiées sont remplies. Par exemple, vous pouvez accorder un accès temporaire aux utilisateurs afin qu'ils puissent résoudre un problème de production, ou accorder l'accès uniquement 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ôles de la stratégie d'autorisation 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 un ensemble d'instructions logiques qui spécifient un ou plusieurs attributs à vérifier.

Stratégies d'autorisation avec des conditions

Les stratégies d'autorisation 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. Si une liaison de rôle n'a pas d'objet condition, les comptes principaux de cette liaison de rôle disposent toujours du rôle spécifié sur la ressource.

Seuls certains types de ressources acceptent les conditions dans les liaisons de rôles. Toutefois, vous pouvez accorder un accès conditionnel à d'autres types de ressources en attribuant des rôles au niveau de l'organisation ou du projet.

L'objet condition présente la structure suivante :

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

Le titre de 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). L'expression de condition peut contenir plusieurs instructions. Chaque instruction évalue 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 de CEL pour les conditions

Common Expression Language (CEL) est le langage d'expression utilisé pour spécifier une expression dans les conditions 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 IAM, un sous-ensemble de CEL est utilisé pour prendre des décisions d'autorisation booléennes basées sur des données d'attribut. En général, une expression de condition contient une ou plusieurs instructions qui sont combinées par un maximum de 12 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'accès est autorisé ou non.

Les conditions IAM utilisent les fonctionnalités CEL suivantes :

  • 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 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 ou son adresse IP de destination).

Attributs de ressource

Vous pouvez utiliser des attributs de ressource pour écrire des conditions qui évaluent la ressource dans la requête d'accès. Les attributs que vous pouvez évaluer incluent les suivants :

  • Type de la ressource
  • Nom de la ressource
  • Le service Google Cloud utilisé
  • Les tags associés à la ressource

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"

Autoriser l'accès uniquement aux objets Cloud Storage dans un bucket spécifique :

resource.type == "storage.googleapis.com/Object" &&
resource.name.startsWith("projects/_/buckets/exampleco-site-assets/")

Autoriser l'accès aux ressources Google Cloud portant le tag env: prod :

resource.matchTag('123456789012/env', 'prod')

Attributs de requête

Vous pouvez utiliser des attributs de requête pour écrire des conditions qui évaluent des détails sur la requête, tels que les suivants :

  • Le niveau d'accès
  • La date et l'heure
  • L'adresse IP et le port de destination (pour la tunnelisation TCP IAP)
  • L'hôte/chemin d'URL attendu (pour IAP)

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

Dans l'exemple suivant, l'organisation définit 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. L'accès n'est autorisé que si la requête répond au niveau d'accès CorpNet :

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

Votre organisation définit des niveaux d'accè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, consultez la documentation Access Context Manager.

Exemple d'expression d'attribut de l'API

Autorisez un utilisateur à n'accorder et à révoquer que le rôle d'administrateur de compte de facturation (roles/billing.admin) :

api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', [])
                 .hasOnly(['roles/billing.admin'])

Pour en savoir plus sur l'utilisation des attributs d'API pour limiter l'attribution de rôles, consultez la page Définir des limites sur l'attribution de rôles.

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'adresse IP ou au port de destination (pour la tunnelisation TCP IAP)

Autoriser l'accès à une adresse IP de destination interne ou à un numéro de port :

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 aux règles de transfert

Autoriser l'accès d'un compte principal 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'
  ])
)

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")

Pour plus d'informations sur les schémas d'équilibrage de charge, consultez la page 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 heure 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")

Étapes suivantes