Control de acceso a nivel de campo

En este documento, se describen los controles de acceso a nivel de campo y cómo configurarlos en un bucket de Logging. Los controles de acceso a nivel de campo te permiten ocultar los campos LogEntry individuales de los usuarios de un proyecto de Google Cloud, lo que te proporciona una manera más detallada de controlar los datos de registro a los que puede acceder un usuario.

Descripción general

Logging usa el control de acceso a nivel de campo para ocultar los campos LogEntry de los usuarios de un proyecto de Cloud que no tienen los permisos necesarios para ver los campos. En comparación con las vistas de registros, que ocultan todos los LogEntry, los controles de acceso a nivel de campo ocultan los campos individuales de LogEntry. Puedes establecer controles de acceso a nivel de campo y permisos de vistas de registro en un bucket de Logging. Restringe y administra el control de acceso a nivel de campo mediante la herramienta de línea de comandos de gcloud.

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

  • Configura los campos LogEntry restringidos en un bucket de registro.
  • Otorga solo a los usuarios que necesitan ver los campos restringidos la función de IAM logging.fieldAccessor para esa ruta de campo o una función que contenga permisos similares.

Logging verifica los permisos de IAM cuando un usuario consulta registros de un bucket que tiene configurados campos restringidos. Los campos con LCA configuradas se rechazan a los usuarios sin el logging.FieldAccessor correspondiente para ese campo, lo que significa lo siguiente:

  • El usuario recibe un error de denegación de permiso si intenta consultar directamente los campos restringidos.
  • Las búsquedas globales no tienen en cuenta el contenido de los campos denegados.
  • Todos los resultados LogEntry que se muestran omiten los campos restringidos.

Campos restringidos

Puedes restringir el acceso a cualquier combinación de los siguientes campos de LogEntry:

Campo LogEntry Campos anidados del campo superior LogEntry
jsonPayload Definido por el usuario
textPayload Ninguna
protoPayload servicios específicos
httpRequest campos anidados httpRequest
labels Definido por el usuario
sourceLocation campos anidados sourceLocation

La restricción de acceso a un campo con campos anidados (como jsonPayload o rutas secundarias jsonPayload específicas) también restringe el acceso a cualquiera de sus rutas anidadas.

Antes de comenzar

Antes de comenzar con la configuración de controles de acceso a nivel de campo, haz lo siguiente:

  • Verifica que gcloud --version informe la versión del SDK de Cloud como la versión 362.0.0 o posterior.

    Para instalar la última versión de la herramienta de gcloud, ejecuta el siguiente comando update:

    gcloud components update

    A fin de obtener instrucciones para instalar la herramienta de gcloud, consulta Instala el SDK de Cloud.

  • Verifica si tienes una de las siguientes funciones de IAM para el proyecto de Cloud que contiene el bucket:

    Para obtener información sobre la configuración de las funciones de IAM, consulta la Guía de control de acceso de Logging.

Configura el control de acceso a nivel de campo

Las restricciones a nivel de campo se configuran a nivel de bucket y se pueden aplicar a un bucket existente o cuando se crea un bucket nuevo.

Restringe campos en un bucket nuevo

Para restringir los campos de registro cuando creas un bucket de registros nuevo, ejecuta el siguiente comando de la herramienta de gcloud:

gcloud logging buckets create BUCKET_NAME --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"

Restringe campos en un bucket existente

Para restringir los campos de registro en un bucket de registros existente, ejecuta el siguiente comando de la herramienta de gcloud:

gcloud logging buckets update BUCKET_NAME --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 deseas agregar campos a tus restricciones existentes, tu comando de actualización debe volver a enumerar todo el conjunto de campos restringidos. Sobre la base del ejemplo anterior, si quisieras restringir el acceso al campo jsonPayload.data.entryDate, además de los campos ya restringidos jsonPayload.data.ssn y httpRequest.status, tu comando debería verse de la siguiente manera:

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

Si no volviste a enumerar los campos ya restringidos y solo enumeraste jsonPayload.data.entryDate, tanto jsonPayload.data.ssn como httpRequest.status se quitarán como campos restringidos.

Administra el acceso a campos restringidos

De forma predeterminada, Logging oculta todos los campos restringidos de los usuarios que no tienen la función logging.fieldAccessor o una función con permisos similares. Logging expone los campos restringidos a los usuarios que tienen el permiso para ver los registros en el bucket y la función logging.fieldAccessor.

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

Otorga permisos en todos los campos restringidos

Para otorgar permiso a los usuarios en todos los campos restringidos, otorga a los usuarios la función logging.fieldAccessor o una función personalizada que contenga la función logging.fieldAccessor.

Console

Para otorgar a los usuarios la función logging.fieldAccessor mediante Google Cloud Console, completa los siguientes pasos:

  1. En el panel Editar permisos, selecciona Descriptor de acceso de campo de registro.
  2. Selecciona Agregar condición.

    Agrega el permiso de acceso al campo de registro.

  3. Ingresa un título y una descripción en los campos Title y Description.

  4. Selecciona la pestaña Editor de condiciones (Condition Editor) e ingresa la siguiente expresión:

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

    Agrega una condición al permiso.

  5. Selecciona Save.

Los permisos de la administración de identidades y accesos se actualizan de inmediato.

gcloud

Para otorgar a los usuarios la función logging.fieldAccessor mediante la herramienta de gcloud, completa los siguientes pasos:

  1. Edita el archivo policy.json:

    gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
    
  2. Actualiza el archivo policy.json con vinculaciones adicionales:

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

    Ejemplo de vinculación:

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

Los permisos de la administración de identidades y accesos se actualizan de inmediato.

Otorga permisos en un subconjunto de campos restringidos

Para otorgar permisos a los usuarios en un subconjunto de los campos restringidos, configura los campos a los que los usuarios pueden acceder cuando les otorguen la función logging.fieldAccessor o cuando establezcan una función personalizada que contenga el logging.fieldAccessor.

Ten en cuenta lo siguiente:

  • La ortografía y el uso de mayúsculas del campo restringido como aparecen en la configuración del bucket deben coincidir con la ortografía y el uso de mayúsculas del campo restringido en el nombre del permiso de IAM. Por ejemplo, si configuras el campo restringido como jsonPayload, debes otorgar permiso en el campo jsonPayload, no en el campo Jsonpayload.

  • Las rutas de campo, incluidas las strings de clave de mapa, distinguen entre mayúsculas y minúsculas, pero las rutas de campo de protobuf pueden expresarse como mayúsculas y minúsculas (Snake_case) o mayúsculas y minúsculas (camelCase).

    Por ejemplo, logName es un campo en el protobuf LogEntry; log_name hace referencia al mismo campo. El campo jsonPayload.fooBar hace referencia a un campo diferente de jsonPayload.foo_bar, ya que los nombres de campo debajo de jsonPayload son claves de string de mapa. sin embargo, sí se refiere a json_payload.fooBar.

    Incluso si las rutas de campo son referencias válidas para el mismo campo, debes hacer coincidir la ortografía, el uso de mayúsculas y minúsculas cuando configures las restricciones y los permisos de IAM. Si, por ejemplo, especificas una restricción en jsonPayload.foo, debes configurar los permisos de IAM para jsonPayload.foo y no para json_payload.foo.

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

Console

Para otorgarles a los usuarios acceso a un campo restringido mediante Cloud Console, completa los siguientes pasos:

  1. En el panel Editar permisos, selecciona Descriptor de acceso de campo de registro.
  2. Selecciona Agregar condición.

    Agrega el permiso de acceso al campo de registro.

  3. Ingresa un título y una descripción en los campos Title y Description.

  4. Selecciona la pestaña Editor de condiciones (Condition Editor) e ingresa la siguiente expresión:

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

    Agrega un subconjunto de los campos restringidos.

  5. Selecciona Save.

Los permisos de la administración de identidades y accesos se actualizan de inmediato.

gcloud

Para otorgarles a los usuarios acceso a un campo restringido mediante la herramienta de gcloud, completa los siguientes pasos:

  1. Edita el archivo policy.json:

    gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
    
  2. Actualiza el archivo policy.json con vinculaciones adicionales:

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

    Ejemplo de vinculación:

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

Los permisos de la administración de identidades y accesos se actualizan de inmediato.

Resultado de ejemplo

En los siguientes ejemplos, se muestra cómo se muestra un LogEntry para los usuarios a los que se les restringió el acceso a un subconjunto de los campos LogEntry.

Supongamos que un bucket tiene los siguientes campos restringidos:

  • jsonPayload
  • httpRequest
  • labels

Para los usuarios con permiso de acceso a todos los campos restringidos, LogEntry se ve de la siguiente manera:

Se muestran todos los campos de registro.

Para los usuarios con permiso de acceso solo al campo jsonPayload restringido LogEntry, el LogEntry se ve de la siguiente manera:

Solo se muestra el campo jsonPayload.

Para los usuarios que no tienen permiso para ver cualquiera de los campos restringidos, la LogEntry se ve de la siguiente manera:

Todos los campos están restringidos.

Si un usuario ingresa una restricción global que muestra un LogEntry con un campo restringido, Logging oculta todo el LogEntry en lugar de solo el campo.

Muestra una lista de campos restringidos

Para enumerar los campos restringidos en un bucket de registro, ejecuta el siguiente comando de la herramienta de gcloud:

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:

  • Cantidad de campos restringidos: Puedes restringir hasta 20 campos por bucket de registro.
  • Tamaño de los campos restringidos: La ruta de un campo restringido debe tener menos de 800 B de longitud.

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