Configura 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 bucket de Logging. Los controles de acceso a nivel de campo te permiten ocultar campos LogEntry individuales de los usuarios de un proyecto de Google Cloud, lo que te proporciona una forma más detallada de controlar los datos de registro a los que tiene acceso 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 Google Cloud que no tienen 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 individuales del LogEntry. Puedes configurar controles de acceso a nivel de campo y permisos de vistas de registro en un bucket de Logging. Restringe y administras el control de acceso a nivel de campo con Google Cloud CLI.

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

  • Configura los campos LogEntry restringidos en un bucket de registro.
  • Otorga 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 desde un bucket que tiene configurados campos restringidos. Cualquier campo con LCA configuradas se rechaza a los usuarios sin el logging.FieldAccessor correspondiente para ese campo, lo que significa lo siguiente:

  • El usuario recibe un error de permiso denegado si intenta consultar directamente los campos restringidos.
  • Las búsquedas globales no consideran el contenido de los campos denegados.
  • Los resultados de LogEntry que se muestran omiten los campos restringidos.

Campos restringidos

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

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

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

Antes de comenzar

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

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

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

    gcloud components update

    Si quieres obtener instrucciones para instalar gcloud CLI, consulta Instala Google Cloud CLI.

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

    Para obtener información sobre los roles de IAM, consulta la Guía de control de acceso de Logging.

Establece el control de acceso a nivel del 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 uno nuevo.

Restringe campos en un bucket nuevo

Para restringir los campos de registro cuando creas un nuevo bucket de registros, ejecuta el siguiente comando de la CLI 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 CLI 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, el comando de actualización debe volver a mostrar la lista de todo el conjunto de campos restringidos. A partir del ejemplo anterior, si deseas restringir el acceso al campo jsonPayload.data.entryDate además de los campos ya restringidos jsonPayload.data.ssn y httpRequest.status, tu comando se verá 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, se quitarán jsonPayload.data.ssn y httpRequest.status 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 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 a los usuarios permiso para todos los campos restringidos, otórgales la función logging.fieldAccessor o una personalizada que contenga la función logging.fieldAccessor.

Consola

Para otorgar a los usuarios la función logging.fieldAccessor con la consola de Google Cloud, completa los siguientes pasos:

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

    Agrega el permiso de descriptor 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 Identity and Access Management se actualizan de inmediato.

gcloud

Para otorgar a los usuarios la función logging.fieldAccessor con la gcloud CLI, 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"
        }
    ]
    

    Vinculación de ejemplo:

    "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 Identity and Access Management 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 otorgues la función logging.fieldAccessor o cuando configuren una función personalizada que contenga la 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 claves de mapa, distinguen mayúsculas de minúsculas, pero las rutas de los campos de protobuf se pueden expresar como snake case sin distinción entre mayúsculas y minúsculas (snake_case) o como mayúsculas mediales (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í hace referencia a json_payload.fooBar.

    Incluso si las rutas de los campos son referencias válidas para el mismo campo, debes coincidir con 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 Lenguaje de consulta de Logging: valores y conversiones.

Consola

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

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

    Agrega el permiso de descriptor 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 Identity and Access Management se actualizan de inmediato.

gcloud

Para otorgar a los usuarios acceso a un campo restringido mediante gcloud CLI, 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"
        }
    ]
    

    Vinculación de ejemplo:

    "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 Identity and Access Management se actualizan de inmediato.

Resultado de ejemplo

En los siguientes ejemplos, se muestra cómo se muestra un LogEntry a 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

En el caso de los usuarios con permiso para acceder a todos los campos restringidos, LogEntry se verá de la siguiente manera:

Se muestran todos los campos de registro.

En el caso de los usuarios con permiso para acceder solo al campo restringido LogEntry de jsonPayload, LogEntry se ve de la siguiente manera:

Solo se muestra el campo jsonPayload.

En el caso de los usuarios sin permiso para ver ninguno de los campos restringidos, LogEntry se verá de la siguiente manera:

Todos los campos están restringidos.

Si un usuario ingresa una restricción global que mostraría un LogEntry con un campo restringido, Logging ocultará el LogEntry completo en lugar de solo el campo.

Cómo mostrar una lista de campos restringidos

Para enumerar los campos restringidos en un bucket de registros, ejecuta el siguiente comando de la CLI 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 cada bucket de registros.
  • Tamaño de los campos restringidos: La ruta de acceso del campo restringido debe ser inferior a 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.