Configurer l'accès au niveau des champs

Ce document décrit les contrôles d'accès au niveau du champ et explique comment les définir sur un bucket Logging. Les contrôles d'accès au niveau des champs vous permettent de masquer des champs LogEntry individuels pour les utilisateurs d'un projet Google Cloud. Vous disposez ainsi d'un moyen plus précis de contrôler les données de journaux auxquelles un utilisateur peut accéder.

Présentation

Logging utilise contrôle des accès au niveau du champ afin de masquer les champs LogEntry pour les utilisateurs d'un projet Google Cloud qui ne disposent pas des autorisations requises pour les afficher. Par rapport aux vues de journaux, qui masquent l'intégralité de LogEntry, les contrôles d'accès au niveau du champ masquent les champs individuels de LogEntry. Vous pouvez définir des contrôles d'accès et des vues de journaux au niveau du champ sur un bucket Logging. Vous limitez et gérez le contrôle d'accès au niveau du champ à l'aide de la Google Cloud CLI.

Pour restreindre l'accès aux champs de journal, procédez comme suit :

  • Configurez les champs LogEntry restreints sur un bucket de journaux.
  • N'attribuez le rôle IAM logging.fieldAccessor (ou un rôle contenant des autorisations similaires) qu'aux utilisateurs ayant besoin d'afficher les champs restreints pour ce chemin d'accès au champ.

Logging vérifie les autorisations IAM lorsqu'un utilisateur interroge les journaux d'un bucket pour lequel des champs restreints sont définis. Tout accès à des champs dont les LCA sont configurées est refusé pour les utilisateurs ne disposant pas du logging.FieldAccessor correspondant pour ce champ, ce qui signifie que :

  • L'utilisateur reçoit une erreur de refus d'autorisation s'il tente d'interroger directement des champs restreints.
  • Les recherches globales ne prennent pas en compte le contenu des champs restreints.
  • Tous les résultats LogEntry renvoyés omettent les champs restreints.

Champs restreints

Vous pouvez restreindre l'accès au champ jsonPayload, ce qui limite également l'accès à ses chemins imbriqués.

Vous pouvez également restreindre l'accès aux champs de feuilles des éléments suivants:

Par exemple, vous pouvez limiter l'accès au champ labels.check_id.

Avant de commencer

Avant de commencer à définir des contrôles d'accès au niveau du champ, procédez comme suit :

  • Vérifiez que gcloud --version signale la version 362.0.0 ou ultérieure.

    Pour installer la dernière version de gcloud CLI, exécutez la commande gcloud components update:

    gcloud components update
    

    Pour savoir comment installer gcloud CLI, consultez la page Installer Google Cloud CLI.

  • Exécutez gcloud config set pour configurer le projet Google Cloud par défaut pour vos commandes Google Cloud CLI. Avant d'exécuter la commande, effectuez le remplacement suivant:

    • PROJECT_ID: identifiant du projet.

    Commande :

    gcloud config set project PROJECT_ID
    
  • Vérifiez que vous disposez de l'un des rôles IAM suivants pour le projet Google Cloud qui contient le bucket:

    Pour en savoir plus sur la définition des rôles IAM, consultez le guide du contrôle des accès de Logging.

Définir le contrôle des accès au niveau des champs

Les restrictions au niveau du champ sont configurées au niveau du bucket de journaux et peuvent être appliquées à un bucket de journaux existant ou au moment de la création d'un bucket de journaux.

Restreindre les champs sur un nouveau bucket

Pour restreindre les champs de journal lors de la création d'un bucket de journaux, exécutez la commande gcloud logging buckets create. Avant d'exécuter la commande, effectuez les remplacements suivants :

  • BUCKET_ID: nom ou ID du bucket de journaux.
  • LOCATION: emplacement du bucket de journaux.
  • DESCRIPTION: description du bucket de journaux.
  • RESTRICTED_FIELDS: liste des champs soumis à restriction, séparés par une virgule.

Commande :

gcloud logging buckets create BUCKET_ID --location=LOCATION  \
--description=DESCRIPTION --restricted-fields=RESTRICTED_FIELDS

Exemple de commande :

gcloud logging buckets create new-log-bucket --location=global \
--description="New bucket with restricted fields" --restricted-fields="jsonPayload.data.ssn,httpRequest.status"

Restreindre les champs sur un bucket existant

Pour restreindre les champs de journal sur un bucket de journaux existant, exécutez la commande gcloud logging buckets update:

gcloud logging buckets update BUCKET_ID --location=LOCATION  \
--restricted-fields=RESTRICTED_FIELDS

Exemple de commande :

gcloud logging buckets update my-existing-log-bucket --location=global \
--restricted-fields="jsonPayload.data.ssn,httpRequest.status"

Si vous souhaitez ajouter des champs à vos restrictions existantes, votre commande "update" doit répertorier l'ensemble des champs restreints. Sur la base de l'exemple précédent, si vous souhaitez limiter l'accès au champ jsonPayload.data.entryDate en plus des champs déjà restreints jsonPayload.data.ssn et httpRequest.status, votre commande doit se présenter comme suit :

gcloud logging buckets update my-existing-log-bucket --location=global \
--restricted-fields="jsonPayload.data.ssn,jsonPayload.data.entryDate,httpRequest.status"

Si vous omettez les champs déjà restreints pour n'inclure que jsonPayload.data.entryDate dans la commande, jsonPayload.data.ssn et httpRequest.status seront supprimés en tant que champs restreints.

Gérer l'accès aux champs restreints

Par défaut, Logging masque tous les champs restreints aux utilisateurs qui ne possèdent pas le rôle logging.fieldAccessor ou un rôle avec des autorisations similaires. Logging expose les champs restreints aux utilisateurs disposant à la fois des autorisations permettant d'afficher les journaux du bucket et du rôle logging.fieldAccessor.

Vous pouvez modifier le comportement par défaut pour limiter les sous-ensembles de champs restreints à des utilisateurs spécifiques.

Accorder des autorisations sur tous les champs restreints

Pour autoriser les utilisateurs à accéder à tous les champs restreints, attribuez-leur le rôle logging.fieldAccessor ou un rôle personnalisé contenant le rôle logging.fieldAccessor.

Console

Pour attribuer le rôle logging.fieldAccessor aux utilisateurs à l'aide de la console Google Cloud, procédez comme suit:

  1. Dans la console Google Cloud, accédez à la page IAM :

    Accéder à IAM

    Si vous utilisez la barre de recherche pour trouver cette page, sélectionnez le résultat dont le sous-titre est IAM et administration.

  2. Sélectionnez l'administrateur principal, puis cliquez sur Modifier.
  3. Dans le volet Modifier les autorisations, sélectionnez Accesseur de champs de journaux pour le rôle.
  4. Sélectionnez Ajouter une condition IAM.
  5. Saisissez un titre et une description dans les champs Titre et Description.
  6. Sélectionnez l'onglet Éditeur de conditions, puis saisissez l'expression suivante :

    resource.name.extract("locations/global/buckets/{bucket}/") == "BUCKET_ID"
    
  7. Sélectionnez Enregistrer.

Les autorisations Identity and Access Management sont immédiatement mises à jour.

gcloud

Pour attribuer le rôle logging.fieldAccessor aux utilisateurs à l'aide de la gcloud CLI, procédez comme suit:

  1. Pour enregistrer les informations sur la stratégie IAM actuelle dans un fichier, exécutez la commande gcloud projects get-iam-policy et enregistrez la sortie dans un fichier:

    gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
    

    La commande précédente enregistre les informations dans un fichier nommé policy.json.

  2. Mettez à jour le fichier policy.json avec des liaisons supplémentaires.

    Dans l'exemple suivant, le champ expression ne liste qu'un bucket de journaux. Par conséquent, tous les champs des entrées de journal stockées dans ce bucket de journaux sont accessibles aux principaux listés dans la section members.

    "bindings": [
        {
          "condition": {
            "description": "DESCRIPTION",
            "expression": "resource.name.extract(\"locations/global/buckets/{bucket}/\") == 'BUCKET_ID'",
            "title": "TITLE"
          },
          "members": [
            PRINCIPAL
          ],
          "role": "roles/logging.fieldAccessor"
        }
    ]
    

    Dans l'exemple précédent, les champs ont la signification suivante:

    • PRINCIPAL: identifiant du compte principal auquel vous souhaitez accorder le rôle. Les identifiants principaux se présentent généralement sous la forme suivante : PRINCIPAL-TYPE:ID. Par exemple, user:my-user@example.com. Pour obtenir la liste complète des formats pouvant être utilisés pour PRINCIPAL, consultez la section Identifiants principaux. Dans le champ members du fichier policy.json, utilisez le format "PRINCIPAL-TYPE":"ID".
    • DESCRIPTION: description de la condition.
    • TITLE: titre de la condition.
  3. Pour appliquer le fichier policy.json mis à jour, exécutez la commande gcloud projects set-iam-policy:

    gcloud projects set-iam-policy PROJECT_ID policy.json
    

Les autorisations Identity and Access Management sont immédiatement mises à jour.

Accorder des autorisations sur un sous-ensemble de champs restreints

Pour accorder aux utilisateurs des autorisations sur un sous-ensemble des champs restreints, définissez les champs auxquels les utilisateurs peuvent accéder lors de l'attribution du rôle logging.fieldAccessor ou de la définition d'un rôle personnalisé contenant le rôle logging.fieldAccessor.

Veuillez noter les points suivants :

  • L'orthographe et la casse du champ restreint tel qu'il apparaît dans la configuration du bucket doivent correspondre à l'orthographe et à la casse du nom de l'autorisation IAM. Par exemple, si vous définissez le champ restreint sur jsonPayload, vous devez accorder l'autorisation sur le champ jsonPayload, et non sur le champ Jsonpayload.

  • Les chemins d'accès de champ (y compris les chaînes de clé de mappage) sont sensibles à la casse. Cependant, les chemins d'accès de champ protobuf peuvent être exprimés de manière non sensible à la casse (snake_case) ou de manière sensible à la casse (camelCase).

    Par exemple, si logName est un champ dans le protobuf LogEntry, log_name fait référence au même champ. Le champ jsonPayload.fooBar fait référence à un champ différent de jsonPayload.foo_bar, car les noms de champ sous jsonPayload sont des clés de chaîne de mappage. Cependant, le champ fait bien référence à json_payload.fooBar.

    Même si les chemins d'accès de champ sont des références valides à un même champ, vous devez vérifier l'orthographe et la casse lorsque vous configurez des restrictions et des autorisations IAM. Par exemple, si vous spécifiez une restriction sur jsonPayload.foo, vous devez configurer des autorisations IAM pour jsonPayload.foo et non pour json_payload.foo.

Pour plus d'informations sur les types de champs de journal valides, consultez la page Langage de requête Logging : valeurs et conversions.

Console

Pour autoriser les utilisateurs à accéder à un champ restreint à l'aide de la console Google Cloud, procédez comme suit:

  1. Dans la console Google Cloud, accédez à la page IAM :

    Accéder à IAM

    Si vous utilisez la barre de recherche pour trouver cette page, sélectionnez le résultat dont le sous-titre est IAM et administration.

  2. Sélectionnez l'administrateur principal, puis cliquez sur Modifier.
  3. Dans le volet Modifier les autorisations, sélectionnez Accesseur de champs de journaux pour le rôle.
  4. Sélectionnez Ajouter une condition IAM.
  5. Saisissez un titre et une description dans les champs Titre et Description.
  6. Sélectionnez l'onglet Éditeur de conditions, puis saisissez l'expression suivante :

    resource.name.extract("locations/global/buckets/BUCKET_ID/fields/{field}") == "RESTRICTED_FIELDS"
    
  7. Sélectionnez Enregistrer.

Les autorisations Identity and Access Management sont immédiatement mises à jour.

gcloud

Pour autoriser les utilisateurs à accéder à un champ restreint à l'aide de la gcloud CLI, procédez comme suit:

  1. Pour enregistrer les informations IAM dans un fichier, exécutez la commande gcloud projects get-iam-policy et enregistrez la sortie dans un fichier:

    gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
    

    La commande précédente enregistre les informations dans un fichier nommé policy.json.

  2. Mettez à jour le fichier policy.json avec des liaisons supplémentaires.

    Dans ce qui suit, le champ expression liste des champs spécifiques. Par conséquent, seuls les principaux listés dans la section members ont accès aux champs des entrées de journal stockés dans le bucket de journaux spécifié.

    "bindings": [
        {
          "condition": {
            "description": "DESCRIPTION",
            "expression": "resource.name.extract(\"locations/global/buckets/BUCKET_ID/fields/{field}\") == 'RESTRICTED_FIELDS'",
            "title": "TITLE"
          },
          "members": [
            PRINCIPAL
          ],
          "role": "roles/logging.fieldAccessor"
        }
    ]
    

    Dans l'exemple précédent, les champs ont la signification suivante:

    • PRINCIPAL: identifiant du compte principal auquel vous souhaitez accorder le rôle. Les identifiants principaux se présentent généralement sous la forme suivante : PRINCIPAL-TYPE:ID. Par exemple, user:my-user@example.com. Pour obtenir la liste complète des formats pouvant être utilisés pour PRINCIPAL, consultez la section Identifiants principaux. Dans le champ members du fichier policy.json, utilisez le format "PRINCIPAL-TYPE":"ID".
    • DESCRIPTION: description de la condition.
    • TITLE: titre de la condition.
  3. Pour appliquer le fichier policy.json mis à jour, exécutez la commande gcloud projects set-iam-policy:

    gcloud projects set-iam-policy PROJECT_ID policy.json
    

Les autorisations Identity and Access Management sont immédiatement mises à jour.

Exemple

Supposons qu'un bucket de journaux limite le champ jsonPayload, un libellé spécifique et un sous-champ httpRequest spécifique. Voici ce qui se produit lorsqu'un utilisateur examine ses entrées de journal :

  • Pour les utilisateurs autorisés à accéder à tous les champs restreints, tous les champs d'une entrée de journal sont visibles.

  • Pour les utilisateurs n'ayant l'autorisation d'accéder qu'au champ restreint jsonPayload LogEntry, tous les champs non restreints sont visibles, et le champ jsonPayload l'est également.

  • Pour les utilisateurs qui ne sont pas autorisés à accéder aux champs restreints, seuls les champs non restreints sont visibles.

Si un utilisateur écrit une requête avec une restriction globale, les entrées de journal contenant un champ restreint sont omises de la réponse.

Répertorier les champs restreints

Pour répertorier les champs restreints d'un bucket de journaux, exécutez la commande gcloud logging buckets describe suivante:

gcloud logging buckets describe BUCKET_ID --location=LOCATION

Exemple de commande :

gcloud logging buckets describe my-log-bucket --location=global

Quotas et limites

Lors de la configuration et de l'utilisation du contrôle d'accès au niveau du champ, tenez compte des points suivants :

  • Nombre de champs restreints : vous pouvez restreindre jusqu'à 20 champs pour chaque bucket de journaux.
  • Taille des champs restreints : le chemin d'accès du champ restreint doit être inférieur à 800 octets.

Pour plus d'informations sur les limites pouvant s'appliquer à votre utilisation de Cloud Logging, consultez la page Quotas et limites.