Contraintes personnalisées liées aux règles d'administration

Cette page vous explique comment utiliser les contraintes personnalisées du service de règles d'administration Google Cloud pour restreindre des opérations spécifiques sur les ressources Cloud Storage for Firebase suivantes :

  • firebasestorage.googleapis.com/DefaultBucket

Pour en savoir plus sur les règles d'administration, consultez Règles d'administration personnalisées.

À propos des règles et des contraintes d'administration

Le service de règles d'administration Google Cloud vous offre un contrôle centralisé et automatisé sur les ressources de votre organisation. En tant qu'administrateur des règles d'administration, vous pouvez définir des ensembles de restrictions appelées contraintes qui s'appliquent aux ressources Google Cloud et à leurs descendants dans la hiérarchie des ressources Google Cloud. Chaque ensemble de restrictions constitue une règle d'administration. Vous pouvez appliquer des règles d'administration au niveau d'une organisation, d'un dossier ou d'un projet.

Les règles d'administration fournissent des contraintes gérées intégrées pour divers servicesGoogle Cloud. Toutefois, si vous souhaitez exercer un contrôle plus précis et le personnaliser pour des champs spécifiques restreints dans vos règles d'administration, vous pouvez également créer des contraintes personnalisées et les utiliser dans une règle d'administration.

Héritage des règles

Par défaut, les règles d'administration sont héritées par les descendants des ressources sur lesquelles vous les appliquez. Par exemple, si vous appliquez une règle au niveau d'un dossier, Google Cloud l'applique à tous les projets du dossier. Pour mieux comprendre ce comportement et savoir comment le modifier, consultez Règles d'évaluation hiérarchique.

De plus, étant donné que Cloud Storage for Firebase stocke les fichiers dans des buckets Cloud Storage sous-jacents, toutes les règles d'administration ou contraintes personnalisées appliquées aux ressources Cloud Storage s'appliquent également à vos buckets Cloud Storage for Firebase.

Avantages

  • Sécurité et gouvernance : appliquez un contrôle organisationnel centralisé sur le provisionnement des buckets Cloud Storage pour garantir la conformité avec les garde-fous de résidence des données et de gestion des coûts.
  • Contrôle précis des attributs : limitez la création de buckets par défaut en fonction d'attributs de ressources spécifiques, tels que storageClass ou location.

Limites

Les limites suivantes s'appliquent lorsque vous utilisez des règles d'administration personnalisées avec Cloud Storage for Firebase :

  • Pas d'application rétroactive : les nouvelles contraintes personnalisées mises en place ne s'appliquent pas aux ressources existantes. Les buckets par défaut existants ne sont pas évalués, sauf s'ils sont mis à jour. Pour identifier les ressources existantes susceptibles d'enfreindre une contrainte, vous pouvez tester les règles en mode dry run.
  • Restrictions de contrôle des accès : les contraintes personnalisées ne peuvent pas limiter les listes de contrôle d'accès (LCA) ni les stratégies IAM sur les buckets.

Avant de commencer

  1. Dans la console Firebase, sélectionnez ou créez un projet Firebase.

    Assurez-vous que votre projet fait partie d'une organisation et que vous connaissez votre ID d'organisation.

  2. Pour configurer et appliquer des contraintes personnalisées à l'aide de la ligne de commande, installez la Google Cloud CLI (gcloud). Les règles d'administration personnalisées ne peuvent pas être gérées à l'aide de la CLI Firebase.

Rôles requis

Pour obtenir les autorisations nécessaires pour gérer des règles d'administration personnalisées, demandez à votre administrateur de vous accorder le rôle IAM Administrateur des règles d'administration (roles/orgpolicy.policyAdmin) dans l'organisation.

Cloud Storage for Firebase ressources compatibles

Le tableau suivant répertorie les ressources Cloud Storage for Firebase que vous pouvez référencer dans les contraintes personnalisées. Vous pouvez également référencer les ressources compatibles avec Cloud Storage, car les contraintes personnalisées sur ces ressources s'appliquent également aux buckets Cloud Storage for Firebase.

Ressource Champs pris en charge
firebasestorage.googleapis.com/DefaultBucket
  • resource.location
  • resource.storageClass

Configurer une contrainte personnalisée

Une contrainte personnalisée est définie dans un fichier YAML, qui spécifie les ressources, méthodes, conditions et actions compatibles avec le service auquel vous appliquez la règle d'administration. Les conditions de vos contraintes personnalisées sont définies à l'aide du CEL (Common Expression Language). Pour en savoir plus sur la création de conditions dans des contraintes personnalisées à l'aide du CEL, consultez la section CEL de la page Créer et gérer des contraintes personnalisées.

Console

Pour créer une contrainte personnalisée :

  1. Dans la console Google Cloud, accédez à la page Règles d'administration.

    Accéder à la page Règles d'administration

  2. Dans le sélecteur de projets, choisissez le projet pour lequel vous souhaitez définir la règle d'administration.
  3. Cliquez sur Contrainte personnalisée.
  4. Dans la zone Nom à afficher, saisissez un nom lisible par l'humain pour la contrainte. Ce nom est utilisé dans les messages d'erreur et peut servir à l'identification et au débogage. N'utilisez pas d'informations permettant d'identifier personnellement l'utilisateur ni de données sensibles dans les noms à afficher, car ces informations pourraient être divulguées dans les messages d'erreur. Ce champ peut contenir jusqu'à 200 caractères.
  5. Dans la zone ID de contrainte, saisissez l'ID souhaité pour votre nouvelle contrainte personnalisée. Une contrainte personnalisée ne peut contenir que des lettres (majuscules et minuscules) ou des chiffres, par exemple custom.restrictStorageClass. Ce champ peut contenir jusqu'à 70 caractères, sans compter le préfixe (custom.), par exemple organizations/123456789/customConstraints/custom.restrictStorageClass. N'incluez pas d'informations permettant d'identifier personnellement l'utilisateur ni de données sensibles dans l'ID de votre contrainte, car ces informations pourraient être divulguées dans les messages d'erreur.
  6. Dans la zone Description, saisissez une description lisible par l'humain pour la contrainte. Cette description est utilisée comme message d'erreur en cas de non-respect de la règle. Incluez des informations sur les raisons du non-respect de la règle et sur la façon de résoudre ce cas de non-respect. Veuillez n'inclure aucune information permettant d'identifier l'utilisateur ou donnée sensible dans votre description, car ces informations pourraient être divulguées dans les messages d'erreur. Ce champ peut contenir jusqu'à 2 000 caractères.
  7. Dans la zone Type de ressource, sélectionnez le nom de la ressource REST contenant l'objet et le champ que vous souhaitez restreindre (par exemple, firebasestorage.googleapis.com/DefaultBucket). La plupart des types de ressources acceptent jusqu'à 20 contraintes personnalisées. Si vous essayez de créer d'autres contraintes personnalisées, l'opération échoue.
  8. Sous Méthode d'application, indiquez si vous souhaitez appliquer la contrainte sur la méthode REST CREATE ou sur les méthodes REST CREATE et UPDATE. (Remarque : DefaultBucket n'est compatible qu'avec CREATE).
  9. Pour définir une condition, cliquez sur Modifier la condition.
    1. Dans le panneau Ajouter une condition, créez une condition CEL faisant référence à une ressource de service compatible, par exemple resource.storageClass == 'STANDARD'. Ce champ peut contenir jusqu'à 1 000 caractères. Pour plus d'informations sur l'utilisation du CEL, consultez Common Expression Language.
    2. Cliquez sur Enregistrer.
  10. Sous Action, indiquez si vous souhaitez autoriser ou refuser la méthode évaluée si la condition est remplie.

    L'action "deny" signifie que l'opération de création ou de mise à jour de la ressource est bloquée si la condition renvoie la valeur "true".

    L'action "allow" signifie que l'opération de création ou de mise à jour de la ressource n'est autorisée que si la condition renvoie la valeur "true". Tous les autres cas, à l'exception de ceux explicitement listés dans la condition, sont bloqués.

  11. Cliquez sur Créer une contrainte.

gcloud

  1. Pour créer une contrainte personnalisée, créez un fichier YAML au format suivant :
    name: organizations/ORGANIZATION_ID/customConstraints/custom.restrictStorageClass
    resourceTypes: firebasestorage.googleapis.com/DefaultBucket
    methodTypes:
      -   CREATE
    condition: "resource.storageClass == 'STANDARD'"
    actionType: DENY
    displayName: Restrict Standard Storage Class
    description: Deny creating buckets with STANDARD storage class.
  2. Après avoir créé le fichier YAML pour une nouvelle contrainte personnalisée, vous devez le configurer de sorte qu'il soit disponible pour les règles d'administration de votre organisation. Pour configurer une contrainte personnalisée, utilisez la commande gcloud org-policies set-custom-constraint :
    gcloud org-policies set-custom-constraint CONSTRAINT_PATH

    Remplacez CONSTRAINT_PATH par le chemin d'accès complet à votre fichier de contrainte personnalisée. Exemple :/home/user/customconstraint.yaml

  3. Pour vérifier que la contrainte personnalisée existe, utilisez la commande gcloud org-policies list-custom-constraints :
    gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID

Appliquer une règle d'administration personnalisée

Vous pouvez appliquer une contrainte en créant une règle d'administration qui y fait référence, puis en appliquant cette règle à une ressource Google Cloud.

Console

  1. Dans la console Google Cloud, accédez à la page Règles d'administration.

    Accéder à la page Règles d'administration

  2. Dans le sélecteur de projets, choisissez le projet pour lequel vous souhaitez définir la règle d'administration.
  3. Dans la liste de la page Règles d'administration, sélectionnez votre contrainte pour afficher la page Détails de la règle de cette contrainte.
  4. Pour configurer la règle d'administration pour cette ressource, cliquez sur Gérer la règle.
  5. Sur la page Modifier la stratégie, sélectionnez Remplacer la stratégie parente.
  6. Cliquez sur Ajouter une règle.
  7. Dans la section Application, indiquez si cette règle d'administration est appliquée ou non.
  8. Pour appliquer la règle d'administration en mode de simulation, cliquez sur Définir la règle de dry run. Pour en savoir plus, consultez Tester les règles d'administration.
  9. Une fois que vous avez vérifié que la règle d'administration en mode dry run fonctionne comme prévu, définissez la règle active en cliquant sur Définir la règle.

gcloud

  1. Pour créer une règle d'administration avec des règles booléennes, créez un fichier YAML de règle qui fait référence à la contrainte :
    name: projects/PROJECT_ID/policies/custom.restrictStorageClass
    spec:
      rules:
      -   enforce: true
    dryRunSpec:
      rules:
      -   enforce: true
  2. Pour appliquer la règle d'administration en mode dry run, exécutez la commande suivante avec le flag dryRunSpec :
    gcloud org-policies set-policy POLICY_PATH --update-mask=dryRunSpec
  3. Après avoir vérifié que la règle d'administration en mode dry run fonctionne comme prévu, définissez la règle active avec la commande org-policies set-policy et l'option spec :
    gcloud org-policies set-policy POLICY_PATH --update-mask=spec

Tester la règle d'administration personnalisée

L'exemple suivant crée une contrainte et une règle personnalisées qui exigent que tous les buckets par défaut nouvellement créés n'utilisent pas la classe de stockage STANDARD. Vous pouvez tester la règle en essayant d'effectuer une action qu'elle est censée bloquer.

Créer la contrainte

  1. Enregistrez le fichier suivant sous le nom constraint-restrict-storage-class.yaml :

    name: organizations/ORGANIZATION_ID/customConstraints/custom.restrictStorageClass
    resourceTypes:
    -   firebasestorage.googleapis.com/DefaultBucket
    methodTypes:
    -   CREATE
    condition: "resource.storageClass == 'STANDARD'"
    actionType: DENY
    displayName: Restrict Standard Storage Class
    description: Deny creating buckets with STANDARD storage class.
    

    Remplacez ORGANIZATION_ID par votre ID d'organisation.

  2. Appliquez la contrainte :

    gcloud org-policies set-custom-constraint ~/constraint-restrict-storage-class.yaml
    
  3. Vérifiez que la contrainte existe :

    gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
    

    Le résultat ressemble à ce qui suit :

    CUSTOM_CONSTRAINT            ACTION_TYPE   METHOD_TYPES   RESOURCE_TYPES                                 DISPLAY_NAME
    custom.restrictStorageClass  DENY          CREATE         firebasestorage.googleapis.com/DefaultBucket   Restrict Standard Storage Class
    ...
    

Créer la règle

  1. Enregistrez le fichier suivant sous le nom policy-restrict-storage-class.yaml :

    name: projects/PROJECT_ID/policies/custom.restrictStorageClass
    spec:
      rules:
      -   enforce: true
    

    Remplacez PROJECT_ID par l'ID du projet.

  2. Appliquez la règle :

    gcloud org-policies set-policy ~/policy-restrict-storage-class.yaml
    
  3. Vérifiez que la règle existe :

    gcloud org-policies list --project=PROJECT_ID
    

    Le résultat ressemble à ce qui suit :

    CONSTRAINT                   LIST_POLICY    BOOLEAN_POLICY    ETAG
    custom.restrictStorageClass  -              SET               CIqktscGELiZn6cC-
    

Une fois la règle activée, Google Cloud commence à l'appliquer au bout d'environ deux minutes.

Tester la stratégie

Essayez de créer un bucket par défaut à l'aide de l'API REST Cloud Storage for Firebase sans spécifier de classe de stockage (qui est définie par défaut sur STANDARD) :

PROJECT_ID="PROJECT_ID"
TOKEN=$(gcloud auth print-access-token)

curl -X POST "https://firebasestorage.googleapis.com/v1beta/projects/${PROJECT_ID}/defaultBucket" \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{"location": "US-EAST1"}'

La requête échoue et renvoie une erreur semblable à celle-ci :

FAILED_PRECONDITION: Operation denied by org policy: ["customConstraints/custom.restrictStorageClass": "Deny creating buckets with STANDARD storage class."].
-   '@type': type.googleapis.com/google.rpc.ErrorInfo
  domain: iam.googleapis.com
  metadata:
    customConstraints: customConstraints/custom.restrictStorageClass
  reason: CUSTOM_ORG_POLICY_VIOLATION

Exemples de règles d'administration personnalisées pour des cas d'utilisation courants

Ce tableau fournit des exemples de syntaxe pour certaines contraintes personnalisées courantes.

Description Syntaxe de la contrainte
Limiter la création de buckets par défaut avec la classe de stockage STANDARD
name: organizations/ORGANIZATION_ID/customConstraints/custom.restrictStorageClass
resourceTypes:
-   firebasestorage.googleapis.com/DefaultBucket
methodTypes:
-   CREATE
condition: "resource.storageClass == 'STANDARD'"
actionType: DENY
displayName: Restrict Standard Storage Class
description: Deny creating buckets with STANDARD storage class.
Exiger que les buckets par défaut soient créés dans un emplacement spécifique
name: organizations/ORGANIZATION_ID/customConstraints/custom.requireDefaultBucketLocation
resourceTypes:
-   firebasestorage.googleapis.com/DefaultBucket
methodTypes:
-   CREATE
condition: "resource.location != 'US-EAST1'"
actionType: DENY
displayName: Require US-EAST1 Location
description: Deny creating default buckets outside the US-EAST1 location.

Étape suivante