Configurar el acceso a nivel de campo

En este documento se describen los controles de acceso a nivel de campo y cómo configurarlos en un segmento de registro. Los controles de acceso a nivel de campo te permiten ocultar campos LogEntry concretos a los usuarios de un Google Cloud proyecto, lo que te ofrece una forma más granular de controlar los datos de registro a los que puede acceder un usuario.

Información general

El registro usa el control de acceso a nivel de campo para ocultar los campos LogEntry a los usuarios de un proyecto Google Cloud que no tengan los permisos necesarios para verlos. En comparación con las vistas de registros, que ocultan todo el LogEntry, los controles de acceso a nivel de campo ocultan campos concretos del LogEntry. Puedes definir controles de acceso a nivel de campo y permisos de vistas de registro en un segmento de Logging. Puedes restringir y gestionar el control de acceso a nivel de campo mediante Google Cloud CLI.

Para restringir el acceso a los campos de registro, sigue estos pasos:

  • Configura los campos LogEntry restringidos en un segmento de registro.
  • Solo debes asignar el rol de gestión de identidades y accesos logging.fieldAccessor a los usuarios que necesiten ver los campos restringidos, o bien un rol que contenga permisos similares.

El registro comprueba los permisos de IAM cuando un usuario consulta los registros de un segmento que tiene campos restringidos. Los campos con ACLs configuradas se deniegan a los usuarios que no tengan el logging.FieldAccessor correspondiente a ese campo, lo que significa que:

  • El usuario recibe un error de permiso denegado si intenta consultar directamente los campos restringidos.
  • Las búsquedas globales no tienen en cuenta el contenido de los campos denegados.
  • Los resultados de LogEntry que se devuelvan omitirán los campos restringidos.

Campos restringidos

Puedes restringir el acceso al campo jsonPayload, lo que también restringe el acceso a sus rutas anidadas.

También puedes restringir el acceso a los campos hoja de lo siguiente:

Por ejemplo, puedes restringir el acceso al campo labels.check_id.

Antes de empezar

Antes de empezar a configurar los controles de acceso a nivel de campo, haz lo siguiente:

  • Comprueba que gcloud --version informa de la versión 362.0.0 o una posterior.

    Para instalar la versión más reciente de la CLI de gcloud, ejecuta el comando gcloud components update:

    gcloud components update
    

    Para obtener instrucciones sobre cómo instalar gcloud CLI, consulta Instalar Google Cloud CLI.

  • Ejecuta gcloud config set para configurar el proyectoGoogle Cloud predeterminado de los comandos de la CLI de Google Cloud. Antes de ejecutar el comando, haz la siguiente sustitución:

    • PROJECT_ID: identificador del proyecto.

    Comando:

    gcloud config set project PROJECT_ID
    
  • Comprueba que tienes uno de los siguientes roles de gestión de identidades y accesos en el proyecto Google Cloud que contiene el contenedor:

    Para obtener información sobre cómo definir roles de gestión de identidades y accesos, consulta la guía de control de acceso de Logging.

Configurar el control de acceso a nivel de campo

Las restricciones a nivel de campo se configuran a nivel del contenedor de registro y se pueden aplicar a un contenedor de registro que ya tengas o al crear uno.

Restringir campos en un nuevo contenedor

Para restringir los campos de registro al crear un nuevo bucket de registro, ejecuta el comando gcloud logging buckets create. Antes de ejecutar el comando, haz las siguientes sustituciones:

  • BUCKET_ID: nombre o ID del segmento de registro.
  • LOCATION: la ubicación del segmento de registro.
  • DESCRIPTION: la descripción del segmento de registro.
  • RESTRICTED_FIELDS: lista separada por comas de los campos que se van a restringir.

Comando:

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

Comando de ejemplo:

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

Restringir campos en un segmento

Para restringir los campos de registro en un bucket de registro, ejecuta el comando gcloud logging buckets update:

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

Comando de ejemplo:

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

Si quieres añadir campos a las restricciones que ya tienes, el comando de actualización debe volver a enumerar todo el conjunto de campos restringidos. Siguiendo el ejemplo anterior, si quieres restringir el acceso al campo jsonPayload.data.entryDate, además de a los campos jsonPayload.data.ssn y httpRequest.status, que ya están restringidos, el comando sería el siguiente:

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

Si no has vuelto a incluir los campos que ya estaban restringidos y solo has incluido jsonPayload.data.entryDate, se eliminarían tanto jsonPayload.data.ssn como httpRequest.status como campos restringidos.

Gestionar el acceso a campos con restricciones

De forma predeterminada, Logging oculta todos los campos restringidos a los usuarios que no tienen el rol logging.fieldAccessor u otro con permisos similares. El registro expone los campos restringidos a los usuarios que tienen permiso para ver los registros del contenedor y el rol logging.fieldAccessor.

Puedes modificar el comportamiento predeterminado para limitar subconjuntos de campos restringidos a usuarios específicos.

Conceder permiso en todos los campos restringidos

Para conceder a los usuarios permiso para acceder a todos los campos restringidos, asígnale el rol logging.fieldAccessor o un rol personalizado que lo incluya.logging.fieldAccessor

Consola

Para asignar el rol logging.fieldAccessor a los usuarios mediante la consola Google Cloud , sigue estos pasos:

  1. En la Google Cloud consola, ve a la página Gestión de identidades y accesos:

    Ve a Gestión de identidades y accesos.

    Si usas la barra de búsqueda para encontrar esta página, selecciona el resultado cuyo subtítulo sea IAM y administrador.

  2. Selecciona el principal y haz clic en Editar.
  3. En el panel Editar permisos, selecciona Accessor de campo de registro para el rol.
  4. Selecciona Añadir condición de IAM.
  5. Escribe un título y una descripción en los campos Título y Descripción.
  6. Seleccione la pestaña Editor de condiciones e introduzca la siguiente expresión:

    resource.name.extract("locations/global/buckets/{bucket}/") == "BUCKET_ID"
    
  7. Selecciona Guardar.

Los permisos de Gestión de Identidades y Accesos se actualizan inmediatamente.

gcloud

Para asignar el rol logging.fieldAccessor a los usuarios mediante la CLI de gcloud, sigue estos pasos:

  1. Para guardar la información de la política de IAM actual en un archivo, ejecuta el comando gcloud projects get-iam-policy y guarda el resultado en un archivo:

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

    El comando anterior guarda la información en un archivo llamado policy.json.

  2. Actualiza el archivo policy.json con enlaces adicionales.

    En el siguiente ejemplo, el campo expression solo muestra un segmento de registro. Por lo tanto, los principales que se indican en la sección members pueden acceder a todos los campos de las entradas de registro almacenadas en ese segmento de registros.

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

    En el ejemplo anterior, los campos tienen los siguientes significados:

    • PRINCIPAL: identificador de la cuenta principal a la que quieres asignar el rol. Los identificadores principales suelen tener el siguiente formato: PRINCIPAL-TYPE:ID. Por ejemplo, user:my-user@example.com. Para ver una lista completa de los formatos que puede tener PRINCIPAL, consulta Identificadores principales. En el campo members del archivo policy.json, usa el formato "PRINCIPAL-TYPE":"ID".
    • DESCRIPTION: descripción de la condición.
    • TITLE: título de la condición.
  3. Para aplicar el archivo policy.json actualizado, ejecuta el comando gcloud projects set-iam-policy:

    gcloud projects set-iam-policy PROJECT_ID policy.json
    

Los permisos de Gestión de Identidades y Accesos se actualizan inmediatamente.

Conceder permisos en un subconjunto de campos restringidos

Para conceder permisos a los usuarios en un subconjunto de los campos restringidos, define los campos a los que pueden acceder los usuarios cuando les asignes el rol logging.fieldAccessor o cuando definas un rol personalizado que contenga el rol logging.fieldAccessor.

Ten en cuenta lo siguiente:

  • La ortografía y el uso de mayúsculas y minúsculas del campo restringido tal como aparece en la configuración del segmento deben coincidir con la ortografía y el uso de mayúsculas y minúsculas del campo restringido en el nombre del permiso de gestión de identidades y accesos. Por ejemplo, si defines el campo restringido como jsonPayload, debes conceder permiso en el campo jsonPayload, no en el campo Jsonpayload.

  • Las rutas de campo, incluidas las cadenas de claves de mapa, distinguen entre mayúsculas y minúsculas, pero las rutas de campo de protobuf se pueden expresar en formato snake_case (sin distinguir entre mayúsculas y minúsculas) o camelCase (distinguiendo entre mayúsculas y minúsculas).

    Por ejemplo, logName es un campo del protobuf LogEntry; log_name hace referencia al mismo campo. El campo jsonPayload.fooBar hace referencia a un campo distinto de jsonPayload.foo_bar, ya que los nombres de los campos de jsonPayload son claves de cadena de mapa. Sin embargo, sí hace referencia a json_payload.fooBar.

    Aunque las rutas de los campos sean referencias válidas al mismo campo, debes respetar la ortografía, el uso de mayúsculas y minúsculas y el formato al configurar las restricciones y los permisos de gestión de identidades y accesos. Por ejemplo, si especifica una restricción en jsonPayload.foo, debe configurar los permisos de IAM para jsonPayload.foo y no para json_payload.foo.

Para obtener más información sobre los tipos de campos de registro válidos, consulta Lenguaje de consulta de registro: valores y conversiones.

Consola

Para dar acceso a los usuarios a un campo restringido mediante la consola Google Cloud , sigue estos pasos:

  1. En la Google Cloud consola, ve a la página Gestión de identidades y accesos:

    Ve a Gestión de identidades y accesos.

    Si usas la barra de búsqueda para encontrar esta página, selecciona el resultado cuyo subtítulo sea IAM y administrador.

  2. Selecciona el principal y haz clic en Editar.
  3. En el panel Editar permisos, selecciona Accessor de campo de registro para el rol.
  4. Selecciona Añadir condición de IAM.
  5. Escribe un título y una descripción en los campos Título y Descripción.
  6. Seleccione la pestaña Editor de condiciones e introduzca la siguiente expresión:

    resource.name.extract("locations/global/buckets/BUCKET_ID/fields/{field}") == "RESTRICTED_FIELDS"
    
  7. Selecciona Guardar.

Los permisos de Gestión de Identidades y Accesos se actualizan inmediatamente.

gcloud

Para dar acceso a los usuarios a un campo restringido mediante la CLI de gcloud, sigue estos pasos:

  1. Para guardar la información de IAM en un archivo, ejecuta el comando gcloud projects get-iam-policy y guarda el resultado en un archivo:

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

    El comando anterior guarda la información en un archivo llamado policy.json.

  2. Actualiza el archivo policy.json con enlaces adicionales.

    A continuación, el campo expression enumera campos específicos. Por lo tanto, solo las entidades de seguridad que se incluyan en la sección members tendrán acceso a los campos de las entradas de registro que se almacenen en el segmento de registro especificado.

    "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"
        }
    ]
    

    En el ejemplo anterior, los campos tienen los siguientes significados:

    • PRINCIPAL: identificador de la cuenta principal a la que quieres asignar el rol. Los identificadores principales suelen tener el siguiente formato: PRINCIPAL-TYPE:ID. Por ejemplo, user:my-user@example.com. Para ver una lista completa de los formatos que puede tener PRINCIPAL, consulta Identificadores principales. En el campo members del archivo policy.json, usa el formato "PRINCIPAL-TYPE":"ID".
    • DESCRIPTION: descripción de la condición.
    • TITLE: título de la condición.
  3. Para aplicar el archivo policy.json actualizado, ejecuta el comando gcloud projects set-iam-policy:

    gcloud projects set-iam-policy PROJECT_ID policy.json
    

Los permisos de Gestión de Identidades y Accesos se actualizan inmediatamente.

Ejemplo

Supongamos que un contenedor de registro restringe el campo jsonPayload, una etiqueta específica y un subcampo httpRequest específico. Cuando un usuario examina sus entradas de registro, ocurre lo siguiente:

  • Los usuarios que tengan permiso para acceder a todos los campos restringidos podrán ver todos los campos de una entrada de registro.

  • Los usuarios que solo tengan permiso para acceder al campo jsonPayload LogEntry restringido podrán ver todos los campos sin restricciones y el campo jsonPayload.

  • Los usuarios que no tengan permiso para ver ninguno de los campos restringidos solo podrán ver los campos sin restricciones.

Si un usuario escribe una consulta con una restricción global, se omitirán de la respuesta las entradas de registro que contengan un campo restringido.

Listar campos restringidos

Para enumerar los campos restringidos de un registro, ejecuta el siguiente comando gcloud logging buckets describe:

gcloud logging buckets describe BUCKET_ID --location=LOCATION

Comando de ejemplo:

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

Cuotas y límites

Cuando configures y uses el control de acceso a nivel de campo, ten en cuenta lo siguiente:

  • Número de campos restringidos: puede restringir hasta 20 campos por cada contenedor de registro.
  • Tamaño de los campos restringidos: la ruta del campo restringido debe tener una longitud inferior a 800 B.

Para obtener más información sobre los límites que se pueden aplicar al uso de Cloud Logging, consulta Cuotas y límites.