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.

Conditions et types de stratégies

Vous pouvez utiliser des conditions aux endroits suivants:

  • Règles d'autorisation
  • Stratégies de refus
  • Liaisons de stratégie pour les règles de limite d'accès des comptes principaux

Les sections suivantes décrivent comment utiliser des conditions dans chacun de ces emplacements pour appliquer un contrôle des accès basé sur les attributs.

Conditions dans les règles d'autorisation

Vous pouvez utiliser des conditions dans les règles d'autorisation pour choisir d'accorder l'accès aux comptes principaux uniquement 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 réseau de votre entreprise.

Les conditions sont spécifiées dans les liaisons de rôles de la stratégie d'autorisation d'une ressource. Si une liaison de rôle comporte une condition, les comptes principaux du rôle ne reçoivent le rôle que si l'expression de condition renvoie la valeur true.

Pour ajouter une condition à une liaison de rôle, vous devez définir le champ condition:

"bindings": [
  {
    "role": "ROLE",
    "members": [
      "MEMBER_1",
      "MEMBER_2"
    ],
    "condition": {
      "title": "TITLE",
      "description": "DESCRIPTION",
      "expression": "EXPRESSION"
    }
  }
]

Pour en savoir plus sur les champs d'une condition, consultez la section Structure de la condition sur cette page.

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.

Nous vous recommandons de ne pas ajouter plus de 100 liaisons de rôles conditionnelles à une seule stratégie d'autorisation. Si vous utilisez un plus grand nombre de liaisons de rôles conditionnelles, vous pouvez dépasser la limite de taille globale pour les stratégies d'autorisation.

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

Conditions dans les règles de refus

Vous pouvez utiliser des conditions dans les règles de refus pour appliquer une règle de refus uniquement si une condition est remplie. Par exemple, vous pouvez refuser une autorisation uniquement si la ressource à laquelle le compte principal tente d'accéder est taguée comme faisant partie de l'environnement prod.

Les conditions sont spécifiées dans les règles de refus des stratégies de refus d'une ressource. Si la condition renvoie true ou ne peut pas être évaluée, la règle de refus s'applique et les comptes principaux ne peuvent pas utiliser les autorisations spécifiées. Si la condition renvoie false, la règle de refus ne s'applique pas et les comptes principaux peuvent utiliser les autorisations spécifiées, le cas échéant.

Pour ajouter une condition à une règle de refus, vous devez définir le champ denialCondition:

"rules": [
  {
    "denyRule": {
      "deniedPrincipals": [
        "PRINCIPAL_1",
        "PRINCIPAL_2"
      ],
      "exceptionPrincipals": [
        "EXCEPTION_PRINCIPAL_1",
        "EXCEPTION_PRINCIPAL_2"
      ],
      "deniedPermissions": [
        "DENIED_PERMISSION_1",
        "DENIED_PERMISSION_2"
      ],
      "denialCondition": {
        "title": "TITLE",
        "description": "DESCRIPTION",
        "expression": "EXPRESSION"
      }
    }
  }
]

Pour en savoir plus sur les champs d'une condition, consultez la section Structure de la condition sur cette page.

Pour savoir comment créer et gérer des règles de refus, consultez Refuser l'accès.

Conditions dans les liaisons de stratégie de limite d'accès des comptes principaux

Vous pouvez utiliser des conditions dans les liaisons de règles pour les stratégies de limite d'accès des comptes principaux afin de préciser l'ensemble de comptes principaux auquel s'applique la stratégie de limite d'accès des comptes principaux. Par exemple, vous pouvez appliquer une règle uniquement pour les comptes de service ou exempter super-admin@example.com d'une règle.

Les conditions sont spécifiées dans chaque liaison de règle. Si une liaison de règle comporte une condition, la règle de la liaison n'est appliquée que si la condition renvoie la valeur true.

Pour ajouter une condition à une liaison de règle, vous définissez le champ condition dans la liaison de règle:

{
  "displayName": "DISPLAY_NAME",
  "target": {
    "principalSet": "PRINCIPAL_SET"
  },
  "policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
  "policy": "PAB_POLICY",
  "condition": {
    "title": "TITLE",
    "description": "DESCRIPTION",
    "expression": "EXPRESSION"
  }
}

Pour en savoir plus sur les champs d'une condition, consultez la section Structure de la condition sur cette page.

Pour savoir comment créer des liaisons de règles pour les stratégies de limite d'accès des comptes principaux, consultez la section Appliquer une stratégie de limite d'accès des comptes principaux à un ensemble de comptes principaux.

Structure de la condition

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.

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 des opérateurs logiques (&&, || ou !).

Chaque instruction exprime une règle de contrôle basée sur des attributs et détermine finalement si la liaison de rôle, la règle de refus ou la liaison de règle s'applique.

Les conditions dans 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'instructions 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 instructions simples et requiert que les deux instructions soient validées 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).

Les attributs de condition que vous pouvez utiliser dans une expression de condition dépendent du type de règle pour lequel vous écrivez des conditions. Pour obtenir la liste complète des attributs de condition et plus d'informations sur les attributs compatibles avec chaque type de règle, consultez la documentation de référence sur les attributs.

Les sections suivantes présentent des exemples d'attributs que vous pouvez utiliser dans des conditions.

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

Dans une association de rôle, l'expression de condition suivante autorise l'accès aux instances de VM Compute Engine, mais à aucun autre type de ressource:

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

Dans une association de rôle, l'expression de condition suivante autorise l'accès aux ressources Cloud Storage, mais à aucune autre ressource de service:

resource.service == 'storage.googleapis.com'

Dans une association de rôle, l'expression de condition suivante n'autorise l'accès qu'aux objets Cloud Storage d'un bucket spécifique:

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

Dans une règle de refus, l'expression de condition suivante bloque l'accès aux ressources Google Cloud portant le tag env: prod:

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

Attributs principaux

Les attributs de compte principal vous permettent d'écrire des conditions en fonction du compte principal qui a émis la requête. Les attributs que vous pouvez évaluer incluent les suivants :

  • Type de compte principal dans la requête
  • L'identité du compte principal dans la requête

Pour en savoir plus, consultez la documentation de référence sur les attributs pour les conditions.

Exemples d'expressions

Dans une liaison de stratégie de limite d'accès des comptes principaux, l'expression de condition suivante garantit que la règle de la liaison n'est appliquée que pour les comptes de service:

principal.type == 'iam.googleapis.com/ServiceAccount'

Dans une liaison de stratégie de limite d'accès des comptes principaux, l'expression de condition suivante garantit que la règle de la liaison n'est pas appliquée pour super-admin@example.com :

principal.subject != 'super-admin@example.com'

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, votre 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. Ajoutez ensuite l'expression de condition suivante à une liaison de rôle pour autoriser l'accès uniquement 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

Dans une association de rôle pour un rôle disposant de l'autorisation iam.projects.setIamPolicy, l'expression de condition suivante permet à un utilisateur d'accorder et de révoquer uniquement le rôle Administrateur de compte de facturation (roles/billing.admin) sur le projet:

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

Dans une liaison de rôle, l'expression de condition suivante autorise l'accès jusqu'à minuit le 1er janvier 2021:

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

Dans une liaison de rôle, l'expression de condition suivante n'autorise 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') <= '

Dans une liaison de rôle, l'expression de condition suivante n'autorise l'accès qu'en juin 2020, 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)

Dans une liaison de rôle, l'expression de condition suivante permet d'accéder à 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

Dans une association de rôle, l'expression de condition suivante autorise l'accès à 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'
  ])
)

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 à l'hôte et au chemin d'URL (pour IAP)

Dans une liaison de rôle, l'expression de condition suivante n'autorise l'accès qu'à certains sous-domaines ou chemins d'URL dans la requête:

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

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

Dans une liaison de rôle, l'expression de condition suivante autorise l'accès si la requête est effectuée pendant une heure spécifique, en faisant correspondre un préfixe de nom de ressource au niveau d'accès choisi 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')

Étape suivante