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 a 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 pueden acceder.

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 ver los campos. En comparación con las vistas de registros, que ocultan toda la LogEntry, los controles de acceso a nivel de campo ocultan campos individuales de LogEntry. Puedes establecer permisos de controles de acceso a nivel de campo y de vistas de registro en un bucket de Logging. Puedes restringir y administrar 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 la función de IAM logging.fieldAccessor solo a los usuarios que necesitan ver los campos restringidos para esa ruta de campo, o una función que contenga permisos similares.

Logging verifica los permisos de IAM cuando un usuario consulta los 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 LogEntry superior
jsonPayload Definido por el usuario
textPayload Ninguna
protoPayload específico del servicio
httpRequest campos anidados httpRequest
labels Definido por el usuario
sourceLocation campos anidados sourceLocation

Restringir el 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 a configurar los controles de acceso a nivel del campo, haz lo siguiente:

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

    Para instalar la versión más reciente de gcloud CLI, ejecuta el siguiente comando 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.

Configura 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 mostrar de nuevo todo el conjunto de campos restringidos. Sobre la base del ejemplo anterior, si deseas restringir el acceso al campo jsonPayload.data.entryDate además de los campos jsonPayload.data.ssn y httpRequest.status ya restringidos, 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 incluir los campos ya restringidos y solo enumeraste jsonPayload.data.entryDate, se quitarían 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 de 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

A fin de otorgar permisos a los usuarios 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 el rol logging.fieldAccessor con la consola de Google Cloud, sigue estos pasos:

  1. En el panel Edit permissions, selecciona Descriptor de acceso de campos de registro.
  2. Selecciona Agregar condición.

    Agrega el permiso de descriptor de acceso de los campos 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 otorgarles a los usuarios el rol logging.fieldAccessor con 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"
        }
    ]
    

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

Otorga permisos a 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 establezcas una función personalizada que contenga la logging.fieldAccessor.

Ten en cuenta lo siguiente:

  • La ortografía y las 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 acceso de campo, incluidas las strings de clave de mapa, distinguen mayúsculas de minúsculas, pero las rutas de acceso de los campos de protobuf se pueden expresar como mayúsculas y minúsculas en snake (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 que jsonPayload.foo_bar, ya que los nombres de campo debajo de jsonPayload son claves de string de mapa. Sin embargo, hace referencia a json_payload.fooBar.

    Incluso si las rutas de campo son referencias válidas al mismo campo, debes coincidir con la ortografía, el uso de mayúsculas y minúsculas cuando configures restricciones y 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 campos de registro válidos, consulta Lenguaje de consulta de Logging: valores y conversiones.

Consola

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

  1. En el panel Edit permissions, selecciona Descriptor de acceso de campos de registro.
  2. Selecciona Agregar condición.

    Agrega el permiso de descriptor de acceso de los campos 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 con 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"
        }
    ]
    

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

Resultado de ejemplo

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

Supongamos que se restringieron los siguientes campos de un bucket:

  • jsonPayload
  • httpRequest
  • labels

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

Se muestran todos los campos de registro.

En el caso de los usuarios con permiso para acceder solamente al campo restringido LogEntry de jsonPayload, el elemento LogEntry tiene el siguiente aspecto:

Solo se muestra el campo jsonPayload.

En el caso de los usuarios que no tengan 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á toda la LogEntry en lugar de solo el campo.

Cómo enumerar 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 del 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 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.