Información general sobre los límites de acceso a credenciales

En esta página se describen los límites de acceso a credenciales, que puedes usar para downscope o restringir los permisos de Gestión de Identidades y Accesos (IAM) que puede usar una credencial de corta duración.

Puedes usar límites de acceso de credenciales para generar tokens de acceso de OAuth 2.0 que representen una cuenta de servicio, pero que tengan menos permisos que la cuenta de servicio. Por ejemplo, si uno de tus clientes necesita acceder a datos de Cloud Storage que controlas, puedes hacer lo siguiente:

  1. Crea una cuenta de servicio que pueda acceder a todos los segmentos de Cloud Storage que tengas.
  2. Genera un token de acceso OAuth 2.0 para la cuenta de servicio.
  3. Aplica un límite de acceso de credenciales que solo permita acceder al contenedor que contiene los datos de tus clientes.

Cómo funcionan los límites de acceso de credenciales

Para restringir los permisos, define un límite de acceso a credenciales que especifique a qué recursos puede acceder la credencial de corta duración, así como un límite superior de los permisos disponibles en cada recurso. Después, puedes crear una credencial de corta duración y, a continuación, cambiarla por una nueva que respete el límite de acceso de la credencial.

Si necesitas dar a las entidades un conjunto de permisos distinto para cada sesión, usar límites de acceso de credenciales puede ser más eficiente que crear muchas cuentas de servicio diferentes y conceder a cada cuenta de servicio un conjunto de roles diferente.

Componentes de un límite de acceso de credenciales

Un límite de acceso de credenciales es un objeto que contiene una lista de reglas de límite de acceso. Cada regla contiene la siguiente información:

  • El recurso al que se aplica la regla.
  • Límite superior de los permisos disponibles en ese recurso.
  • Opcional: una condición que restrinja aún más los permisos. Una condición incluye lo siguiente:
    • Una expresión de condición que da como resultado true o false. Si el resultado es true, se permite el acceso; de lo contrario, se deniega.
    • Opcional: título que identifica la condición.
    • Opcional: una descripción con más información sobre la condición.

Si aplicas un límite de acceso de credenciales a una credencial de corta duración, la credencial solo podrá acceder a los recursos del límite de acceso de credenciales. No hay permisos disponibles en otros recursos.

Un límite de acceso de credenciales puede contener hasta 10 reglas de límite de acceso. Solo puedes aplicar un límite de acceso a credenciales a cada credencial de corta duración.

Cuando se representa como un objeto JSON, un límite de acceso de credenciales contiene los siguientes campos:

Campos
accessBoundary

object

Contenedor del límite de acceso de credenciales.

accessBoundary.accessBoundaryRules[]

object

Lista de reglas de límite de acceso que se aplicarán a una credencial de corta duración.

accessBoundary.accessBoundaryRules[].availablePermissions[]

string

Lista que define el límite superior de los permisos disponibles para el recurso.

Cada valor es el identificador de un rol predefinido o un rol personalizado de gestión de identidades y accesos, con el prefijo inRole:. Por ejemplo: inRole:roles/storage.objectViewer. Solo estarán disponibles los permisos de estos roles.

accessBoundary.accessBoundaryRules[].availableResource

string

Nombre completo del recurso del segmento de Cloud Storage al que se aplica la regla. Utiliza el formato //storage.googleapis.com/projects/_/buckets/bucket-name.

accessBoundary.accessBoundaryRules[].availabilityCondition

object

Opcional. Condición que restringe la disponibilidad de permisos a objetos de Cloud Storage específicos.

Usa este campo si quieres que los permisos estén disponibles para objetos específicos, en lugar de para todos los objetos de un segmento de Cloud Storage.

accessBoundary.accessBoundaryRules[].availabilityCondition.expression

string

Una expresión de condición que especifica los objetos de Cloud Storage en los que hay permisos disponibles.

Para saber cómo hacer referencia a objetos específicos en una expresión de condición, consulta los atributos resource.name y api.getAttribute("storage.googleapis.com/objectListPrefix").

accessBoundary.accessBoundaryRules[].availabilityCondition.title

string

Opcional. Cadena corta que identifica el propósito de la condición.

accessBoundary.accessBoundaryRules[].availabilityCondition.description

string

Opcional. Detalles sobre el propósito de la condición.

Para ver ejemplos en formato JSON, consulta la sección Ejemplos de límites de acceso a credenciales de esta página.

Ejemplos de límites de acceso a credenciales

En las siguientes secciones se muestran ejemplos de límites de acceso a credenciales para casos prácticos habituales. Utilizas el límite de acceso de credenciales cuando intercambias un token de acceso de OAuth 2.0 por un token con permisos limitados.

Limitar los permisos de un segmento

En el siguiente ejemplo se muestra un límite de acceso a credenciales sencillo. Se aplica al segmento de Cloud Storage example-bucket y establece el límite superior de los permisos incluidos en el rol Lector de objetos de Storage (roles/storage.objectViewer):

{
  "accessBoundary": {
    "accessBoundaryRules": [
      {
        "availablePermissions": [
          "inRole:roles/storage.objectViewer"
        ],
        "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket"
      }
    ]
  }
}

Limitar los permisos de varios segmentos

En el siguiente ejemplo se muestra un límite de acceso de credenciales que incluye reglas para varios contenedores:

  • Segmento de Cloud Storage example-bucket-1: en este segmento, solo están disponibles los permisos del rol Lector de objetos de Storage (roles/storage.objectViewer).
  • Segmento de Cloud Storage example-bucket-2: en este segmento, solo están disponibles los permisos del rol Creador de objetos de Storage (roles/storage.objectCreator).
{
  "accessBoundary": {
    "accessBoundaryRules": [
      {
        "availablePermissions": [
          "inRole:roles/storage.objectViewer"
        ],
        "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket-1"
      },
      {
        "availablePermissions": [
          "inRole:roles/storage.objectCreator"
        ],
        "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket-2"
      }
    ]
  }
}

Limitar los permisos de objetos específicos

También puedes usar condiciones de gestión de identidades y accesos para especificar a qué objetos de Cloud Storage puede acceder una principal. Por ejemplo, puedes añadir una condición que haga que los permisos estén disponibles para los objetos cuyo nombre empiece por customer-a:

{
  "accessBoundary": {
    "accessBoundaryRules": [
      {
        "availablePermissions": [
          "inRole:roles/storage.objectViewer"
        ],
        "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket",
        "availabilityCondition": {
          "expression" : "resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a')"
        }
      }
    ]
  }
}

Limitar los permisos al enumerar objetos

Cuando muestras los objetos de un segmento de Cloud Storage, llamas a un método en un recurso de segmento, no en un recurso de objeto. Por lo tanto, si se evalúa una condición para una solicitud de lista y la condición hace referencia al nombre del recurso, el nombre del recurso identifica el contenedor, no un objeto dentro del contenedor. Por ejemplo, cuando enumeras objetos en example-bucket, el nombre del recurso es projects/_/buckets/example-bucket.

Esta convención de nomenclatura puede provocar un comportamiento inesperado al enumerar objetos. Por ejemplo, supongamos que quieres un límite de acceso a credenciales que permita el acceso de lectura a los objetos de example-bucket con el prefijo customer-a/invoices/. Puedes probar a usar la siguiente condición en el límite de acceso de credenciales:

Incompleta: condición que comprueba solo el nombre del recurso

resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a/invoices/')

Esta condición funciona para leer objetos, pero no para enumerarlos:

  • Cuando una entidad intenta leer un objeto en example-bucket con el prefijo customer-a/invoices/, la condición se evalúa como true.
  • Cuando una entidad intenta enumerar objetos con ese prefijo, la condición se evalúa como false. El valor de resource.name es projects/_/buckets/example-bucket, que no empieza por projects/_/buckets/example-bucket/objects/customer-a/invoices/.

Para evitar este problema, además de usar resource.name.startsWith(), tu condición puede comprobar un atributo de API llamado storage.googleapis.com/objectListPrefix. Este atributo contiene el valor del parámetro prefix que se ha usado para filtrar la lista de objetos. Por lo tanto, puede escribir una condición que haga referencia al valor del parámetro prefix.

En el siguiente ejemplo se muestra cómo usar el atributo de API en una condición. Permite leer y mostrar objetos en example-bucket con el prefijo customer-a/invoices/:

Completa: condición que comprueba el nombre del recurso y el prefijo

resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a/invoices/')  ||
    api.getAttribute('storage.googleapis.com/objectListPrefix', '')
                     .startsWith('customer-a/invoices/')

Ahora puede usar esta condición en un límite de acceso de credenciales:

{
  "accessBoundary": {
    "accessBoundaryRules": [
      {
        "availablePermissions": [
          "inRole:roles/storage.objectViewer"
        ],
        "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket",
        "availabilityCondition": {
          "expression":
            "resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a/invoices/') || api.getAttribute('storage.googleapis.com/objectListPrefix', '').startsWith('customer-a/invoices/')"
        }
      }
    ]
  }
}

Siguientes pasos