Contrôle d'accès au niveau du champ

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 un contrôle d'accès au niveau du champ afin de masquer les champs LogEntry pour les utilisateurs d'un projet 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 en utilisant l'outil de ligne de commande gcloud.

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 à n'importe quelle combinaison des champs LogEntry suivants :

Champ LogEntry Champs imbriqués du champ LogEntry parent
jsonPayload Défini par l'utilisateur
textPayload Aucun
protoPayload Spécifique au service
httpRequest Champs imbriqués httpRequest
labels Défini par l'utilisateur
sourceLocation Champs imbriqués sourceLocation

Le fait de restreindre l'accès à un champ avec des champs imbriqués (comme jsonPayload ou des sous-chemins d'accès jsonPayload spécifiques) empêche également l'accès à ses chemins imbriqués.

Avant de commencer

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

Définir le contrôle d'accès au niveau du champ

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

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 d'outil gcloud suivante :

gcloud logging buckets create BUCKET_NAME --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 d'outil gcloud suivante :

gcloud logging buckets update BUCKET_NAME --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 en utilisant Google Cloud Console, procédez comme suit :

  1. Dans le volet Modifier les autorisations, sélectionnez Accesseur de champs de journaux.
  2. Sélectionnez Ajouter une condition.

    Ajout de l'autorisation "Accesseur de champs de journaux"

  3. Saisissez un titre et une description dans les champs Titre et Description.

  4. Sélectionnez l'onglet Éditeur de conditions, puis saisissez l'expression suivante :

    resource.name.extract("locations/global/buckets/{bucket}/") == "BUCKET_NAME"
    

    Ajout d'une condition à l'autorisation

  5. Sélectionnez Enregistrer.

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

gcloud

Pour attribuer le rôle logging.fieldAccessor aux utilisateurs en utilisant l'outil gcloud, procédez comme suit :

  1. Modifiez le fichier policy.json comme suit :

    gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
    
  2. Mettez à jour le fichier policy.json avec des liaisons supplémentaires :

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

    Exemple de liaison :

    "bindings": [
      {
        "condition": {
          "description": "Grants access to all restricted fields in a log bucket",
          "expression": "resource.name.extract(\"locations/global/buckets/{bucket}/\") == 'log-bucket-with-sensitive-data'",
          "title": "Log bucket condition for restricted fields"
        },
        "members": [
          "user":"222larabrown@gmail.com"
        ],
        "role": "roles/logging.fieldAccessor"
      }
    ]
    

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 Cloud Console, procédez comme suit :

  1. Dans le volet Modifier les autorisations, sélectionnez Accesseur de champs de journaux.
  2. Sélectionnez Ajouter une condition.

    Ajout de l'autorisation "Accesseur de champs de journaux"

  3. Saisissez un titre et une description dans les champs Titre et Description.

  4. Sélectionnez l'onglet Éditeur de conditions, puis saisissez l'expression suivante :

    resource.name.extract("locations/global/buckets/BUCKET_ID /fields/{field}") == "RESTRICTED_FIELD"
    

    Ajout d'un sous-ensemble de champs restreints.

  5. 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 l'outil gcloud, procédez comme suit :

  1. Modifiez le fichier policy.json comme suit :

    gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
    
  2. Mettez à jour le fichier policy.json avec des liaisons supplémentaires :

    "bindings": [
        {
          "condition": {
            "description": "DESCRIPTION",
            "expression": "resource.name.extract(\"locations/global/buckets/BUCKET_NAME/fields/{field}\") == 'RESTRICTED_FIELD'",
            "title": "TITLE"
          },
          "members": [
            "user":"USER_ID@DOMAIN.com"
          ],
          "role": "roles/logging.fieldAccessor"
        }
    ]
    

    Exemple de liaison :

    "bindings": [
      {
        "condition": {
          "description": "Give access to one restricted field that contains sensitive information",
          "expression": "resource.name.extract(\"locations/global/buckets/my-log-bucket/fields/{field}\") == 'jsonPyaload.data.ssn'",
          "title": "Access to restricted field"
        },
        "members": [
          "user":"222larabrown@gmail.com"
        ],
        "role": "roles/logging.fieldAccessor"
      }
    ]
    

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

Exemple de résultat :

Les exemples suivants montrent comment une LogEntry s'affiche pour les utilisateurs qui ne peuvent pas accéder à un sous-ensemble des champs LogEntry.

Supposons qu'un bucket ait les champs restreints suivants :

  • jsonPayload
  • httpRequest
  • labels

Pour les utilisateurs autorisés à accéder à tous les champs restreints, le fichier LogEntry se présente comme suit :

Tous les champs de journal sont affichés.

Pour les utilisateurs n'ayant l'autorisation d'accéder qu'au champ restreint jsonPayload LogEntry, le fichier LogEntry se présente comme suit :

Seul le champ jsonPayload est affiché.

Pour les utilisateurs qui ne sont pas autorisés à accéder aux champs restreints, le fichier LogEntry se présente comme suit :

Tous les champs sont restreints.

Si un utilisateur saisit une restriction globale qui renverrait un LogEntry avec un champ restreint, Logging masque l'intégralité de LogEntry au lieu de masquer seulement le champ.

Répertorier les champs restreints

Pour répertorier les champs restreints d'un bucket de journaux, exécutez la commande d'outil gcloud 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.